diff --git a/issue/forms.py b/issue/forms.py
index 59e8654..9b2d929 100644
--- a/issue/forms.py
+++ b/issue/forms.py
@@ -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
diff --git a/issue/templates/base.html b/issue/templates/base.html
index a223bf8..7cb81ff 100644
--- a/issue/templates/base.html
+++ b/issue/templates/base.html
@@ -66,6 +66,7 @@
{{ request.user.username }}
diff --git a/issue/templates/issue/global_permission_edit.html b/issue/templates/issue/global_permission_edit.html
new file mode 100644
index 0000000..9230c82
--- /dev/null
+++ b/issue/templates/issue/global_permission_edit.html
@@ -0,0 +1,27 @@
+{% extends 'base.html' %}
+
+{% load crispy_forms_tags %}
+
+{% block content %}
+
+
+
+{% endblock %}
diff --git a/issue/templates/issue/global_permission_list.html b/issue/templates/issue/global_permission_list.html
new file mode 100644
index 0000000..2bfce69
--- /dev/null
+++ b/issue/templates/issue/global_permission_list.html
@@ -0,0 +1,50 @@
+{% extends 'base.html' %}
+
+{% load django_markdown %}
+{% load issue_filters %}
+
+{% block content %}
+
+
+
+
+
+
+ {% if permissions.count %}
+
+ {% else %}
+
+ There aren't any permissions defined yet.
+
+ {% endif %}
+
+{% endblock %}
diff --git a/issue/templatetags/issue_filters.py b/issue/templatetags/issue_filters.py
new file mode 100644
index 0000000..5958ccd
--- /dev/null
+++ b/issue/templatetags/issue_filters.py
@@ -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('
')
diff --git a/issue/urls.py b/issue/urls.py
index a1f6f20..e10f7ab 100644
--- a/issue/urls.py
+++ b/issue/urls.py
@@ -28,6 +28,11 @@ urlpatterns = [
url(r'^(?P
[a-z0-9_-]+)/milestones/(?P[a-z0-9_.-]+)/close$', 'issue.views.milestone_close', name='close-milestone'),
url(r'^(?P[a-z0-9_-]+)/milestones/(?P[a-z0-9_.-]+)/reopen$', 'issue.views.milestone_reopen', name='reopen-milestone'),
url(r'^(?P[a-z0-9_-]+)/milestones/(?P[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[0-9]+)/edit$', 'issue.views.global_permission_edit', name='edit-global-permission'),
+ url(r'^permissions/(?P[0-9]+)/toggle/(?P[a-z-]+)$', 'issue.views.global_permission_toggle', name='toggle-global-permission'),
+ url(r'^permissions/(?P[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'),
diff --git a/issue/views.py b/issue/views.py
index 636b48c..2ed0a2d 100644
--- a/issue/views.py
+++ b/issue/views.py
@@ -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():