Rafał Pitoń 11 лет назад
Родитель
Сommit
0993ec0cfd

+ 17 - 6
misago/templates/misago/admin/users/list.html

@@ -20,6 +20,7 @@
 <th style="width: 200px;">{% trans "E-mail" %}</th>
 <th style="width: 150px;">{% trans "Rank" %}</th>
 <th style="width: 200px;">{% trans "Joined" %}</th>
+<th style="width: 128px;">{% trans "Posts" %}</th>
 {% for action in extra_actions %}
 <th style="width: 1%;">&nbsp;</th>
 {% endfor %}
@@ -32,9 +33,9 @@
 
 {% block table-row %}
 <td>
-  <img src="{{ item|avatar:30 }}" alt="{% trans "Avatar" %}">
+  <img src="{{ item|avatar:24 }}" alt="{% trans "Avatar" %}" width="24" height="24">
 </td>
-<td class="lead {% if item.requires_activation %}text-muted{% endif %}">
+<td class="{% if item.requires_activation %}text-muted{% endif %}">
   {{ item.username }}
 </td>
 <td class="lead text-muted">
@@ -72,6 +73,9 @@
     {{ item.joined_on|date }}
   </abbr>
 </td>
+<td>
+  {{ item.posts }}
+</td>
 {% for action in extra_actions %}
 <td class="row-action">
   <a href="{% url action.link user_id=item.id %}" class="btn btn-{% if action.style %}{{ action.style }}{% else %}default{% endif %} tooltip-top" title="{{ action.name }}">
@@ -80,9 +84,16 @@
 </td>
 {% endfor %}
 <td class="row-action">
-  <a href="{% url 'misago:admin:users:accounts:edit' user_id=item.pk %}" class="btn btn-success tooltip-top" title="{% trans "Activate user" %}">
-    <span class="fa fa-check-square-o"></span>
-  </a>
+  {% if item.requires_activation %}
+  <form action="{% url 'misago:admin:users:accounts:activate' user_id=item.pk %}" method="post">
+    <button class="btn btn-success tooltip-top" title="{% trans "Activate user" %}">
+      {% csrf_token %}
+      <span class="fa fa-check-square-o"></span>
+    </button>
+  </form>
+  {% else %}
+  &nbsp;
+  {% endif %}
 </td>
 <td class="row-action">
   <a href="{% url 'misago:admin:users:accounts:edit' user_id=item.pk %}" class="btn btn-warning tooltip-top" title="{% trans "Ban user" %}">
@@ -103,7 +114,7 @@
 
 
 {% block emptylist %}
-<td colspan="{{ 12|add:extra_actions_len }}">
+<td colspan="{{ 13|add:extra_actions_len }}">
   <p>{% trans "No users matching search criteria have been found." %}</p>
 </td>
 {% endblock emptylist %}

+ 3 - 1
misago/users/admin.py

@@ -8,7 +8,8 @@ from misago.users.views.admin.bans import BansList, NewBan, EditBan, DeleteBan
 from misago.users.views.admin.ranks import (RanksList, NewRank, EditRank,
                                             DeleteRank, MoveDownRank,
                                             MoveUpRank, DefaultRank, RankUsers)
-from misago.users.views.admin.users import UsersList, NewUser, EditUser
+from misago.users.views.admin.users import (UsersList, NewUser, EditUser,
+                                            ActivateUser)
 from misago.users.views.admin.warnings import (WarningsList, NewWarning,
                                                EditWarning, MoveDownWarning,
                                                MoveUpWarning, DeleteWarning)
@@ -48,6 +49,7 @@ class MisagoAdminExtension(object):
             url(r'^(?P<page>\d+)/$', UsersList.as_view(), name='index'),
             url(r'^new/$', NewUser.as_view(), name='new'),
             url(r'^edit/(?P<user_id>\d+)/$', EditUser.as_view(), name='edit'),
+            url(r'^activate/(?P<user_id>\d+)/$', ActivateUser.as_view(), name='activate'),
         )
 
         # Ranks

+ 1 - 1
misago/users/migrations/0001_initial.py

@@ -61,7 +61,7 @@ class Migration(migrations.Migration):
                 ('subscribe_to_started_threads', models.PositiveIntegerField(default=0)),
                 ('subscribe_to_replied_threads', models.PositiveIntegerField(default=0)),
                 ('threads', models.PositiveIntegerField(default=0)),
