views.py 3.5 KB

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