views.py 5.4 KB

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