Ralfp 12 лет назад
Родитель
Сommit
0a6e199834
3 измененных файлов с 116 добавлено и 11 удалено
  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.utils.translation import ungettext, ugettext_lazy as _
+from mptt.forms import TreeNodeChoiceField
 from misago.forms import Form
+from misago.forums.models import Forum
 from misago.utils import slugify
 
 class ThreadNameMixin(object):
@@ -55,6 +57,34 @@ class QuickReplyForm(Form):
     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):
     def __init__(self, data=None, request=None, threads=[], *args, **kwargs):
         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.messages import Message
 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.views.base import BaseView
 from misago.threads.views.mixins import ThreadsFormMixin
@@ -147,6 +147,40 @@ class ThreadsView(BaseView, ThreadsFormMixin):
             Thread.objects.filter(id__in=opened).update(closed=False)
             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):
         if len(ids) < 2:
             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.request.messages.set_flash(Message(_('Selected threads have been merged into new one.')), 'success', 'threads')
                 return None
-            else:
-                self.message = Message(form.non_field_errors()[0], 'error')
+            self.message = Message(form.non_field_errors()[0], 'error')
         else:
             form = MergeThreadsForm(request=self.request,threads=threads)  
         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):
         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 %}