newthread.py 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from datetime import timedelta
  2. from django.core.urlresolvers import reverse
  3. from django.shortcuts import redirect
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from misago.apps.forumbase.posting.base import PostingBaseView
  7. from misago.apps.forumbase.posting.forms import NewThreadForm
  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. class NewThreadBaseView(PostingBaseView):
  13. form_type = NewThreadForm
  14. def post_form(self, form):
  15. now = timezone.now()
  16. moderation = (not self.request.acl.threads.acl[self.forum.pk]['can_approve']
  17. and self.request.acl.threads.acl[self.forum.pk]['can_start_threads'] == 1)
  18. # Create empty thread
  19. self.thread = Thread.objects.create(
  20. forum=self.forum,
  21. name=form.cleaned_data['thread_name'],
  22. slug=slugify(form.cleaned_data['thread_name']),
  23. start=now,
  24. last=now,
  25. moderated=moderation,
  26. score=self.request.settings['thread_ranking_initial_score'],
  27. replies=1,
  28. replies_moderated=int(moderation),
  29. )
  30. # Create our post
  31. md, post_preparsed = post_markdown(self.request, form.cleaned_data['post'])
  32. self.post = Post.objects.create(
  33. forum=self.forum,
  34. thread=self.thread,
  35. user=self.request.user,
  36. user_name=self.request.user.username,
  37. ip=self.request.session.get_ip(self.request),
  38. agent=self.request.META.get('HTTP_USER_AGENT'),
  39. post=form.cleaned_data['post'],
  40. post_preparsed=post_preparsed,
  41. date=now,
  42. moderated=moderation,
  43. )
  44. # Update thread stats to contain this post
  45. self.thread.new_start_post(self.post)
  46. self.thread.new_last_post(self.post)
  47. # Set thread status
  48. if 'close_thread' in form.cleaned_data:
  49. self.thread.closed = form.cleaned_data['close_thread']
  50. if 'thread_weight' in form.cleaned_data:
  51. self.thread.weight = form.cleaned_data['thread_weight']
  52. # Finally save complete thread
  53. self.thread.save(force_update=True)
  54. # Reward user for posting new thread?
  55. if (not self.request.user.last_post
  56. or self.request.user.last_post < timezone.now() - timedelta(seconds=self.request.settings['score_reward_new_post_cooldown'])):
  57. self.request.user.score += self.request.settings['score_reward_new_thread']
  58. # Update forum monitor
  59. if not moderation:
  60. self.request.monitor['threads'] = int(self.request.monitor['threads']) + 1
  61. self.request.monitor['posts'] = int(self.request.monitor['posts']) + 1
  62. self.forum.threads += 1
  63. self.forum.posts += 1
  64. self.forum.new_last_thread(self.thread)
  65. self.forum.save(force_update=True)
  66. # Update user
  67. if not moderation:
  68. self.request.user.threads += 1
  69. self.request.user.posts += 1
  70. self.request.user.last_post = now
  71. self.request.user.save(force_update=True)
  72. # Notify mentioned
  73. if md.mentions:
  74. self.post.notify_mentioned(self.request, md.mentions)
  75. self.post.save(force_update=True)