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 %} + +
+ +
+

+ Permissions + +

+ +
+
+ {{ form|crispy }} + {% csrf_token %} + +
+
+ +
+ +{% 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 %} + + +
+ +
+

+ Permissions + +

+
+ + {% if permissions.count %} + + + + + + + + + + {% for perm in permissions %} + + + + + + + + + {% endfor %} +
TypeNameCreate project?Modify project?Delete project?
{{ perm.type }}{{ perm.name }}{{ perm.create_project|boolean }}{{ perm.modify_project|boolean }}{{ perm.delete_project|boolean }} + + +
+ {% 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():