views.py 3.6 KB

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