Просмотр исходного кода

Assing roles to forum view added.

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

+ 4 - 3
misago/forums/admin.py

@@ -1,11 +1,11 @@
 from django.conf.urls import url
 from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from misago.forums.views.forumsadmin import (ForumsList, NewForum, EditForum,
 from misago.forums.views.forumsadmin import (ForumsList, NewForum, EditForum,
-                                             DeleteForum, MoveUpForum,
-                                             MoveDownForum)
+                                             MoveUpForum, MoveDownForum,
+                                             DeleteForum)
 from misago.forums.views.permsadmin import (ForumRolesList, NewForumRole,
 from misago.forums.views.permsadmin import (ForumRolesList, NewForumRole,
                                             EditForumRole, DeleteForumRole,
                                             EditForumRole, DeleteForumRole,
-                                            RoleForumsACL)
+                                            ForumPermissions, RoleForumsACL)
 
 
 
 
 class MisagoAdminExtension(object):
 class MisagoAdminExtension(object):
@@ -19,6 +19,7 @@ class MisagoAdminExtension(object):
             url(r'^$', ForumsList.as_view(), name='index'),
             url(r'^$', ForumsList.as_view(), name='index'),
             url(r'^new/$', NewForum.as_view(), name='new'),
             url(r'^new/$', NewForum.as_view(), name='new'),
             url(r'^edit/(?P<forum_id>\d+)/$', EditForum.as_view(), name='edit'),
             url(r'^edit/(?P<forum_id>\d+)/$', EditForum.as_view(), name='edit'),
+            url(r'^permissions/(?P<forum_id>\d+)/$', ForumPermissions.as_view(), name='permissions'),
             url(r'^move/up/(?P<forum_id>\d+)/$', MoveUpForum.as_view(), name='up'),
             url(r'^move/up/(?P<forum_id>\d+)/$', MoveUpForum.as_view(), name='up'),
             url(r'^move/down/(?P<forum_id>\d+)/$', MoveDownForum.as_view(), name='down'),
             url(r'^move/down/(?P<forum_id>\d+)/$', MoveDownForum.as_view(), name='down'),
             url(r'^delete/(?P<forum_id>\d+)/$', DeleteForum.as_view(), name='delete'),
             url(r'^delete/(?P<forum_id>\d+)/$', DeleteForum.as_view(), name='delete'),

+ 17 - 3
misago/forums/forms.py

@@ -220,15 +220,29 @@ class ForumRoleForm(forms.ModelForm):
         fields = ['name']
         fields = ['name']
 
 
 
 
-def RoleForumACLFormFactory(forum, role, roles):
+def RoleForumACLFormFactory(forum, forum_roles, selected_role):
     attrs = {
     attrs = {
         'forum': forum,
         'forum': forum,
         'role': forms.ModelChoiceField(
         'role': forms.ModelChoiceField(
             label=_("Role"),
             label=_("Role"),
             required=False,
             required=False,
-            queryset=roles,
-            initial=role,
+            queryset=forum_roles,
+            initial=selected_role,
             empty_label=_("No access"))
             empty_label=_("No access"))
     }
     }
 
 
     return type('RoleForumACLForm', (forms.Form,), attrs)
     return type('RoleForumACLForm', (forms.Form,), attrs)
+
+
+def ForumRolesACLFormFactory(role, forum_roles, selected_role):
+    attrs = {
+        'role': role,
+        'forum_role': forms.ModelChoiceField(
+            label=_("Role"),
+            required=False,
+            queryset=forum_roles,
+            initial=selected_role,
+            empty_label=_("No access"))
+    }
+
+    return type('ForumRolesACLForm', (forms.Form,), attrs)

+ 1 - 1
misago/forums/models.py

@@ -86,5 +86,5 @@ class ForumRole(BaseRole):
 
 
 class RoleForumACL(models.Model):
 class RoleForumACL(models.Model):
     role = models.ForeignKey('misago_acl.Role', related_name='forums_acls')
     role = models.ForeignKey('misago_acl.Role', related_name='forums_acls')
-    forum = models.ForeignKey('Forum')
+    forum = models.ForeignKey('Forum', related_name='forum_role_set')
     forum_role = models.ForeignKey(ForumRole)
     forum_role = models.ForeignKey(ForumRole)

+ 1 - 0
misago/forums/views/forumsadmin.py

@@ -3,6 +3,7 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from misago.admin.views import generic
 from misago.admin.views import generic
