Browse Source

Assign forum roles

Rafał Pitoń 11 years ago
parent
commit
10b5068c48

+ 14 - 0
misago/forums/forms.py

@@ -218,3 +218,17 @@ class ForumRoleForm(forms.ModelForm):
     class Meta:
         model = ForumRole
         fields = ['name']
+
+
+def RoleForumACLFormFactory(forum, role, roles):
+    attrs = {
+        'forum': forum,
+        'role': forms.ModelChoiceField(
+            label=_("Role"),
+            required=False,
+            queryset=roles,
+            initial=role,
+            empty_label=_("No access"))
+    }
+
+    return type('RoleForumACLForm', (forms.Form,), attrs)

+ 1 - 1
misago/forums/models.py

@@ -77,7 +77,7 @@ class ForumRole(BaseRole):
 
 
 class RoleForumACL(models.Model):
-    role = TreeForeignKey('acl.Role')
+    role = TreeForeignKey('acl.Role', related_name='forums_acls')
     forum = TreeForeignKey('Forum')
     forum_role = TreeForeignKey(ForumRole)
 

+ 1 - 1
misago/forums/permissions.py

@@ -10,7 +10,7 @@ DEFAULT_PERMISSIONS = {
 
 
 class PermissionsForm(forms.Form):
-    legend = _("Destroying user accounts")
+    legend = _("Forum access")
     can_see = forms.YesNoSwitch(label=_("Can see forum"))
     can_browse = forms.YesNoSwitch(label=_("Can see forum contents"))
 

+ 58 - 3
misago/forums/views/roles.py

@@ -2,10 +2,10 @@ 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 get_change_permissions_forms
+from misago.acl import cachebuster, get_change_permissions_forms
 from misago.acl.views import RoleAdmin, RolesList
-from misago.forums.forms import ForumRoleForm
-from misago.forums.models import ForumRole
+from misago.forums.forms import ForumRoleForm, RoleForumACLFormFactory
+from misago.forums.models import Forum, ForumRole, RoleForumACL
 
 
 class ForumRoleAdmin(generic.AdminBaseMixin):
@@ -83,6 +83,61 @@ class RoleForumsACL(RoleAdmin, generic.ModelFormView):
     templates_dir = 'misago/admin/forumroles'
     template = 'forumsroles.html'
 
+    def real_dispatch(self, request, target):
+        forums = Forum.objects.all_forums()
+        roles = ForumRole.objects.order_by('name')
+
+        if not forums:
+            messages.info(request, _("No forums exist."))
+            return redirect(self.root_link)
+
+        choices = {}
+        for choice in target.forums_acls.select_related('forum_role'):
+            choices[choice.forum_id] = choice.forum_role
+
+        forms = []
+        forms_are_valid = True
+        for forum in forums:
+            forum.level_range = range(forum.level - 1)
+            FormType = RoleForumACLFormFactory(forum,
+                                               choices.get(forum.pk),
+                                               roles)
+
+            if request.method == 'POST':
+                forms.append(FormType(request.POST, prefix=forum.pk))
+                if not forms[-1].is_valid():
+                    forms_are_valid = False
+            else:
+                forms.append(FormType(prefix=forum.pk))
+
+        if request.method == 'POST' and forms_are_valid:
+            target.forums_acls.all().delete()
+            new_permissions = []
+            for form in forms:
+                if form.cleaned_data['role']:
+                    new_permissions.append(
+                        RoleForumACL(role=target,
+                                     forum=form.forum,
+                                     forum_role=form.cleaned_data['role']))
+            if new_permissions:
+                RoleForumACL.objects.bulk_create(new_permissions)
+
+            cachebuster.invalidate()
+
+            message = _("Forum permissions for role %s 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,
+            })
+
 
 RolesList.add_item_action(
     name=_("Forums permissions"),

+ 16 - 1
misago/static/misago/admin/css/misago/tables.less

@@ -100,7 +100,7 @@
               bottom: -1px;
 
               &.fa-times {
-             		bottom: 1px;
+                bottom: 1px;
               }
 
               &.fa-pencil {
@@ -157,4 +157,19 @@
       }
     }
   }
+
+  .table-footer {
+    background-color: @form-panel-footer-bg;
+    border-radius: 0px 0px (@border-radius-large - 1px) (@border-radius-large - 1px);
+    border-top: 1px solid @form-panel-border;
+    padding: @form-panel-padding;
+    padding-left: @table-cell-padding;
+    padding-right: @table-cell-padding;
+
+    &>.row {
+      position: relative;
+      left: -2px;
+      margin-left: @table-cell-padding;
+    }
+  }
 }

+ 13 - 0
misago/static/misago/admin/css/style.css

@@ -6281,6 +6281,19 @@ body {
 .table-panel table.table tr td.row-select a.active span {
   color: #2ecc71;
 }
+.table-panel .table-footer {
+  background-color: #f7f7f7;
+  border-radius: 0px 0px 5px 5px;
+  border-top: 1px solid #d4d4d4;
+  padding: 15px 16px;
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.table-panel .table-footer > .row {
+  position: relative;
+  left: -2px;
+  margin-left: 8px;
+}
 .list-panel {
   border-radius: 4px;
   box-shadow: 0px 0px 0px 3px #ededed;

+ 79 - 1
misago/templates/misago/admin/forumroles/forumsroles.html

@@ -1 +1,79 @@
-Hello, I am Forums Roles template!
+{% extends "misago/admin/generic/list.html" %}
+{% load crispy_forms_field i18n %}
+
+
+{% block title %}
+{% blocktrans with role=target %}
+{{ role }}: Forum permissions
+{% endblocktrans %} | {{ block.super }}
+{% endblock title%}
+
+
+{% block page-header %}
+{{ block.super }}
+<div class="sub">
+  <span class="fa fa-chevron-right"></span>
+  {% blocktrans with role=target %}
+  {{ role }}: 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">
+          {% for i in form.forum.level_range %}
+          &nbsp;&nbsp;&nbsp;&nbsp;
+          {% endfor %}
+          {% if form.forum.role == 'category' %}
+          <span class="fa fa-folder-open tooltip-top" title="{% trans "Category" %}"></span>
+          {% elif form.forum.role == 'forum' %}
+          <span class="fa fa-comments-o tooltip-top" title="{% trans "Forum" %}"></span>
+          {% elif form.forum.role == 'redirect' %}
+          <span class="fa fa-link tooltip-top" title="{% trans "Redirect" %}"></span>
+          {% endif %}
+          {{ form.forum.name }}
+        </td>
+        <td>
+          {% crispy_field form.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 %}

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

@@ -84,6 +84,6 @@
 
 {% block emptylist %}
 <td colspan="{{ 5|add:extra_actions_len }}">
-  <p>{% trans "No forums are currently defined." %}</p>
+  <p>{% trans "No forums exist." %}</p>
 </td>
 {% endblock emptylist %}