add global permissions managment page

This commit is contained in:
Élie Bouttier 2014-08-07 19:19:41 -07:00
parent de137b0df9
commit 81927a3cad
7 changed files with 179 additions and 1 deletions

View file

@ -6,7 +6,6 @@ from django_markdown.widgets import MarkdownWidget
from issue.models import *
AddProjectForm = modelform_factory(Project, fields=['display_name', 'name', 'description', 'public'])
EditProjectForm = modelform_factory(Project, fields=['display_name', 'description', 'public'])
LabelForm = modelform_factory(Label, fields=['name', 'color', 'inverted'])
@ -26,3 +25,26 @@ class IssueForm(forms.Form):
class CommentForm(forms.Form):
comment = forms.CharField(widget=MarkdownWidget)
class GlobalPermissionForm(forms.ModelForm):
class Meta:
model = GlobalPermission
exclude = ['content_type']
def clean(self):
data = super(GlobalPermissionForm, self).clean()
name = data['grantee_name']
if int(data['grantee_type']) == PermissionModel.GRANTEE_USER:
if not User.objects.filter(username=name).exists():
raise ValidationError("User '%s' does not exists." %name)
elif int(data['grantee_type']) == PermissionModel.GRANTEE_GROUP:
if not Group.objects.filter(name=name).exists():
raise ValidationError("Group '%s' does not exists." %name)
elif int(data['grantee_type']) == PermissionModel.GRANTEE_TEAM:
if not Team.objects.filter(name=name).exists():
raise ValidationError("Team '%s' does not exists." %name)
return data

View file

@ -66,6 +66,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ request.user.username }} <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li role="presentation"><a role="menuitem" href="{% url 'profile' %}"><span class="glyphicon glyphicon-dashboard"></span>&nbsp;Profile</a></li>
<li role="presentation"><a role="menuitem" href="{% url 'list-global-permission' %}"><span class="glyphicon glyphicon-cog"></span>&nbsp;Manage permissions</a></li>
<li role="presentation" class="divider"></li>
<li role="presentation"><a role="menuitem" href="{% url 'logout' %}"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Logout</a></li>
</ul>

View file

@ -0,0 +1,27 @@
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading clearfix">
<h1>
Permissions
<div class="pull-right">
<a href="{% url 'list-global-permission' %}"><button class="btn btn-warning">Go back to list</button></a>
</div>
</div>
<div class="panel-body">
<form action="" method="post" role="form">
{{ form|crispy }}
{% csrf_token %}
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,50 @@
{% extends 'base.html' %}
{% load django_markdown %}
{% load issue_filters %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading">
<h1>
Permissions
<div class="pull-right">
<a href="{% url 'add-global-permission' %}"><button class="btn btn-success">Add new permission</button></a>
</div>
</h1>
</div>
{% if permissions.count %}
<table class="table">
<tr>
<th>Type</th>
<th>Name</th>
<th>Create project?</th>
<th>Modify project?</th>
<th>Delete project?</th>
<th class="col-md-2"></th>
</tr>
{% for perm in permissions %}
<tr>
<td>{{ perm.type }}</td>
<td>{{ perm.name }}</td>
<td><a href="{% url 'toggle-global-permission' perm.id 'create-project' %}">{{ perm.create_project|boolean }}</a></td>
<td><a href="{% url 'toggle-global-permission' perm.id 'modify-project' %}">{{ perm.modify_project|boolean }}</a></td>
<td><a href="{% url 'toggle-global-permission' perm.id 'delete-project' %}">{{ perm.delete_project|boolean }}</a></td>
<td class="text-right">
<a href="{% url 'edit-global-permission' perm.id %}"><button class="btn btn-primary btn-xs"><span class="glyphicon glyphicon-edit"></span> Edit</button></a>
<a href="{% url 'delete-global-permission' perm.id %}"><button class="btn btn-danger btn-xs"><span class="glyphicon glyphicon-remove"></span> Delete</button></a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<div class="panel-body">
There aren't any permissions defined yet.
</div>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,13 @@
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def boolean(value):
if value:
glyph = 'ok'
else:
glyph = 'remove'
return mark_safe('<span class="glyphicon glyphicon-' + glyph + '" style="vertical-align: middle;"></span>')

View file

@ -28,6 +28,11 @@ urlpatterns = [
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[a-z0-9_.-]+)/close$', 'issue.views.milestone_close', name='close-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[a-z0-9_.-]+)/reopen$', 'issue.views.milestone_reopen', name='reopen-milestone'),
url(r'^(?P<project>[a-z0-9_-]+)/milestones/(?P<name>[a-z0-9_.-]+)/delete$', 'issue.views.milestone_delete', name='delete-milestone'),
url(r'^permissions$', 'issue.views.global_permission_list', name='list-global-permission'),
url(r'^permissions/add$', 'issue.views.global_permission_edit', name='add-global-permission'),
url(r'^permissions/(?P<id>[0-9]+)/edit$', 'issue.views.global_permission_edit', name='edit-global-permission'),
url(r'^permissions/(?P<id>[0-9]+)/toggle/(?P<perm>[a-z-]+)$', 'issue.views.global_permission_toggle', name='toggle-global-permission'),
url(r'^permissions/(?P<id>[0-9]+)/delete$', 'issue.views.global_permission_delete', name='delete-global-permission'),
url(r'^login$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}, name='login'),
url(r'^profile$', 'issue.views.profile', name='profile'),
url(r'^logout$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='logout'),

View file

@ -1,6 +1,7 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404
from issue.models import *
from issue.forms import *
@ -19,6 +20,65 @@ def profile(request):
return render(request, 'issue/profile.html', c)
def global_permission_list(request):
permissions = GlobalPermission.objects.all()
c = {
'permissions': permissions,
}
return render(request, 'issue/global_permission_list.html', c)
def global_permission_edit(request, id=None):
if id:
permission = get_object_or_404(GlobalPermission, id=id)
else:
permission = None
form = GlobalPermissionForm(request.POST or None, instance=permission)
if request.method == 'POST' and form.is_valid():
permission = form.save()
messages.success(request, 'Permission added successfully.')
return redirect('list-global-permission')
c = {
'form': form,
}
return render(request, 'issue/global_permission_edit.html', c)
def global_permission_toggle(request, id, perm):
permission = get_object_or_404(GlobalPermission, id=id)
# to be sure to dont modify other attribut with the following trick
if not '-' in perm:
raise Http404
perm = perm.replace('-', '_')
if hasattr(permission, perm):
print(type(getattr(permission, perm)))
setattr(permission, perm, not getattr(permission, perm))
permission.save()
else:
raise Http404
return redirect('list-global-permission')
def global_permission_delete(request, id):
permission = get_object_or_404(GlobalPermission, id=id)
permission.delete()
return redirect('list-global-permission')
def project_list(request):
if not request.projects.exists():