Browse Source

Banning admin files.

Ralfp 12 years ago
parent
commit
26d969e335
3 changed files with 207 additions and 0 deletions
  1. 0 0
      misago/banning/admin/__init__.py
  2. 56 0
      misago/banning/admin/forms.py
  3. 151 0
      misago/banning/admin/views.py

+ 0 - 0
misago/banning/admin/__init__.py


+ 56 - 0
misago/banning/admin/forms.py

@@ -0,0 +1,56 @@
+from django.utils.translation import ugettext_lazy as _
+from django import forms
+from misago.forms import Form
+
+class BanForm(Form):
+    """
+    New/Edit Ban form
+    """
+    type = forms.ChoiceField(choices=(
+                                      (0, _('Ban Username and e-mail')),
+                                      (1, _('Ban Username')),
+                                      (2, _('Ban E-mail address')),
+                                      (3, _('Ban IP Address'))
+                                      ))
+    reason_user = forms.CharField(widget=forms.Textarea,required=False)
+    reason_admin = forms.CharField(widget=forms.Textarea,required=False)
+    ban = forms.CharField(max_length=255)
+    expires = forms.DateField(required=False)
+    layout = (
+               (
+                 _("Ban Details"),
+                 (
+                  ('nested', (('type', {'label': _("Ban Rule"), 'help_text': _("Select ban type from list and define rule by entering it in text field. If you want to ban specific user, enter here either his Username or E-mail address. If you want to define blanket ban, you can use wildcard (\"*\"). For example to forbid all members from using name suggesting that member is an admin, you can set ban that forbids \"Admin*\" as username."), 'width': 25}),
+                  ('ban', {'width': 75}))),
+                  ('expires', {'label': _("Ban Expiration"), 'help_text': _("If you want to, you can set this ban's expiration date by entering it here using YYYY-MM-DD format. Otherwhise you can leave this field empty making this ban permanent.")}),
+                 ),
+                ),
+                (
+                 _("Ban Message"),
+                 (
+                  ('reason_user', {'label': _("User-visible Ban Message"), 'help_text': _("Optional Ban message that will be displayed to banned members.")}),
+                  ('reason_admin', {'label': _("Team-visible Ban Message"), 'help_text': _("Optional Ban message that will be displayed to forum team members.")}),
+                 ),
+                ),
+               )
+
+
+class SearchBansForm(Form):
+    ban = forms.CharField(required=False)
+    reason = forms.CharField(required=False)
+    type = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=(
+                                      ("0", _('Username and e-mail')),
+                                      ("1", _('Username')),
+                                      ("2", _('E-mail address')),
+                                      ("3", _('IP Address'))
+                                      ), required=False)
+    layout = (
+              (
+               _("Search Bans"),
+               (
+                ('ban', {'label': _("Ban"), 'attrs': {'placeholder': _("Ban contains...")}}),
+                ('reason', {'label': _("Messages"), 'attrs': {'placeholder': _("User or Team message contains...")}}),
+                ('type', {'label': _("Type")}),
+               ),
+              ),
+             )

+ 151 - 0
misago/banning/admin/views.py

