Browse Source

Copy forum permissions from other forum.

Ralfp 12 years ago
parent
commit
f81dffe41d
3 changed files with 45 additions and 0 deletions
  1. 9 0
      misago/forums/forms.py
  2. 12 0
      misago/forums/models.py
  3. 24 0
      misago/forums/views.py

+ 9 - 0
misago/forums/forms.py

@@ -6,6 +6,7 @@ from misago.forums.models import Forum
 
 class CategoryForm(Form):
     parent = False
+    perms = False
     name = forms.CharField(max_length=255)
     description = forms.CharField(widget=forms.Textarea,required=False)
     closed = forms.BooleanField(widget=YesNoSwitch,required=False)
@@ -16,6 +17,7 @@ class CategoryForm(Form):
                _("Basic Options"),
                (
                 ('parent', {'label': _("Category Parent")}),
+                ('perms', {'label': _("Copy Permissions from")}),
                 ('name', {'label': _("Category Name")}),
                 ('description', {'label': _("Category Description")}),
                 ('closed', {'label': _("Closed Category")}),
@@ -31,11 +33,13 @@ class CategoryForm(Form):
     
     def __init__(self, *args, **kwargs):
         self.base_fields['parent'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(include_self=True),level_indicator=u'- - ')
+        self.base_fields['perms'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(),level_indicator=u'- - ',required=False,empty_label=_("Don't copy permissions"))
         super(CategoryForm, self).__init__(*args, **kwargs)
     
 
 class ForumForm(Form):
     parent = False
+    perms = False
     name = forms.CharField(max_length=255)
     description = forms.CharField(widget=forms.Textarea,required=False)
     closed = forms.BooleanField(widget=YesNoSwitch,required=False)
@@ -48,6 +52,7 @@ class ForumForm(Form):
                _("Basic Options"),
                (
                 ('parent', {'label': _("Forum Parent")}),
+                ('perms', {'label': _("Copy Permissions from")}),
                 ('name', {'label': _("Forum Name")}),
                 ('description', {'label': _("Forum Description")}),
                 ('closed', {'label': _("Closed Forum")}),
@@ -70,11 +75,13 @@ class ForumForm(Form):
     
     def __init__(self, *args, **kwargs):
         self.base_fields['parent'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(),level_indicator=u'- - ')
+        self.base_fields['perms'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(),level_indicator=u'- - ',required=False,empty_label=_("Don't copy permissions"))
         super(ForumForm, self).__init__(*args, **kwargs)
         
 
 class RedirectForm(Form):
     parent = False
+    perms = False
     name = forms.CharField(max_length=255)
     description = forms.CharField(widget=forms.Textarea,required=False)
     redirect = forms.URLField(max_length=255)
@@ -85,6 +92,7 @@ class RedirectForm(Form):
                _("Basic Options"),
                (
                 ('parent', {'label': _("Redirect Parent")}),
+                ('perms', {'label': _("Copy Permissions from")}),
                 ('name', {'label': _("Redirect Name")}),
                 ('redirect', {'label': _("Redirect URL")}),
                 ('description', {'label': _("Redirect Description")}),
@@ -100,6 +108,7 @@ class RedirectForm(Form):
     
     def __init__(self, *args, **kwargs):
         self.base_fields['parent'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(),level_indicator=u'- - ')
+        self.base_fields['perms'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(),level_indicator=u'- - ',required=False,empty_label=_("Don't copy permissions"))
         super(RedirectForm, self).__init__(*args, **kwargs)
     
 

+ 12 - 0
misago/forums/models.py

@@ -2,6 +2,7 @@ from django.conf import settings
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
 from mptt.models import MPTTModel, TreeForeignKey
+from misago.roles.models import Role
 
 class ForumManager(models.Manager):
     def treelist(self, forums, parent=None):
@@ -58,6 +59,17 @@ class Forum(MPTTModel):
         if self.description:
             import markdown
             self.description_preparsed = markdown.markdown(description, safe_mode='escape', output_format=settings.OUTPUT_FORMAT)
+       
+    def copy_permissions(self, target):
+        if target.pk != self.pk:
+            for role in Role.objects.all():
+                perms = role.get_permissions()
+                try:
+                    perms['forums'][self.pk] = perms['forums'][target.pk]
+                    role.set_permissions(perms)
+                    role.save(force_update=True)
+                except KeyError:
+                    pass
         
     def move_content(self, target):
         pass

+ 24 - 0
misago/forums/views.py

@@ -89,6 +89,11 @@ class NewCategory(FormWidget):
                      )
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
+        
+        if form.cleaned_data['perms']:
+            new_forum.copy_permissions(form.cleaned_data['perms'])
+            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            
         return new_forum, Message(_('New Category has been created.'), 'success')
 
 
@@ -117,6 +122,11 @@ class NewForum(FormWidget):
                      )
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
+        
+        if form.cleaned_data['perms']:
+            new_forum.copy_permissions(form.cleaned_data['perms'])
+            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            
         return new_forum, Message(_('New Forum has been created.'), 'success')
 
     def __call__(self, request):
@@ -149,6 +159,11 @@ class NewRedirect(FormWidget):
                      )
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
+        
+        if form.cleaned_data['perms']:
+            new_forum.copy_permissions(form.cleaned_data['perms'])
+            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            
         return new_forum, Message(_('New Redirect has been created.'), 'success')
     
     def __call__(self, request):
@@ -247,9 +262,18 @@ class Edit(FormWidget):
         if target.type == 'forum':
             target.prune_start = form.cleaned_data['prune_start']
             target.prune_last = form.cleaned_data['prune_last']
+            
         if form.cleaned_data['parent'].pk != target.parent.pk:
             target.move_to(form.cleaned_data['parent'], 'last-child')
+            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
+            
         target.save(force_update=True)
+            
+        if form.cleaned_data['perms']:
+            target.copy_permissions(form.cleaned_data['perms'])
+        
+        if form.cleaned_data['parent'].pk != target.parent.pk or form.cleaned_data['perms']:
+            request.monitor['acl_version'] = int(request.monitor['acl_version']) + 1
         
         return target, Message(_('Changes in forum "%(name)s" have been saved.') % {'name': self.original_name}, 'success')