-                ('posts', models.PositiveIntegerField(default=0)),
+                ('posts', models.PositiveIntegerField(default=0, db_index=True)),
                 ('last_post', models.DateTimeField(null=True, blank=True)),
                 ('last_search', models.DateTimeField(null=True, blank=True)),
             ],

+ 1 - 1
misago/users/models/user.py

@@ -201,7 +201,7 @@ class User(AbstractBaseUser, PermissionsMixin):
         default=AUTO_SUBSCRIBE_NONE)
 
     threads = models.PositiveIntegerField(default=0)
-    posts = models.PositiveIntegerField(default=0)
+    posts = models.PositiveIntegerField(default=0, db_index=True)
 
     last_post = models.DateTimeField(null=True, blank=True)
     last_search = models.DateTimeField(null=True, blank=True)

+ 17 - 0
misago/users/tests/test_useradmin_views.py

@@ -1,4 +1,5 @@
 from django.contrib.auth import get_user_model
+from django.core import mail
 from django.core.urlresolvers import reverse
 
 from misago.acl.models import Role
@@ -107,3 +108,19 @@ class UserAdminViewsTests(AdminTestCase):
 
         User.objects.get_by_username('Bawww')
         User.objects.get_by_email('reg@stered.com')
+
+    def test_activate_view(self):
+        """activate user view activates account"""
+        User = get_user_model()
+        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123',
+                                             requires_activation=1)
+
+        test_link = reverse('misago:admin:users:accounts:activate',
+                            kwargs={'user_id': test_user.pk})
+        response = self.client.post(test_link)
+        self.assertEqual(response.status_code, 302)
+
+        self.assertIn("has been activated", mail.outbox[0].subject)
+
+        test_user = User.objects.get(pk=test_user.pk)
+        self.assertEqual(test_user.requires_activation, 0)

+ 29 - 9
misago/users/views/admin/users.py

@@ -31,14 +31,26 @@ class UserAdmin(generic.AdminBaseMixin):
         return StaffFlagUserFormFactory(
             self.Form, target, add_staff_field=add_staff_field)
 
+    def send_activation_mail(self, request, activated_users):
+        mail_subject = _("Your account on %(forum_title)s "
+                             "forums has been activated")
+        subject_formats = {'forum_title': settings.forum_name}
+        mail_subject = mail_subject % subject_formats
+
+        mail_subject = mail_subject
+        mail_users(request, activated_users, mail_subject,
+                   'misago/emails/activation/by_admin')
+
 
 class UsersList(UserAdmin, generic.ListView):
-    items_per_page = 20
+    items_per_page = 24
     ordering = (
         ('-id', _("From newest")),
         ('id', _("From oldest")),
         ('username_slug', _("A to z")),
         ('-username_slug', _("Z to a")),
+        ('posts', _("Biggest posters")),
+        ('-posts', _("Smallest posters")),
     )
     selection_label = _('With users: 0')
     empty_selection_label = _('Select users')
@@ -82,14 +94,7 @@ class UsersList(UserAdmin, generic.ListView):
             queryset = User.objects.filter(pk__in=activated_users_pks)
             queryset.update(requires_activation=ACTIVATION_REQUIRED_NONE)
 
-            mail_subject = _("Your account on %(forum_title)s "
-                             "forums has been activated")
-            subject_formats = {'forum_title': settings.forum_name}
-            mail_subject = mail_subject % subject_formats
-
-            mail_subject =  mail_subject
-            mail_users(request, inactive_users, mail_subject,
-                       'misago/emails/activation/by_admin')
+            self.send_activation_mail(request, queryset)
 
             message = _("Selected users accounts have been activated.")
             messages.success(request, message)
@@ -164,3 +169,18 @@ class EditUser(UserAdmin, generic.ModelFormView):
         form.instance.save()
 
         messages.success(request, self.message_submit % target.username)
+
+
+class ActivateUser(UserAdmin, generic.ButtonView):
+    def button_action(self, request, target):
+        if target.requires_activation:
+            target.requires_activation=ACTIVATION_REQUIRED_NONE
+            target.save(update_fields=['requires_activation'])
+
+            self.send_activation_mail(request, [target])
+
+            message = _("%(username)s's account has been activated.")
+            messages.success(request, message % {'username': target.username})
+        else:
+            message = _("%(username)s's account is already active.")
+            messages.info(request, message % {'username': target.username})