Browse Source

Users pruning policies admin

Ralfp 12 years ago
parent
commit
71d584f867

+ 23 - 5
misago/users/admin/__init__.py

@@ -3,7 +3,7 @@ from django.utils.translation import ugettext_lazy as _
 from misago.admin import AdminSection, AdminAction
 from misago.admin import AdminSection, AdminAction
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.banning.models import Ban
 from misago.banning.models import Ban
-from misago.users.models import User, Rank, Newsletter
+from misago.users.models import User, Rank, Newsletter, Pruning
 
 
 ADMIN_SECTIONS=(
 ADMIN_SECTIONS=(
     AdminSection(
     AdminSection(
@@ -137,13 +137,31 @@ ADMIN_ACTIONS=(
                ),
                ),
    AdminAction(
    AdminAction(
                section='users',
                section='users',
-               id='prune',
+               id='pruning',
                name=_("Prune Users"),
                name=_("Prune Users"),
                help=_("Delete multiple Users"),
                help=_("Delete multiple Users"),
                icon='remove',
                icon='remove',
-               route='admin_users_prune',
-               urlpatterns=patterns('misago.admin.views',
-                        url(r'^$', 'todo', name='admin_users_prune'),
+               model=Pruning,
+               actions=[
+                        {
+                         'id': 'list',
+                         'name': _("Pruning Policies"),
+                         'help': _("Browse all existing pruning policies"),
+                         'route': 'admin_users_pruning'
+                         },
+                        {
+                         'id': 'new',
+                         'name': _("Set New Policy"),
+                         'help': _("Set new pruning policy"),
+                         'route': 'admin_users_pruning_new'
+                         },
+                        ],
+               route='admin_users_pruning',
+               urlpatterns=patterns('misago.users.admin.pruning.views',
+                        url(r'^$', 'List', name='admin_users_pruning'),
+                        url(r'^new/$', 'New', name='admin_users_pruning_new'),
+                        url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_users_pruning_edit'),
+                        url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_users_pruning_delete'),
                     ),
                     ),
                ),
                ),
    AdminAction(
    AdminAction(

+ 0 - 0
misago/users/admin/prune/__init__.py → misago/users/admin/pruning/__init__.py


+ 30 - 0
misago/users/admin/pruning/forms.py

@@ -0,0 +1,30 @@
+from django.core.validators import RegexValidator
+from django.utils.translation import ugettext_lazy as _
+from django import forms
+from misago.forms import Form, YesNoSwitch
+
+class PruningForm(Form):
+    name = forms.CharField(max_length=255)
+    email = forms.CharField(max_length=255,required=False)
+    posts = forms.IntegerField(min_value=0,initial=0)
+    registered = forms.IntegerField(min_value=0,initial=0)
+    last_visit = forms.IntegerField(min_value=0,initial=0)
+    
+    layout = (
+              (
+               _("Basic Policy Options"),
+               (
+                ('name', {'label': _("Policy Name"), 'help_text': _("Short, describtive name of this pruning policy.")}),
+               )
+              ),
+              (
+               _("Pruning Policy Criteria"),
+               (
+                ('email', {'label': _("Member E-mail Address ends with"), 'help_text': _("If you want to, you can enter more than one e-mail suffix by separating them with comma.")}),
+                ('posts', {'label': _("Member has no more posts than"), 'help_text': _("Maximum number of posts member is allowed to have to fall under policy. For example if you enter in 10 posts and make this only criteria, every user that has less than 10 posts will be deleted. Enter zero to dont use this criteria")}),
+                ('registered', {'label': _("User is member for no more than"), 'help_text': _("Maximal number of days user is member for. For exmaple if you enter in 15 days and make this only criteria, every user who is member for less than 15 days will be deleted. Enter zero to dont use this criteria.")}),
+                ('last_visit', {'label': _("User last visit was before"), 'help_text': _("Maximal allowed inactivity period in days. For example if you enter in 300 days and make this only criteria for deleting users, every member who did not signed into forums in last 300 days will be deleted. Enter zero to dont use this criteria.")}),
+               )
+              ),
+             )
+    

+ 132 - 0
misago/users/admin/pruning/views.py

@@ -0,0 +1,132 @@
+from django.core.urlresolvers import reverse as django_reverse
+from django import forms
+from django.utils.translation import ugettext as _
+from misago.admin import site
+from misago.admin.widgets import *
+from misago.forms import Form
+from misago.users.admin.pruning.forms import PruningForm
+from misago.users.models import Pruning
+
+def reverse(route, target=None):
+    if target:
+        return django_reverse(route, kwargs={'target': target.pk})
+    return django_reverse(route)
+
+"""
+Views
+"""
+class List(ListWidget):
+    admin = site.get_action('pruning')
+    id = 'list'
+    columns=(
+             ('name', _("Pruning Policy")),
+             )
+    nothing_checked_message = _('You have to check at least one policy.')
+    actions=(
+             ('delete', _("Delete selected policies"), _("Are you sure you want to delete selected policies?")),
+             )
+    
+    def sort_items(self, request, page_items, sorting_method):
+        return page_items.order_by('name')
+    
+    def get_item_actions(self, request, item):
+        return (
+                self.action('pencil', _("Edit Pruning Policy"), reverse('admin_users_pruning_edit', item)),
+                self.action('remove', _("Delete Pruning Policy"), reverse('admin_users_pruning_delete', item), post=True, prompt=_("Are you sure you want to delete this rank?")),
+                )
+
+    def action_delete(self, request, items, checked):
+        if not request.user.is_god():
+            return Message(_('Only system administrators can delete pruning policies.'), 'error'), reverse('admin_users_pruning')
+        
+        Pruning.objects.filter(id__in=checked).delete()
+        return Message(_('Selected pruning policies have been deleted successfully.'), 'success'), reverse('admin_users_pruning')
+
+
+class New(FormWidget):
+    admin = site.get_action('pruning')
+    id = 'new'
+    fallback = 'admin_users_pruning' 
+    form = PruningForm
+    submit_button = _("Save Policy")
+        
+    def get_new_url(self, request, model):
+        return reverse('admin_users_pruning')
+    
+    def get_edit_url(self, request, model):
+        return reverse('admin_users_pruning_edit', model)
+    
+    def submit_form(self, request, form, target):
+        new_policy = Pruning(
+                      name = form.cleaned_data['name'],
+                      email = form.cleaned_data['email'],
+                      posts = form.cleaned_data['posts'],
+                      registered = form.cleaned_data['registered'],
+                      last_visit = form.cleaned_data['last_visit'],
+                     )
+        new_policy.save(force_insert=True)
+        
+        return new_policy, Message(_('New Pruning Policy has been created.'), 'success')
+    
+    def __call__(self, request, *args, **kwargs):
+        if not request.user.is_god():
+            request.messages.set_flash(Message(_('Only system administrators can set new pruning policies.')), 'error', self.admin.id)
+            return redirect(reverse('admin_users_pruning'))
+        
+        return super(New, self).__call__(request, *args, **kwargs)
+   
+class Edit(FormWidget):
+    admin = site.get_action('pruning')
+    id = 'edit'
+    name = _("Edit Pruning Policy")
+    fallback = 'admin_users_pruning'
+    form = PruningForm
+    target_name = 'name'
+    notfound_message = _('Requested pruning policy could not be found.')
+    submit_fallback = True
+    
+    def get_url(self, request, model):
+        return reverse('admin_users_pruning_edit', model)
+    
+    def get_edit_url(self, request, model):
+        return self.get_url(request, model)
+    
+    def get_initial_data(self, request, model):
+        return {
+                'name': model.name,
+                'email': model.email,
+                'posts': model.posts,
+                'registered': model.registered,
+                'last_visit': model.last_visit,
+                }
+    
+    def submit_form(self, request, form, target):
+        target.name = form.cleaned_data['name']
+        target.email = form.cleaned_data['email']
+        target.posts = form.cleaned_data['posts']
+        target.registered = form.cleaned_data['registered']
+        target.last_visit = form.cleaned_data['last_visit']
+        target.save(force_update=True)
+        
+        return target, Message(_('Changes in policy "%(name)s" have been saved.') % {'name': self.original_name}, 'success')
+    
+    def __call__(self, request, *args, **kwargs):
+        if not request.user.is_god():
+            request.messages.set_flash(Message(_('Only system administrators can edit pruning policies.')), 'error', self.admin.id)
+            return redirect(reverse('admin_users_pruning'))
+        
+        return super(Edit, self).__call__(request, *args, **kwargs)
+
+
+class Delete(ButtonWidget):
+    admin = site.get_action('pruning')
+    id = 'delete'
+    fallback = 'admin_users_pruning'
+    notfound_message = _('Requested pruning policy could not be found.')
+    
+    def action(self, request, target):
+        if not request.user.is_god():
+            return Message(_('Only system administrators can delete pruning policies.'), 'error'), False
+        
+        target.delete()
+        return Message(_('Pruning policy "%(name)s" has been deleted.') % {'name': target.name}, 'success'), False

+ 1 - 1
misago/users/admin/ranks/views.py

@@ -141,7 +141,7 @@ class Delete(ButtonWidget):
     admin = site.get_action('ranks')
     admin = site.get_action('ranks')
     id = 'delete'
     id = 'delete'
     fallback = 'admin_users_ranks'
     fallback = 'admin_users_ranks'
-    notfound_message = _('Requested rank could not be found.')
+    notfound_message = _('Requested Rank could not be found.')
     
     
     def action(self, request, target):
     def action(self, request, target):
         target.delete()
         target.delete()

+ 1 - 1
misago/users/admin/roles/views.py

@@ -103,7 +103,7 @@ class Delete(ButtonWidget):
     admin = site.get_action('roles')
     admin = site.get_action('roles')
     id = 'delete'
     id = 'delete'
     fallback = 'admin_users_roles'
     fallback = 'admin_users_roles'
-    notfound_message = _('Requested role could not be found.')
+    notfound_message = _('Requested Role could not be found.')
     
     
     def action(self, request, target):
     def action(self, request, target):
         if target.token:
         if target.token:

+ 1 - 1
misago/users/admin/users/views.py

@@ -316,7 +316,7 @@ class Delete(ButtonWidget):
     admin = site.get_action('users')
     admin = site.get_action('users')
     id = 'delete'
     id = 'delete'
     fallback = 'admin_users'
     fallback = 'admin_users'
-    notfound_message = _('Requested user account could not be found.')
+    notfound_message = _('Requested User account could not be found.')
     
     
     def action(self, request, target):
     def action(self, request, target):
         if target.pk == request.user.id:
         if target.pk == request.user.id:

+ 11 - 0
misago/users/models.py

@@ -554,4 +554,15 @@ class Newsletter(models.Model):
         for key in tokens:
         for key in tokens:
             content_plain = content_plain.replace(key, tokens[key])
             content_plain = content_plain.replace(key, tokens[key])
         return content_plain
         return content_plain
+
+
+class Pruning(models.Model):
+    """
+    Pruning policy
+    """
+    name = models.CharField(max_length=255)
+    email = models.CharField(max_length=255,null=True,blank=True)
+    posts = models.PositiveIntegerField(default=0)
+    registered = models.PositiveIntegerField(default=0)
+    last_visit = models.PositiveIntegerField(default=0)
     
     

+ 10 - 0
templates/admin/users/admin_users_pruning/list.html

@@ -0,0 +1,10 @@
+{% extends "admin/admin/list.html" %}
+{% load i18n %}
+{% load l10n %}
+{% load url from future %}
+
+{% block table_row scoped %}
+  <td class="lead-cell">
+  	<strong>{{ item.name }}</strong>
+  </td>
+{% endblock%}