views.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from django.core.urlresolvers import reverse as django_reverse
  2. from django import forms
  3. from django.utils.translation import ungettext, ugettext as _
  4. from misago.admin import site
  5. from misago.admin.widgets import *
  6. from misago.forms import Form
  7. from misago.prune.forms import PolicyForm
  8. from misago.prune.models import Policy
  9. from misago.users.models import User
  10. def reverse(route, target=None):
  11. if target:
  12. return django_reverse(route, kwargs={'target': target.pk})
  13. return django_reverse(route)
  14. """
  15. Views
  16. """
  17. class List(ListWidget):
  18. admin = site.get_action('prune_users')
  19. id = 'list'
  20. columns=(
  21. ('name', _("Pruning Policy")),
  22. )
  23. nothing_checked_message = _('You have to check at least one policy.')
  24. actions=(
  25. ('delete', _("Delete selected policies"), _("Are you sure you want to delete selected policies?")),
  26. )
  27. def sort_items(self, request, page_items, sorting_method):
  28. return page_items.order_by('name')
  29. def get_item_actions(self, request, item):
  30. return (
  31. self.action('filter', _("Apply Policy"), reverse('admin_prune_users_apply', item)),
  32. self.action('pencil', _("Edit Policy"), reverse('admin_prune_users_edit', item)),
  33. self.action('remove', _("Delete Policy"), reverse('admin_prune_users_delete', item), post=True, prompt=_("Are you sure you want to delete this policy?")),
  34. )
  35. def action_delete(self, request, items, checked):
  36. if not request.user.is_god():
  37. return Message(_('Only system administrators can delete pruning policies.'), 'error'), reverse('admin_prune_users')
  38. Policy.objects.filter(id__in=checked).delete()
  39. return Message(_('Selected pruning policies have been deleted successfully.'), 'success'), reverse('admin_prune_users')
  40. class New(FormWidget):
  41. admin = site.get_action('prune_users')
  42. id = 'new'
  43. fallback = 'admin_prune_users'
  44. form = PolicyForm
  45. submit_button = _("Save Policy")
  46. def get_new_url(self, request, model):
  47. return reverse('admin_prune_users_new')
  48. def get_edit_url(self, request, model):
  49. return reverse('admin_prune_users_edit', model)
  50. def submit_form(self, request, form, target):
  51. new_policy = Policy(
  52. name = form.cleaned_data['name'],
  53. email = form.cleaned_data['email'],
  54. posts = form.cleaned_data['posts'],
  55. registered = form.cleaned_data['registered'],
  56. last_visit = form.cleaned_data['last_visit'],
  57. )
  58. new_policy.save(force_insert=True)
  59. return new_policy, Message(_('New Pruning Policy has been created.'), 'success')
  60. def __call__(self, request, *args, **kwargs):
  61. if not request.user.is_god():
  62. request.messages.set_flash(Message(_('Only system administrators can set new pruning policies.')), 'error', self.admin.id)
  63. return redirect(reverse('admin_prune_users'))
  64. return super(New, self).__call__(request, *args, **kwargs)
  65. class Edit(FormWidget):
  66. admin = site.get_action('prune_users')
  67. id = 'edit'
  68. name = _("Edit Pruning Policy")
  69. fallback = 'admin_prune_users'
  70. form = PolicyForm
  71. target_name = 'name'
  72. notfound_message = _('Requested pruning policy could not be found.')
  73. submit_fallback = True
  74. def get_url(self, request, model):
  75. return reverse('admin_prune_users_edit', model)
  76. def get_edit_url(self, request, model):
  77. return self.get_url(request, model)
  78. def get_initial_data(self, request, model):
  79. return {
  80. 'name': model.name,
  81. 'email': model.email,
  82. 'posts': model.posts,
  83. 'registered': model.registered,
  84. 'last_visit': model.last_visit,
  85. }
  86. def submit_form(self, request, form, target):
  87. target.name = form.cleaned_data['name']
  88. target.email = form.cleaned_data['email']
  89. target.posts = form.cleaned_data['posts']
  90. target.registered = form.cleaned_data['registered']
  91. target.last_visit = form.cleaned_data['last_visit']
  92. target.save(force_update=True)
  93. return target, Message(_('Changes in policy "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
  94. def __call__(self, request, *args, **kwargs):
  95. if not request.user.is_god():
  96. request.messages.set_flash(Message(_('Only system administrators can edit pruning policies.')), 'error', self.admin.id)
  97. return redirect(reverse('admin_prune_users'))
  98. return super(Edit, self).__call__(request, *args, **kwargs)
  99. class Delete(ButtonWidget):
  100. admin = site.get_action('prune_users')
  101. id = 'delete'
  102. fallback = 'admin_prune_users'
  103. notfound_message = _('Requested pruning policy could not be found.')
  104. def action(self, request, target):
  105. if not request.user.is_god():
  106. return Message(_('Only system administrators can delete pruning policies.'), 'error'), False
  107. target.delete()
  108. return Message(_('Pruning policy "%(name)s" has been deleted.') % {'name': target.name}, 'success'), False
  109. class Apply(FormWidget):
  110. admin = site.get_action('prune_users')
  111. id = 'apply'
  112. name = _("Apply Pruning Policy")
  113. fallback = 'admin_prune_users'
  114. form = PolicyForm
  115. target_name = 'name'
  116. notfound_message = _('Requested pruning policy could not be found.')
  117. submit_fallback = True
  118. template = 'apply'
  119. def get_url(self, request, model):
  120. return reverse('admin_prune_users_apply', model)
  121. def __call__(self, request, target=None, slug=None):
  122. # Fetch target
  123. model = None
  124. if target:
  125. model = self.get_and_validate_target(request, target)
  126. self.original_name = self.get_target_name(model)
  127. if not model:
  128. return redirect(self.get_fallback_url(request))
  129. original_model = model
  130. # Set filter
  131. users = model.get_model()
  132. total_users = users
  133. total_users = total_users.count()
  134. if not total_users:
  135. request.messages.set_flash(Message(_('Policy "%(name)s" does not apply to any users.') % {'name': model.name}), 'error', self.admin.id)
  136. return redirect(reverse('admin_prune_users'))
  137. message = None
  138. if request.method == 'POST':
  139. deleted = 0
  140. if request.csrf.request_secure(request):
  141. for user in users.iterator():
  142. if user.is_protected():
  143. request.messages.set_flash(Message(_('User "%(name)s" is protected and was not deleted.') % {'name': user.username}), 'info', self.admin.id)
  144. else:
  145. user.delete()
  146. deleted += 1
  147. if deleted:
  148. request.messages.set_flash(Message(ungettext(
  149. 'One user has been deleted.',
  150. '%(deleted)d users have been deleted.',
  151. deleted
  152. ) % {'deleted': deleted}), 'success', self.admin.id)
  153. User.objects.resync_monitor(request.monitor)
  154. else:
  155. request.messages.set_flash(Message(_("No users have been deleted.")), 'info', self.admin.id)
  156. return redirect(reverse('admin_prune_users'))
  157. else:
  158. message = Message(_("Request authorization is invalid. Please resubmit your form."), 'error')
  159. return request.theme.render_to_response(self.get_template(self.template),
  160. {
  161. 'admin': self.admin,
  162. 'action': self,
  163. 'request': request,
  164. 'url': self.get_url(request, model),
  165. 'fallback': self.get_fallback_url(request),
  166. 'messages': request.messages.get_messages(self.admin.id),
  167. 'message': message,
  168. 'tabbed': self.tabbed,
  169. 'total_users': total_users,
  170. 'target': self.get_target_name(original_model),
  171. 'target_model': original_model,
  172. },
  173. context_instance=RequestContext(request));