Ralfp 12 лет назад
Родитель
Сommit
3faeeb12b3

+ 1 - 0
misago/admin/layout/users.py

@@ -156,6 +156,7 @@ ADMIN_ACTIONS=(
                         url(r'^new/$', 'New', name='admin_prune_users_new'),
                         url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_prune_users_edit'),
                         url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_prune_users_delete'),
+                        url(r'^apply/(?P<target>\d+)/$', 'Apply', name='admin_prune_users_apply'),
                     ),
                ),
    AdminAction(

+ 1 - 1
misago/prune/forms.py

@@ -13,7 +13,7 @@ class PolicyForm(Form):
               (
                _("Basic Policy Options"),
                (
-                ('name', {'label': _("Policy Name"), 'help_text': _("Short, describtive name of this pruning policy.")}),
+                ('name', {'label': _("Policy Name"), 'help_text': _("Short, descriptive name of this pruning policy.")}),
                )
               ),
               (

+ 35 - 1
misago/prune/models.py

@@ -1,4 +1,8 @@
+from datetime import timedelta
 from django.db import models
+from django.db.models import Q
+from django.utils import timezone
+from misago.users.models import User
 
 class Policy(models.Model):
     """
@@ -9,4 +13,34 @@ class Policy(models.Model):
     posts = models.PositiveIntegerField(default=0)
     registered = models.PositiveIntegerField(default=0)
     last_visit = models.PositiveIntegerField(default=0)
-    
+    
+    def get_model(self):
+        model = User.objects
+        
+        if self.email:
+            if ',' in self.email:
+                qs = None
+                for name in self.email.split(','):
+                    name = name.strip().lower()
+                    if name:
+                        if qs:
+                            qs = qs | Q(email__iendswith=name)
+                        else:
+                            qs = Q(email__iendswith=name)
+                if qs:
+                    model = model.filter(qs)
+            else:
+                model = model.filter(email__iendswith=self.email)
+                
+        if self.posts:
+            model = model.filter(posts__lt=self.posts)
+            
+        if self.registered:
+            date = timezone.now() - timedelta(days=self.registered)
+            model = model.filter(join_date__gte=date)
+            
+        if self.last_visit:
+            date = timezone.now() - timedelta(days=self.last_visit)
+            model = model.filter(last_date__gte=date)
+            
+        return model

+ 83 - 7
misago/prune/views.py

@@ -1,11 +1,12 @@
 from django.core.urlresolvers import reverse as django_reverse
 from django import forms
-from django.utils.translation import ugettext as _
+from django.utils.translation import ungettext, ugettext as _
 from misago.admin import site
 from misago.admin.widgets import *
 from misago.forms import Form
 from misago.prune.forms import PolicyForm
 from misago.prune.models import Policy
+from misago.users.models import User
 
 def reverse(route, target=None):
     if target:
@@ -31,8 +32,9 @@ class List(ListWidget):
     
     def get_item_actions(self, request, item):
         return (
-                self.action('pencil', _("Edit Pruning Policy"), reverse('admin_pruning_edit', item)),
-                self.action('remove', _("Delete Pruning Policy"), reverse('admin_pruning_delete', item), post=True, prompt=_("Are you sure you want to delete this rank?")),
+                self.action('filter', _("Apply Policy"), reverse('admin_prune_users_apply', item)),
+                self.action('pencil', _("Edit Policy"), reverse('admin_prune_users_edit', item)),
+                self.action('remove', _("Delete Policy"), reverse('admin_prune_users_delete', item), post=True, prompt=_("Are you sure you want to delete this policy?")),
                 )
 
     def action_delete(self, request, items, checked):
@@ -51,10 +53,10 @@ class New(FormWidget):
     submit_button = _("Save Policy")
         
     def get_new_url(self, request, model):
-        return reverse('admin_prune_users')
+        return reverse('admin_prune_users_new')
     
     def get_edit_url(self, request, model):
-        return reverse('admin_pruning_edit', model)
+        return reverse('admin_prune_users_edit', model)
     
     def submit_form(self, request, form, target):
         new_policy = Policy(
@@ -87,7 +89,7 @@ class Edit(FormWidget):
     submit_fallback = True
     
     def get_url(self, request, model):
-        return reverse('admin_pruning_edit', model)
+        return reverse('admin_prune_users_edit', model)
     
     def get_edit_url(self, request, model):
         return self.get_url(request, model)
@@ -130,4 +132,78 @@ class Delete(ButtonWidget):
             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
+        return Message(_('Pruning policy "%(name)s" has been deleted.') % {'name': target.name}, 'success'), False
+    
+
+class Apply(FormWidget):
+    admin = site.get_action('prune_users')
+    id = 'apply'
+    name = _("Apply Pruning Policy")
+    fallback = 'admin_prune_users'
+    form = PolicyForm
+    target_name = 'name'
+    notfound_message = _('Requested pruning policy could not be found.')
+    submit_fallback = True
+    template = 'apply'
+    
+    def get_url(self, request, model):
+        return reverse('admin_prune_users_apply', model)
+    
+    def __call__(self, request, target=None, slug=None):
+
+        # Fetch target
+        model = None
+        if target:
+            model = self.get_and_validate_target(request, target)
+            self.original_name = self.get_target_name(model)
+            if not model:
+                return redirect(self.get_fallback_url(request))
+        original_model = model
+                
+        # Set filter
+        users = model.get_model() 
+        total_users = users
+        total_users = total_users.count()
+        
+        if not total_users:
+            request.messages.set_flash(Message(_('Policy "%(name)s" does not apply to any users.') % {'name': model.name}), 'error', self.admin.id)
+            return redirect(reverse('admin_prune_users'))
+        
+        message = None
+        if request.method == 'POST':
+            deleted = 0
+            if request.csrf.request_secure(request):
+                for user in users.iterator():
+                    if user.is_protected():
+                        request.messages.set_flash(Message(_('User "%(name)s" is protected and was not deleted.') % {'name': user.username}), 'info', self.admin.id)
+                    else:
+                        user.delete()
+                        deleted += 1
+                if deleted:
+                    request.messages.set_flash(Message(ungettext(
+                                                                 'One user has been deleted.',
+                                                                 '%(deleted)d users have been deleted.',
+                                                                 deleted
+                                                                 ) % {'deleted': deleted}), 'success', self.admin.id)
+                    User.objects.resync_monitor(request.monitor)
+                else:
+                    request.messages.set_flash(Message(_("No users have been deleted.")), 'info', self.admin.id)
+                return redirect(reverse('admin_prune_users'))
+            else:
+                message = Message(_("Request authorization is invalid. Please resubmit your form."), 'error')
+        
+        return request.theme.render_to_response(self.get_template(self.template),
+                                                {
+                                                 'admin': self.admin,
+                                                 'action': self,
+                                                 'request': request,
+                                                 'url': self.get_url(request, model),
+                                                 'fallback': self.get_fallback_url(request),
+                                                 'messages': request.messages.get_messages(self.admin.id),
+                                                 'message': message,
+                                                 'tabbed': self.tabbed,
+                                                 'total_users': total_users,
+                                                 'target': self.get_target_name(original_model),
+                                                 'target_model': original_model,
+                                                },
+                                                context_instance=RequestContext(request));

+ 17 - 0
templates/admin/prune/apply.html

@@ -0,0 +1,17 @@
+{% extends "admin/admin/layout.html" %}
+{% load i18n %}
+{% load l10n %}
+{% load url from future %}
+
+{% block action_body %}
+<form action="{{ url }}" method="post">
+  <input type="hidden" name="{{ csrf_id }}" value="{{ csrf_token }}">
+  <p class="lead">
+  	{% trans %}Users to be deleted{% endtrans %}: <strong>{{ total_users|intcomma }}</strong>
+  </p>
+  <div class="form-actions">
+  	<button name="save" type="submit" class="btn btn-danger">{% trans %}Apply Policy{% endtrans %}</button>
+  	<a href="{{ fallback }}" class="btn">{% trans %}Cancel{% endtrans %}</a>
+  </div>
+</form>
+{% endblock %}

+ 0 - 0
templates/admin/policies/list.html → templates/admin/prune/list.html