Browse Source

Move threads

Ralfp 12 years ago
parent
commit
0a6e199834
3 changed files with 116 additions and 11 deletions
  1. 30 0
      misago/threads/forms.py
  2. 44 11
      misago/threads/views/list.py
  3. 42 0
      templates/sora/threads/move.html

+ 30 - 0
misago/threads/forms.py

@@ -1,6 +1,8 @@
 from django import forms
 from django import forms
 from django.utils.translation import ungettext, ugettext_lazy as _
 from django.utils.translation import ungettext, ugettext_lazy as _
+from mptt.forms import TreeNodeChoiceField
 from misago.forms import Form
 from misago.forms import Form
+from misago.forums.models import Forum
 from misago.utils import slugify
 from misago.utils import slugify
 
 
 class ThreadNameMixin(object):
 class ThreadNameMixin(object):
@@ -55,6 +57,34 @@ class QuickReplyForm(Form):
     post = forms.CharField(widget=forms.Textarea)
     post = forms.CharField(widget=forms.Textarea)
 
 
 
 
+class MoveThreadsForm(Form):
+    error_source = 'new_forum'
+    
+    def __init__(self, data=None, request=None, forum=None, *args, **kwargs):
+        self.forum = forum
+        super(MoveThreadsForm, self).__init__(data, request=request, *args, **kwargs)
+    
+    def finalize_form(self):
+        self.fields['new_forum'] = TreeNodeChoiceField(queryset=Forum.tree.get(token='root').get_descendants().filter(pk__in=self.request.acl.forums.acl['can_browse']),level_indicator=u'- - ')
+        self.layout = [
+                       [
+                        _("Thread Options"),
+                        [
+                         ('new_forum', {'label': _("Move Thread to"), 'help_text': _("Select forum you want to move threads to.")}),
+                         ],
+                        ],
+                       ]
+            
+    def clean_new_forum(self):
+        new_forum = self.cleaned_data['new_forum']
+        # Assert its forum and its not current forum
+        if new_forum.type != 'forum':
+            raise forms.ValidationError(_("This is not forum."))
+        if new_forum.pk == self.forum.pk:
+            raise forms.ValidationError(_("New forum is same as current one."))
+        return new_forum
+
+
 class MergeThreadsForm(Form, ThreadNameMixin):
 class MergeThreadsForm(Form, ThreadNameMixin):
     def __init__(self, data=None, request=None, threads=[], *args, **kwargs):
     def __init__(self, data=None, request=None, threads=[], *args, **kwargs):
         self.threads = threads
         self.threads = threads

+ 44 - 11
misago/threads/views/list.py

@@ -10,7 +10,7 @@ from misago.forms import FormLayout, FormFields
 from misago.forums.models import Forum
 from misago.forums.models import Forum
 from misago.messages import Message
 from misago.messages import Message
 from misago.readstracker.trackers import ForumsTracker, ThreadsTracker
 from misago.readstracker.trackers import ForumsTracker, ThreadsTracker
-from misago.threads.forms import MergeThreadsForm
+from misago.threads.forms import MoveThreadsForm, MergeThreadsForm
 from misago.threads.models import Thread, Post
 from misago.threads.models import Thread, Post
 from misago.threads.views.base import BaseView
 from misago.threads.views.base import BaseView
 from misago.threads.views.mixins import ThreadsFormMixin
 from misago.threads.views.mixins import ThreadsFormMixin
@@ -147,6 +147,40 @@ class ThreadsView(BaseView, ThreadsFormMixin):
             Thread.objects.filter(id__in=opened).update(closed=False)
             Thread.objects.filter(id__in=opened).update(closed=False)
             self.request.messages.set_flash(Message(_('Selected threads have been opened.')), 'success', 'threads')
             self.request.messages.set_flash(Message(_('Selected threads have been opened.')), 'success', 'threads')
     
     
