users.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. from django.contrib import messages
  2. from django.contrib.auth import get_user_model, update_session_auth_hash
  3. from django.shortcuts import redirect
  4. from django.utils.translation import ugettext_lazy as _
  5. from misago.admin.auth import start_admin_session
  6. from misago.admin.views import generic
  7. from misago.conf import settings
  8. from misago.core.mail import mail_users
  9. from misago.users.forms.admin import (StaffFlagUserFormFactory, NewUserForm,
  10. EditUserForm, SearchUsersForm)
  11. from misago.users.models import ACTIVATION_REQUIRED_NONE, User
  12. class UserAdmin(generic.AdminBaseMixin):
  13. root_link = 'misago:admin:users:accounts:index'
  14. templates_dir = 'misago/admin/users'
  15. def get_model(self):
  16. return get_user_model()
  17. def create_form_type(self, request, target):
  18. if request.user.is_superuser:
  19. add_staff_field = request.user.pk != target.id
  20. else:
  21. add_staff_field = False
  22. return StaffFlagUserFormFactory(
  23. self.Form, target, add_staff_field=add_staff_field)
  24. class UsersList(UserAdmin, generic.ListView):
  25. items_per_page = 20
  26. ordering = (
  27. ('-id', _("From newest")),
  28. ('id', _("From oldest")),
  29. ('username_slug', _("A to z")),
  30. ('-username_slug', _("Z to a")),
  31. )
  32. selection_label = _('With users: 0')
  33. empty_selection_label = _('Select users')
  34. mass_actions = [
  35. {
  36. 'action': 'activate',
  37. 'name': _("Activate accounts"),
  38. 'icon': 'fa fa-check',
  39. }
  40. ]
  41. def get_queryset(self):
  42. qs = super(UsersList, self).get_queryset()
  43. return qs.select_related('rank')
  44. def get_search_form(self, request):
  45. return SearchUsersForm
  46. def action_activate(self, request, users):
  47. inactive_users = []
  48. for user in users:
  49. if user.requires_activation:
  50. inactive_users.append(user)
  51. if not inactive_users:
  52. message = _("You have to select inactive users.")
  53. raise generic.MassActionError(message)
  54. else:
  55. activated_users_pks = [u.pk for u in inactive_users]
  56. queryset = User.objects.filter(pk__in=activated_users_pks)
  57. queryset.update(requires_activation=ACTIVATION_REQUIRED_NONE)
  58. mail_subject = _("Your account on %(forum_title)s "
  59. "forums has been activated")
  60. subject_formats = {'forum_title': settings.forum_name}
  61. mail_subject = mail_subject % subject_formats
  62. mail_subject = mail_subject
  63. mail_users(request, inactive_users, mail_subject,
  64. 'misago/emails/activation/by_admin')
  65. message = _("Selected users accounts have been activated.")
  66. messages.success(request, message)
  67. class NewUser(UserAdmin, generic.ModelFormView):
  68. Form = NewUserForm
  69. template = 'new.html'
  70. message_submit = _('New user "%s" has been registered.')
  71. def handle_form(self, form, request, target):
  72. User = get_user_model()
  73. new_user = User.objects.create_user(
  74. form.cleaned_data['username'],
  75. form.cleaned_data['email'],
  76. form.cleaned_data['new_password'],
  77. title=form.cleaned_data['title'],
  78. rank=form.cleaned_data.get('rank'),
  79. joined_from_ip=request._misago_real_ip)
  80. if form.cleaned_data.get('staff_level'):
  81. new_user.staff_level = form.cleaned_data['staff_level']
  82. if form.cleaned_data.get('roles'):
  83. new_user.roles.add(*form.cleaned_data['roles'])
  84. new_user.update_acl_key()
  85. new_user.save()
  86. messages.success(request, self.message_submit % target.username)
  87. return redirect('misago:admin:users:accounts:edit',
  88. user_id=new_user.pk)
  89. class EditUser(UserAdmin, generic.ModelFormView):
  90. Form = EditUserForm
  91. template = 'edit.html'
  92. message_submit = _('User "%s" has been edited.')
  93. def handle_form(self, form, request, target):
  94. if form.cleaned_data.get('new_password'):
  95. target.set_password(form.cleaned_data['new_password'])
  96. if target.pk == request.user.pk:
  97. start_admin_session(request, target)
  98. update_session_auth_hash(request, target)
  99. if form.cleaned_data.get('email'):
  100. target.set_email(form.cleaned_data['email'])
  101. if form.cleaned_data.get('staff_level'):
  102. form.instance.staff_level = form.cleaned_data['staff_level']
  103. if form.cleaned_data.get('roles'):
  104. form.instance.roles.add(*form.cleaned_data['roles'])
  105. form.instance.update_acl_key()
  106. form.instance.save()
  107. messages.success(request, self.message_submit % target.username)