Browse Source

Improved new forums creation process #69

Ralfp 12 years ago
parent
commit
1e66da7f53

+ 75 - 22
misago/apps/admin/forums/forms.py

@@ -5,7 +5,77 @@ from misago.forms import Form, YesNoSwitch
 from misago.models import Forum
 from misago.validators import validate_sluggable
 
-class CategoryForm(Form):
+class CleanAttrsMixin(object):
+    def clean_attrs(self):
+        clean = []
+        data = self.cleaned_data['attrs'].strip().split()
+        for i in data:
+            i = i.strip()
+            if not i in clean:
+                clean.append(i)
+        return ' '.join(clean)
+
+
+class NewNodeForm(Form, CleanAttrsMixin):
+    parent = False
+    perms = False
+    role = forms.ChoiceField(choices=(
+                                      ('category', _("Category")),
+                                      ('forum', _("Forum")),
+                                      ('redirect', _("Redirection")),
+                                      ))
+    name = forms.CharField(max_length=255, validators=[validate_sluggable(
+                                                                          _("Category name must contain alphanumeric characters."),
+                                                                          _("Category name is too long.")
+                                                                          )])
+    redirect = forms.URLField(max_length=255, required=False)
+    description = forms.CharField(widget=forms.Textarea, required=False)
+    closed = forms.BooleanField(widget=YesNoSwitch, required=False)
+    attrs = forms.CharField(max_length=255, required=False)
+    show_details = forms.BooleanField(widget=YesNoSwitch, required=False, initial=True)
+    style = forms.CharField(max_length=255, required=False)
+
+    layout = (
+              (
+               _("Basic Options"),
+               (
+                ('parent', {'label': _("Node Parent")}),
+                ('perms', {'label': _("Copy Permissions from")}),
+                ('role', {'label': _("Node Type"), 'help_text': _("Each Node has specific role in forums tree. This role cannot be changed after node is created.")}),
+                ('name', {'label': _("Node Name")}),
+                ('description', {'label': _("Node Description")}),
+                ('redirect', {'label': _("Redirect URL"), 'help_text': _("Redirection nodes require you to specify URL they will redirect users to upon click.")}),
+                ('closed', {'label': _("Closed Node")}),
+                ),
+              ),
+              (
+               _("Display Options"),
+               (
+                ('attrs', {'label': _("Node Attributes"), 'help_text': _('Custom templates can check nodes for predefined attributes that will change way they are rendered.')}),
+                ('show_details', {'label': _("Show Subforums Details"), 'help_text': _('Allows you to prevent this node subforums from displaying statistics, last post data, etc. ect. on forums lists.')}),
+                ('style', {'label': _("Node Style"), 'help_text': _('You can add custom CSS classess to this node, to change way it looks on board index.')}),
+                ),
+              ),
+             )
+
+    def finalize_form(self):
+        self.fields['parent'] = TreeNodeChoiceField(queryset=Forum.objects.get(special='root').get_descendants(include_self=True), level_indicator=u'- - ')
+        self.fields['perms'] = TreeNodeChoiceField(queryset=Forum.objects.get(special='root').get_descendants(), level_indicator=u'- - ', required=False, empty_label=_("Don't copy permissions"))
+
+    def clean(self):
+        cleaned_data = super(NewNodeForm, self).clean()
+        node_role = cleaned_data['role']
+
+        if node_role != 'category' and cleaned_data['parent'].special == 'root':
+            raise forms.ValidationError(_("Only categories can use Root Category as their parent."))
+        if node_role == 'redirect' and not cleaned_data['redirect']:
+            raise forms.ValidationError(_("You have to define redirection URL"))
+
+        return cleaned_data
+
+
+
+class CategoryForm(Form, CleanAttrsMixin):
     parent = False
     perms = False
     name = forms.CharField(max_length=255, validators=[validate_sluggable(
@@ -43,17 +113,8 @@ class CategoryForm(Form):
         self.fields['parent'] = TreeNodeChoiceField(queryset=Forum.objects.get(special='root').get_descendants(include_self=True), level_indicator=u'- - ')
         self.fields['perms'] = TreeNodeChoiceField(queryset=Forum.objects.get(special='root').get_descendants(), level_indicator=u'- - ', required=False, empty_label=_("Don't copy permissions"))
 
-    def clean_attrs(self):
-        clean = []
-        data = self.cleaned_data['attrs'].strip().split()
-        for i in data:
-            i = i.strip()
-            if not i in clean:
-                clean.append(i)
-        return ' '.join(clean)
-
 
-class ForumForm(Form):
+class ForumForm(Form, CleanAttrsMixin):
     parent = False
     perms = False
     name = forms.CharField(max_length=255, validators=[validate_sluggable(
@@ -89,7 +150,7 @@ class ForumForm(Form):
               (
                _("Display Options"),
                (
-                ('attrs', {'label': _("Subforums List Attributes"), 'help_text': _('Custom templates can check forums for predefined attributes that will change way subforums lists are rendered.')}),
+                ('attrs', {'label': _("Forum Attributes"), 'help_text': _('Custom templates can check forums for predefined attributes that will change way subforums lists are rendered.')}),
                 ('show_details', {'label': _("Show Subforums Details"), 'help_text': _("Allows you to prevent this forum's subforums from displaying statistics, last post data, etc. ect. on subforums list.")}),
                 ('style', {'label': _("Forum Style"), 'help_text': _('You can add custom CSS classess to this forum to change way it looks on forums lists.')}),
                 ),
@@ -100,17 +161,8 @@ class ForumForm(Form):
         self.fields['parent'] = TreeNodeChoiceField(queryset=Forum.objects.get(special='root').get_descendants(), level_indicator=u'- - ')
         self.fields['perms'] = TreeNodeChoiceField(queryset=Forum.objects.get(special='root').get_descendants(), level_indicator=u'- - ', required=False, empty_label=_("Don't copy permissions"))
 
-    def clean_attrs(self):
-        clean = []
-        data = self.cleaned_data['attrs'].strip().split()
-        for i in data:
-            i = i.strip()
-            if not i in clean:
-                clean.append(i)
-        return ' '.join(clean)
-
 
-class RedirectForm(Form):
+class RedirectForm(Form, CleanAttrsMixin):
     parent = False
     perms = False
     name = forms.CharField(max_length=255, validators=[validate_sluggable(
@@ -135,6 +187,7 @@ class RedirectForm(Form):
               (
                _("Display Options"),
                (
+                ('attrs', {'label': _("Forum Attributes"), 'help_text': _('Custom templates can check forums for predefined attributes that will change way subforums lists are rendered.')}),
                 ('style', {'label': _("Redirect Style"), 'help_text': _('You can add custom CSS classess to this redirect to change way it looks on forums lists.')}),
                 ),
                ),

+ 52 - 88
misago/apps/admin/forums/views.py

@@ -1,13 +1,15 @@
 import copy
-from django.core.urlresolvers import reverse as django_reverse
+from urlparse import urlparse
+from django.core.urlresolvers import resolve, reverse as django_reverse
 from django.db.models import Q
+from django.http import Http404
 from django.utils.translation import ugettext as _
 from mptt.forms import TreeNodeChoiceField
 from misago.admin import site
 from misago.apps.admin.widgets import *
 from misago.models import Forum
 from misago.utils.strings import slugify
-from misago.apps.admin.forums.forms import CategoryForm, ForumForm, RedirectForm, DeleteForm
+from misago.apps.admin.forums.forms import NewNodeForm, CategoryForm, ForumForm, RedirectForm, DeleteForm
 
 def reverse(route, target=None):
     if target:
@@ -68,104 +70,61 @@ class List(ListWidget):
         return Message(_('Selected forums have been pruned successfully.'), 'success'), reverse('admin_forums')
 
 
-class NewCategory(FormWidget):
+class NewNode(FormWidget):
     admin = site.get_action('forums')
-    id = 'new_category'
+    id = 'new'
     fallback = 'admin_forums'
-    form = CategoryForm
-    submit_button = _("Save Category")
+    form = NewNodeForm
+    submit_button = _("Save Node")
 
     def get_new_url(self, model):
-        return reverse('admin_forums_new_category')
+        return reverse('admin_forums_new')
 
     def get_edit_url(self, model):
         return reverse('admin_forums_edit', model)
 
-    def submit_form(self, form, target):
-        new_forum = Forum(
-                          name=form.cleaned_data['name'],
-                          slug=slugify(form.cleaned_data['name']),
-                          type='category',
-                          attrs=form.cleaned_data['attrs'],
-                          show_details=form.cleaned_data['show_details'],
-                          style=form.cleaned_data['style'],
-                          closed=form.cleaned_data['closed'],
-                          )
-        new_forum.set_description(form.cleaned_data['description'])
-        new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
-        Forum.objects.populate_tree(True)
-
-        if form.cleaned_data['perms']:
-            new_forum.copy_permissions(form.cleaned_data['perms'])
-            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
-
-        return new_forum, Message(_('New Category has been created.'), 'success')
-
-
-class NewForum(FormWidget):
-    admin = site.get_action('forums')
-    id = 'new_forum'
-    fallback = 'admin_forums'
-    form = ForumForm
-    submit_button = _("Save Forum")
-
-    def get_new_url(self, model):
-        return reverse('admin_forums_new_forum')
-
-    def get_edit_url(self, model):
-        return reverse('admin_forums_edit', model)
+    def get_initial_data(self, model):
+        print 'CALL!'
+        if not self.request.session.get('forums_admin_preffs'):
+            print 'NO PATTERN!'
+            return {}
+
+        ref = self.request.META.get('HTTP_REFERER')
+        if ref:
+            parsed = urlparse(self.request.META.get('HTTP_REFERER'));
+            try:
+                link = resolve(parsed.path)
+                if not link.url_name == 'admin_forums_new':
+                    return {}
+            except Http404:
+                return {}
+        try:
+            init = self.request.session.get('forums_admin_preffs')
+            del self.request.session['forums_admin_preffs']
+            return {
+                'parent': Forum.objects.get(id=init['parent']),
+                'perms': Forum.objects.get(id=init['perms']) if init['perms'] else None,
+                'role': init['role'],
+            }
+        except (KeyError, Forum.DoesNotExist):
+            return {}
 
     def submit_form(self, form, target):
         new_forum = Forum(
                           name=form.cleaned_data['name'],
                           slug=slugify(form.cleaned_data['name']),
-                          type='forum',
+                          type=form.cleaned_data['role'],
                           attrs=form.cleaned_data['attrs'],
-                          show_details=form.cleaned_data['show_details'],
                           style=form.cleaned_data['style'],
-                          closed=form.cleaned_data['closed'],
-                          prune_start=form.cleaned_data['prune_start'],
-                          prune_last=form.cleaned_data['prune_last'],
                           )
         new_forum.set_description(form.cleaned_data['description'])
-        new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
-        Forum.objects.populate_tree(True)
-
-        if form.cleaned_data['perms']:
-            new_forum.copy_permissions(form.cleaned_data['perms'])
-            self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
-
-        return new_forum, Message(_('New Forum has been created.'), 'success')
 
-    def __call__(self, request):
-        if self.admin.model.objects.get(special='root').get_descendants().count() == 0:
-            request.messages.set_flash(Message(_("You have to create at least one category before you will be able to create forums.")), 'error', self.admin.id)
-            return redirect(self.get_fallback_url())
-        return super(NewForum, self).__call__(request)
-
-
-class NewRedirect(FormWidget):
-    admin = site.get_action('forums')
-    id = 'new_redirect'
-    fallback = 'admin_forums'
-    form = RedirectForm
-    submit_button = _("Save Forum")
-
-    def get_new_url(self, model):
-        return reverse('admin_forums_new_redirect')
-
-    def get_edit_url(self, model):
-        return reverse('admin_forums_edit', model)
+        if form.cleaned_data['role'] == 'redirect':
+            new_forum.redirect = form.cleaned_data['redirect']
+        else:
+            new_forum.closed = form.cleaned_data['closed']
+            new_forum.show_details = form.cleaned_data['show_details']
 
-    def submit_form(self, form, target):
-        new_forum = Forum(
-                          name=form.cleaned_data['name'],
-                          slug=slugify(form.cleaned_data['name']),
-                          redirect=form.cleaned_data['redirect'],
-                          style=form.cleaned_data['style'],
-                          type='redirect',
-                          )
-        new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
         Forum.objects.populate_tree(True)
 
@@ -173,13 +132,18 @@ class NewRedirect(FormWidget):
             new_forum.copy_permissions(form.cleaned_data['perms'])
             self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
 
-        return new_forum, Message(_('New Redirect has been created.'), 'success')
-
-    def __call__(self, request):
-        if self.admin.model.objects.get(special='root').get_descendants().count() == 0:
-            request.messages.set_flash(Message(_("You have to create at least one category before you will be able to create redirects.")), 'error', self.admin.id)
-            return redirect(self.get_fallback_url())
-        return super(NewRedirect, self).__call__(request)
+        self.request.session['forums_admin_preffs'] = {
+            'parent': form.cleaned_data['parent'].pk,
+            'perms': form.cleaned_data['perms'].pk if form.cleaned_data['perms'] else None,
+            'role': form.cleaned_data['role'],
+        }
+
+        if form.cleaned_data['role'] == 'category':
+            return new_forum, Message(_('New Category has been created.'), 'success')
+        if form.cleaned_data['role'] == 'forum':
+            return new_forum, Message(_('New Forum has been created.'), 'success')
+        if form.cleaned_data['role'] == 'redirect':
+            return new_forum, Message(_('New Redirect has been created.'), 'success')
 
 
 class Up(ButtonWidget):

+ 5 - 19
misago/apps/admin/sections/forums.py

@@ -19,30 +19,16 @@ ADMIN_ACTIONS = (
                          'route': 'admin_forums'
                          },
                         {
-                         'id': 'new_category',
-                         'name': _("New Category"),
-                         'help': _("Create new category"),
-                         'route': 'admin_forums_new_category'
-                         },
-                        {
-                         'id': 'new_forum',
-                         'name': _("New Forum"),
-                         'help': _("Create new forum"),
-                         'route': 'admin_forums_new_forum'
-                         },
-                        {
-                         'id': 'new_redirect',
-                         'name': _("New Redirect"),
-                         'help': _("Create new redirect"),
-                         'route': 'admin_forums_new_redirect'
+                         'id': 'new',
+                         'name': _("New Node"),
+                         'help': _("Create new forums tree node"),
+                         'route': 'admin_forums_new'
                          },
                         ],
                route='admin_forums',
                urlpatterns=patterns('misago.apps.admin.forums.views',
                         url(r'^$', 'List', name='admin_forums'),
-                        url(r'^new/category/$', 'NewCategory', name='admin_forums_new_category'),
-                        url(r'^new/forum/$', 'NewForum', name='admin_forums_new_forum'),
-                        url(r'^new/redirect/$', 'NewRedirect', name='admin_forums_new_redirect'),
+                        url(r'^new/$', 'NewNode', name='admin_forums_new'),
                         url(r'^up/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Up', name='admin_forums_up'),
                         url(r'^down/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Down', name='admin_forums_down'),
                         url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_forums_edit'),

+ 2 - 2
misago/apps/admin/widgets.py

@@ -426,8 +426,8 @@ class FormWidget(BaseWidget):
 
     def get_form_instance(self, form, target, initial, post=False):
         if post:
-            return form(self.request.POST, request=self.request, initial=self.get_initial_data(target))
-        return form(request=self.request, initial=self.get_initial_data(target))
+            return form(self.request.POST, request=self.request, initial=initial)
+        return form(request=self.request, initial=initial)
 
     def get_layout(self, form, model):
         if self.layout: