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

+ 3 - 1
misago/acl/admin.py

@@ -1,6 +1,7 @@
 from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
-from misago.acl.views import RolesList, NewRole, EditRole, DeleteRole
+from misago.acl.views import (RolesList, NewRole, EditRole, RoleUsers,
+                              DeleteRole)
 
 
 class MisagoAdminExtension(object):
@@ -14,6 +15,7 @@ class MisagoAdminExtension(object):
             url(r'^$', RolesList.as_view(), name='index'),
             url(r'^new/$', NewRole.as_view(), name='new'),
             url(r'^edit/(?P<role_id>\d+)/$', EditRole.as_view(), name='edit'),
+            url(r'^users/(?P<role_id>\d+)/$', RoleUsers.as_view(), name='users'),
             url(r'^delete/(?P<role_id>\d+)/$', DeleteRole.as_view(), name='delete'),
         )
 

+ 12 - 0
misago/acl/tests/test_roleadmin_views.py

@@ -69,6 +69,18 @@ class RoleAdminViewsTests(AdminTestCase):
         self.assertEqual(response.status_code, 200)
         self.assertIn(test_role.name, response.content)
 
+    def test_users_view(self):
+        """users with this role view has no showstoppers"""
+        response = self.client.post(
+            reverse('misago:admin:permissions:users:new'),
+            data=fake_data({'name': 'Test Role'}))
+        test_role = Role.objects.get(name='Test Role')
+
+        response = self.client.get(
+            reverse('misago:admin:permissions:users:users',
+                    kwargs={'role_id': test_role.pk}))
+        self.assertEqual(response.status_code, 302)
+
     def test_delete_view(self):
         """delete role view has no showstoppers"""
         self.client.post(

+ 7 - 0
misago/acl/views.py

@@ -1,4 +1,5 @@
 from django.contrib import messages
+from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 
@@ -77,3 +78,9 @@ class DeleteRole(RoleAdmin, generic.ButtonView):
         target.delete()
         message = _('Role "%s" has been deleted.') % unicode(target.name)
         messages.success(request, message)
+
+
+class RoleUsers(RoleAdmin, generic.TargetedView):
+    def real_dispatch(self, request, target):
+        redirect_url = reverse('misago:admin:users:accounts:index')
+        return redirect('%s?role=%s' % (redirect_url, target.pk))

+ 0 - 2
misago/forums/views/permsadmin.py

@@ -215,8 +215,6 @@ class RoleForumsACL(RoleAdmin, generic.ModelFormView):
                 'forms': forms,
                 'target': target,
             })
-
-
 RolesList.add_item_action(
     name=_("Forums permissions"),
     icon='fa fa-comments-o',

+ 7 - 1
misago/templates/misago/admin/ranks/list.html

@@ -24,6 +24,7 @@
 <th style="width: 1%;">&nbsp;</th>
 <th style="width: 1%;">&nbsp;</th>
 <th style="width: 1%;">&nbsp;</th>
+<th style="width: 1%;">&nbsp;</th>
 {% endblock table-header %}
 
 
@@ -57,6 +58,11 @@
 </td>
 {% endfor %}
 <td class="row-action">
+  <a href="{% url 'misago:admin:users:ranks:users' rank_id=item.id %}" class="btn btn-primary tooltip-top" title="{% trans "Users with rank" %}">
+    <span class="fa fa-users"></span>
+  </a>
+</td>
+<td class="row-action">
   {% if not item.is_default %}
   <form action="{% url 'misago:admin:users:ranks:default' rank_id=item.id %}" method="post">
     <button class="btn btn-warning tooltip-top" title="{% trans "Make default" %}">
@@ -109,7 +115,7 @@
 
 
 {% block emptylist %}
-<td colspan="{{ 7|add:extra_actions_len }}">
+<td colspan="{{ 8|add:extra_actions_len }}">
   <p>{% trans "No ranks are currently defined." %}</p>
 </td>
 {% endblock emptylist %}

+ 7 - 1
misago/templates/misago/admin/roles/list.html

@@ -19,6 +19,7 @@
 {% endfor %}
 <th style="width: 1%;">&nbsp;</th>
 <th style="width: 1%;">&nbsp;</th>
+<th style="width: 1%;">&nbsp;</th>
 {% endblock table-header %}
 
 
@@ -34,6 +35,11 @@
 </td>
 {% endfor %}
 <td class="row-action">
+  <a href="{% url 'misago:admin:permissions:users:users' role_id=item.id %}" class="btn btn-primary tooltip-top" title="{% trans "Users with role" %}">
+    <span class="fa fa-users"></span>
+  </a>
+</td>
+<td class="row-action">
   <a href="{% url 'misago:admin:permissions:users:edit' role_id=item.id %}" class="btn btn-primary tooltip-top" title="{% trans "Edit" %}">
     <span class="fa fa-pencil"></span>
   </a>
@@ -50,7 +56,7 @@
 
 
 {% block emptylist %}
-<td colspan="{{ 3|add:extra_actions_len }}">
+<td colspan="{{ 4|add:extra_actions_len }}">
   <p>{% trans "No user roles are currently defined." %}</p>
 </td>
 {% endblock emptylist %}

+ 2 - 2
misago/users/admin.py

@@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
 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)
