views.py 5.4 KB

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