+    def action_move(self, ids):
+        threads = []
+        for thread in self.threads:
+            if thread.pk in ids:
+                threads.append(thread)
+        if self.request.POST.get('origin') == 'move_form':
+            form = MoveThreadsForm(self.request.POST,request=self.request,forum=self.forum)
+            if form.is_valid():
+                new_forum = form.cleaned_data['new_forum']
+                for thread in threads:
+                    thread.forum = new_forum
+                    thread.post_set.update(forum=new_forum)
+                    thread.change_set.update(forum=new_forum)
+                    thread.checkpoint_set.update(forum=new_forum)
+                    thread.save(force_update=True)
+                new_forum.sync()
+                new_forum.save(force_update=True)
+                self.forum.sync()
+                self.forum.save(force_update=True)
+                self.request.messages.set_flash(Message(_('Selected threads have been moved to "%(forum)s".') % {'forum': new_forum.name}), 'success', 'threads')
+                return None
+            self.message = Message(form.non_field_errors()[0], 'error')
+        else:
+            form = MoveThreadsForm(request=self.request,forum=self.forum)
+        return self.request.theme.render_to_response('threads/move.html',
+                                                     {
+                                                      'message': self.message,
+                                                      'forum': self.forum,
+                                                      'parents': self.parents,
+                                                      'threads': threads,
+                                                      'form': FormLayout(form),
+                                                      },
+                                                     context_instance=RequestContext(self.request)); 
+            
     def action_merge(self, ids):
     def action_merge(self, ids):
         if len(ids) < 2:
         if len(ids) < 2:
             raise ValidationError(_("You have to pick two or more threads to merge."))
             raise ValidationError(_("You have to pick two or more threads to merge."))
@@ -183,19 +217,18 @@ class ThreadsView(BaseView, ThreadsFormMixin):
                 self.forum.save(force_update=True)
                 self.forum.save(force_update=True)
                 self.request.messages.set_flash(Message(_('Selected threads have been merged into new one.')), 'success', 'threads')
                 self.request.messages.set_flash(Message(_('Selected threads have been merged into new one.')), 'success', 'threads')
                 return None
                 return None
-            else:
-                self.message = Message(form.non_field_errors()[0], 'error')
+            self.message = Message(form.non_field_errors()[0], 'error')
         else:
         else:
             form = MergeThreadsForm(request=self.request,threads=threads)  
             form = MergeThreadsForm(request=self.request,threads=threads)  
         return self.request.theme.render_to_response('threads/merge.html',
         return self.request.theme.render_to_response('threads/merge.html',
-                                                {
-                                                 'message': self.message,
-                                                 'forum': self.forum,
-                                                 'parents': self.parents,
-                                                 'threads': threads,
-                                                 'form': FormLayout(form),
-                                                 },
-                                                context_instance=RequestContext(self.request));      
+                                                     {
+                                                      'message': self.message,
+                                                      'forum': self.forum,
+                                                      'parents': self.parents,
+                                                      'threads': threads,
+                                                      'form': FormLayout(form),
+                                                      },
+                                                     context_instance=RequestContext(self.request));      
         
         
     def action_close(self, ids):
     def action_close(self, ids):
         closed = []
         closed = []

+ 42 - 0
templates/sora/threads/move.html

@@ -0,0 +1,42 @@
+{% extends "sora/layout.html" %}
+{% load i18n %}
+{% load url from future %}
+{% import "_forms.html" as form_theme with context %}
+{% import "sora/macros.html" as macros with context %}
+
+{% block title %}{{ macros.page_title(title=_("Move Threads"),parent=forum.name) }}{% endblock %}
+
+{% block breadcrumb %}{{ super() }} <span class="divider">/</span></li>
+{% for parent in parents %}
+<li class="first"><a href="{{ parent.type|url(forum=parent.pk, slug=parent.slug) }}">{{ parent.name }}</a> <span class="divider">/</span></li>
+{% endfor %}
+<li class="first"><a href="{% url 'forum' forum=forum.pk, slug=forum.slug %}">{{ forum.name }}</a> <span class="divider">/</span></li>
+<li class="active">{% trans %}Move Threads{% endtrans %}
+{%- endblock %}
+
+{% block content %}
+<div class="page-header">
+  <ul class="breadcrumb">
+    {{ self.breadcrumb() }}</li>
+  </ul>
+  <h1>{% trans %}Move Threads{% endtrans %} <small>{{ forum.name }}</small></h1>
+</div>
+<div class="row">
+  <div class="span8 offset2">
+    {% if message %}{{ macros.draw_message(message) }}{% endif %}
+    <form action="{% url 'forum' forum=forum.pk, slug=forum.slug %}" method="post">
+      <input type="hidden" name="{{ csrf_id }}" value="{{ csrf_token }}">
+      <input type="hidden" name="origin" value="move_form">
+      <input type="hidden" name="list_action" value="move">
+      {% for thread in threads -%}
+      <input type="hidden" name="list_items" value="{{ thread.pk }}">
+      {% endfor %}
+      {{ form_theme.form_widget(form, width=8) }}
+      <div class="form-actions">
+        <button name="save" type="submit" class="btn btn-primary">{% trans %}Move Threads{% endtrans %}</button>
+        <a href="{% url 'forum' forum=forum.pk, slug=forum.slug %}" class="btn">{% trans %}Cancel{% endtrans %}</a>
+      </div>
+    </form>
+  </div>
+</div>
+{% endblock %}