Rafał Pitoń 10 лет назад
Родитель
Сommit
7c4e6d7ea9

+ 13 - 0
misago/static/misago/js/misago-posting.js

@@ -267,6 +267,19 @@ $(function() {
 
     }
 
+    this.append = function(text) {
+
+      var $textarea = this.$form.find('textarea');
+      $textarea.val($.trim($.trim($textarea.val()) + '\n\n' + text));
+      console.log($textarea.prop("scrollHeight"));
+      $textarea.scrollTop($textarea.prop("scrollHeight"));
+
+      if (this.$preview != null) {
+        this.$preview.update();
+      }
+
+    }
+
   }
 
   Misago.Posting = new MisagoPosting();

+ 24 - 3
misago/static/misago/js/misago-posts.js

@@ -4,17 +4,17 @@ $(function() {
   MisagoPost = function($element) {
 
     this.$e = $element;
-    this.$content = this.$e.find('.post-body');
+    this.$content = this.$e.find('article.post-body');
     this.id = this.$e.data('id');
 
     var _this = this;
 
     this.highlight = function() {
-      $element.addClass('highlighted');
+      this.$e.addClass('highlighted');
     }
 
     this.remove_highlight = function() {
-      $element.removeClass('highlighted');
+      this.$e.removeClass('highlighted');
     }
 
     this.change_post = function(new_content) {
@@ -42,6 +42,7 @@ $(function() {
             Misago.Alerts.success(data.message);
             _this.change_post(data.parsed);
             Misago.Posting.cancel();
+            Misago.Scroll.scrollTo(_this.$e);
             return false;
           }
         });
@@ -49,6 +50,26 @@ $(function() {
 
     });
 
+    this.quote = function() {
+
+      $.get(_this.$e.data('quote-url'), function(data) {
+        Misago.Posting.append(data.quote);
+      });
+
+    }
+
+    this.$e.find('.btn-reply').click(function() {
+
+      if (!Misago.Posting.is_open()) {
+        Misago.reply_thread(function() {
+          _this.quote();
+        });
+      } else {
+        _this.quote();
+      }
+
+    });
+
   }
 
   MisagoPosts = function() {

+ 1 - 1
misago/templates/misago/thread/post.html

@@ -1,5 +1,5 @@
 {% load i18n misago_avatars %}
-<div id="post-{{ post.pk }}" class="media post thread-post{% if post.poster_id and post.poster.rank.css_class %} rank-{{ post.poster.rank.css_class }}{% endif %}" data-id="{{ post.pk }}" data-edit-url="{{ post.get_edit_url }}"=>
+<div id="post-{{ post.pk }}" class="media post thread-post{% if post.poster_id and post.poster.rank.css_class %} rank-{{ post.poster.rank.css_class }}{% endif %}" data-id="{{ post.pk }}" data-edit-url="{{ post.get_edit_url }}" data-quote-url="{{ post.get_quote_url }}">
   {% if post.poster %}
   <a class="user-avatar pull-left" href="{% url USER_PROFILE_URL user_slug=post.poster.slug user_id=post.poster.id %}">
     <img class="media-object" src="{{ post.poster|avatar:100 }}" alt="{% trans "Poster avatar" %}">

+ 12 - 1
misago/templates/misago/thread/replies.html

@@ -153,16 +153,27 @@
   {% if thread.acl.can_reply %}
   <script lang="JavaScript">
     $(function() {
-      $('.reply-to-thread button').click(function() {
+      Misago.reply_thread = function(extra_on_load) {
+        if (extra_on_load == undefined) {
+          extra_on_load = function() {};
+        }
+
         Misago.Posting.load({
           api_url: "{% url 'misago:reply_thread' forum_id=forum.id thread_id=thread.id %}",
           on_load: function() {
             $('.reply-to-thread').hide();
+            extra_on_load();
           },
           on_cancel: function() {
             $('.reply-to-thread').show();
           }
         });
+      }
+
+      $('.reply-to-thread button').click(function() {
+        if (!Misago.Posting.is_open()) {
+          Misago.reply_thread();
+        }
       });
     });
   </script>

+ 3 - 0
misago/threads/models/post.py

@@ -93,6 +93,9 @@ class Post(models.Model):
             'post_id': self.id
         })
 
+    def get_quote_url(self):
+        return reverse('misago:quote_post', kwargs={'post_id': self.id})
+
     @property
     def short(self):
         if self.is_valid:

+ 2 - 1
misago/threads/posting/recordedit.py

@@ -14,4 +14,5 @@ class RecordEditMiddleware(PostingMiddleware):
     def save(self, form):
         if self.mode == EDIT:
             # record edit
-            pass
+            self.post.edits += 1
+            self.post.update_fields.append('edits')

+ 4 - 4
misago/threads/posting/reply.py

@@ -14,17 +14,17 @@ class ReplyFormMiddleware(PostingMiddleware):
             if can_edit_thread(self.user, self.thread):
                 FormType = ThreadForm
             else:
-                FormType = FormType
+                FormType = ReplyForm
         elif self.mode == START:
             FormType = ThreadForm
         else:
-            FormType = FormType
+            FormType = ReplyForm
 
         if FormType == ThreadForm:
             if self.request.method == 'POST':
-                form = ThreadForm(self.thread, self.post, self.request.POST)
+                form = FormType(self.thread, self.post, self.request.POST)
             else:
-                form = ThreadForm(self.thread, self.post, initial=initial_data)
+                form = FormType(self.thread, self.post, initial=initial_data)
         else:
             if self.request.method == 'POST':
                 form = FormType(self.post, self.request.POST)

+ 5 - 0
misago/threads/urls.py

@@ -41,6 +41,11 @@ urlpatterns += patterns('',
 )
 
 
+from misago.threads.views.post import QuotePostView
+urlpatterns += patterns('',
+    url(r'^quote-post/(?P<post_id>\d+)/$', QuotePostView.as_view(), name='quote_post'),
+)
+
 # new threads lists
 from misago.threads.views.newthreads import NewThreadsView, clear_new_threads
 urlpatterns += patterns('',

+ 33 - 0
misago/threads/views/post.py

@@ -0,0 +1,33 @@
+from django.db.transaction import atomic
+from django.http import JsonResponse
+
+from misago.threads.views.generic.base import ViewBase
+
+
+__all__ = ['QuotePostView']
+
+
+class PostView(ViewBase):
+    is_atomic = True
+
+    def dispatch(self, request, *args, **kwargs):
+        if self.is_atomic:
+            with atomic():
+                post = self.get_post(request, True, **kwargs)
+                return self.real_dispatch(request, post)
+        else:
+            post = self.get_post(request, **kwargs)
+            return self.real_dispatch(request, post)
+
+    def real_dispatch(self, request, post):
+        raise NotImplementedError(
+            "post views have to override real_dispatch method")
+
+
+class QuotePostView(PostView):
+    def real_dispatch(self, request, post):
+        quote_tpl = u'[quote="%s, post:%s, topic:%s"]\n%s\n[/quote]'
+        formats = (post.poster_name, post.pk, post.thread_id, post.original)
+        return JsonResponse({
+            'quote': quote_tpl % formats
+        })

+ 2 - 1
misago/threads/views/posting.py

@@ -1,7 +1,7 @@
 from django.contrib import messages
 from django.db.transaction import atomic
 from django.http import JsonResponse
-from django.shortcuts import redirect, render
+from django.shortcuts import redirect
 from django.utils.translation import ugettext as _
 from django.views.generic import View
 
@@ -127,6 +127,7 @@ class PostingView(ViewBase):
                             'post_url': goto.post(request.user, thread, post),
                             'parsed': post.parsed,
                             'original': post.original,
+                            'title': thread.title,
                         })
                     except PostingInterrupt as e:
                         return JsonResponse({'interrupt': e.message})