views.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. from django.core.urlresolvers import reverse as django_reverse
  2. from django.utils.translation import ugettext as _
  3. from misago.admin import site
  4. from misago.admin.widgets import *
  5. from misago.security import get_random_string
  6. from misago.utils import slugify
  7. from misago.users.admin.users.forms import UserForm, SearchUsersForm
  8. from misago.users.models import User
  9. def reverse(route, target=None):
  10. if target:
  11. return django_reverse(route, kwargs={'target': target.pk, 'slug': target.username_slug})
  12. return django_reverse(route)
  13. """
  14. Views
  15. """
  16. class List(ListWidget):
  17. admin = site.get_action('users')
  18. id = 'list'
  19. columns=(
  20. ('username_slug', _("User Name"), 35),
  21. ('join_date', _("Join Date")),
  22. )
  23. default_sorting = 'username'
  24. sortables={
  25. 'username_slug': 1,
  26. 'join_date': 0,
  27. }
  28. pagination = 25
  29. search_form = SearchUsersForm
  30. nothing_checked_message = _('You have to check at least one user.')
  31. actions=(
  32. ('activate', _("Activate users"), _("Are you sure you want to activate selected members?")),
  33. ('deactivate', _("Request e-mail validation"), _("Are you sure you want to deactivate selected members and request them to revalidate their e-mail addresses?")),
  34. ('remove_av', _("Remove and lock avatars"), _("Are you sure you want to remove selected members avatars and their ability to change them?")),
  35. ('remove_sig', _("Remove and lock signatures"), _("Are you sure you want to remove selected members signatures and their ability to edit them?")),
  36. ('remove_locks', _("Remove locks from avatars and signatures"), _("Are you sure you want to remove locks from selected members avatars and signatures?")),
  37. ('reset', _("Reset passwords"), _("Are you sure you want to reset selected members passwords?")),
  38. ('delete', _("Delete users"), _("Are you sure you want to delete selected users?")),
  39. )
  40. def set_filters(self, model, filters):
  41. if 'role' in filters:
  42. model = model.filter(roles__in=filters['role']).distinct()
  43. if 'rank' in filters:
  44. model = model.filter(rank__in=filters['rank'])
  45. if 'username' in filters:
  46. model = model.filter(username_slug__contains=filters['username'])
  47. if 'email' in filters:
  48. model = model.filter(email__contains=filters['email'])
  49. if 'activation' in filters:
  50. model = model.filter(activation__in=filters['activation'])
  51. return model
  52. def prefetch_related(self, items):
  53. return items.prefetch_related('roles')
  54. def get_item_actions(self, request, item):
  55. return (
  56. self.action('pencil', _("Edit User Details"), reverse('admin_users_edit', item)),
  57. self.action('remove', _("Delete User"), reverse('admin_users_delete', item), post=True, prompt=_("Are you sure you want to delete this user account?")),
  58. )
  59. def action_activate(self, request, items, checked):
  60. for user in items:
  61. if unicode(user.pk) in checked and user.activation > 0:
  62. request.monitor['users_inactive'] = int(request.monitor['users_inactive']) - 1
  63. user.activation = user.ACTIVATION_NONE
  64. user.save(force_update=True)
  65. user.email_user(
  66. request,
  67. 'users/activation/admin_done',
  68. _("Your Account has been activated"),
  69. )
  70. return Message(_('Selected users accounts have been activated.'), 'success'), reverse('admin_users')
  71. def action_deactivate(self, request, items, checked):
  72. # First loop - check for errors
  73. for user in items:
  74. if unicode(user.pk) in checked:
  75. if user.is_protected() and not request.user.is_god():
  76. return Message(_('You cannot force validation of protected members e-mails.'), 'error'), reverse('admin_users')
  77. # Second loop - reset passwords
  78. for user in items:
  79. if unicode(user.pk) in checked:
  80. user.activation = user.ACTIVATION_USER
  81. user.token = token = get_random_string(12)
  82. user.save(force_update=True)
  83. user.email_user(
  84. request,
  85. 'users/activation/invalidated',
  86. _("Account Activation"),
  87. )
  88. return Message(_('Selected users accounts have been deactivated and new activation links have been sent to them.'), 'success'), reverse('admin_users')
  89. def action_remove_av(self, request, items, checked):
  90. # First loop - check for errors
  91. for user in items:
  92. if unicode(user.pk) in checked:
  93. if user.is_protected() and not request.user.is_god():
  94. return Message(_('You cannot remove and block protected members avatars.'), 'error'), reverse('admin_users')
  95. # Second loop - reset passwords
  96. for user in items:
  97. if unicode(user.pk) in checked:
  98. user.lock_avatar()
  99. user.save(force_update=True)
  100. return Message(_('Selected users avatars were deleted and locked.'), 'success'), reverse('admin_users')
  101. def action_remove_sig(self, request, items, checked):
  102. # First loop - check for errors
  103. for user in items:
  104. if unicode(user.pk) in checked:
  105. if user.is_protected() and not request.user.is_god():
  106. return Message(_('You cannot remove and block protected members signatures.'), 'error'), reverse('admin_users')
  107. # Second loop - reset passwords
  108. for user in items:
  109. if unicode(user.pk) in checked:
  110. user.signature_ban = True
  111. user.signature = ''
  112. user.signature_preparsed = ''
  113. user.save(force_update=True)
  114. return Message(_('Selected users signatures were deleted and locked.'), 'success'), reverse('admin_users')
  115. def action_remove_locks(self, request, items, checked):
  116. for user in items:
  117. if unicode(user.pk) in checked:
  118. user.default_avatar(request.settings)
  119. user.avatar_ban = False
  120. user.signature_ban = False
  121. user.save(force_update=True)
  122. return Message(_('Selected users can now edit their avatars and signatures.'), 'success'), reverse('admin_users')
  123. def action_reset(self, request, items, checked):
  124. # First loop - check for errors
  125. for user in items:
  126. if unicode(user.pk) in checked:
  127. if user.is_protected() and not request.user.is_god():
  128. return Message(_('You cannot reset protected members passwords.'), 'error'), reverse('admin_users')
  129. # Second loop - reset passwords
  130. for user in items:
  131. if unicode(user.pk) in checked:
  132. new_password = get_random_string(8)
  133. user.set_password(new_password)
  134. user.save(force_update=True)
  135. user.email_user(
  136. request,
  137. 'users/password/new_admin',
  138. _("Your New Password"),
  139. {
  140. 'password': new_password,
  141. },
  142. )
  143. return Message(_('Selected users passwords have been reset successfully.'), 'success'), reverse('admin_users')
  144. def action_delete(self, request, items, checked):
  145. for user in items:
  146. if unicode(user.pk) in checked:
  147. if user.pk == request.user.id:
  148. return Message(_('You cannot delete yourself.'), 'error'), reverse('admin_users')
  149. if user.is_protected():
  150. return Message(_('You cannot delete protected members.'), 'error'), reverse('admin_users')
  151. User.objects.filter(id__in=checked).delete()
  152. User.objects.resync_monitor(request.monitor)
  153. return Message(_('Selected users have been deleted successfully.'), 'success'), reverse('admin_users')
  154. class Edit(FormWidget):
  155. admin = site.get_action('users')
  156. id = 'edit'
  157. name = _("Edit User")
  158. fallback = 'admin_users'
  159. form = UserForm
  160. tabbed = True
  161. target_name = 'username'
  162. notfound_message = _('Requested User could not be found.')
  163. submit_fallback = True
  164. def get_form_instance(self, form, request, model, initial, post=False):
  165. if post:
  166. return form(model, request.POST, request=request, initial=self.get_initial_data(request, model))
  167. return form(model, request=request, initial=self.get_initial_data(request, model))
  168. def get_url(self, request, model):
  169. return reverse('admin_users_edit', model)
  170. def get_edit_url(self, request, model):
  171. return self.get_url(request, model)
  172. def get_initial_data(self, request, model):
  173. return {
  174. 'username': model.username,
  175. 'title': model.title,
  176. 'email': model.email,
  177. 'rank': model.rank,
  178. 'roles': model.roles.all(),
  179. 'avatar_ban': model.avatar_ban,
  180. 'avatar_ban_reason_user': model.avatar_ban_reason_user,
  181. 'avatar_ban_reason_admin': model.avatar_ban_reason_admin,
  182. 'signature': model.signature,
  183. 'signature_ban': model.signature_ban,
  184. 'signature_ban_reason_user': model.signature_ban_reason_user,
  185. 'signature_ban_reason_admin': model.signature_ban_reason_admin,
  186. }
  187. def submit_form(self, request, form, target):
  188. target.title = form.cleaned_data['title']
  189. target.rank = form.cleaned_data['rank']
  190. target.avatar_ban_reason_user = form.cleaned_data['avatar_ban_reason_user']
  191. target.avatar_ban_reason_admin = form.cleaned_data['avatar_ban_reason_admin']
  192. target.set_signature(form.cleaned_data['signature'])
  193. target.signature_ban = form.cleaned_data['signature_ban']
  194. target.signature_ban_reason_user = form.cleaned_data['signature_ban_reason_user']
  195. target.signature_ban_reason_admin = form.cleaned_data['signature_ban_reason_admin']
  196. # Do avatar ban mumbo-jumbo
  197. if target.avatar_ban != form.cleaned_data['avatar_ban']:
  198. if form.cleaned_data['avatar_ban']:
  199. target.lock_avatar()
  200. else:
  201. target.default_avatar(request.settings)
  202. target.avatar_ban = form.cleaned_data['avatar_ban']
  203. # Set custom avatar
  204. if form.cleaned_data['avatar_custom']:
  205. target.delete_avatar()
  206. target.avatar_image = form.cleaned_data['avatar_custom']
  207. target.avatar_type = 'gallery'
  208. # Update user roles
  209. if request.user.is_god():
  210. target.roles.clear()
  211. for role in form.cleaned_data['roles']:
  212. target.roles.add(role)
  213. else:
  214. for role in target.roles.all():
  215. if not role.protected:
  216. target.roles.remove(role)
  217. for role in form.cleaned_data['roles']:
  218. target.roles.add(role)
  219. target.save(force_update=True)
  220. return target, Message(_('Changes in user\'s "%(name)s" account have been saved.') % {'name': self.original_name}, 'success')
  221. class Delete(ButtonWidget):
  222. admin = site.get_action('users')
  223. id = 'delete'
  224. fallback = 'admin_users'
  225. notfound_message = _('Requested user account could not be found.')
  226. def action(self, request, target):
  227. if target.pk == request.user.id:
  228. return Message(_('You cannot delete yourself.'), 'error'), False
  229. if target.is_protected():
  230. return Message(_('You cannot delete protected member.'), 'error'), False
  231. target.delete()
  232. User.objects.resync_monitor(request.monitor)
  233. return Message(_('User "%(name)s" has been deleted.') % {'name': target.username}, 'success'), False
  234. def inactive(request):
  235. token = 'list_filter_misago.users.models.User'
  236. request.session[token] = {'activation': ['1', '2', '3']}
  237. return redirect(reverse('admin_users'))