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

+ 10 - 3
misago/acl/permissions/threads.py

@@ -65,7 +65,7 @@ def make_forum_form(request, role, form):
                                                               min_value=0, initial=3)
     form.base_fields['can_approve'] = forms.BooleanField(label=_("Can accept threads and posts"),
                                                          widget=YesNoSwitch, initial=False, required=False)
-    form.base_fields['can_edit_prefixes'] = forms.BooleanField(label=_("Can edit thread prefixes"),
+    form.base_fields['can_change_prefixes'] = forms.BooleanField(label=_("Can change threads prefixes"),
                                                              widget=YesNoSwitch, initial=False, required=False)
     form.base_fields['can_see_changelog'] = forms.BooleanField(label=_("Can see edits history"),
                                                                widget=YesNoSwitch, initial=False, required=False)
@@ -140,7 +140,7 @@ def make_forum_form(request, role, form):
                           ))
     form.fieldsets.append((
                            _("Moderation"),
-                           ('can_approve', 'can_edit_prefixes', 'can_see_changelog', 'can_pin_threads', 'can_edit_threads_posts',
+                           ('can_approve', 'can_change_prefixes', 'can_see_changelog', 'can_pin_threads', 'can_edit_threads_posts',
                             'can_move_threads_posts', 'can_close_threads', 'can_protect_posts', 'can_delete_threads',
                             'can_delete_posts', 'can_delete_attachments', 'can_delete_checkpoints', 'can_see_deleted_checkpoints')
                           ))
@@ -326,6 +326,13 @@ class ThreadsACL(BaseACL):
         except KeyError:
             raise ACLError403(_("You don't have permission to edit replies in this forum."))
 
+    def can_change_prefix(self, forum):
+        try:
+            forum_role = self.get_role(forum)
+            return forum_role['can_change_prefixes']
+        except KeyError:
+            return False
+
     def can_see_changelog(self, user, forum, post):
         try:
             forum_role = self.get_role(forum)
@@ -714,7 +721,7 @@ def build_forums(acl, perms, forums, forum_roles):
                      'attachment_size': 100,
                      'attachment_limit': 3,
                      'can_approve': False,
-                     'can_edit_prefixes': False,
+                     'can_change_prefixes': False,
                      'can_see_changelog': False,
                      'can_pin_threads': 0,
                      'can_edit_threads_posts': False,

+ 19 - 2
misago/apps/threads/forms.py

@@ -2,6 +2,7 @@ from django.utils.translation import ungettext, ugettext_lazy as _
 import floppyforms as forms
 from misago.apps.threadtype.posting.forms import NewThreadForm as NewThreadFormBase, EditThreadForm as EditThreadFormBase
 from misago.forms import Form
+from misago.models import ThreadPrefix
 from misago.validators import validate_sluggable
 
 class PollFormMixin(object):
@@ -140,19 +141,32 @@ class PollFormMixin(object):
         return data
 
 
-class NewThreadForm(NewThreadFormBase, PollFormMixin):
+class ThreadPrefixMixin(object):
+    def create_prefix_form(self):
+        self.prefixes = ThreadPrefix.objects.forum_prefixes(self.forum)
+        if self.prefixes:
+            self.add_field('thread_prefix',
+                           forms.TypedChoiceField(label=_("Thread Prefix"),
+                                                  choices=[(0, _("No prefix"))] + [(p.pk, _(p.name)) for p in self.prefixes.values()],
+                                                  coerce=int, required=False, empty_value=0))
+
+
+class NewThreadForm(NewThreadFormBase, PollFormMixin, ThreadPrefixMixin):
     def type_fields(self):
         self.poll = None
         if self.request.acl.threads.can_make_polls(self.forum):
             self.create_poll_form()
 
+        if self.request.acl.threads.can_change_prefix(self.forum):
+            self.create_prefix_form()
+
     def clean(self):
         data = super(NewThreadForm, self).clean()
         data = self.clean_poll(data)
         return data
 
 
-class EditThreadForm(EditThreadFormBase, PollFormMixin):
+class EditThreadForm(EditThreadFormBase, PollFormMixin, ThreadPrefixMixin):
     def type_fields(self):
         self.poll = self.thread.poll
 
@@ -168,6 +182,9 @@ class EditThreadForm(EditThreadFormBase, PollFormMixin):
                            forms.BooleanField(label=_("Delete poll"),
                                               required=False))
 
+        if self.request.acl.threads.can_change_prefix(self.forum):
+            self.create_prefix_form()
+
     def clean(self):
         data = super(EditThreadForm, self).clean()
         data = self.clean_poll(data)

+ 16 - 2
misago/apps/threads/posting.py

@@ -71,7 +71,15 @@ class PollFormMixin(object):
         self.thread.poll.delete()
 
 
-class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin):
+class PrefixFormMixin(object):
+    def set_prefix(self, form):
+        if form.cleaned_data['thread_prefix']:
+            self.thread.prefix_id = form.cleaned_data['thread_prefix']
+        else:
+            self.thread.prefix = None
+        self.thread.save()
+
+class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin, PrefixFormMixin):
     form_type = NewThreadForm
 
     def set_forum_context(self):
@@ -81,6 +89,9 @@ class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin):
         if form.cleaned_data.get('poll_question'):
             self.create_poll(form)
 
+        if form.cleaned_data.get('thread_prefix') != None:
+            self.set_prefix(form)
+
     def response(self):
         if self.post.moderated:
             messages.success(self.request, _("New thread has been posted. It will be hidden from other members until moderator reviews it."), 'threads')
@@ -89,7 +100,7 @@ class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin):
         return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
 
 
-class EditThreadView(EditThreadBaseView, TypeMixin, PollFormMixin):
+class EditThreadView(EditThreadBaseView, TypeMixin, PollFormMixin, PrefixFormMixin):
     form_type = EditThreadForm
 
     def after_form(self, form):
@@ -102,6 +113,9 @@ class EditThreadView(EditThreadBaseView, TypeMixin, PollFormMixin):
         elif form.cleaned_data.get('poll_question'):
             self.create_poll(form)
 
+        if form.cleaned_data.get('thread_prefix') != None:
+            self.set_prefix(form)
+
     def response(self):
         messages.success(self.request, _("Your thread has been edited."), 'threads_%s' % self.post.pk)
         return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))

+ 1 - 1
misago/fixtures/forumsroles.py

@@ -29,7 +29,7 @@ def load():
                         'attachment_size': 5000,
                         'attachment_limit': 15,
                         'can_approve': True,
-                        'can_edit_prefixes': True,
+                        'can_change_prefixes': True,
                         'can_see_changelog': True,
                         'can_pin_threads': 2,
                         'can_edit_threads_posts': True,

+ 11 - 0
templates/cranefly/threads/posting.html

@@ -60,7 +60,18 @@
           <form action="{{ get_action() }}" method="post">
             <input type="hidden" name="{{ csrf_id }}" value="{{ csrf_token }}">
             {% if 'thread_name' in form.fields %}
+            {% if 'thread_prefix' in form.fields %}
+            <div class="row">
+              <div class="span6">
+              {{ form_theme.row(form.thread_name, attrs={'class': 'span6'}) }}
+              </div>
+              <div class="span2">
+              {{ form_theme.row(form.thread_prefix, attrs={'class': 'span2'}) }}
+              </div>
+            </div>
+            {% else %}
             {{ form_theme.row(form.thread_name, attrs={'class': 'span8'}) }}
+            {% endif %}
             <hr>
             <h4>{% trans %}Message Body{% endtrans %}</h4>
             {% endif %}