views.py 6.2 KB

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