views.py 6.1 KB

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