views.py 4.0 KB

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