ranks.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from django.contrib import messages
  2. from django.core.urlresolvers import reverse
  3. from django.shortcuts import redirect
  4. from django.utils.translation import ugettext_lazy as _
  5. from misago.admin.views import generic
  6. from misago.users.forms.admin import RankForm
  7. from misago.users.models import Rank
  8. class RankAdmin(generic.AdminBaseMixin):
  9. root_link = 'misago:admin:users:ranks:index'
  10. Model = Rank
  11. Form = RankForm
  12. templates_dir = 'misago/admin/ranks'
  13. message_404 = _("Requested rank does not exist.")
  14. def update_roles(self, target, roles):
  15. target.roles.clear()
  16. if roles:
  17. target.roles.add(*roles)
  18. def handle_form(self, form, request, target):
  19. super(RankAdmin, self).handle_form(form, request, target)
  20. self.update_roles(target, form.cleaned_data['roles'])
  21. class RanksList(RankAdmin, generic.ListView):
  22. ordering = (('order', None),)
  23. class NewRank(RankAdmin, generic.ModelFormView):
  24. message_submit = _('New rank "%(name)s" has been saved.')
  25. class EditRank(RankAdmin, generic.ModelFormView):
  26. message_submit = _('Rank "%(name)s" has been edited.')
  27. class DeleteRank(RankAdmin, generic.ButtonView):
  28. def check_permissions(self, request, target):
  29. message_format = {'name': target.name}
  30. if target.is_default:
  31. message = _('Rank "%(name)s" is default '
  32. 'rank and can\'t be deleted.')
  33. return message % message_format
  34. if target.user_set.exists():
  35. message = _('Rank "%(name)s" is assigned to '
  36. 'users and can\'t be deleted.')
  37. return message % message_format
  38. def button_action(self, request, target):
  39. target.delete()
  40. message = _('Rank "%(name)s" has been deleted.')
  41. messages.success(request, message % {'name': target.name})
  42. class MoveDownRank(RankAdmin, generic.ButtonView):
  43. def button_action(self, request, target):
  44. try:
  45. other_target = Rank.objects.filter(order__gt=target.order)
  46. other_target = other_target.earliest('order')
  47. except Rank.DoesNotExist:
  48. other_target = None
  49. if other_target:
  50. other_target.order, target.order = target.order, other_target.order
  51. other_target.save(update_fields=['order'])
  52. target.save(update_fields=['order'])
  53. message = _('Rank "%(name)s" has been moved below "%(other)s".')
  54. targets_names = {'name': target.name, 'other': other_target.name}
  55. messages.success(request, message % targets_names)
  56. class MoveUpRank(RankAdmin, generic.ButtonView):
  57. def button_action(self, request, target):
  58. try:
  59. other_target = Rank.objects.filter(order__lt=target.order)
  60. other_target = other_target.latest('order')
  61. except Rank.DoesNotExist:
  62. other_target = None
  63. if other_target:
  64. other_target.order, target.order = target.order, other_target.order
  65. other_target.save(update_fields=['order'])
  66. target.save(update_fields=['order'])
  67. message = _('Rank "%(name)s" has been moved above "%(other)s".')
  68. targets_names = {'name': target.name, 'other': other_target.name}
  69. messages.success(request, message % targets_names)
  70. class RankUsers(RankAdmin, generic.TargetedView):
  71. def real_dispatch(self, request, target):
  72. redirect_url = reverse('misago:admin:users:accounts:index')
  73. return redirect('%s?rank=%s' % (redirect_url, target.pk))
  74. class DefaultRank(RankAdmin, generic.ButtonView):
  75. def check_permissions(self, request, target):
  76. if target.is_default:
  77. message = _('Rank "%(name)s" is already default.')
  78. return message % {'name': target.name}
  79. def button_action(self, request, target):
  80. Rank.objects.make_rank_default(target)
  81. message = _('Rank "%(name)s" has been made default.')
  82. messages.success(request, message % {'name': target.name})