newthread.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.utils import timezone
  4. from django.utils.translation import ugettext as _
  5. from itertools import chain
  6. from misago.apps.forumbase.mixins import RedirectToPostMixin
  7. from misago.apps.forumbase.posting import PostingBaseView
  8. from misago.markdown import post_markdown
  9. from misago.messages import Message
  10. from misago.models import Forum, Thread, Post
  11. from misago.utils.strings import slugify
  12. from misago.apps.threads.forms import NewThreadForm
  13. from misago.apps.threads.mixins import TypeMixin
  14. class NewThreadView(PostingBaseView, TypeMixin, RedirectToPostMixin):
  15. action = 'new_thread'
  16. form_type = NewThreadForm
  17. def set_context(self):
  18. self.forum = Forum.objects.get(pk=self.kwargs.get('forum'), type='forum')
  19. self.request.acl.forums.allow_forum_view(self.forum)
  20. self.proxy = Forum.objects.parents_aware_forum(self.forum)
  21. self.request.acl.threads.allow_new_threads(self.proxy)
  22. def post_form(self, form):
  23. now = timezone.now()
  24. moderation = (not self.request.acl.threads.acl[self.forum.pk]['can_approve']
  25. and self.request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1)
  26. # Create empty thread
  27. self.thread = Thread.objects.create(
  28. forum=self.forum,
  29. name=form.cleaned_data['thread_name'],
  30. slug=slugify(form.cleaned_data['thread_name']),
  31. start=now,
  32. last=now,
  33. moderated=moderation,
  34. score=self.request.settings['thread_ranking_initial_score'],
  35. replies=1,
  36. replies_moderated=int(moderation),
  37. )
  38. # Create our post
  39. md, post_preparsed = post_markdown(self.request, form.cleaned_data['post'])
  40. self.post = Post.objects.create(
  41. forum=self.forum,
  42. thread=self.thread,
  43. user=self.request.user,
  44. user_name=self.request.user.username,
  45. ip=self.request.session.get_ip(self.request),
  46. agent=self.request.META.get('HTTP_USER_AGENT'),
  47. post=form.cleaned_data['post'],
  48. post_preparsed=post_preparsed,
  49. date=now,
  50. moderated=moderation,
  51. )
  52. # Update thread stats to contain this post
  53. self.thread.new_start_post(self.post)
  54. self.thread.new_last_post(self.post)
  55. # Set thread status
  56. if 'close_thread' in form.cleaned_data:
  57. self.thread.closed = True
  58. if 'thread_weight' in form.cleaned_data:
  59. self.thread.weight = form.cleaned_data['thread_weight']
  60. # Finally save complete thread
  61. self.thread.save(force_update=True)
  62. # Reward user for posting new thread?
  63. if (not self.request.user.last_post
  64. or self.request.user.last_post < timezone.now() - timedelta(seconds=self.request.settings['score_reward_new_post_cooldown'])):
  65. self.request.user.score += self.request.settings['score_reward_new_thread']
  66. # Update forum monitor
  67. if not moderation:
  68. self.request.monitor['threads'] = int(self.request.monitor['threads']) + 1
  69. self.request.monitor['posts'] = int(self.request.monitor['posts']) + 1
  70. self.forum.threads += 1
  71. self.forum.posts += 1
  72. self.forum.new_last_thread(self.thread)
  73. self.forum.save(force_update=True)
  74. # Update user
  75. if not moderation:
  76. self.request.user.threads += 1
  77. self.request.user.posts += 1
  78. self.request.user.last_post = now
  79. self.request.user.save(force_update=True)
  80. # Notify mentioned
  81. if md.mentions:
  82. self.post.notify_mentioned(self.request, md.mentions)
  83. self.post.save(force_update=True)
  84. # Set thread watch status
  85. self.watch_thread()
  86. # Set flash and redirect user to his post
  87. if moderation:
  88. self.request.messages.set_flash(Message(_("New thread has been posted. It will be hidden from other members until moderator reviews it.")), 'success', 'threads')
  89. else:
  90. self.request.messages.set_flash(Message(_("New thread has been posted.")), 'success', 'threads')
  91. return redirect(reverse('thread', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))