+from misago.acl import version as acl_version
 from misago.forums.models import FORUMS_TREE_ID, Forum
 from misago.forums.models import FORUMS_TREE_ID, Forum
 from misago.forums.forms import ForumFormFactory, DeleteFormFactory
 from misago.forums.forms import ForumFormFactory, DeleteFormFactory
 
 

+ 75 - 4
misago/forums/views/permsadmin.py

@@ -4,8 +4,10 @@ from django.utils.translation import ugettext_lazy as _
 from misago.admin.views import generic
 from misago.admin.views import generic
 from misago.acl import version as acl_version
 from misago.acl import version as acl_version
 from misago.acl.forms import get_permissions_forms
 from misago.acl.forms import get_permissions_forms
+from misago.acl.models import Role
 from misago.acl.views import RoleAdmin, RolesList
 from misago.acl.views import RoleAdmin, RolesList
 from misago.forums.forms import ForumRoleForm, RoleForumACLFormFactory
 from misago.forums.forms import ForumRoleForm, RoleForumACLFormFactory
+from misago.forums.views.forumsadmin import ForumAdmin, ForumsList
 from misago.forums.models import Forum, ForumRole, RoleForumACL
 from misago.forums.models import Forum, ForumRole, RoleForumACL
 
 
 
 
@@ -81,11 +83,79 @@ class DeleteForumRole(ForumRoleAdmin, generic.ButtonView):
 
 
 
 
 """
 """
+Create forum roles view for assinging roles to forum,
+add link to it in forums list
+"""
+templates_dir = 'misago/admin/forumroles'
+class ForumPermissions(ForumAdmin, generic.ModelFormView):
+    template = 'permissions.html'
+
+    def real_dispatch(self, request, target):
+        forum_roles = ForumRole.objects.order_by('name')
+
+
+        assigned_roles = {}
+        for acl in target.forum_role_set.select_related('forum_role'):
+            assigned_roles[acl.role_id] = acl.forum_role
+
+        forms = []
+        forms_are_valid = True
+        for role in Role.objects.order_by('name'):
+            FormType = ForumRolesACLFormFactory(role,
+                                                forum_roles,
+                                                assigned_roles.get(role.pk))
+
+            if request.method == 'POST':
+                forms.append(FormType(request.POST, prefix=role.pk))
+                if not forms[-1].is_valid():
+                    forms_are_valid = False
+            else:
+                forms.append(FormType(prefix=role.pk))
+
+        if request.method == 'POST' and forms_are_valid:
+            target.forum_role_set.all().delete()
+            new_permissions = []
+            for form in forms:
+                if form.cleaned_data['forum_role']:
+                    new_permissions.append(
+                        RoleForumACL(
+                            role=form.role,
+                            forum=target,
+                            forum_role=form.cleaned_data['forum_role']
+                        ))
+            if new_permissions:
+                RoleForumACL.objects.bulk_create(new_permissions)
+
+            acl_version.invalidate()
+
+            message = _("Forum %s permissions have been changed.")
+            messages.success(request, message % target)
+            if 'stay' in request.POST:
+                return redirect(request.path)
+            else:
+                return redirect(self.root_link)
+
+        return self.render(
+            request,
+            {
+                'forms': forms,
+                'target': target,
+            })
+
+
+ForumsList.add_item_action(
+    name=_("Forum permissions"),
+    icon='fa fa-adjust',
+    link='misago:admin:forums:nodes:permissions',
+    style='success')
+
+
+"""
 Create forums perms view for perms role and register it in other admin
 Create forums perms view for perms role and register it in other admin
 """
 """
 class RoleForumsACL(RoleAdmin, generic.ModelFormView):
 class RoleForumsACL(RoleAdmin, generic.ModelFormView):
     templates_dir = 'misago/admin/forumroles'
     templates_dir = 'misago/admin/forumroles'
-    template = 'forumsroles.html'
+    template = 'roleforums.html'
 
 
     def real_dispatch(self, request, target):
     def real_dispatch(self, request, target):
         forums = Forum.objects.all_forums()
         forums = Forum.objects.all_forums()
@@ -104,8 +174,8 @@ class RoleForumsACL(RoleAdmin, generic.ModelFormView):
         for forum in forums:
         for forum in forums:
             forum.level_range = range(forum.level - 1)
             forum.level_range = range(forum.level - 1)
             FormType = RoleForumACLFormFactory(forum,
             FormType = RoleForumACLFormFactory(forum,
-                                               choices.get(forum.pk),
-                                               roles)
+                                               roles,
+                                               choices.get(forum.pk))
 
 
             if request.method == 'POST':
             if request.method == 'POST':
                 forms.append(FormType(request.POST, prefix=forum.pk))
                 forms.append(FormType(request.POST, prefix=forum.pk))
