|
@@ -12,7 +12,7 @@ from misago.threads.forms import PostForm
|
|
|
from misago.threads.models import Thread, Post
|
|
|
from misago.threads.views.base import BaseView
|
|
|
from misago.views import error403, error404
|
|
|
-from misago.utils import slugify
|
|
|
+from misago.utils import make_pagination, slugify
|
|
|
|
|
|
class PostingView(BaseView):
|
|
|
def fetch_target(self, kwargs):
|
|
@@ -31,6 +31,7 @@ class PostingView(BaseView):
|
|
|
self.thread = Thread.objects.get(pk=kwargs['thread'])
|
|
|
self.forum = self.thread.forum
|
|
|
self.request.acl.forums.allow_forum_view(self.forum)
|
|
|
+ self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
|
|
|
self.request.acl.threads.allow_reply(self.thread)
|
|
|
self.parents = self.forum.get_ancestors(include_self=True).filter(level__gt=1)
|
|
|
|
|
@@ -64,15 +65,24 @@ class PostingView(BaseView):
|
|
|
form = self.get_form(True)
|
|
|
if form.is_valid():
|
|
|
now = timezone.now()
|
|
|
+ moderation = False
|
|
|
+ if not request.acl.threads.acl[self.forum.pk]['can_approve']:
|
|
|
+ if self.mode == 'new_thread' and request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1:
|
|
|
+ moderation = True
|
|
|
+ if self.mode in ['new_post', 'new_post_quick'] and request.acl.threads.acl[self.forum.pk]['can_write_posts'] == 1:
|
|
|
+ moderation = True
|
|
|
# Get or create new thread
|
|
|
- if self.mode in ['new_thread', 'edit_thread']:
|
|
|
+ if self.mode in ['new_thread']:
|
|
|
thread = Thread.objects.create(
|
|
|
forum=self.forum,
|
|
|
name=form.cleaned_data['thread_name'],
|
|
|
slug=slugify(form.cleaned_data['thread_name']),
|
|
|
start=now,
|
|
|
last=now,
|
|
|
+ moderated=moderation,
|
|
|
)
|
|
|
+ if moderation:
|
|
|
+ thread.replies_moderated += 1
|
|
|
else:
|
|
|
thread = self.thread
|
|
|
|
|
@@ -86,7 +96,8 @@ class PostingView(BaseView):
|
|
|
agent=request.META.get('HTTP_USER_AGENT'),
|
|
|
post=form.cleaned_data['post'],
|
|
|
post_preparsed=post_markdown(request, form.cleaned_data['post']),
|
|
|
- date=now
|
|
|
+ date=now,
|
|
|
+ moderated=moderation,
|
|
|
)
|
|
|
|
|
|
if self.mode == 'new_thread':
|
|
@@ -96,7 +107,7 @@ class PostingView(BaseView):
|
|
|
thread.start_poster_slug = request.user.username_slug
|
|
|
if request.user.rank and request.user.rank.style:
|
|
|
thread.start_poster_style = request.user.rank.style
|
|
|
-
|
|
|
+
|
|
|
thread.last = now
|
|
|
thread.last_post = post
|
|
|
thread.last_poster = request.user
|
|
@@ -105,41 +116,58 @@ class PostingView(BaseView):
|
|
|
if request.user.rank and request.user.rank.style:
|
|
|
thread.last_poster_style = request.user.rank.style
|
|
|
if self.mode in ['new_post', 'new_post_quick']:
|
|
|
- thread.replies += 1
|
|
|
+ if moderation:
|
|
|
+ thread.replies_moderated += 1
|
|
|
+ else:
|
|
|
+ thread.replies += 1
|
|
|
+ thread.score += 5
|
|
|
thread.save(force_update=True)
|
|
|
|
|
|
- # Update forum
|
|
|
- if self.mode == 'new_thread':
|
|
|
- self.forum.threads += 1
|
|
|
- self.forum.threads_delta += 1
|
|
|
-
|
|
|
- if self.mode in ['new_post', 'new_post_quick']:
|
|
|
- self.forum.posts += 1
|
|
|
- self.forum.posts_delta += 1
|
|
|
-
|
|
|
- self.forum.last_thread = thread
|
|
|
- self.forum.last_thread_name = thread.name
|
|
|
- self.forum.last_thread_slug = thread.slug
|
|
|
- self.forum.last_thread_date = thread.last
|
|
|
- self.forum.last_poster = thread.last_poster
|
|
|
- self.forum.last_poster_name = thread.last_poster_name
|
|
|
- self.forum.last_poster_slug = thread.last_poster_slug
|
|
|
- self.forum.last_poster_style = thread.last_poster_style
|
|
|
- self.forum.save(force_update=True)
|
|
|
+ # Update forum and monitor
|
|
|
+ if not moderation:
|
|
|
+ if self.mode == 'new_thread':
|
|
|
+ self.request.monitor['threads'] = int(self.request.monitor['threads']) + 1
|
|
|
+ self.forum.threads += 1
|
|
|
+ self.forum.threads_delta += 1
|
|
|
+
|
|
|
+ if self.mode in ['new_thread', 'new_post', 'new_post_quick']:
|
|
|
+ self.request.monitor['posts'] = int(self.request.monitor['posts']) + 1
|
|
|
+ self.forum.posts += 1
|
|
|
+ self.forum.posts_delta += 1
|
|
|
+
|
|
|
+ self.forum.last_thread = thread
|
|
|
+ self.forum.last_thread_name = thread.name
|
|
|
+ self.forum.last_thread_slug = thread.slug
|
|
|
+ self.forum.last_thread_date = thread.last
|
|
|
+ self.forum.last_poster = thread.last_poster
|
|
|
+ self.forum.last_poster_name = thread.last_poster_name
|
|
|
+ self.forum.last_poster_slug = thread.last_poster_slug
|
|
|
+ self.forum.last_poster_style = thread.last_poster_style
|
|
|
+ self.forum.save(force_update=True)
|
|
|
|
|
|
# Update user
|
|
|
- if self.mode == 'new_thread':
|
|
|
- request.user.threads += 1
|
|
|
- request.user.posts += 1
|
|
|
+ if not moderation:
|
|
|
+ if self.mode == 'new_thread':
|
|
|
+ request.user.threads += 1
|
|
|
+ request.user.posts += 1
|
|
|
request.user.last_post = thread.last
|
|
|
request.user.save(force_update=True)
|
|
|
|
|
|
if self.mode == 'new_thread':
|
|
|
- request.messages.set_flash(Message(_("New thread has been posted.")), 'success', 'threads')
|
|
|
+ if moderation:
|
|
|
+ request.messages.set_flash(Message(_("New thread has been posted. It will be hidden from other members until moderator reviews it.")), 'success', 'threads')
|
|
|
+ else:
|
|
|
+ request.messages.set_flash(Message(_("New thread has been posted.")), 'success', 'threads')
|
|
|
return redirect(reverse('thread', kwargs={'thread': thread.pk, 'slug': thread.slug}) + ('#post-%s' % post.pk))
|
|
|
|
|
|
if self.mode in ['new_post', 'new_post_quick']:
|
|
|
- request.messages.set_flash(Message(_("Your reply has been posted.")), 'success', 'threads')
|
|
|
+ if moderation:
|
|
|
+ request.messages.set_flash(Message(_("Your reply has been posted. It will be hidden from other members until moderator reviews it.")), 'success', 'threads_%s' % post.pk)
|
|
|
+ else:
|
|
|
+ request.messages.set_flash(Message(_("Your reply has been posted.")), 'success', 'threads_%s' % post.pk)
|
|
|
+ pagination = make_pagination(0, self.request.acl.threads.filter_posts(self.request, self.thread, self.thread.post_set).count(), self.request.settings.posts_per_page)
|
|
|
+ if pagination['total'] > 1:
|
|
|
+ return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug, 'page': pagination['total']}) + ('#post-%s' % post.pk))
|
|
|
return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % post.pk))
|
|
|
message = Message(form.non_field_errors()[0], 'error')
|
|
|
else:
|