+                                            MoveUpRank, DefaultRank, RankUsers)
 from misago.users.views.admin.users import UsersList, NewUser, EditUser
 from misago.users.views.admin.warnings import (WarningsList, NewWarning,
                                                EditWarning, MoveDownWarning,
@@ -36,7 +36,6 @@ class UserAdmin(djadmin.ModelAdmin):
 djadmin.site.register(get_user_model(), UserAdmin)
 
 
-
 class MisagoAdminExtension(object):
     def register_urlpatterns(self, urlpatterns):
         # Users section
@@ -60,6 +59,7 @@ class MisagoAdminExtension(object):
             url(r'^default/(?P<rank_id>\d+)/$', DefaultRank.as_view(), name='default'),
             url(r'^move/down/(?P<rank_id>\d+)/$', MoveDownRank.as_view(), name='down'),
             url(r'^move/up/(?P<rank_id>\d+)/$', MoveUpRank.as_view(), name='up'),
+            url(r'^users/(?P<rank_id>\d+)/$', RankUsers.as_view(), name='users'),
             url(r'^delete/(?P<rank_id>\d+)/$', DeleteRank.as_view(), name='delete'),
         )
 

+ 18 - 0
misago/users/tests/test_rankadmin_views.py

@@ -172,6 +172,24 @@ class RankAdminViewsTests(AdminTestCase):
         changed_rank = Rank.objects.get(slug='test-rank')
         self.assertEqual(changed_rank.order, test_rank.order)
 
+    def test_users_view(self):
+        """users with this rank view has no showstoppers"""
+        self.client.post(
+            reverse('misago:admin:users:ranks:new'),
+            data={
+                'name': 'Test Rank',
+                'description': 'Lorem ipsum dolor met',
+                'title': 'Test Title',
+                'style': 'test',
+                'is_tab': '1',
+            })
+
+        test_rank = Rank.objects.get(slug='test-rank')
+
+        response = self.client.get(reverse('misago:admin:users:ranks:users',
+                                           kwargs={'rank_id': test_rank.pk}))
+        self.assertEqual(response.status_code, 302)
+
     def test_delete_view(self):
         """delete rank view has no showstoppers"""
         self.client.post(

+ 8 - 0
misago/users/views/admin/ranks.py

@@ -1,4 +1,6 @@
 from django.contrib import messages
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 
 from misago.admin.views import generic
@@ -89,6 +91,12 @@ class MoveUpRank(RankAdmin, generic.ButtonView):
             messages.success(request, message % targets_names)
 
 
+class RankUsers(RankAdmin, generic.TargetedView):
+    def real_dispatch(self, request, target):
+        redirect_url = reverse('misago:admin:users:accounts:index')
+        return redirect('%s?rank=%s' % (redirect_url, target.pk))
+
+
 class DefaultRank(RankAdmin, generic.ButtonView):
     def check_permissions(self, request, target):
         if target.is_default: