views.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from django.core.urlresolvers import reverse as django_reverse
  2. from django.utils.translation import ugettext as _
  3. import floppyforms as forms
  4. from misago import messages
  5. from misago.admin import site
  6. from misago.apps.admin.widgets import *
  7. from misago.forms import Form
  8. from misago.models import WarnLevel
  9. from misago.utils.strings import slugify
  10. from misago.apps.admin.warninglevels.forms import WarnLevelForm
  11. def reverse(route, target=None):
  12. if target:
  13. return django_reverse(route, kwargs={'target': target.pk, 'slug': slugify(target.name)})
  14. return django_reverse(route)
  15. """
  16. Views
  17. """
  18. class List(ListWidget):
  19. admin = site.get_action('warning_levels')
  20. id = 'list'
  21. columns = (
  22. ('name', _("Level Name")),
  23. )
  24. table_form_button = _('Change Warning Levels')
  25. nothing_checked_message = _('You have to check at least one warning level.')
  26. actions = (
  27. ('delete', _("Delete selected levels"), _("Are you sure you want to delete selected warning levels?")),
  28. )
  29. def get_table_form(self, page_items):
  30. order_form = {}
  31. # Build choices list
  32. choices = []
  33. for i in range(0, len(page_items)):
  34. choices.append([str(i), i + 1])
  35. # Build selectors list
  36. position = 0
  37. for item in page_items:
  38. order_form['pos_' + str(item.pk)] = forms.ChoiceField(choices=choices, initial=str(position))
  39. position += 1
  40. # Turn dict into object
  41. return type('OrderWarningLevelsForm', (Form,), order_form)
  42. def table_action(self, page_items, cleaned_data):
  43. for item in page_items:
  44. item.warning_level = cleaned_data['pos_' + str(item.pk)]
  45. item.save(force_update=True)
  46. WarnLevel.objects.flush_cache()
  47. return Message(_('Warning levels have been changed'), messages.SUCCESS), reverse('admin_warning_levels')
  48. def sort_items(self, page_items, sorting_method):
  49. return page_items.order_by('warning_level')
  50. def get_item_actions(self, item):
  51. return (
  52. self.action('pencil', _("Edit Level"), reverse('admin_warning_levels_edit', item)),
  53. self.action('remove', _("Delete Level"), reverse('admin_warning_levels_delete', item), post=True, prompt=_("Are you sure you want to delete this warning level?")),
  54. )
  55. def action_delete(self, items, checked):
  56. WarnLevel.objects.filter(id__in=checked).delete()
  57. levels_counter = 1
  58. for level in WarnLevel.objects.order_by('warning_level').iterator():
  59. if level.warning_level != levels_counter:
  60. level.warning_level = levels_counter
  61. level.save(force_update=True)
  62. levels_counter += 1
  63. WarnLevel.objects.flush_cache()
  64. return Message(_('Selected warning levels have been deleted successfully.'), messages.SUCCESS), reverse('admin_warning_levels')
  65. class New(FormWidget):
  66. admin = site.get_action('warning_levels')
  67. id = 'new'
  68. fallback = 'admin_warning_levels'
  69. form = WarnLevelForm
  70. submit_button = _("Save Warning Level")
  71. def get_new_link(self, model):
  72. return reverse('admin_warning_levels_new')
  73. def get_edit_link(self, model):
  74. return reverse('admin_warning_levels_edit', model)
  75. def submit_form(self, form, target):
  76. top_level = WarnLevel.objects.order_by('-warning_level')[:1]
  77. if top_level:
  78. new_warning_level = top_level[0].warning_level + 1
  79. else:
  80. new_warning_level = 1
  81. new_level = WarnLevel(
  82. name=form.cleaned_data['name'],
  83. slug=slugify(form.cleaned_data['name']),
  84. description=form.cleaned_data['description'],
  85. warning_level=new_warning_level,
  86. expires_after_minutes=form.cleaned_data['expires_after_minutes'],
  87. restrict_posting_replies=form.cleaned_data['restrict_posting_replies'],
  88. restrict_posting_threads=form.cleaned_data['restrict_posting_threads']
  89. )
  90. new_level.save(force_insert=True)
  91. WarnLevel.objects.flush_cache()
  92. return new_level, Message(_('New warning level has been defined.'), messages.SUCCESS)
  93. class Edit(FormWidget):
  94. admin = site.get_action('warning_levels')
  95. id = 'edit'
  96. name = _("Edit Warning Level")
  97. fallback = 'admin_warning_levels'
  98. form = WarnLevelForm
  99. target_name = 'name'
  100. notfound_message = _('Requested warning level could not be found.')
  101. translate_target_name = False
  102. submit_fallback = True
  103. def get_link(self, model):
  104. return reverse('admin_warning_levels_edit', model)
  105. def get_edit_link(self, model):
  106. return self.get_link(model)
  107. def get_initial_data(self, model):
  108. return {
  109. 'name': model.name,
  110. 'description': model.description,
  111. 'expires_after_minutes': model.expires_after_minutes,
  112. 'restrict_posting_replies': model.restrict_posting_replies,
  113. 'restrict_posting_threads': model.restrict_posting_threads,
  114. }
  115. def submit_form(self, form, target):
  116. target.name = form.cleaned_data['name']
  117. target.slug = slugify(form.cleaned_data['name'])
  118. target.description = form.cleaned_data['description']
  119. target.expires_after_minutes = form.cleaned_data['expires_after_minutes']
  120. target.restrict_posting_replies = form.cleaned_data['restrict_posting_replies']
  121. target.restrict_posting_threads = form.cleaned_data['restrict_posting_threads']
  122. target.save(force_update=True)
  123. WarnLevel.objects.flush_cache()
  124. return target, Message(_('Changes in warning level "%(name)s" have been saved.') % {'name': self.original_name}, messages.SUCCESS)
  125. class Delete(ButtonWidget):
  126. admin = site.get_action('warning_levels')
  127. id = 'delete'
  128. fallback = 'admin_warning_levels'
  129. notfound_message = _('Requested warning level could not be found.')
  130. def action(self, target):
  131. target.delete()
  132. levels_counter = 1
  133. for level in WarnLevel.objects.order_by('warning_level').iterator():
  134. if level.warning_level != levels_counter:
  135. level.warning_level = levels_counter
  136. level.save(force_update=True)
  137. levels_counter += 1
  138. WarnLevel.objects.flush_cache()
  139. return Message(_('Warning level "%(name)s" has been deleted.') % {'name': _(target.name)}, messages.SUCCESS), False