Ralfp 12 лет назад
Родитель
Сommit
0b679f2274

+ 2 - 1
misago/acl/models.py

@@ -8,7 +8,8 @@ class Role(models.Model):
     name = models.CharField(max_length=255)
     token = models.CharField(max_length=255,null=True,blank=True)
     protected = models.BooleanField(default=False)
-    
+    permissions = models.TextField(null=True,blank=True)
+     
     def __unicode__(self):
         return unicode(_(self.name))
     

+ 1 - 0
misago/overview/admin/views.py

@@ -145,6 +145,7 @@ def check_dates(date_start, date_end, precision):
         return BasicMessage(_('Too few items to display on graph'), type='error')
     return None
         
+
 def build_graph(model, date_start, date_end, precision):
     if precision == 'day':
         format = 'F j, Y'

+ 25 - 4
misago/users/admin/__init__.py

@@ -1,6 +1,7 @@
 from django.conf.urls import patterns, include, url
 from django.utils.translation import ugettext_lazy as _
 from misago.admin import AdminSection, AdminAction
+from misago.acl.models import Role
 from misago.banning.models import Ban
 from misago.users.models import User, Rank
 
@@ -43,8 +44,8 @@ ADMIN_ACTIONS=(
                         url(r'^(?P<page>\d+)/$', 'List', name='admin_users'),
                         url(r'^inactive/$', 'inactive', name='admin_users_inactive'),
                         url(r'^new/$', 'List', name='admin_users_new'),
-                        url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_users_edit'),
-                        url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_users_delete'),
+                        url(r'^edit/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Edit', name='admin_users_edit'),
+                        url(r'^delete/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Delete', name='admin_users_delete'),
                     ),
                ),
                
