views.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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.clean()
  59. new_policy.save(force_insert=True)
  60. return new_policy, Message(_('New Pruning Policy has been created.'), 'success')
  61. def __call__(self, request, *args, **kwargs):
  62. if not request.user.is_god():
  63. request.messages.set_flash(Message(_('Only system administrators can set new pruning policies.')), 'error', self.admin.id)
  64. return redirect(reverse('admin_prune_users'))
  65. return super(New, self).__call__(request, *args, **kwargs)
  66. class Edit(FormWidget):
  67. admin = site.get_action('prune_users')
  68. id = 'edit'
  69. name = _("Edit Pruning Policy")
  70. fallback = 'admin_prune_users'
  71. form = PolicyForm
  72. target_name = 'name'
  73. notfound_message = _('Requested pruning policy could not be found.')
  74. submit_fallback = True
  75. def get_url(self, request, model):
  76. return reverse('admin_prune_users_edit', model)
  77. def get_edit_url(self, request, model):
  78. return self.get_url(request, model)
  79. def get_initial_data(self, request, model):
  80. return {
  81. 'name': model.name,
  82. 'email': model.email,
  83. 'posts': model.posts,
  84. 'registered': model.registered,
  85. 'last_visit': model.last_visit,
  86. }
  87. def submit_form(self, request, form, target):
  88. target.name = form.cleaned_data['name']
  89. target.email = form.cleaned_data['email']
  90. target.posts = form.cleaned_data['posts']
  91. target.registered = form.cleaned_data['registered']
  92. target.last_visit = form.cleaned_data['last_visit']
  93. target.clean()
  94. target.save(force_update=True)
  95. return target, Message(_('Changes in policy "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
  96. def __call__(self, request, *args, **kwargs):
  97. if not request.user.is_god():
  98. request.messages.set_flash(Message(_('Only system administrators can edit pruning policies.')), 'error', self.admin.id)
  99. return redirect(reverse('admin_prune_users'))
  100. return super(Edit, self).__call__(request, *args, **kwargs)
  101. class Delete(ButtonWidget):
  102. admin = site.get_action('prune_users')
  103. id = 'delete'
  104. fallback = 'admin_prune_users'
  105. notfound_message = _('Requested pruning policy could not be found.')
  106. def action(self, request, target):
  107. if not request.user.is_god():
  108. return Message(_('Only system administrators can delete pruning policies.'), 'error'), False
  109. target.delete()
  110. return Message(_('Pruning policy "%(name)s" has been deleted.') % {'name': target.name}, 'success'), False
  111. class Apply(FormWidget):
  112. admin = site.get_action('prune_users')
  113. id = 'apply'
  114. name = _("Apply Pruning Policy")
  115. fallback = 'admin_prune_users'
  116. form = PolicyForm
  117. target_name = 'name'
  118. notfound_message = _('Requested pruning policy could not be found.')
  119. submit_fallback = True
  120. template = 'apply'
  121. def get_url(self, request, model):
  122. return reverse('admin_prune_users_apply', model)
  123. def __call__(self, request, target=None, slug=None):
  124. # Fetch target
  125. model = None
  126. if target:
  127. model = self.get_and_validate_target(request, target)
  128. self.original_name = self.get_target_name(model)
  129. if not model:
  130. return redirect(self.get_fallback_url(request))
  131. original_model = model
  132. # Set filter
  133. users = model.get_model()
  134. total_users = users
  135. total_users = total_users.count()
  136. if not total_users:
  137. request.messages.set_flash(Message(_('Policy "%(name)s" does not apply to any users.') % {'name': model.name}), 'error', self.admin.id)
  138. return redirect(reverse('admin_prune_users'))
  139. message = None
  140. if request.method == 'POST':
  141. deleted = 0
  142. if request.csrf.request_secure(request):
  143. for user in users.iterator():
  144. if user.is_protected():
  145. request.messages.set_flash(Message(_('User "%(name)s" is protected and was not deleted.') % {'name': user.username}), 'info', self.admin.id)
  146. else:
  147. user.delete()
  148. deleted += 1
  149. if deleted:
  150. request.messages.set_flash(Message(ungettext(
  151. 'One user has been deleted.',
  152. '%(deleted)d users have been deleted.',
  153. deleted
  154. ) % {'deleted': deleted}), 'success', self.admin.id)
  155. User.objects.resync_monitor(request.monitor)
  156. else:
  157. request.messages.set_flash(Message(_("No users have been deleted.")), 'info', self.admin.id)
  158. return redirect(reverse('admin_prune_users'))
  159. else:
  160. message = Message(_("Request authorization is invalid. Please resubmit your form."), 'error')
  161. return request.theme.render_to_response(self.get_template(self.template),
  162. {
  163. 'admin': self.admin,
  164. 'action': self,
  165. 'request': request,
  166. 'url': self.get_url(request, model),
  167. 'fallback': self.get_fallback_url(request),
  168. 'messages': request.messages.get_messages(self.admin.id),
  169. 'message': message,
  170. 'tabbed': self.tabbed,
  171. 'total_users': total_users,
  172. 'target': self.get_target_name(original_model),
  173. 'target_model': original_model,
  174. },
  175. context_instance=RequestContext(request));