views.py 8.4 KB

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