Ralfp 12 лет назад
Родитель
Сommit
894ae5ef8e

+ 26 - 6
misago/apps/reports/list.py

@@ -1,11 +1,12 @@
 from itertools import chain
 from django.core.urlresolvers import reverse
+from django.db.models import F
 from django.http import Http404
 from django.shortcuts import redirect
 from django.utils.translation import ugettext as _
 from misago.apps.threadtype.list import ThreadsListBaseView, ThreadsListModeration
 from misago.messages import Message
-from misago.models import Forum, Thread
+from misago.models import Forum, Thread, Post
 from misago.readstrackers import ThreadsTracker
 from misago.utils.pagination import make_pagination
 from misago.apps.reports.mixins import TypeMixin
@@ -15,8 +16,8 @@ class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
         self.forum = Forum.objects.get(special='reports')
 
     def threads_queryset(self):
-        announcements = self.forum.thread_set.filter(weight=2).order_by('-pk')
-        threads = self.forum.thread_set.filter(weight__lt=2).order_by('-weight', '-last')
+        announcements = self.forum.thread_set.filter(weight=2).prefetch_related('report_for').order_by('-pk')
+        threads = self.forum.thread_set.filter(weight__lt=2).prefetch_related('report_for').order_by('-weight', '-last')
 
         # Add in first and last poster
         if self.request.settings.avatars_on_threads_list:
@@ -52,22 +53,40 @@ class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
             actions.append(('sticky', _('Change to resolved')))
             actions.append(('normal', _('Change to bogus')))
             if acl['can_delete_threads']:
-                actions.append(('undelete', _('Restore threads')))
-                actions.append(('soft', _('Hide threads')))
+                actions.append(('undelete', _('Restore reports')))
+                actions.append(('soft', _('Hide reports')))
             if acl['can_delete_threads'] == 2:
-                actions.append(('hard', _('Delete threads')))
+                actions.append(('hard', _('Delete reports')))
         except KeyError:
             pass
         return actions
 
+    def mass_resolve(self, ids):
+        reported_posts = []
+        reported_threads = []
+        second_pass = []
+        for thread in self.threads:
+            if thread.pk in ids:
+                 reported_posts.append(thread.report_for.pk)
+                 reported_threads.append(thread.report_for.thread_id)
+                 if thread.weight == 2:
+                    second_pass.append(thread.pk)
+        if reported_threads:
+            Thread.objects.filter(id__in=reported_threads).update(replies_reported=F('replies_reported') - 1)
+            Post.objects.filter(id__in=reported_posts).update(reported=False)
+        if second_pass:
+            Thread.objects.filter(id__in=second_pass).update(weight=1)
+
     def action_sticky(self, ids):
         if self._action_sticky(ids):
+            self.mass_resolve(ids)
             self.request.messages.set_flash(Message(_('Selected reports were set as resolved.')), 'success', 'threads')
         else:
             self.request.messages.set_flash(Message(_('No reports were set as resolved.')), 'info', 'threads')
 
     def action_normal(self, ids):
         if self._action_normal(ids):
+            self.mass_resolve(ids)
             self.request.messages.set_flash(Message(_('Selected reports were set as bogus.')), 'success', 'threads')
         else:
             self.request.messages.set_flash(Message(_('No reports were set as bogus.')), 'info', 'threads')
@@ -80,6 +99,7 @@ class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
 
     def action_soft(self, ids):
         if self._action_soft(ids):
+            self.mass_resolve(ids)
             self.request.messages.set_flash(Message(_('Selected reports have been hidden.')), 'success', 'threads')
         else:
             self.request.messages.set_flash(Message(_('No reports were hidden.')), 'info', 'threads')

+ 7 - 1
misago/apps/reports/mixins.py

@@ -1,2 +1,8 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+
 class TypeMixin(object):
-    type_prefix = 'report'
+    type_prefix = 'report'
+
+    def threads_list_redirect(self):
+        return redirect(reverse('reports'))

+ 1 - 1
misago/apps/threads/urls.py

@@ -23,7 +23,7 @@ urlpatterns = patterns('misago.apps.threads',
     url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<post>\d+)/upvote/$', 'jumps.UpvotePostView', name="post_upvote"),
     url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<post>\d+)/downvote/$', 'jumps.DownvotePostView', name="post_downvote"),
     url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<post>\d+)/report/$', 'jumps.ReportPostView', name="post_report"),
-    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<post>\d+)/show-report/$', 'jumps.ReportPostView', name="post_report_show"),
+    url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/(?P<post>\d+)/show-report/$', 'jumps.ShowPostReportView', name="post_report_show"),
     url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/delete/$', 'delete.DeleteThreadView', name="thread_delete"),
     url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/hide/$', 'delete.HideThreadView', name="thread_hide"),
     url(r'^thread/(?P<slug>(\w|-)+)-(?P<thread>\d+)/show/$', 'delete.ShowThreadView', name="thread_show"),

