views.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from misago.admin import site
  2. print site.get_action('bans')
  3. from django.core.urlresolvers import reverse as django_reverse
  4. from django.db.models import Q
  5. from django.template import RequestContext
  6. from django.utils.translation import ugettext as _
  7. from misago.admin import site
  8. print site.get_action('bans')
  9. from misago.admin.widgets import *
  10. from misago.banning.forms import BanForm, SearchBansForm
  11. from misago.banning.models import Ban
  12. from misago.messages import Message
  13. """
  14. Admin mixin
  15. """
  16. def reverse(route, target=None):
  17. if target:
  18. return django_reverse(route, kwargs={'target': target.pk})
  19. return django_reverse(route)
  20. """
  21. Views
  22. """
  23. def error_banned(request, user=None, ban=None):
  24. if not ban:
  25. ban = request.ban
  26. response = request.theme.render_to_response('error403_banned.html',
  27. {
  28. 'banned_user': user,
  29. 'ban': ban,
  30. 'hide_signin': True,
  31. 'exception_response': True,
  32. },
  33. context_instance=RequestContext(request));
  34. response.status_code = 403
  35. return response
  36. class List(ListWidget):
  37. """
  38. List Bans
  39. """
  40. admin = site.get_action('bans')
  41. id = 'list'
  42. columns=(
  43. ('ban', _("Ban"), 50),
  44. ('expires', _("Expires")),
  45. )
  46. default_sorting = 'expires'
  47. sortables={
  48. 'ban': 1,
  49. 'expires': 0,
  50. }
  51. pagination = 20
  52. search_form = SearchBansForm
  53. empty_message = _('No bans are currently set.')
  54. empty_search_message = _('No bans have been found.')
  55. nothing_checked_message = _('You have to check at least one ban.')
  56. actions=(
  57. ('delete', _("Lift selected bans"), _("Are you sure you want to lift selected bans?")),
  58. )
  59. def set_filters(self, model, filters):
  60. if 'ban' in filters:
  61. model = model.filter(ban__contains=filters['ban'])
  62. if 'reason' in filters:
  63. model = model.filter(Q(reason_user__contains=filters['reason']) | Q(reason_admin__contains=filters['reason']))
  64. if 'type' in filters:
  65. model = model.filter(type__in=filters['type'])
  66. return model
  67. def get_item_actions(self, item):
  68. return (
  69. self.action('pencil', _("Edit Ban"), reverse('admin_bans_edit', item)),
  70. self.action('remove', _("Lift Ban"), reverse('admin_bans_delete', item), post=True, prompt=_("Are you sure you want to lift this ban?")),
  71. )
  72. def action_delete(self, items, checked):
  73. Ban.objects.filter(id__in=checked).delete()
  74. self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
  75. return Message(_('Selected bans have been lifted successfully.'), 'success'), reverse('admin_bans')
  76. class New(FormWidget):
  77. """
  78. Create Ban
  79. """
  80. admin = site.get_action('bans')
  81. id = 'new'
  82. fallback = 'admin_bans'
  83. form = BanForm
  84. submit_button = _("Set Ban")
  85. def get_new_url(self, model):
  86. return reverse('admin_bans_new')
  87. def get_edit_url(self, model):
  88. return reverse('admin_bans_edit', model)
  89. def submit_form(self, form, target):
  90. new_ban = Ban(
  91. type = form.cleaned_data['type'],
  92. ban = form.cleaned_data['ban'],
  93. reason_user = form.cleaned_data['reason_user'],
  94. reason_admin = form.cleaned_data['reason_admin'],
  95. expires = form.cleaned_data['expires']
  96. )
  97. new_ban.save(force_insert=True)
  98. self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
  99. return new_ban, Message(_('New Ban has been set.'), 'success')
  100. class Edit(FormWidget):
  101. """
  102. Edit Ban
  103. """
  104. admin = site.get_action('bans')
  105. id = 'edit'
  106. name = _("Edit Ban")
  107. fallback = 'admin_bans'
  108. form = BanForm
  109. target_name = 'ban'
  110. notfound_message = _('Requested Ban could not be found.')
  111. submit_fallback = True
  112. def get_url(self, model):
  113. return reverse('admin_bans_edit', model)
  114. def get_edit_url(self, model):
  115. return self.get_url(model)
  116. def get_initial_data(self, model):
  117. return {
  118. 'type': model.type,
  119. 'ban': model.ban,
  120. 'reason_user': model.reason_user,
  121. 'reason_admin': model.reason_admin,
  122. 'expires': model.expires,
  123. }
  124. def submit_form(self, form, target):
  125. target.type = form.cleaned_data['type']
  126. target.ban = form.cleaned_data['ban']
  127. target.reason_user = form.cleaned_data['reason_user']
  128. target.reason_admin = form.cleaned_data['reason_admin']
  129. target.expires = form.cleaned_data['expires']
  130. target.save(force_update=True)
  131. self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
  132. return target, Message(_('Changes in ban have been saved.'), 'success')
  133. class Delete(ButtonWidget):
  134. """
  135. Delete Ban
  136. """
  137. admin = site.get_action('bans')
  138. id = 'delete'
  139. fallback = 'admin_bans'
  140. notfound_message = _('Requested Ban could not be found.')
  141. def action(self, target):
  142. target.delete()
  143. self.request.monitor['bans_version'] = int(self.request.monitor['bans_version']) + 1
  144. if target.type == 0:
  145. return Message(_('E-mail and username Ban "%(ban)s" has been lifted.') % {'ban': target.ban}, 'success'), False
  146. if target.type == 1:
  147. return Message(_('Username Ban "%(ban)s" has been lifted.') % {'ban': target.ban}, 'success'), False
  148. if target.type == 2:
  149. return Message(_('E-mail Ban "%(ban)s" has been lifted.') % {'ban': target.ban}, 'success'), False
  150. if target.type == 3:
  151. return Message(_('IP Ban "%(ban)s" has been lifted.') % {'ban': target.ban}, 'success'), False