views.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from datetime import timedelta
  2. from django.core.urlresolvers import reverse
  3. from django.shortcuts import redirect
  4. from django.template import RequestContext
  5. from django.utils import timezone
  6. from django.utils.translation import ugettext as _
  7. from misago import messages
  8. from misago.acl.exceptions import ACLError403
  9. from misago.apps.errors import error403, error404
  10. from misago.apps.warnuser.forms import WarnMemberForm
  11. from misago.decorators import block_guest, check_csrf
  12. from misago.markdown.factory import basic_markdown
  13. from misago.models import User, Warn, WarnLevel
  14. from misago.shortcuts import render_to_response
  15. @block_guest
  16. @check_csrf
  17. def warn_user(request, user, slug):
  18. try:
  19. user = User.objects.get(pk=user)
  20. except User.DoesNotExist:
  21. return error404(request, _("Requested user could not be found."))
  22. try:
  23. request.acl.warnings.allow_warning_members()
  24. user.acl().warnings.allow_warning()
  25. except ACLError403 as e:
  26. return error403(request, e)
  27. if not WarnLevel.objects.get_level(1):
  28. messages.error(request, _("No warning levels have been defined."))
  29. return redirect(request.POST.get('retreat',
  30. reverse('user', kwargs={
  31. 'user': user.pk,
  32. 'username': user.username_slug,
  33. })))
  34. current_warning_level = user.get_current_warning_level()
  35. next_warning_level = WarnLevel.objects.get_level(user.warning_level + 1)
  36. if not next_warning_level:
  37. return render_to_response('warn_user/max_level.html',
  38. {
  39. 'warned_user': user,
  40. 'retreat': request.POST.get('retreat'),
  41. },
  42. context_instance=RequestContext(request))
  43. form = WarnMemberForm(initial={'reason': request.POST.get('reason')})
  44. if ('origin' in request.POST
  45. and request.POST.get('origin') == 'warning-form'):
  46. form = WarnMemberForm(request.POST, request=request)
  47. if form.is_valid():
  48. user.warning_level += 1
  49. if next_warning_level.expires_after_minutes:
  50. user.warning_level_update_on = timezone.now()
  51. user.warning_level_update_on += timedelta(
  52. minutes=next_warning_level.expires_after_minutes)
  53. else:
  54. user.warning_level_update_on = None
  55. user.save(force_update=True)
  56. reason_preparsed = None
  57. if form.cleaned_data['reason']:
  58. reason_preparsed = basic_markdown(form.cleaned_data['reason'])
  59. Warn.objects.create(
  60. user=user,
  61. giver=request.user,
  62. giver_name=request.user.username,
  63. giver_slug=request.user.username_slug,
  64. date=timezone.now(),
  65. ip=request.session.get_ip(request),
  66. agent=request.META.get('HTTP_USER_AGENT'),
  67. reason=form.cleaned_data['reason'],
  68. reason_preparsed=reason_preparsed,
  69. )
  70. messages.success(request,
  71. _("%(user)s warning level has been increased.") % {
  72. 'user': user.username})
  73. return redirect(request.POST.get('retreat',
  74. reverse('user', kwargs={
  75. 'user': user.pk,
  76. 'username': user.username_slug,
  77. })))
  78. return render_to_response('warn_user/form.html',
  79. {
  80. 'warned_user': user,
  81. 'current_warning_level': current_warning_level,
  82. 'next_warning_level': next_warning_level,
  83. 'form': form,
  84. 'retreat': request.POST.get('retreat'),
  85. },
  86. context_instance=RequestContext(request))