Browse Source

WIP #410: posting options overhaul

Rafał Pitoń 10 years ago
parent
commit
d1f81cb092

+ 3 - 1
misago/conf/defaults.py

@@ -172,7 +172,9 @@ MISAGO_MARKUP_EXTENSIONS = ()
 
 MISAGO_POSTING_MIDDLEWARES = (
     'misago.threads.posting.reply.ReplyFormMiddleware',
-    'misago.threads.posting.threadstate.ThreadStateFormMiddleware',
+    'misago.threads.posting.threadprefix.ThreadPrefixFormMiddleware',
+    'misago.threads.posting.threadweight.ThreadWeightFormMiddleware',
+    'misago.threads.posting.threadclose.ThreadCloseFormMiddleware',
     'misago.threads.posting.recordedit.RecordEditMiddleware',
     'misago.threads.posting.updatestats.UpdateStatsMiddleware',
     # Note: always keep SaveChangesMiddleware middleware last one

+ 21 - 0
misago/static/misago/css/misago/forms.less

@@ -256,3 +256,24 @@
     }
   }
 }
+
+
+// Form side panel
+.form-panel{
+  &.form-side-panel {
+    .form-body {
+      &:first-child {
+        legend {
+          border-top: none;
+        }
+      }
+
+      fieldset {
+        legend {
+          font-size: @font-size-base;
+          font-weight: bold;
+        }
+      }
+    }
+  }
+}

+ 10 - 3
misago/templates/misago/posting/form.html

@@ -64,9 +64,16 @@
         {% if supporting_forms %}
         <div class="col-md-3">
 
-          {% for form in supporting_forms %}
-          {% include form.template %}
-          {% endfor %}
+          <div class="form-panel form-side-panel">
+            <div class="form-body">
+              {% for form in supporting_forms %}
+              <fieldset>
+                <legend>{{ form.legend }}</legend>
+                {% include form.template %}
+              </fieldset>
+              {% endfor %}
+            </div>
+          </div>
 
         </div>
         {% endif %}

+ 0 - 14
misago/templates/misago/posting/stateform.html

@@ -1,14 +0,0 @@
-{% load i18n misago_forms %}
-<div class="form-panel">
-  <div class="form-header">
-    <h3>{{ form.legend }}</h3>
-  </div>
-  <div class="form-body no-fieldsets">
-    {% if form.weight %}
-      {% form_row form.weight %}
-    {% endif %}
-    {% if form.is_closed %}
-      {% form_row form.is_closed %}
-    {% endif %}
-  </div>
-</div>

+ 2 - 0
misago/templates/misago/posting/threadcloseform.html

@@ -0,0 +1,2 @@
+{% load misago_forms %}
+{% form_input form.is_closed %}

+ 2 - 0
misago/templates/misago/posting/threadprefixform.html

@@ -0,0 +1,2 @@
+{% load misago_forms %}
+{% form_input form.prefix %}

+ 2 - 0
misago/templates/misago/posting/threadweightform.html

@@ -0,0 +1,2 @@
+{% load misago_forms %}
+{% form_input form.weight %}

+ 23 - 12
misago/threads/forms/reply.py

@@ -113,28 +113,39 @@ class ThreadForm(ReplyForm):
             raise forms.ValidationError(errors)
 
 
-class PrefixedThreadForm(ThreadForm):
-    pass
+class ThreadPrefixFormBase(forms.Form):
+    is_supporting = True
+    legend = _("Prefix")
+    template = "misago/posting/threadprefixform.html"
+
+    prefix = forms.TypedChoiceField(label=_("Thread weight"), initial=0,
+                                    choices=(
+                                        (0, _("Standard")),
+                                        (1, _("Pinned")),
+                                        (2, _("Announcement")),
+                                    ))
 
 
-class FullThreadStateForm(forms.Form):
+def ThreadPrefixForm(*args, **kwargs):
+    return ThreadPrefixFormBase(*args, **kwargs)
+
+
+class ThreadWeightForm(forms.Form):
     is_supporting = True
-    legend = _("Thread options")
-    template = "misago/posting/stateform.html"
+    legend = _("Weight")
+    template = "misago/posting/threadweightform.html"
 
     weight = forms.TypedChoiceField(label=_("Thread weight"), initial=0,
-                                    widget=forms.RadioSelect,
                                     choices=(
                                         (0, _("Standard")),
                                         (1, _("Pinned")),
                                         (2, _("Announcement")),
                                     ))
