views.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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.apps.errors import error404
  9. from misago.apps.profiles.decorators import profile_view
  10. from misago.apps.profiles.template import RequestContext
  11. from misago.apps.profiles.warnings.warningstracker import WarningsTracker
  12. from misago.decorators import check_csrf
  13. from misago.models import Warn
  14. from misago.shortcuts import render_to_response
  15. from misago.utils.pagination import make_pagination
  16. @profile_view('user_warnings')
  17. def warnings(request, user, page=0):
  18. request.acl.warnings.allow_member_warns_view(request.user, user)
  19. queryset = user.warning_set
  20. count = queryset.count()
  21. try:
  22. pagination = make_pagination(page, count, 12)
  23. except Http404:
  24. return redirect(reverse('user_warnings', kwargs={'user': user.id, 'username': user.username_slug}))
  25. return render_to_response('profiles/warnings.html',
  26. context_instance=RequestContext(request, {
  27. 'profile': user,
  28. 'tab': 'warnings',
  29. 'items_total': count,
  30. 'warning_level': user.get_current_warning_level(),
  31. 'warnings_tracker': WarningsTracker(user.warning_level - pagination['start']),
  32. 'items': queryset.order_by('-id')[pagination['start']:pagination['stop']],
  33. 'pagination': pagination,
  34. }));
  35. def warning_decorator(f):
  36. def decorator(*args, **kwargs):
  37. request, user = args
  38. request.acl.warnings.allow_member_warns_view(request.user, user)
  39. warning_pk = kwargs['warning']
  40. try:
  41. warning = user.warning_set.get(pk=warning_pk)
  42. return f(request, user, warning)
  43. except Warn.DoesNotExist:
  44. return error404(request, _("Requested warning could not be found."))
  45. return decorator
  46. def todo_decorator(f):
  47. def decorator(*args, **kwargs):
  48. raise NotImplementedError("TODO: add decrease_warning_level function to user model, then do magic for cancel/delete warning")
  49. @check_csrf
  50. @profile_view('user_warnings_cancel')
  51. @warning_decorator
  52. @todo_decorator
  53. def cancel_warning(request, user, warning):
  54. request.acl.warnings.allow_cancel_warning(
  55. request.user, user, warning)
  56. @check_csrf
  57. @profile_view('user_warnings_delete')
  58. @warning_decorator
  59. @todo_decorator
  60. def delete_warning(request, user, warning):
  61. request.acl.warnings.allow_delete_warning()
  62. if user.is_warning_active(warning):
  63. pass