Browse Source

Assing roles to forum view added.

Rafał Pitoń 11 years ago
parent
commit
4a46cb422c

+ 4 - 3
misago/forums/admin.py

@@ -1,11 +1,11 @@
 from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
 from misago.forums.views.forumsadmin import (ForumsList, NewForum, EditForum,
-                                             DeleteForum, MoveUpForum,
-                                             MoveDownForum)
+                                             MoveUpForum, MoveDownForum,
+                                             DeleteForum)
 from misago.forums.views.permsadmin import (ForumRolesList, NewForumRole,
                                             EditForumRole, DeleteForumRole,
-                                            RoleForumsACL)
+                                            ForumPermissions, RoleForumsACL)
 
 
 class MisagoAdminExtension(object):
@@ -19,6 +19,7 @@ class MisagoAdminExtension(object):
             url(r'^$', ForumsList.as_view(), name='index'),
             url(r'^new/$', NewForum.as_view(), name='new'),
             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/down/(?P<forum_id>\d+)/$', MoveDownForum.as_view(), name='down'),
             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']
 
 
-def RoleForumACLFormFactory(forum, role, roles):
+def RoleForumACLFormFactory(forum, forum_roles, selected_role):
     attrs = {
         'forum': forum,
         'role': forms.ModelChoiceField(
             label=_("Role"),
             required=False,
-            queryset=roles,
-            initial=role,
+            queryset=forum_roles,
+            initial=selected_role,
             empty_label=_("No access"))
     }
 
     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):
     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)

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

@@ -3,6 +3,7 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 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.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.acl import version as acl_version
 from misago.acl.forms import get_permissions_forms
+from misago.acl.models import Role
 from misago.acl.views import RoleAdmin, RolesList
 from misago.forums.forms import ForumRoleForm, RoleForumACLFormFactory
+from misago.forums.views.forumsadmin import ForumAdmin, ForumsList
 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
 """
 class RoleForumsACL(RoleAdmin, generic.ModelFormView):
     templates_dir = 'misago/admin/forumroles'
-    template = 'forumsroles.html'
+    template = 'roleforums.html'
 
     def real_dispatch(self, request, target):
         forums = Forum.objects.all_forums()
@@ -104,8 +174,8 @@ class RoleForumsACL(RoleAdmin, generic.ModelFormView):
         for forum in forums:
             forum.level_range = range(forum.level - 1)
             FormType = RoleForumACLFormFactory(forum,
-                                               choices.get(forum.pk),
-                                               roles)
+                                               roles,
+                                               choices.get(forum.pk))
 
             if request.method == 'POST':
                 forms.append(FormType(request.POST, prefix=forum.pk))
@@ -146,4 +216,5 @@ class RoleForumsACL(RoleAdmin, generic.ModelFormView):
 RolesList.add_item_action(
     name=_("Forums permissions"),
     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 %}
   {{ item.name }}
 </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">
   {% if not item.last %}
   <form action="{% url 'misago:admin:forums:nodes:down' forum_id=item.id %}" method="post">
@@ -69,6 +62,13 @@
   &nbsp;
   {% endif %}
 </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">
   <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>