views.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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.apps.admin.widgets import *
  6. from misago.forms import Form
  7. from misago.models import PruningPolicy, User
  8. from misago.apps.admin.pruneusers.forms import PolicyForm
  9. def reverse(route, target=None):
  10. if target:
  11. return django_reverse(route, kwargs={'target': target.pk})
  12. return django_reverse(route)
  13. """
  14. Views
  15. """
  16. class List(ListWidget):
  17. admin = site.get_action('prune_users')
  18. id = 'list'
  19. columns = (
  20. ('name', _("Pruning Policy")),
  21. )
  22. nothing_checked_message = _('You have to check at least one policy.')
  23. actions = (
  24. ('delete', _("Delete selected policies"), _("Are you sure you want to delete selected policies?")),
  25. )
  26. def sort_items(self, page_items, sorting_method):
  27. return page_items.order_by('name')
  28. def get_item_actions(self, item):
  29. return (
  30. self.action('filter', _("Apply Policy"), reverse('admin_prune_users_apply', item)),
  31. self.action('pencil', _("Edit Policy"), reverse('admin_prune_users_edit', item)),
  32. self.action('remove', _("Delete Policy"), reverse('admin_prune_users_delete', item), post=True, prompt=_("Are you sure you want to delete this policy?")),
  33. )
  34. def action_delete(self, items, checked):
  35. if not self.request.user.is_god():
  36. return Message(_('Only system administrators can delete pruning policies.'), 'error'), reverse('admin_prune_users')
  37. PruningPolicy.objects.filter(id__in=checked).delete()
  38. return Message(_('Selected pruning policies have been deleted successfully.'), 'success'), reverse('admin_prune_users')
  39. class New(FormWidget):
  40. admin = site.get_action('prune_users')
  41. id = 'new'
  42. fallback = 'admin_prune_users'
  43. form = PolicyForm
  44. submit_button = _("Save Policy")
  45. def get_new_url(self, model):
  46. return reverse('admin_prune_users_new')
  47. def get_edit_url(self, model):
  48. return reverse('admin_prune_users_edit', model)
  49. def submit_form(self, form, target):
  50. new_policy = PruningPolicy(
  51. name=form.cleaned_data['name'],
  52. email=form.cleaned_data['email'],
  53. posts=form.cleaned_data['posts'],
  54. registered=form.cleaned_data['registered'],
  55. last_visit=form.cleaned_data['last_visit'],
  56. )
  57. new_policy.clean()
  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, model):
  75. return reverse('admin_prune_users_edit', model)
  76. def get_edit_url(self, model):
  77. return self.get_url(model)
  78. def get_initial_data(self, 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, 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.clean()
  93. target.save(force_update=True)
  94. return target, Message(_('Changes in policy "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
  95. def __call__(self, request, *args, **kwargs):
  96. if not request.user.is_god():
  97. request.messages.set_flash(Message(_('Only system administrators can edit pruning policies.')), 'error', self.admin.id)
  98. return redirect(reverse('admin_prune_users'))
  99. return super(Edit, self).__call__(request, *args, **kwargs)
  100. class Delete(ButtonWidget):
  101. admin = site.get_action('prune_users')
  102. id = 'delete'
  103. fallback = 'admin_prune_users'
  104. notfound_message = _('Requested pruning policy could not be found.')
  105. def action(self, target):
  106. if not self.request.user.is_god():
  107. return Message(_('Only system administrators can delete pruning policies.'), 'error'), False
  108. target.delete()
  109. return Message(_('Pruning policy "%(name)s" has been deleted.') % {'name': target.name}, 'success'), False
  110. class Apply(FormWidget):
  111. admin = site.get_action('prune_users')
  112. id = 'apply'
  113. name = _("Apply Pruning Policy")
  114. fallback = 'admin_prune_users'
  115. form = PolicyForm
  116. target_name = 'name'
  117. notfound_message = _('Requested pruning policy could not be found.')
  118. submit_fallback = True
  119. template = 'apply'
  120. def get_url(self, model):
  121. return reverse('admin_prune_users_apply', model)
  122. def __call__(self, request, target=None, slug=None):
  123. self.request = request
  124. # Fetch target
  125. model = None
  126. if target:
  127. model = self.get_and_validate_target(target)
  128. self.original_name = self.get_target_name(model)
  129. if not model:
  130. return redirect(self.get_fallback_url())
  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(),
  162. {
  163. 'admin': self.admin,
  164. 'action': self,
  165. 'request': request,
  166. 'url': self.get_url(model),
  167. 'fallback': self.get_fallback_url(),
  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));