Browse Source

Delete forum functionality

Ralfp 12 years ago
parent
commit
b93be168ac
5 changed files with 63 additions and 14 deletions
  1. 23 4
      misago/forums/forms.py
  2. 6 2
      misago/forums/models.py
  3. 4 0
      misago/forums/signals.py
  4. 20 8
      misago/forums/views.py
  5. 10 0
      misago/threads/models.py

+ 23 - 4
misago/forums/forms.py

@@ -136,16 +136,35 @@ class RedirectForm(Form):
 
 
 class DeleteForm(Form):
-    parent = False
-
     layout = (
               (
                _("Delete Options"),
                (
-                ('parent', {'label': _("Move deleted Forum contents to")}),
+                ('contents', {'label': _("Move threads to")}),
+                ('subforums', {'label': _("Move subforums to")}),
                 ),
                ),
               )
 
+    def __init__(self, *args, **kwargs):
+        self.forum = kwargs.pop('forum')
+        super(DeleteForm, self).__init__(*args, **kwargs)
+
     def finalize_form(self):
-        self.fields['parent'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(), required=False, empty_label=_("Remove with forum"), level_indicator=u'- - ')
+        self.fields['contents'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(), required=False, empty_label=_("Remove with forum"), level_indicator=u'- - ')
+        self.fields['subforums'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants(), required=False, empty_label=_("Remove with forum"), level_indicator=u'- - ')
+
+    def clean_contents(self):
+        data = self.cleaned_data['contents']
+        if data:
+            if data.type == 'category':
+                raise forms.ValidationError(_("Categories cannot contain threads."))
+            if data.type == 'redirect':
+                raise forms.ValidationError(_("Redirects cannot contain threads."))
+        return data
+
+    def clean(self):
+        cleaned_data = super(DeleteForm, self).clean()
+        if self.forum.type == 'forum' and cleaned_data['contents'] and cleaned_data['contents'].lft > self.forum.lft and cleaned_data['contents'].rght < self.forum.rght and not cleaned_data['subforums']:
+            raise forms.ValidationError(_("Destination you want to move this forum's threads to will be deleted with this forum."))
+        return cleaned_data

+ 6 - 2
misago/forums/models.py

@@ -3,6 +3,7 @@ from django.core.cache import cache
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
 from mptt.models import MPTTModel, TreeForeignKey
+from misago.forums.signals import move_forum_content, delete_forum_content
 from misago.roles.models import Role
 from misago.users.signals import rename_user
 
@@ -156,7 +157,7 @@ class Forum(MPTTModel):
                     pass
 
     def move_content(self, target):
-        pass
+        move_forum_content.send(sender=self, move_to=target)
 
     def sync(self):
         self.threads = self.thread_set.filter(moderated=False).filter(deleted=False).count()
@@ -185,7 +186,10 @@ class Forum(MPTTModel):
 
     def prune(self):
         pass
-
+    
+    def delete(self, *args, **kwargs):
+        delete_forum_content.send(sender=self)
+        super(Forum, self).delete(*args, **kwargs)
 
 """
 Signals

+ 4 - 0
misago/forums/signals.py

@@ -0,0 +1,4 @@
+import django.dispatch
+
+move_forum_content = django.dispatch.Signal(providing_args=["move_to"])
+delete_forum_content = django.dispatch.Signal()

+ 20 - 8
misago/forums/views.py

@@ -316,21 +316,33 @@ class Delete(FormWidget):
         return self.form
 
     def get_form_instance(self, form, target, initial, post=False):
-        form_inst = super(Delete, self).get_form_instance(form, target, initial, post)
-        valid_targets = Forum.tree.get(token='root').get_descendants(include_self=target.type == 'category').exclude(Q(lft__gte=target.lft) & Q(rght__lte=target.rght))
-        form_inst.fields['parent'] = TreeNodeChoiceField(queryset=valid_targets, required=False, empty_label=_("Remove with forum"), level_indicator=u'- - ')
+        if post:
+            form_inst = form(self.request.POST, forum=target, request=self.request, initial=self.get_initial_data(target))
+        else:
+            form_inst = form(forum=target, request=self.request, initial=self.get_initial_data(target))
+        if target.type != 'forum':
+            del form_inst.fields['contents']
+        valid_targets = Forum.tree.get(token='root').get_descendants().exclude(Q(lft__gte=target.lft) & Q(rght__lte=target.rght))
+        form_inst.fields['subforums'] = TreeNodeChoiceField(queryset=valid_targets, required=False, empty_label=_("Remove with forum"), level_indicator=u'- - ')
         return form_inst
 
     def submit_form(self, form, target):
-        new_parent = form.cleaned_data['parent']
+        if target.type == 'forum':
+            new_forum = form.cleaned_data['contents']
+            if new_forum:
+                target.move_content(new_forum)
+                new_forum.sync()
+                new_forum.save(force_update=True)
+        new_parent = form.cleaned_data['subforums']
         if new_parent:
-            target.move_content(new_parent)
             for child in target.get_descendants():
-                child.move_to(new_parent, 'last-child')
-                child.save(force_update=True)
+                if child.parent_id == target.pk:
+                    child.move_to(new_parent, 'last-child')
+                    child.save(force_update=True)
         else:
-            for child in target.get_descendants():
+            for child in target.get_descendants().order_by('-lft'):
                 child.delete()
         target.delete()
         Forum.objects.populate_tree(True)
+        self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
         return target, Message(_('Forum "%(name)s" has been deleted.') % {'name': self.original_name}, 'success')

+ 10 - 0
misago/threads/models.py

@@ -1,6 +1,7 @@
 from django.db import models
 from django.utils import timezone
 from django.utils.translation import ugettext_lazy as _
+from misago.forums.signals import move_forum_content
 from misago.users.signals import delete_user_content, rename_user
 from misago.utils import slugify
 
@@ -218,3 +219,12 @@ def delete_user_content_handler(sender, **kwargs):
         thread.save(force_update=True)
 
 delete_user_content.connect(delete_user_content_handler, dispatch_uid="delete_user_threads_posts")
+
+
+def move_forum_content_handler(sender, **kwargs):
+    Thread.objects.filter(forum=sender).update(forum=kwargs['move_to'])
+    Post.objects.filter(forum=sender).update(forum=kwargs['move_to'])
+    Change.objects.filter(forum=sender).update(forum=kwargs['move_to'])
+    Checkpoint.objects.filter(forum=sender).update(forum=kwargs['move_to'])
+
+move_forum_content.connect(move_forum_content_handler, dispatch_uid="move_forum_threads_posts")