posting.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.template import RequestContext
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from misago.acl.utils import ACLError403, ACLError404
  7. from misago.forms import FormLayout
  8. from misago.forums.models import Forum
  9. from misago.markdown import post_markdown
  10. from misago.messages import Message
  11. from misago.threads.forms import NewThreadForm
  12. from misago.threads.models import Thread, Post
  13. from misago.threads.views.base import BaseView
  14. from misago.views import error403, error404
  15. from misago.utils import slugify
  16. class Posting(BaseView):
  17. def fetch_forum(self, kwargs):
  18. self.forum = Forum.objects.get(pk=kwargs['forum'], type='forum')
  19. self.request.acl.forums.check_forum(self.forum)
  20. self.request.acl.threads.allow_new_threads(self.forum)
  21. def __call__(self, request, **kwargs):
  22. self.request = request
  23. try:
  24. self.fetch_forum(kwargs)
  25. except Forum.DoesNotExist:
  26. return error404(self.request)
  27. except ACLError403 as e:
  28. return error403(request, e.message)
  29. except ACLError404 as e:
  30. return error404(request, e.message)
  31. message = request.messages.get_message('threads')
  32. if request.method == 'POST':
  33. form = NewThreadForm(request.POST, request=request)
  34. if form.is_valid():
  35. thread = Thread.objects.create(
  36. forum=self.forum,
  37. name=form.cleaned_data['thread_name'],
  38. slug=slugify(form.cleaned_data['thread_name']),
  39. start=timezone.now(),
  40. last=timezone.now(),
  41. )
  42. post = Post.objects.create(
  43. forum=self.forum,
  44. thread=thread,
  45. user=request.user,
  46. user_name=request.user.username,
  47. ip=request.session.get_ip(request),
  48. agent=request.META.get('HTTP_USER_AGENT'),
  49. post=form.cleaned_data['post'],
  50. post_preparsed=post_markdown(request, form.cleaned_data['post']),
  51. date=timezone.now()
  52. )
  53. thread.start_post = post
  54. thread.last_post = post
  55. thread.start_poster = request.user
  56. thread.last_poster = request.user
  57. thread.start_poster_name = request.user.username
  58. thread.last_poster_name = request.user.username
  59. thread.start_poster_slug = request.user.username_slug
  60. thread.last_poster_slug = request.user.username_slug
  61. if request.user.rank and request.user.rank.style:
  62. thread.start_poster_style = request.user.rank.style
  63. thread.last_poster_style = request.user.rank.style
  64. thread.save(force_update=True)
  65. self.forum.threads += 1
  66. self.forum.threads_delta += 1
  67. self.forum.posts += 1
  68. self.forum.posts_delta += 1
  69. self.forum.last_thread = thread
  70. self.forum.last_thread_name = thread.name
  71. self.forum.last_thread_slug = thread.slug
  72. self.forum.last_thread_date = thread.last
  73. self.forum.last_poster = thread.last_poster
  74. self.forum.last_poster_name = thread.last_poster_name
  75. self.forum.last_poster_slug = thread.last_poster_slug
  76. self.forum.last_poster_style = thread.last_poster_style
  77. self.forum.save(force_update=True)
  78. request.user.topics += 1
  79. request.user.posts += 1
  80. request.user.last_post = thread.last
  81. request.user.save(force_update=True)
  82. request.messages.set_flash(Message(_("New thread has been posted.")), 'success', 'threads')
  83. return redirect(reverse('forum', kwargs={'forum': self.forum.pk, 'slug': self.forum.slug}))
  84. message = Message(form.non_field_errors()[0], 'error')
  85. else:
  86. form = NewThreadForm(request=request)
  87. return request.theme.render_to_response('threads/posting.html',
  88. {
  89. 'forum': self.forum,
  90. 'message': message,
  91. 'form': FormLayout(form),
  92. },
  93. context_instance=RequestContext(request));