Rafał Pitoń 10 лет назад
Родитель
Сommit
c81f181045

+ 1 - 0
misago/templates/misago/threads/list.html

@@ -41,6 +41,7 @@
       <div class="table-actions">
         {% include "misago/threads/paginator.html" %}
         {% include "misago/threads/sort.html" %}
+        {% include "misago/threads/show.html" %}
         {% include "misago/threads/reply_btn.html" %}
       </div>
 

+ 20 - 0
misago/templates/misago/threads/show.html

@@ -0,0 +1,20 @@
+{% load i18n %}
+{% if filters %}
+<div class="btn-group pull-left">
+  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+    {% trans "Show:" %} <strong>{{ filter_name }}</strong>
+  </button>
+  <ul class="dropdown-menu" role="menu">
+    <li class="dropdown-title">
+      {% trans "Show:" %}
+    </li>
+    {% for filtering in filters %}
+    <li>
+      <a href="{{ filtering.url }}">
+        {{ filtering.name }}
+      </a>
+    </li>
+    {% endfor %}
+  </ul>
+</div>
+{% endif %}

+ 2 - 1
misago/threads/migrations/0001_initial.py

@@ -154,8 +154,9 @@ class Migration(migrations.Migration):
         migrations.AlterIndexTogether(
             name='thread',
             index_together=set([
-                ('forum', 'weight', 'last_post'),
+                ('forum', 'weight'),
                 ('forum', 'weight', 'id'),
+                ('forum', 'weight', 'last_post'),
                 ('forum', 'weight', 'replies')
             ]),
         ),

+ 1 - 0
misago/threads/models/thread.py

@@ -49,6 +49,7 @@ class Thread(models.Model):
 
     class Meta:
         index_together = [
+            ['forum', 'weight'],
             ['forum', 'weight', 'id'],
             ['forum', 'weight', 'last_post'],
             ['forum', 'weight', 'replies'],

+ 10 - 0
misago/threads/permissions.py

@@ -107,6 +107,8 @@ class PermissionsForm(forms.Form):
     can_review_moderated_content = forms.YesNoSwitch(
         label=_("Can review moderated content"),
         help_text=_("Will see and be able to accept moderated content."))
+    can_report_content = forms.YesNoSwitch(label=_("Can report posts"))
+    can_see_reports = forms.YesNoSwitch(label=_("Can see reports"))
 
 
 def change_permissions_form(role):
@@ -150,6 +152,8 @@ def build_forum_acl(acl, forum, forums_roles, key_name):
         'can_change_threads_weight': 0,
         'can_close_threads': 0,
         'can_review_moderated_content': 0,
+        'can_report_content': 0,
+        'can_see_reports': 0,
     }
     final_acl.update(acl)
 
@@ -169,6 +173,8 @@ def build_forum_acl(acl, forum, forums_roles, key_name):
         can_change_threads_weight=algebra.greater,
         can_close_threads=algebra.greater,
         can_review_moderated_content=algebra.greater,
+        can_report_content=algebra.greater,
+        can_see_reports=algebra.greater,
     )
 
     return final_acl
@@ -205,6 +211,8 @@ def add_acl_to_forum(user, forum):
         'can_change_threads_weight': 0,
         'can_close_threads': 0,
         'can_review_moderated_content': 0,
+        'can_report_content': 0,
+        'can_see_reports': 0,
     })
 
     if user.is_authenticated():
@@ -224,6 +232,8 @@ def add_acl_to_forum(user, forum):
             can_change_threads_weight=algebra.greater,
             can_close_threads=algebra.greater,
             can_review_moderated_content=algebra.greater,
+            can_report_content=algebra.greater,
+            can_see_reports=algebra.greater,
         )
 
     forum.acl['can_see_own_threads'] = not forum.acl['can_see_all_threads']

+ 83 - 10
misago/threads/views/generic/threadslists.py

@@ -58,6 +58,40 @@ class OrderThreadsMixin(object):
         return dicts
 
 
+class FilterThreadsMixin(object):
+    def get_filter_name(self, filters, filter_by):
+        if filters:
+            if filter_by:
+                for filtering in filters:
+                    if filtering[0] == filter_by:
+                        return filtering[1]
+            else:
+                return _("All threads")
+        else:
+            return None
+
+    def get_filters_dicts(self, filters, exclude_filter, links_params):
+        url_kwargs = links_params.copy()
+        dicts = []
+
+        if filters and exclude_filter:
+            url_kwargs.pop('show', None)
+            dicts.append({
+                'url': reverse(self.link_name, kwargs=url_kwargs),
+                'name': _("All threads"),
+            })
+
+        for filtering in filters:
+            if filtering[0] != exclude_filter:
+                url_kwargs['show'] = filtering[0]
+                dicts.append({
+                    'url': reverse(self.link_name, kwargs=url_kwargs),
+                    'name': filtering[1],
+                })
+
+        return dicts
+
+
 class ThreadsView(ViewBase):
     def get_threads(self, request, kwargs):
         queryset = self.get_threads_queryset(request, forum)