@@ -146,4 +216,5 @@ class RoleForumsACL(RoleAdmin, generic.ModelFormView):
 RolesList.add_item_action(
 RolesList.add_item_action(
     name=_("Forums permissions"),
     name=_("Forums permissions"),
     icon='fa fa-comments-o',
     icon='fa fa-comments-o',
-    link='misago:admin:permissions:users:forums')
+    link='misago:admin:permissions:users:forums',
+    style='success')

+ 69 - 0
misago/templates/misago/admin/forumroles/forumroles.html

@@ -0,0 +1,69 @@
+{% extends "misago/admin/generic/list.html" %}
+{% load crispy_forms_field i18n %}
+
+
+{% block title %}
+{% blocktrans with forum=target %}
+{{ forum }}: Permissions
+{% endblocktrans %} | {{ block.super }}
+{% endblock title%}
+
+
+{% block page-header %}
+{{ block.super }}
+<div class="sub">
+  <span class="fa fa-chevron-right"></span>
+  {% blocktrans with forum=target %}
+  {{ forum }}: Permissions
+  {% endblocktrans %}
+</div>
+{% endblock page-header %}
+
+
+{% block view %}
+<form method="post" role="form">
+  {% csrf_token %}
+  <div class="table-panel">
+    <table class="table">
+      <tr>
+        <th>{% trans "Forum" %}</ht>
+        <th class="col-md-6">{% trans "Permissions" %}</ht>
+      </tr>
+
+      {% for form in forms %}
+      <tr>
+        <td class="lead">
+          {{ form.role.name }}
+        </td>
+        <td>
+          {% crispy_field form.forum_role %}
+        </td>
+      </tr>
+      {% endfor %}
+    </table>
+    <div class="table-footer">
+      <div class="row">
+        <div class="col-md-offset-6">
+
+          <button class="btn btn-primary">{% trans "Save changes" %}</button>
+          <button class="btn btn-success" name="stay" value="1">{% trans "Save and keep editing" %}</button>
+          <a href="{% url root_link %}" class="btn btn-default btn-cancel">{% trans "Cancel" %}</a>
+
+        </div>
+      </div>
+    </div>
+  </div><!-- /.table-panel -->
+</form>
+{% endblock view %}
+
+
+{% block javascripts %}
+<script type="text/javascript">
+  $(function() {
+    $('.btn-cancel').click(function() {
+      var decision = confirm("{% trans "Are you sure you want to abandon changes?" %}");
+      return decision;
+    });
+  });
+</script>
+{% endblock %}

+ 0 - 0
misago/templates/misago/admin/forumroles/forumsroles.html → misago/templates/misago/admin/forumroles/roleforums.html


+ 7 - 7
misago/templates/misago/admin/forums/list.html

@@ -38,13 +38,6 @@
   {% endif %}
   {% endif %}
   {{ item.name }}
   {{ item.name }}
 </td>
 </td>
-{% for action in extra_actions %}
-<td class="row-action">
-  <a href="{% url action.link forum_id=item.id %}" class="btn btn-{% if action.style %}{{ action.style }}{% else %}default{% endif %} tooltip-top" title="{{ action.name }}">
-    <span class="{{ action.icon }}"></span>
-  </a>
-</td>
-{% endfor %}
 <td class="row-action">
 <td class="row-action">
   {% if not item.last %}
   {% if not item.last %}
   <form action="{% url 'misago:admin:forums:nodes:down' forum_id=item.id %}" method="post">
   <form action="{% url 'misago:admin:forums:nodes:down' forum_id=item.id %}" method="post">
@@ -69,6 +62,13 @@
   &nbsp;
   &nbsp;
   {% endif %}
   {% endif %}
 </td>
 </td>
+{% for action in extra_actions %}
+<td class="row-action">
+  <a href="{% url action.link forum_id=item.id %}" class="btn btn-{% if action.style %}{{ action.style }}{% else %}default{% endif %} tooltip-top" title="{{ action.name }}">
+    <span class="{{ action.icon }}"></span>
+  </a>
+</td>
+{% endfor %}
 <td class="row-action">
 <td class="row-action">
   <a href="{% url 'misago:admin:forums:nodes:edit' forum_id=item.id %}" class="btn btn-primary tooltip-top" title="{% trans "Edit" %}">
   <a href="{% url 'misago:admin:forums:nodes:edit' forum_id=item.id %}" class="btn btn-primary tooltip-top" title="{% trans "Edit" %}">
     <span class="fa fa-pencil"></span>
     <span class="fa fa-pencil"></span>