• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

allura


Commit MetaInfo

修訂f3e4da9020167688733415f816863d8d0baebe6e (tree)
時間2011-02-19 01:15:58
作者Jenny Steele <jsteele@geek...>
CommiterJenny Steele

Log Message

[#1468] Moderation fixes

Signed-off-by: Jenny Steele <jsteele@geek.net>

Change Summary

差異

--- a/Allura/allura/controllers/discuss.py
+++ b/Allura/allura/controllers/discuss.py
@@ -369,12 +369,14 @@ class DiscussionAttachmentsController(AttachmentsController):
369369
370370 class ModerationController(BaseController):
371371 __metaclass__=h.ProxiedAttrMeta
372+ PostModel = M.Post
372373 M=h.attrproxy('_discussion_controller', 'M')
373374 W=h.attrproxy('_discussion_controller', 'W')
374375 ThreadController=h.attrproxy('_discussion_controller', 'ThreadController')
375376 PostController=h.attrproxy('_discussion_controller', 'PostController')
376377 AttachmentController=h.attrproxy('_discussion_controller', 'AttachmentController')
377378
379+
378380 def _check_security(self):
379381 require(has_artifact_access('moderate', self.discussion))
380382
@@ -389,10 +391,10 @@ class ModerationController(BaseController):
389391 @expose('jinja:discussion/moderate.html')
390392 @validate(pass_validator)
391393 def index(self, **kw):
392- kw = WidgetConfig.post_filter.to_python(kw, None)
394+ kw = WidgetConfig.post_filter.validate(kw, None)
393395 page = kw.pop('page', 0)
394396 limit = kw.pop('limit', 50)
395- status = kw.pop('status', '-')
397+ status = kw.pop('status', 'pending')
396398 flag = kw.pop('flag', None)
397399 c.post_filter = WidgetConfig.post_filter
398400 c.moderate_posts = WidgetConfig.moderate_posts
@@ -402,8 +404,10 @@ class ModerationController(BaseController):
402404 query['status'] = status
403405 if flag:
404406 query['flags'] = {'$gte': int(flag) }
405- q = M.Post.query.find(query)
407+ q = self.PostModel.query.find(query)
406408 count = q.count()
409+ if not page:
410+ page = 0
407411 page = int(page)
408412 limit = int(limit)
409413 q = q.skip(page)
@@ -418,21 +422,16 @@ class ModerationController(BaseController):
418422 @h.vardec
419423 @expose()
420424 @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'
436435 redirect(request.referer)
437436
438437 class PostRestController(PostController):
--- a/Allura/allura/lib/widgets/discuss.py
+++ b/Allura/allura/lib/widgets/discuss.py
@@ -87,7 +87,7 @@ class PostFilter(ff.ForgeForm):
8787 ew.Option(py_value='spam', label='Spam'),
8888 ew.Option(py_value='pending', label='Pending moderation'),
8989 ew.Option(py_value='ok', label='Ok')],
90- if_missing='-'),
90+ if_missing='pending'),
9191 ew.IntField(name='flag',
9292 label='Show posts with at least "n" flags',
9393 css_class='text',
--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -302,6 +302,7 @@ class Post(Message, VersionedArtifact):
302302 class __mongometa__:
303303 name='post'
304304 history_class = PostHistory
305+ indexes = [ 'discussion_id', 'thread_id' ]
305306 type_s = 'Post'
306307
307308 thread_id = ForeignIdProperty(Thread)
--- a/Allura/allura/templates/discussion/moderate.html
+++ b/Allura/allura/templates/discussion/moderate.html
@@ -16,6 +16,6 @@ Moderation Queue
1616 <a href="?status={{status}}&amp;flag={{flag}}&amp;page={{page-limit}}">Previous Page</a>
1717 <a href="?status={{status}}&amp;flag={{flag}}&amp;page={{page+limit}}">Next Page</a>
1818 </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')}}
2121 {% endblock %}
--- a/ForgeDiscussion/forgediscussion/controllers/forum.py
+++ b/ForgeDiscussion/forgediscussion/controllers/forum.py
@@ -142,48 +142,4 @@ class ForumPostController(PostController):
142142 super(ForumPostController, self).moderate(**kw)
143143
144144 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
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -156,6 +156,11 @@ class ForgeTrackerApp(Application):
156156 links.append(SitemapEntry('Edit Milestones', self.config.url() + 'milestones', ui_icon=g.icons['table']))
157157 links.append(SitemapEntry('Edit Searches', c.project.url() + 'admin/' + c.app.config.options.mount_point + '/bins/', ui_icon=g.icons['search']))
158158 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))
159164 if ticket:
160165 for aref in ticket.references+ticket.backreferences.values():
161166 artifact = M.ArtifactReference(aref).artifact
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -177,8 +177,13 @@ class ForgeWikiApp(Application):
177177 links = links + [
178178 SitemapEntry('Wiki Home',c.app.url),
179179 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(''),
182187 SitemapEntry('Wiki Help',c.app.url+'wiki_help/', className='nav_child'),
183188 SitemapEntry('Markdown Syntax',c.app.url+'markdown_syntax/', className='nav_child')
184189 ]