allura
修訂 | f3e4da9020167688733415f816863d8d0baebe6e (tree) |
---|---|
時間 | 2011-02-19 01:15:58 |
作者 | Jenny Steele <jsteele@geek...> |
Commiter | Jenny Steele |
[#1468] Moderation fixes
Signed-off-by: Jenny Steele <jsteele@geek.net>
@@ -369,12 +369,14 @@ class DiscussionAttachmentsController(AttachmentsController): | ||
369 | 369 | |
370 | 370 | class ModerationController(BaseController): |
371 | 371 | __metaclass__=h.ProxiedAttrMeta |
372 | + PostModel = M.Post | |
372 | 373 | M=h.attrproxy('_discussion_controller', 'M') |
373 | 374 | W=h.attrproxy('_discussion_controller', 'W') |
374 | 375 | ThreadController=h.attrproxy('_discussion_controller', 'ThreadController') |
375 | 376 | PostController=h.attrproxy('_discussion_controller', 'PostController') |
376 | 377 | AttachmentController=h.attrproxy('_discussion_controller', 'AttachmentController') |
377 | 378 | |
379 | + | |
378 | 380 | def _check_security(self): |
379 | 381 | require(has_artifact_access('moderate', self.discussion)) |
380 | 382 |
@@ -389,10 +391,10 @@ class ModerationController(BaseController): | ||
389 | 391 | @expose('jinja:discussion/moderate.html') |
390 | 392 | @validate(pass_validator) |
391 | 393 | def index(self, **kw): |
392 | - kw = WidgetConfig.post_filter.to_python(kw, None) | |
394 | + kw = WidgetConfig.post_filter.validate(kw, None) | |
393 | 395 | page = kw.pop('page', 0) |
394 | 396 | limit = kw.pop('limit', 50) |
395 | - status = kw.pop('status', '-') | |
397 | + status = kw.pop('status', 'pending') | |
396 | 398 | flag = kw.pop('flag', None) |
397 | 399 | c.post_filter = WidgetConfig.post_filter |
398 | 400 | c.moderate_posts = WidgetConfig.moderate_posts |
@@ -402,8 +404,10 @@ class ModerationController(BaseController): | ||
402 | 404 | query['status'] = status |
403 | 405 | if flag: |
404 | 406 | query['flags'] = {'$gte': int(flag) } |
405 | - q = M.Post.query.find(query) | |
407 | + q = self.PostModel.query.find(query) | |
406 | 408 | count = q.count() |
409 | + if not page: | |
410 | + page = 0 | |
407 | 411 | page = int(page) |
408 | 412 | limit = int(limit) |
409 | 413 | q = q.skip(page) |
@@ -418,21 +422,16 @@ class ModerationController(BaseController): | ||
418 | 422 | @h.vardec |
419 | 423 | @expose() |
420 | 424 | @require_post() |
421 | - def moderate(self, post=None, | |
422 | - approve=None, | |
423 | - spam=None, | |
424 | - delete=None, | |
425 | - **kw): | |
426 | - for args in post: | |
427 | - if not args.get('checked', False): continue | |
428 | - post = M.Post.query.get(slug=args['slug']) | |
429 | - if approve: | |
430 | - if post.status != 'ok': | |
431 | - post.approve() | |
432 | - elif spam: | |
433 | - if post.status != 'spam': post.spam() | |
434 | - elif delete: | |
435 | - post.delete() | |
425 | + def save_moderation(self, post=None, delete=None, spam=None, approve=None, **kw): | |
426 | + for p in post: | |
427 | + if 'checked' in p: | |
428 | + posted = self.PostModel.query.get(slug=p['slug']) | |
429 | + if delete: | |
430 | + posted.delete() | |
431 | + elif spam: | |
432 | + posted.status = 'spam' | |
433 | + elif approve: | |
434 | + posted.status = 'ok' | |
436 | 435 | redirect(request.referer) |
437 | 436 | |
438 | 437 | class PostRestController(PostController): |
@@ -87,7 +87,7 @@ class PostFilter(ff.ForgeForm): | ||
87 | 87 | ew.Option(py_value='spam', label='Spam'), |
88 | 88 | ew.Option(py_value='pending', label='Pending moderation'), |
89 | 89 | ew.Option(py_value='ok', label='Ok')], |
90 | - if_missing='-'), | |
90 | + if_missing='pending'), | |
91 | 91 | ew.IntField(name='flag', |
92 | 92 | label='Show posts with at least "n" flags', |
93 | 93 | css_class='text', |
@@ -302,6 +302,7 @@ class Post(Message, VersionedArtifact): | ||
302 | 302 | class __mongometa__: |
303 | 303 | name='post' |
304 | 304 | history_class = PostHistory |
305 | + indexes = [ 'discussion_id', 'thread_id' ] | |
305 | 306 | type_s = 'Post' |
306 | 307 | |
307 | 308 | thread_id = ForeignIdProperty(Thread) |
@@ -16,6 +16,6 @@ Moderation Queue | ||
16 | 16 | <a href="?status={{status}}&flag={{flag}}&page={{page-limit}}">Previous Page</a> |
17 | 17 | <a href="?status={{status}}&flag={{flag}}&page={{page+limit}}">Next Page</a> |
18 | 18 | </div> |
19 | -{{c.post_filter.display(action='.', value=dict(status=status, flag=flag))}} | |
20 | -{{c.moderate_posts.display(value=dict(posts=posts), action='.')}} | |
19 | +{{c.post_filter.display(action=discussion.url()+'moderate', value=dict(status=status, flag=flag))}} | |
20 | +{{c.moderate_posts.display(value=dict(posts=posts), action=discussion.url()+'moderate/save_moderation')}} | |
21 | 21 | {% endblock %} |
@@ -142,48 +142,4 @@ class ForumPostController(PostController): | ||
142 | 142 | super(ForumPostController, self).moderate(**kw) |
143 | 143 | |
144 | 144 | class ForumModerationController(ModerationController): |
145 | - | |
146 | - @h.vardec | |
147 | - @expose('jinja:discussion/moderate.html') | |
148 | - @validate(pass_validator) | |
149 | - def index(self, post=None, **kw): | |
150 | - if kw.pop('delete', None): | |
151 | - for p in post: | |
152 | - if 'checked' in p: | |
153 | - posted = DM.ForumPost.query.find(dict(slug=p['slug'])).first() | |
154 | - posted.delete() | |
155 | - elif kw.pop('spam', None): | |
156 | - for p in post: | |
157 | - if 'checked' in p: | |
158 | - posted = DM.ForumPost.query.find(dict(slug=p['slug'])).first() | |
159 | - posted.status = 'spam' | |
160 | - elif kw.pop('approve', None): | |
161 | - for p in post: | |
162 | - if 'checked' in p: | |
163 | - posted = DM.ForumPost.query.find(dict(slug=p['slug'])).first() | |
164 | - posted.status = 'ok' | |
165 | - kw = WidgetConfig.post_filter.validate(kw, None) | |
166 | - page = kw.pop('page', 0) | |
167 | - limit = kw.pop('limit', 50) | |
168 | - status = kw.pop('status', '-') | |
169 | - flag = kw.pop('flag', None) | |
170 | - c.post_filter = WidgetConfig.post_filter | |
171 | - c.moderate_posts = WidgetConfig.moderate_posts | |
172 | - query = dict( | |
173 | - discussion_id=self.discussion._id) | |
174 | - if status != '-': | |
175 | - query['status'] = status | |
176 | - if flag: | |
177 | - query['flags'] = {'$gte': int(flag) } | |
178 | - q = DM.ForumPost.query.find(query) | |
179 | - count = q.count() | |
180 | - page = int(page) | |
181 | - limit = int(limit) | |
182 | - q = q.skip(page) | |
183 | - q = q.limit(limit) | |
184 | - pgnum = (page // limit) + 1 | |
185 | - pages = (count // limit) + 1 | |
186 | - return dict(discussion=self.discussion, | |
187 | - posts=q, page=page, limit=limit, | |
188 | - status=status, flag=flag, | |
189 | - pgnum=pgnum, pages=pages) | |
145 | + PostModel = DM.ForumPost |
@@ -156,6 +156,11 @@ class ForgeTrackerApp(Application): | ||
156 | 156 | links.append(SitemapEntry('Edit Milestones', self.config.url() + 'milestones', ui_icon=g.icons['table'])) |
157 | 157 | links.append(SitemapEntry('Edit Searches', c.project.url() + 'admin/' + c.app.config.options.mount_point + '/bins/', ui_icon=g.icons['search'])) |
158 | 158 | links.append(SitemapEntry('View Stats', self.config.url() + 'stats', ui_icon=g.icons['stats'])) |
159 | + discussion = c.app.config.discussion | |
160 | + pending_mod_count = M.Post.query.find({'discussion_id':discussion._id, 'status':'pending'}).count() | |
161 | + if pending_mod_count and h.has_artifact_access('moderate', discussion)(): | |
162 | + links.append(SitemapEntry('Moderate', discussion.url() + 'moderate', ui_icon=g.icons['pencil'], | |
163 | + small = pending_mod_count)) | |
159 | 164 | if ticket: |
160 | 165 | for aref in ticket.references+ticket.backreferences.values(): |
161 | 166 | artifact = M.ArtifactReference(aref).artifact |
@@ -177,8 +177,13 @@ class ForgeWikiApp(Application): | ||
177 | 177 | links = links + [ |
178 | 178 | SitemapEntry('Wiki Home',c.app.url), |
179 | 179 | SitemapEntry('Browse Pages',c.app.url+'browse_pages/'), |
180 | - SitemapEntry('Browse Labels',c.app.url+'browse_tags/'), | |
181 | - SitemapEntry(''), | |
180 | + SitemapEntry('Browse Labels',c.app.url+'browse_tags/')] | |
181 | + discussion = c.app.config.discussion | |
182 | + pending_mod_count = M.Post.query.find({'discussion_id':discussion._id, 'status':'pending'}).count() | |
183 | + if pending_mod_count and h.has_artifact_access('moderate', discussion)(): | |
184 | + links.append(SitemapEntry('Moderate', discussion.url() + 'moderate', ui_icon=g.icons['pencil'], | |
185 | + small = pending_mod_count)) | |
186 | + links = links + [SitemapEntry(''), | |
182 | 187 | SitemapEntry('Wiki Help',c.app.url+'wiki_help/', className='nav_child'), |
183 | 188 | SitemapEntry('Markdown Syntax',c.app.url+'markdown_syntax/', className='nav_child') |
184 | 189 | ] |