views.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from datetime import timedelta
  2. from django.core.cache import cache
  3. from django.core.urlresolvers import reverse
  4. from django.http import Http404
  5. from django.shortcuts import redirect
  6. from django.utils import timezone
  7. from django.utils.translation import ugettext as _
  8. from misago import messages
  9. from misago.apps.errors import error404
  10. from misago.apps.profiles.decorators import profile_view
  11. from misago.apps.profiles.template import RequestContext
  12. from misago.apps.profiles.warnings.warningstracker import WarningsTracker
  13. from misago.decorators import block_guest, check_csrf
  14. from misago.models import Warn
  15. from misago.shortcuts import render_to_response
  16. from misago.utils.pagination import make_pagination
  17. @profile_view('user_warnings')
  18. def warnings(request, user, page=0):
  19. request.acl.warnings.allow_member_warns_view(request.user, user)
  20. queryset = user.warning_set
  21. count = queryset.count()
  22. try:
  23. pagination = make_pagination(page, count, 12)
  24. except Http404:
  25. return redirect(reverse('user_warnings', kwargs={'user': user.id, 'username': user.username_slug}))
  26. return render_to_response('profiles/warnings.html',
  27. context_instance=RequestContext(request, {
  28. 'profile': user,
  29. 'tab': 'warnings',
  30. 'items_total': count,
  31. 'warning_level': user.get_current_warning_level(),
  32. 'warnings_tracker': WarningsTracker(user.warning_level - pagination['start']),
  33. 'items': queryset.order_by('-id')[pagination['start']:pagination['stop']],
  34. 'pagination': pagination,
  35. }));
  36. def warning_decorator(f):
  37. def decorator(*args, **kwargs):
  38. request, user = args
  39. request.acl.warnings.allow_member_warns_view(request.user, user)
  40. warning_pk = kwargs['warning']
  41. try:
  42. warning = user.warning_set.get(pk=warning_pk)
  43. f(request, user, warning)
  44. return redirect('user_warnings', username=user.username_slug, user=user.pk)
  45. except Warn.DoesNotExist:
  46. return error404(request, _("Requested warning could not be found."))
  47. return decorator
  48. @block_guest
  49. @check_csrf
  50. @profile_view('user_warnings_cancel')
  51. @warning_decorator
  52. def cancel_warning(request, user, warning):
  53. request.acl.warnings.allow_cancel_warning(
  54. request.user, user, warning)
  55. user.decrease_warning_level()
  56. warning.canceled = True
  57. warning.canceled_on = timezone.now()
  58. warning.canceler = request.user
  59. warning.canceler_username = request.user.username
  60. warning.canceler_slug = request.user.username_slug
  61. warning.canceler_ip = request.session.get_ip(request)
  62. warning.canceler_agent = request.META.get('HTTP_USER_AGENT')
  63. warning.save(force_update=True)
  64. messages.success(request, _("Selected warning has been canceled."))
  65. @block_guest
  66. @check_csrf
  67. @profile_view('user_warnings_delete')
  68. @warning_decorator
  69. def delete_warning(request, user, warning):
  70. request.acl.warnings.allow_delete_warning()
  71. if user.is_warning_active(warning):
  72. user.decrease_warning_level()
  73. warning.delete()
  74. messages.success(request, _("Selected warning has been deleted."))