@@ -90,21 +124,21 @@ class ThreadsView(ViewBase):
             thread.is_new = random.choice((True, False))
 
 
-class ForumView(OrderThreadsMixin, ThreadsView):
+class ForumView(FilterThreadsMixin, OrderThreadsMixin, ThreadsView):
     """
     Basic view for threads lists
     """
     template = 'misago/threads/list.html'
 
-    def get_threads(self, request, forum, kwargs, order_by=None, limit=None):
-        queryset = self.get_threads_queryset(request, forum)
-        queryset = self.filter_all_querysets(request, forum, queryset)
+    def get_threads(self, request, forum, kwargs,
+                    order_by=None, filter_by=None):
+        org_queryset = self.get_threads_queryset(request, forum)
+        queryset = self.filter_all_querysets(request, forum, org_queryset)
+        queryset = self.set_custom_filter(request, queryset, filter_by)
 
         announcements_qs = queryset.filter(weight=ANNOUNCEMENT)
         threads_qs = queryset.filter(weight__lt=ANNOUNCEMENT)
 
-        announcements_qs = self.filter_announcements_queryset(
-            request, forum, announcements_qs)
         threads_qs = self.filter_threads_queryset(request, forum, threads_qs)
 
         threads_qs, announcements_qs = self.order_querysets(
@@ -178,15 +212,38 @@ class ForumView(OrderThreadsMixin, ThreadsView):
 
         return queryset
 
-    def filter_announcements_queryset(self, request, forum, queryset):
-        return queryset
+    def set_custom_filter(self, request, queryset, filter_by):
+        if filter_by == 'my-threads':
+            return queryset.filter(starter_id=request.user.id)
+        elif filter_by == 'reported':
+            return queryset.filter(has_reported_posts=True)
+        elif filter_by == 'moderated-threads':
+            return queryset.filter(is_moderated=True)
+        elif filter_by == 'moderated-posts':
+            return queryset.filter(has_moderated_posts=True)
+        else:
+            return queryset
 
     def get_threads_queryset(self, request, forum):
         return forum.thread_set.all().order_by('-last_post_id')
 
     def get_default_link_params(self, forum):
         message = "forum views have to define get_default_link_params"
-        raise NotImplementedError()
+        raise NotImplementedError(message)
+
+    def get_available_filters(self, request, forum):
+        filters = []
+        if request.user.is_authenticated():
+            if forum.acl['can_see_all_threads']:
+                filters.append(('my-threads', _("My threads")))
+            if forum.acl['can_see_reports']:
+                filters.append(('reported', _("With reported posts")))
+            if forum.acl['can_review_moderated_content']:
+                filters.extend((
+                    ('moderated-threads', _("Moderated threads")),
+                    ('moderated-posts', _("With moderated posts")),
+                ))
+        return filters
 
     def dispatch(self, request, *args, **kwargs):
         forum = self.get_forum(request, **kwargs)
@@ -204,7 +261,20 @@ class ForumView(OrderThreadsMixin, ThreadsView):
         elif not self.is_ordering_default(order_by):
             links_params['sort'] = order_by
 
-        page, threads = self.get_threads(request, forum, kwargs, order_by)
+        available_filters = self.get_available_filters(request, forum)
+        if available_filters and kwargs.get('show'):
+            filter_methods = [f[0] for f in available_filters]
+            if kwargs.get('show') not in filter_methods:
+                kwargs.pop('show')
+                return redirect('misago:forum', **kwargs)
+            else:
+                filter_by = kwargs.get('show')
+                links_params['show'] = filter_by
+        else:
+            filter_by = None
+
+        page, threads = self.get_threads(
+            request, forum, kwargs, order_by, filter_by)
         self.add_threads_reads(request, threads)
 
         return self.render(request, {
@@ -215,6 +285,9 @@ class ForumView(OrderThreadsMixin, ThreadsView):
             'threads': threads,
             'link_name': self.link_name,
             'links_params': links_params,
+            'filter_name': self.get_filter_name(available_filters, filter_by),
+            'filters': self.get_filters_dicts(
+                available_filters, filter_by, links_params),
             'order_name': self.get_ordering_name(order_by),
             'order_by': self.get_orderings_dicts(order_by, links_params),
         })