|
@@ -18,29 +18,46 @@ class PostingView(BaseView):
|
|
|
def fetch_target(self, kwargs):
|
|
|
if self.mode == 'new_thread':
|
|
|
self.fetch_forum(kwargs)
|
|
|
- if self.mode in ('edit_thread', 'new_post', 'new_post_quick'):
|
|
|
+ else:
|
|
|
self.fetch_thread(kwargs)
|
|
|
+ if self.mode == 'edit_thread':
|
|
|
+ self.fetch_post(self.thread.start_post_id)
|
|
|
+ if self.mode == 'edit_post':
|
|
|
+ self.fetch_post(kwargs['post'])
|
|
|
|
|
|
def fetch_forum(self, kwargs):
|
|
|
self.forum = Forum.objects.get(pk=kwargs['forum'], type='forum')
|
|
|
+ self.proxy = Forum.objects.parents_aware_forum(self.forum)
|
|
|
self.request.acl.forums.allow_forum_view(self.forum)
|
|
|
- self.request.acl.threads.allow_new_threads(self.forum)
|
|
|
+ self.request.acl.threads.allow_new_threads(self.proxy)
|
|
|
self.parents = Forum.objects.forum_parents(self.forum.pk, True)
|
|
|
|
|
|
def fetch_thread(self, kwargs):
|
|
|
self.thread = Thread.objects.get(pk=kwargs['thread'])
|
|
|
self.forum = self.thread.forum
|
|
|
+ self.proxy = Forum.objects.parents_aware_forum(self.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.request.acl.threads.allow_reply(self.proxy, self.thread)
|
|
|
self.parents = Forum.objects.forum_parents(self.forum.pk, True)
|
|
|
if kwargs.get('quote'):
|
|
|
self.quote = Post.objects.select_related('user').get(pk=kwargs['quote'], thread=self.thread.pk)
|
|
|
self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.quote)
|
|
|
+
|
|
|
+ def fetch_post(self, post):
|
|
|
+ self.post = self.thread.post_set.get(pk=post)
|
|
|
+ self.request.acl.threads.allow_post_view(self.request.user, self.thread, self.post)
|
|
|
+ if self.mode == 'edit_thread':
|
|
|
+ self.request.acl.threads.allow_thread_edit(self.request.user, self.proxy, self.thread, self.post)
|
|
|
+ if self.mode == 'edit_post':
|
|
|
+ self.request.acl.threads.allow_post_edit(self.request.user, self.proxy, self.thread, self.post)
|
|
|
|
|
|
- def get_form(self, bound=False):
|
|
|
- if bound:
|
|
|
- return PostForm(self.request.POST,request=self.request,mode=self.mode)
|
|
|
+ def get_form(self, bound=False):
|
|
|
+ initial = {}
|
|
|
+ if self.mode == 'edit_thread':
|
|
|
+ initial['thread_name'] = self.thread.name
|
|
|
+ if self.mode in ['edit_thread', 'edit_post']:
|
|
|
+ initial['post'] = self.post.post
|
|
|
if self.quote:
|
|
|
quote_post = []
|
|
|
if self.quote.user:
|
|
@@ -50,8 +67,11 @@ class PostingView(BaseView):
|
|
|
for line in self.quote.post.splitlines():
|
|
|
quote_post.append('> %s' % line)
|
|
|
quote_post.append('\n')
|
|
|
- return PostForm(request=self.request,mode=self.mode,initial={'post': '\n'.join(quote_post)})
|
|
|
- return PostForm(request=self.request,mode=self.mode)
|
|
|
+ initial['post'] = '\n'.join(quote_post)
|
|
|
+
|
|
|
+ if bound:
|
|
|
+ return PostForm(self.request.POST,request=self.request,mode=self.mode,initial=initial)
|
|
|
+ return PostForm(request=self.request,mode=self.mode,initial=initial)
|
|
|
|
|
|
def __call__(self, request, **kwargs):
|
|
|
self.request = request
|
|
@@ -66,7 +86,7 @@ class PostingView(BaseView):
|
|
|
try:
|
|
|
self.fetch_target(kwargs)
|
|
|
if not request.user.is_authenticated():
|
|
|
- raise ACLError403(_("Guest, you have to sign-in to post."))
|
|
|
+ raise ACLError403(_("Guest, you have to sign-in in order to post replies."))
|
|
|
except (Forum.DoesNotExist, Thread.DoesNotExist, Post.DoesNotExist):
|
|
|
return error404(self.request)
|
|
|
except ACLError403 as e:
|
|
@@ -78,6 +98,16 @@ class PostingView(BaseView):
|
|
|
if request.method == 'POST':
|
|
|
form = self.get_form(True)
|
|
|
if form.is_valid():
|
|
|
+ # Record original vars if user is editing
|
|
|
+ if self.mode in ['edit_thread', 'edit_post']:
|
|
|
+ old_name = self.thread.name
|
|
|
+ old_post = self.post.post
|
|
|
+ # If there is no change, throw user back
|
|
|
+ changed_name = old_name != form.cleaned_data['thread_name']
|
|
|
+ changed_post = old_post != form.cleaned_data['post']
|
|
|
+ changed_anything = changed_name or changed_post
|
|
|
+
|
|
|
+ # Some extra initialisation
|
|
|
now = timezone.now()
|
|
|
moderation = False
|
|
|
if not request.acl.threads.acl[self.forum.pk]['can_approve']:
|
|
@@ -85,8 +115,9 @@ class PostingView(BaseView):
|
|
|
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']:
|
|
|
+ if self.mode == 'new_thread':
|
|
|
thread = Thread.objects.create(
|
|
|
forum=self.forum,
|
|
|
name=form.cleaned_data['thread_name'],
|
|
@@ -100,22 +131,58 @@ class PostingView(BaseView):
|
|
|
thread.replies_moderated += 1
|
|
|
else:
|
|
|
thread = self.thread
|
|
|
+ if self.mode == 'edit_thread':
|
|
|
+ thread.name = form.cleaned_data['thread_name']
|
|
|
+ thread.slug = slugify(form.cleaned_data['thread_name'])
|
|
|
|
|
|
# Create new message
|
|
|
- post = Post.objects.create(
|
|
|
- forum=self.forum,
|
|
|
- thread=thread,
|
|
|
- merge=thread.merges,
|
|
|
- user=request.user,
|
|
|
- user_name=request.user.username,
|
|
|
- ip=request.session.get_ip(request),
|
|
|
- agent=request.META.get('HTTP_USER_AGENT'),
|
|
|
- post=form.cleaned_data['post'],
|
|
|
- post_preparsed=post_markdown(request, form.cleaned_data['post']),
|
|
|
- date=now,
|
|
|
- moderated=moderation,
|
|
|
- )
|
|
|
+ if self.mode in ['new_thread', 'new_post', 'new_post_quick']:
|
|
|
+ post = Post.objects.create(
|
|
|
+ forum=self.forum,
|
|
|
+ thread=thread,
|
|
|
+ merge=thread.merges,
|
|
|
+ user=request.user,
|
|
|
+ user_name=request.user.username,
|
|
|
+ ip=request.session.get_ip(request),
|
|
|
+ agent=request.META.get('HTTP_USER_AGENT'),
|
|
|
+ post=form.cleaned_data['post'],
|
|
|
+ post_preparsed=post_markdown(request, form.cleaned_data['post']),
|
|
|
+ date=now,
|
|
|
+ moderated=moderation,
|
|
|
+ )
|
|
|
+ elif changed_post:
|
|
|
+ # Change message
|
|
|
+ post = self.post
|
|
|
+ post.post = form.cleaned_data['post']
|
|
|
+ post.post_preparsed = post_markdown(request, form.cleaned_data['post'])
|
|
|
+ post.edits += 1
|
|
|
+ post.edit_date = now
|
|
|
+ post.edit_user = request.user
|
|
|
+ post.edit_user_name = request.user.username
|
|
|
+ post.edit_user_slug = request.user.username_slug
|
|
|
+ post.save(force_update=True)
|
|
|
+
|
|
|
+ # Record this edit in changelog?
|
|
|
+ if self.mode in ['edit_thread', 'edit_post'] and changed_anything:
|
|
|
+ self.post.change_set.create(
|
|
|
+ forum=self.forum,
|
|
|
+ thread=self.thread,
|
|
|
+ post=self.post,
|
|
|
+ user=request.user,
|
|
|
+ user_name=request.user.username,
|
|
|
+ user_slug=request.user.username_slug,
|
|
|
+ date=now,
|
|
|
+ ip=request.session.get_ip(request),
|
|
|
+ agent=request.META.get('HTTP_USER_AGENT'),
|
|
|
+ reason=form.cleaned_data['edit_reason'],
|
|
|
+ size=len(self.post.post),
|
|
|
+ change=len(self.post.post) - len(old_post),
|
|
|
+ thread_name_old=old_name if form.cleaned_data['thread_name'] != old_name else None,
|
|
|
+ thread_name_new=self.thread.name if form.cleaned_data['thread_name'] != old_name else None,
|
|
|
+ post_content=old_post,
|
|
|
+ )
|
|
|
|
|
|
+ # Set thread start post and author data
|
|
|
if self.mode == 'new_thread':
|
|
|
thread.start_post = post
|
|
|
thread.start_poster = request.user
|
|
@@ -124,6 +191,8 @@ class PostingView(BaseView):
|
|
|
if request.user.rank and request.user.rank.style:
|
|
|
thread.start_poster_style = request.user.rank.style
|
|
|
|
|
|
+ # New post - increase post counters, thread score
|
|
|
+ # Notify quoted post author and close thread if it has hit limit
|
|
|
if self.mode in ['new_post', 'new_post_quick']:
|
|
|
if moderation:
|
|
|
thread.replies_moderated += 1
|
|
@@ -143,6 +212,7 @@ class PostingView(BaseView):
|
|
|
thread.closed = True
|
|
|
post.set_checkpoint(self.request, 'limit')
|
|
|
|
|
|
+ # Update last poster data
|
|
|
if not moderation:
|
|
|
thread.last = now
|
|
|
thread.last_post = post
|
|
@@ -151,7 +221,10 @@ class PostingView(BaseView):
|
|
|
thread.last_poster_slug = request.user.username_slug
|
|
|
if request.user.rank and request.user.rank.style:
|
|
|
thread.last_poster_style = request.user.rank.style
|
|
|
- thread.save(force_update=True)
|
|
|
+
|
|
|
+ # Final update of thread entry
|
|
|
+ if self.mode != 'edit_post':
|
|
|
+ thread.save(force_update=True)
|
|
|
|
|
|
# Update forum and monitor
|
|
|
if not moderation:
|
|
@@ -180,9 +253,11 @@ class PostingView(BaseView):
|
|
|
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 in ['new_thread', 'new_post', 'new_post_quick']:
|
|
|
+ request.user.last_post = thread.last
|
|
|
+ request.user.save(force_update=True)
|
|
|
|
|
|
+ # Set flash and redirect user to his post
|
|
|
if self.mode == 'new_thread':
|
|
|
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')
|
|
@@ -199,10 +274,21 @@ class PostingView(BaseView):
|
|
|
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))
|
|
|
+
|
|
|
+ if self.mode == 'edit_thread':
|
|
|
+ request.messages.set_flash(Message(_("Your thread has been edited.")), 'success', 'threads_%s' % self.post.pk)
|
|
|
+ if self.mode == 'edit_post':
|
|
|
+ request.messages.set_flash(Message(_("Your reply has been edited.")), 'success', 'threads_%s' % self.post.pk)
|
|
|
+ pagination = make_pagination(0, self.request.acl.threads.filter_posts(self.request, self.thread, self.thread.post_set).filter(id__lte=self.post.pk).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' % self.post.pk))
|
|
|
+ return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
|
|
|
message = Message(form.non_field_errors()[0], 'error')
|
|
|
else:
|
|
|
form = self.get_form()
|
|
|
-
|
|
|
+
|
|
|
+ # Merge proxy into forum
|
|
|
+ self.forum.closed = self.proxy.closed
|
|
|
return request.theme.render_to_response('threads/posting.html',
|
|
|
{
|
|
|
'mode': self.mode,
|