@@ -0,0 +1,151 @@
+from django.core.urlresolvers import reverse as django_reverse
+from django.db.models import Q
+from django.utils.translation import ugettext as _
+from misago.admin import site
+from misago.admin.widgets import *
+from misago.banning.admin.forms import BanForm, SearchBansForm
+from misago.banning.models import Ban
+
+def reverse(route, target=None):
+    if target:
+        return django_reverse(route, kwargs={'target': target.pk})
+    return django_reverse(route)
+
+"""
+Views
+"""
+class List(ListWidget):
+    """
+    List Bans
+    """
+    admin = site.get_action('bans')
+    id = 'list'
+    columns=(
+             ('ban', _("Ban"), 50),
+             ('expires', _("Expires")),
+             )
+    default_sorting = 'expires'
+    sortables={
+               'ban': 1,
+               'expires': 0,
+              }
+    pagination = 20
+    search_form = SearchBansForm
+    empty_message = _('No bans are currently set.')
+    empty_search_message = _('No bans have been found.')
+    nothing_checked_message = _('You have to check at least one ban.')
+    actions=(
+             ('delete', _("Lift selected bans"), _("Are you sure you want to lift selected bans?")),
+             )
+    
+    def set_filters(self, model, filters):
+        if 'ban' in filters:
+            model = model.filter(ban__contains=filters['ban'])
+        if 'reason' in filters:
+            model = model.filter(Q(reason_user__contains=filters['reason']) | Q(reason_admin__contains=filters['reason']))
+        if 'type' in filters:
+            model = model.filter(type__in=filters['type'])
+        return model
+    
+    def get_item_actions(self, request, item):
+        return (
+                self.action('pencil', _("Edit Ban"), reverse('admin_users_bans_edit', item)),
+                self.action('remove', _("Lift Ban"), reverse('admin_users_bans_delete', item), post=True, prompt=_("Are you sure you want to lift this ban?")),
+                )
+
+    def action_delete(self, request, items, checked):
+        Ban.objects.filter(id__in=checked).delete()
+        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        return BasicMessage(_('Selected bans have been lifted successfully.'), 'success'), reverse('admin_users_bans')
+    
+
+class New(FormWidget):
+    """
+    Create Ban
+    """
+    admin = site.get_action('bans')
+    id = 'new'
+    fallback = 'admin_users_bans' 
+    form = BanForm
+    submit_button = _("Set Ban")
+        
+    def get_new_url(self, request, model):
+        return reverse('admin_users_bans')
+    
+    def get_edit_url(self, request, model):
+        return reverse('admin_users_bans_edit', model)
+    
+    def submit_form(self, request, form, target):
+        new_ban = Ban(
+                      type = form.cleaned_data['type'],
+                      ban = form.cleaned_data['ban'],
+                      reason_user = form.cleaned_data['reason_user'],
+                      reason_admin = form.cleaned_data['reason_admin'],
+                      expires = form.cleaned_data['expires']
+                     )
+        new_ban.save(force_insert=True)
+        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        return new_ban, BasicMessage(_('New Ban has been set.'), 'success')
+    
+   
+class Edit(FormWidget):
+    """
+    Edit Ban
+    """
+    admin = site.get_action('bans')
+    id = 'edit'
+    name = _("Edit Ban")
+    fallback = 'admin_users_bans'
+    form = BanForm
+    target_name = 'ban'
+    notfound_message = _('Requested Ban could not be found.')
+    submit_fallback = True
+    
+    def get_url(self, request, model):
+        return reverse('admin_users_bans_edit', model)
+    
+    def get_edit_url(self, request, model):
+        return self.get_url(request, model)
+    
+    def get_initial_data(self, request, model):
+        return {
+                'type': model.type,
+                'ban': model.ban,
+                'reason_user': model.reason_user,
+                'reason_admin': model.reason_admin,
+                'expires': model.expires,
+                }
+    
+    def submit_form(self, request, form, target):
+        target.type = form.cleaned_data['type']
+        target.ban = form.cleaned_data['ban']
+        target.reason_user = form.cleaned_data['reason_user']
+        target.reason_admin = form.cleaned_data['reason_admin']
+        target.expires = form.cleaned_data['expires']
+        target.save(force_update=True)
+        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        return target, BasicMessage(_('Changes in ban have been saved.'), 'success')
+
+
+class Delete(ButtonWidget):
+    """
+    Delete Ban
+    """
+    admin = site.get_action('bans')
+    id = 'delete'
+    fallback = 'admin_users_bans'
+    notfound_message = _('Requested Ban could not be found.')
+    
+    def action(self, request, target):
+        target.delete()
+        request.monitor['bans_version'] = int(request.monitor['bans_version']) + 1
+        if target.type == 0:
+            return BasicMessage(_('E-mail and username Ban "%(ban)s" has been lifted.' % {'ban': target.ban}), 'success'), False
+        if target.type == 1:
+            return BasicMessage(_('Username Ban "%(ban)s" has been lifted.' % {'ban': target.ban}), 'success'), False
+        if target.type == 2:
+            return BasicMessage(_('E-mail Ban "%(ban)s" has been lifted.' % {'ban': target.ban}), 'success'), False
+        if target.type == 3:
+            return BasicMessage(_('IP Ban "%(ban)s" has been lifted.' % {'ban': target.ban}), 'success'), False
+        
+