Browse Source

Prefixed new thread. #208

Rafał Pitoń 11 years ago
parent
commit
ed423e3ad9

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

@@ -65,7 +65,7 @@ def make_forum_form(request, role, form):
                                                               min_value=0, initial=3)
                                                               min_value=0, initial=3)
     form.base_fields['can_approve'] = forms.BooleanField(label=_("Can accept threads and posts"),
     form.base_fields['can_approve'] = forms.BooleanField(label=_("Can accept threads and posts"),
                                                          widget=YesNoSwitch, initial=False, required=False)
                                                          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)
                                                              widget=YesNoSwitch, initial=False, required=False)
     form.base_fields['can_see_changelog'] = forms.BooleanField(label=_("Can see edits history"),
     form.base_fields['can_see_changelog'] = forms.BooleanField(label=_("Can see edits history"),
                                                                widget=YesNoSwitch, initial=False, required=False)
                                                                widget=YesNoSwitch, initial=False, required=False)
@@ -140,7 +140,7 @@ def make_forum_form(request, role, form):
                           ))
                           ))
     form.fieldsets.append((
     form.fieldsets.append((
                            _("Moderation"),
                            _("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_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')
                             'can_delete_posts', 'can_delete_attachments', 'can_delete_checkpoints', 'can_see_deleted_checkpoints')
                           ))
                           ))
@@ -326,6 +326,13 @@ class ThreadsACL(BaseACL):
         except KeyError:
         except KeyError:
             raise ACLError403(_("You don't have permission to edit replies in this forum."))
             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):
     def can_see_changelog(self, user, forum, post):
         try:
         try:
             forum_role = self.get_role(forum)
             forum_role = self.get_role(forum)
@@ -714,7 +721,7 @@ def build_forums(acl, perms, forums, forum_roles):
                      'attachment_size': 100,
                      'attachment_size': 100,
                      'attachment_limit': 3,
                      'attachment_limit': 3,
                      'can_approve': False,
                      'can_approve': False,
-                     'can_edit_prefixes': False,
+                     'can_change_prefixes': False,
                      'can_see_changelog': False,
                      'can_see_changelog': False,
                      'can_pin_threads': 0,
                      'can_pin_threads': 0,
                      'can_edit_threads_posts': False,
                      '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
 import floppyforms as forms
 from misago.apps.threadtype.posting.forms import NewThreadForm as NewThreadFormBase, EditThreadForm as EditThreadFormBase
 from misago.apps.threadtype.posting.forms import NewThreadForm as NewThreadFormBase, EditThreadForm as EditThreadFormBase
 from misago.forms import Form
 from misago.forms import Form
+from misago.models import ThreadPrefix
 from misago.validators import validate_sluggable
 from misago.validators import validate_sluggable
 
 
 class PollFormMixin(object):
 class PollFormMixin(object):
@@ -140,19 +141,32 @@ class PollFormMixin(object):
         return data
         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):
     def type_fields(self):
         self.poll = None
         self.poll = None
         if self.request.acl.threads.can_make_polls(self.forum):
         if self.request.acl.threads.can_make_polls(self.forum):
             self.create_poll_form()
             self.create_poll_form()
 
 
+        if self.request.acl.threads.can_change_prefix(self.forum):
+            self.create_prefix_form()
+
     def clean(self):
     def clean(self):
         data = super(NewThreadForm, self).clean()
         data = super(NewThreadForm, self).clean()
         data = self.clean_poll(data)
         data = self.clean_poll(data)
         return data
         return data
 
 
 
 
-class EditThreadForm(EditThreadFormBase, PollFormMixin):
+class EditThreadForm(EditThreadFormBase, PollFormMixin, ThreadPrefixMixin):
     def type_fields(self):
     def type_fields(self):
         self.poll = self.thread.poll
         self.poll = self.thread.poll
 
 
@@ -168,6 +182,9 @@ class EditThreadForm(EditThreadFormBase, PollFormMixin):
                            forms.BooleanField(label=_("Delete poll"),
                            forms.BooleanField(label=_("Delete poll"),
                                               required=False))
                                               required=False))
 
 
+        if self.request.acl.threads.can_change_prefix(self.forum):
+            self.create_prefix_form()
+
     def clean(self):
     def clean(self):
         data = super(EditThreadForm, self).clean()
         data = super(EditThreadForm, self).clean()
         data = self.clean_poll(data)
         data = self.clean_poll(data)

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

@@ -71,7 +71,15 @@ class PollFormMixin(object):
         self.thread.poll.delete()
         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
     form_type = NewThreadForm
 
 
     def set_forum_context(self):
     def set_forum_context(self):
@@ -81,6 +89,9 @@ class NewThreadView(NewThreadBaseView, TypeMixin, PollFormMixin):
         if form.cleaned_data.get('poll_question'):
         if form.cleaned_data.get('poll_question'):
             self.create_poll(form)
             self.create_poll(form)
 
 
+        if form.cleaned_data.get('thread_prefix') != None:
+            self.set_prefix(form)
+
     def response(self):
     def response(self):
         if self.post.moderated:
         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')
             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))
         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
     form_type = EditThreadForm
 
 
     def after_form(self, form):
     def after_form(self, form):
@@ -102,6 +113,9 @@ class EditThreadView(EditThreadBaseView, TypeMixin, PollFormMixin):
         elif form.cleaned_data.get('poll_question'):
         elif form.cleaned_data.get('poll_question'):
             self.create_poll(form)
             self.create_poll(form)
 
 
+        if form.cleaned_data.get('thread_prefix') != None:
+            self.set_prefix(form)
+
     def response(self):
     def response(self):
         messages.success(self.request, _("Your thread has been edited."), 'threads_%s' % self.post.pk)
         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))
         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_size': 5000,
                         'attachment_limit': 15,
                         'attachment_limit': 15,
                         'can_approve': True,
                         'can_approve': True,
-                        'can_edit_prefixes': True,
+                        'can_change_prefixes': True,
                         'can_see_changelog': True,
                         'can_see_changelog': True,
                         'can_pin_threads': 2,
                         'can_pin_threads': 2,
                         'can_edit_threads_posts': True,
                         'can_edit_threads_posts': True,

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

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