+ 28 - 16
misago/apps/threadtype/jumps.py

@@ -1,3 +1,4 @@
+from django.conf import settings
 from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.utils import timezone
@@ -254,18 +255,21 @@ class ReportPostBaseView(JumpView):
         @block_guest
         @check_csrf
         def view(request):
-            reported = None
+            report = None
+            made_report = False
             if self.post.reported:
-                reported = self.post.live_report()
-
-            if reported and reported.start_poster_id != request.user.pk:
-                # Append our q.q to existing report?
-                try:
-                    reported.start_post.checkpoint_set.get(user=request.user, action="reported")
-                except Checkpoint.DoesNotExist:
-                    reported.start_post.set_checkpoint(self.request, 'reported', user)
-                    reported.start_post.save(force_update=True)
-            else:
+                report = self.post.live_report()
+
+                if report and report.start_poster_id != request.user.pk:
+                    # Append our q.q to existing report?
+                    try:
+                        report.start_post.checkpoint_set.get(user=request.user, action="reported")
+                    except Checkpoint.DoesNotExist:
+                        report.start_post.set_checkpoint(self.request, 'reported', user)
+                        report.start_post.save(force_update=True)
+                    made_report = True
+
+            if not report:
                 # File up new report
                 now = timezone.now()
                 report_name = _('#%(post)s by %(author)s in "%(thread)s"')
@@ -287,7 +291,7 @@ Member @%(reporter)s has reported following post by @%(reported)s:
                 reason_post = reason_post.strip() % {
                                              'reporter': request.user.username,
                                              'reported': self.post.user_name,
-                                             'post': self.redirect_to_post(self.post),
+                                             'post': settings.BOARD_ADDRESS + self.redirect_to_post(self.post)['Location'],
                                              'quote': self.post.quote(),
                                             }
 
@@ -336,9 +340,17 @@ Member @%(reporter)s has reported following post by @%(reported)s:
                 self.thread.replies_reported += 1
                 self.thread.save(force_update=True)
                 request.monitor.increase('reported_posts')
-            if request.is_ajax():
-                return json_response(request, message=_("Selected post has been reported and will receive moderator attention. Thank you."))
-            self.request.messages.set_flash(Message(_("Selected post has been reported and will receive moderator attention. Thank you.")), 'info', 'threads_%s' % self.post.pk)
+                made_report = True
+
+            if made_report:
+                if request.is_ajax():
+                    return json_response(request, message=_("Selected post has been reported and will receive moderator attention. Thank you."))
+                self.request.messages.set_flash(Message(_("Selected post has been reported and will receive moderator attention. Thank you.")), 'info', 'threads_%s' % self.post.pk)
+            else:
+                if request.is_ajax():
+                    return json_response(request, message=_("You have already reported this post. One of moderators will handle it as soon as it is possible. Thank you for your patience."))
+                self.request.messages.set_flash(Message(_("You have already reported this post. One of moderators will handle it as soon as it is possible. Thank you for your patience.")), 'info', 'threads_%s' % self.post.pk)
+
             return self.redirect_to_post(self.post)
         return view(self.request)
 
@@ -352,7 +364,7 @@ class ShowPostReportBaseView(JumpView):
             if not self.post.reported:
                 return error404()
             reports = Forum.objects.special_model('reports')
-            self.request.acl.forums.allow_thread_view(reports)
+            self.request.acl.forums.allow_forum_view(reports)
             report = self.post.live_report()
             if not report:
                 return error404()

+ 10 - 8
misago/models/threadmodel.py

@@ -194,10 +194,11 @@ def report_update_handler(sender, **kwargs):
         thread = kwargs.get('instance')
         if thread.weight < 2 and thread.report_for_id:
             reported_post = thread.report_for
-            reported_post.reported = False
-            reported_post.save(force_update=True)
-            reported_post.thread.replies_reported -= 1
-            reported_post.thread.save(force_update=True)
+            if reported_post.reported:
+                reported_post.reported = False
+                reported_post.save(force_update=True)
+                reported_post.thread.replies_reported -= 1
+                reported_post.thread.save(force_update=True)
 
 pre_save.connect(report_update_handler, dispatch_uid="sync_post_reports_on_update")
 
@@ -207,10 +208,11 @@ def report_delete_handler(sender, **kwargs):
         thread = kwargs.get('instance')
         if thread.report_for_id:
             reported_post = thread.report_for
-            reported_post.reported = False
-            reported_post.save(force_update=True)
-            reported_post.thread.replies_reported -= 1
-            reported_post.thread.save(force_update=True)
+            if reported_post.reported:
+                reported_post.reported = False
+                reported_post.save(force_update=True)
+                reported_post.thread.replies_reported -= 1
+                reported_post.thread.save(force_update=True)
 
 pre_delete.connect(report_delete_handler, dispatch_uid="sync_post_reports_on_delete")