-    is_closed = forms.YesNoSwitch(label=_("Close thread"), initial=0)
 
 
-class ThreadWeightForm(FullThreadStateForm):
-    is_closed = None
-
+class ThreadCloseForm(forms.Form):
+    is_supporting = True
+    legend = _("Close thread")
+    template = "misago/posting/threadcloseform.html"
 
-class CloseThreadForm(FullThreadStateForm):
-    Weight = None
+    is_closed = forms.YesNoSwitch(label=_("Close thread"), initial=0)

+ 7 - 0
misago/threads/permissions.py

@@ -92,6 +92,9 @@ class PermissionsForm(forms.Form):
         label=_("Can protect posts"),
         help_text=_("Only users with this permission "
                     "can edit protected posts."))
+    can_change_threads_prefix = forms.TypedChoiceField(
+        label=_("Can change threads prefix"), coerce=int, initial=0,
+        choices=((0, _("No")), (1, _("Own threads")), (2, _("All threads"))))
     can_change_threads_weight = forms.TypedChoiceField(
         label=_("Can change threads weight"), coerce=int, initial=0,
         choices=(
@@ -149,6 +152,7 @@ def build_forum_acl(acl, forum, forums_roles, key_name):
         'can_hide_threads': 0,
         'can_hide_replies': 0,
         'can_protect_posts': 0,
+        'can_change_threads_prefix': 0,
         'can_change_threads_weight': 0,
         'can_close_threads': 0,
         'can_review_moderated_content': 0,
@@ -170,6 +174,7 @@ def build_forum_acl(acl, forum, forums_roles, key_name):
         thread_edit_time=algebra.greater_or_zero,
         reply_edit_time=algebra.greater_or_zero,
         can_protect_posts=algebra.greater,
+        can_change_threads_prefix=algebra.greater,
         can_change_threads_weight=algebra.greater,
         can_close_threads=algebra.greater,
         can_review_moderated_content=algebra.greater,
@@ -208,6 +213,7 @@ def add_acl_to_forum(user, forum):
         'can_hide_threads': 0,
         'can_hide_replies': 0,
         'can_protect_posts': 0,
+        'can_change_threads_prefix': 0,
         'can_change_threads_weight': 0,
         'can_close_threads': 0,
         'can_review_moderated_content': 0,
@@ -229,6 +235,7 @@ def add_acl_to_forum(user, forum):
             thread_edit_time=algebra.greater_or_zero,
             reply_edit_time=algebra.greater_or_zero,
             can_protect_posts=algebra.greater,
+            can_change_threads_prefix=algebra.greater,
             can_change_threads_weight=algebra.greater,
             can_close_threads=algebra.greater,
             can_review_moderated_content=algebra.greater,

+ 1 - 2
misago/threads/posting/reply.py

@@ -1,8 +1,7 @@
 from misago.markup import Editor
 
 from misago.threads.checksums import update_post_checksum
-from misago.threads.forms.reply import (ReplyForm, ThreadForm,
-                                        PrefixedThreadForm)
+from misago.threads.forms.reply import ReplyForm, ThreadForm
 from misago.threads.posting import PostingMiddleware, START, REPLY, EDIT
 
 

+ 23 - 0
misago/threads/posting/threadclose.py

@@ -0,0 +1,23 @@
+from misago.threads.forms.reply import ThreadCloseForm
+from misago.threads.posting import PostingMiddleware
+
+
+class ThreadCloseFormMiddleware(PostingMiddleware):
+    def use_this_middleware(self):
+        if self.forum.acl['can_close_threads']:
+            self.thread_is_closed = self.thread.is_closed
+            return True
+        else:
+            return False
+
+    def make_form(self):
+        if self.request.method == 'POST':
+            return ThreadCloseForm(self.request.POST, prefix=self.prefix)
+        else:
+            initial = {'is_closed': self.thread_is_closed}
+            return ThreadCloseForm(prefix=self.prefix, initial=initial)
+
+    def pre_save(self, form):
+        if self.thread_is_closed != form.cleaned_data.get('is_closed'):
+            self.thread.is_closed = form.cleaned_data.get('is_closed')
+            self.thread.update_fields.append('is_closed')

+ 23 - 0
misago/threads/posting/threadprefix.py

@@ -0,0 +1,23 @@
+from misago.threads.forms.reply import ThreadPrefixForm
+from misago.threads.posting import PostingMiddleware
+
+
+class ThreadPrefixFormMiddleware(PostingMiddleware):
+    def use_this_middleware(self):
+        if self.forum.acl['can_change_threads_weight'] and self.forum.prefixes:
+            self.thread_prefix_id = self.thread.prefix_id
+            return True
+        else:
+            return False
+
+    def make_form(self):
+        if self.request.method == 'POST':
+            return ThreadPrefixForm(self.request.POST, prefix=self.prefix)
+        else:
+            initial = {'prefix_id': self.thread_prefix_id}
+            return ThreadPrefixForm(prefix=self.prefix, initial=initial)
+
+    def pre_save(self, form):
+        if self.thread_prefix_id != form.cleaned_data.get('prefix'):
+            self.thread.prefix_id = form.cleaned_data.get('prefix')
+            self.thread.update_fields.append('prefix')

+ 0 - 49
misago/threads/posting/threadstate.py

@@ -1,49 +0,0 @@
-from misago.threads.forms.reply import (FullThreadStateForm, ThreadWeightForm,
-                                        CloseThreadForm)
-from misago.threads.posting import PostingMiddleware, START, REPLY, EDIT
-
-
-class ThreadStateFormMiddleware(PostingMiddleware):
-    def __init__(self, **kwargs):
-        super(ThreadStateFormMiddleware, self).__init__(**kwargs)
-
-        self.thread_weight = self.thread.weight
-        self.thread_is_closed = self.thread.is_closed
-
-    def make_form(self):
-        StateFormType = None
-        initial = {
-            'weight': self.thread_weight,
-            'is_closed': self.thread_is_closed,
-        }
-
-        can_change_threads_weight = self.forum.acl['can_change_threads_weight']
-        can_close_threads = self.forum.acl['can_close_threads']
-
-        if can_change_threads_weight and can_close_threads:
-            StateFormType = FullThreadStateForm
-        elif can_change_threads_weight:
-            StateFormType = ThreadWeightForm
-        elif can_close_threads:
-            StateFormType = CloseThreadForm
-
-        if StateFormType:
-            if self.request.method == 'POST':
-                return StateFormType(self.request.POST, prefix=self.prefix)
-            else:
-                return StateFormType(prefix=self.prefix, initial=initial)
-        else:
-            return False
-
-    def pre_save(self, form):
-        if self.forum.acl['can_change_threads_weight']:
-            if self.thread_weight != form.cleaned_data.get('weight'):
-                self.thread.weight = form.cleaned_data.get('weight')
-                self.thread.update_fields.append('weight')
-        if self.forum.acl['can_close_threads']:
-            if self.thread_is_closed != form.cleaned_data.get('is_closed'):
-                self.thread.is_closed = form.cleaned_data.get('is_closed')
-                self.thread.update_fields.append('is_closed')
-
-    def save(self, form):
-        pass

+ 23 - 0
misago/threads/posting/threadweight.py

@@ -0,0 +1,23 @@
+from misago.threads.forms.reply import ThreadWeightForm
+from misago.threads.posting import PostingMiddleware
+
+
+class ThreadWeightFormMiddleware(PostingMiddleware):
+    def use_this_middleware(self):
+        if self.forum.acl['can_change_threads_weight']:
+            self.thread_weight = self.thread.weight
+            return True
+        else:
+            return False
+
+    def make_form(self):
+        if self.request.method == 'POST':
+            return ThreadWeightForm(self.request.POST, prefix=self.prefix)
+        else:
+            initial = {'weight': self.thread_weight}
+            return ThreadWeightForm(prefix=self.prefix, initial=initial)
+
+    def pre_save(self, form):
+        if self.thread_weight != form.cleaned_data.get('weight'):
+            self.thread.weight = form.cleaned_data.get('weight')
+            self.thread.update_fields.append('weight')

+ 2 - 1
misago/threads/views/generic/posting.py

@@ -9,7 +9,7 @@ from misago.forums.lists import get_forum_path
 
 from misago.threads.posting import (PostingInterrupt, EditorFormset,
                                     START, REPLY, EDIT)
-from misago.threads.models import ANNOUNCEMENT, Thread, Post
+from misago.threads.models import ANNOUNCEMENT, Thread, Post, Prefix
 from misago.threads.permissions import allow_start_thread
 from misago.threads.views.generic.base import ViewBase
 
@@ -75,6 +75,7 @@ class EditorView(ViewBase):
         self.allow_mode(request.user, *mode_context)
 
         mode, forum, thread, post, quote = mode_context
+        forum.prefixes = Prefix.objects.get_forum_prefixes(forum)
         formset = EditorFormset(request=request,
                                 mode=mode,
                                 user=request.user,