@@ -54,9 +55,29 @@ ADMIN_ACTIONS=(
                name=_("Roles"),
                help=_("Manage User Roles"),
                icon='adjust',
+               model=Role,
+               actions=[
+                        {
+                         'id': 'list',
+                         'icon': 'list-alt',
+                         'name': _("Browse Roles"),
+                         'help': _("Browse all existing roles"),
+                         'route': 'admin_users_roles'
+                         },
+                        {
+                         'id': 'new',
+                         'icon': 'plus',
+                         'name': _("Add Role"),
+                         'help': _("Create new role"),
+                         'route': 'admin_users_roles_new'
+                         },
+                        ],
                route='admin_users_roles',
-               urlpatterns=patterns('misago.admin.views',
-                        url(r'^$', 'todo', name='admin_users_roles'),
+               urlpatterns=patterns('misago.users.admin.roles.views',
+                        url(r'^$', 'List', name='admin_users_roles'),
+                        url(r'^new/$', 'New', name='admin_users_roles_new'),
+                        url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_users_roles_edit'),
+                        url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_users_roles_delete'),
                     ),
                ),
    AdminAction(

+ 1 - 1
misago/users/admin/ranks/views.py

@@ -25,7 +25,7 @@ class List(ListWidget):
     table_form_button = _('Reorder Ranks')
     nothing_checked_message = _('You have to check at least one rank.')
     actions=(
-             ('delete', _("Delete selected"), _("Are you sure you want to delete selected ranks?")),
+             ('delete', _("Delete selected ranks"), _("Are you sure you want to delete selected ranks?")),
              )
     
     

+ 0 - 0
misago/users/admin/roles/__init__.py


+ 16 - 0
misago/users/admin/roles/forms.py

@@ -0,0 +1,16 @@
+from django.core.validators import RegexValidator
+from django.utils.translation import ugettext_lazy as _
+from django import forms
+from misago.forms import Form, YesNoSwitch
+
+class RoleForm(Form):
+    name = forms.CharField(max_length=255)
+    layout = (
+              (
+               _("Basic Role Options"),
+               (
+                ('name', {'label': _("Role Name"), 'help_text': _("Role Name is used to identify this role in Admin Control Panel.")}),
+                ),
+              ),
+             )
+    

+ 117 - 0
misago/users/admin/roles/views.py

@@ -0,0 +1,117 @@
+from django.core.urlresolvers import reverse as django_reverse
+from django import forms
+from django.utils.translation import ugettext as _
+from misago.admin import site
+from misago.admin.widgets import *
+from misago.forms import Form
+from misago.utils import slugify
+from misago.users.admin.roles.forms import RoleForm
+from misago.acl.models import Role
+
+def reverse(route, target=None):
+    if target:
+        return django_reverse(route, kwargs={'target': target.pk, 'slug': slugify(target.name)})
+    return django_reverse(route)
+
+"""
+Views
+"""
+class List(ListWidget):
+    admin = site.get_action('roles')
+    id = 'list'
+    columns=(
+             ('role', _("Role")),
+             )
+    table_form_button = _('Reorder Roles')
+    nothing_checked_message = _('You have to check at least one role.')
+    actions=(
+             ('delete', _("Delete selected roles"), _("Are you sure you want to delete selected roles?")),
+             )
+    
+    def sort_items(self, request, page_items, sorting_method):
+        return page_items.order_by('name')
+    
+    def get_item_actions(self, request, item):
+        return (
+                self.action('pencil', _("Edit Role"), reverse('admin_users_roles_edit', item)),
+                self.action('remove', _("Delete Role"), reverse('admin_users_roles_delete', item), post=True, prompt=_("Are you sure you want to delete this role?")),
+                )
+
+    def action_delete(self, request, items, checked):
+        for item in items:
+            if unicode(item.pk) in checked:
+                if item.token:
+                    return BasicMessage(_('You cannot delete system roles.'), 'error'), reverse('admin_users_roles')
+                if item.protected and not request.user.is_god():
+                    return BasicMessage(_('You cannot delete protected roles.'), 'error'), reverse('admin_users_roles')
+                if item.user_set.count() > 0:
+                    return BasicMessage(_('You cannot delete roles that are assigned to users.'), 'error'), reverse('admin_users_roles')
+        
+        Role.objects.filter(id__in=checked).delete()
+        return BasicMessage(_('Selected roles have been deleted successfully.'), 'success'), reverse('admin_users_roles')
+
+
+class New(FormWidget):
+    admin = site.get_action('roles')
+    id = 'new'
+    fallback = 'admin_users_roles' 
+    form = RoleForm
+    submit_button = _("Save Role")
+        
+    def get_new_url(self, request, model):
+        return reverse('admin_users_roles')
+    
+    def get_edit_url(self, request, model):
+        return reverse('admin_users_roles_edit', model)
+    
+    def submit_form(self, request, form, target):
+        new_role = Role(
+                      name = form.cleaned_data['name'],
+                     )
+        new_role.save(force_insert=True)
+        return new_role, BasicMessage(_('New Role has been created.'), 'success')
+    
+   
+class Edit(FormWidget):
+    admin = site.get_action('roles')
+    id = 'edit'
+    name = _("Edit Role")
+    fallback = 'admin_users_roles'
+    form = RoleForm
+    target_name = 'name'
+    notfound_message = _('Requested Role could not be found.')
+    submit_fallback = True
+    
+    def get_url(self, request, model):
+        return reverse('admin_users_roles_edit', model)
+    
+    def get_edit_url(self, request, model):
+        return self.get_url(request, model)
+    
+    def get_initial_data(self, request, model):
+        return {
+                'name': model.name,
+                }
+    
+    def submit_form(self, request, form, target):
+        target.name = form.cleaned_data['name']
+        target.save(force_update=True)
+        return target, BasicMessage(_('Changes in role "%(name)s" have been saved.' % {'name': self.original_name}), 'success')
+
+
+class Delete(ButtonWidget):
+    admin = site.get_action('roles')
+    id = 'delete'
+    fallback = 'admin_users_roles'
+    notfound_message = _('Requested role could not be found.')
+    
+    def action(self, request, target):
+        if target.token:
+            return BasicMessage(_('You cannot delete system roles.'), 'error'), reverse('admin_users_roles')
+        if target.protected and not request.user.is_god():
+            return BasicMessage(_('This role is protected.'), 'error'), reverse('admin_users_roles')
+        if target.user_set.count() > 0:
+            return BasicMessage(_('This role is assigned to one or more usets.'), 'error'), reverse('admin_users_roles')
+
+        target.delete()
+        return BasicMessage(_('Role "%(name)s" has been deleted.' % {'name': target.name}), 'success'), False

+ 10 - 0
templates/admin/acl/admin_users_roles/list.html

@@ -0,0 +1,10 @@
+{% extends "admin/admin/list.html" %}
+{% load i18n %}
+{% load l10n %}
+{% load url from future %}
+
+{% block table_row scoped %}
+  <td class="lead-cell">
+  	<strong>{{ _(item.name) }}</strong>{% if item.token %} <span class="label label-important">{% trans %}System Role{% endtrans %}</span>{% elif item.protected %} <span class="label label-info">{% trans %}Protected Role{% endtrans %}</span>{% endif %}
+  </td>
+{% endblock%}