From fc10f1fcfdff57a9250ef18daf761d8784be92da Mon Sep 17 00:00:00 2001 From: Leif Johansson Date: Fri, 3 Dec 2010 23:20:31 +0100 Subject: coip wsgi driver --- coip.wsgi | 8 ++++++++ coip/apps/name/forms.py | 16 ++++++++++----- coip/apps/name/views.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++-- coip/urls.py | 4 ++++ site-media/css/style.css | 11 ++++++---- templates/base.html | 2 +- templates/edit.html | 20 +++++++++++-------- 7 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 coip.wsgi diff --git a/coip.wsgi b/coip.wsgi new file mode 100644 index 0000000..5211276 --- /dev/null +++ b/coip.wsgi @@ -0,0 +1,8 @@ +import os +import sys + +os.environ['DJANGO_SETTINGS_MODULE'] = 'coip.settings' + +sys.path.append('/var/www/coip') +import django.core.handlers.wsgi +application = django.core.handlers.wsgi.WSGIHandler() diff --git a/coip/apps/name/forms.py b/coip/apps/name/forms.py index 9dd03a7..a2a659e 100644 --- a/coip/apps/name/forms.py +++ b/coip/apps/name/forms.py @@ -5,7 +5,8 @@ Created on Jun 24, 2010 ''' from django import forms from coip.apps.name.models import Name, Attribute, NameLink -from django.forms.fields import BooleanField +from django.forms import fields +from django.forms.widgets import HiddenInput, CheckboxSelectMultiple class NameForm(forms.ModelForm): class Meta: @@ -16,20 +17,20 @@ class AttributeForm(forms.ModelForm): model = Attribute class NameEditForm(forms.ModelForm): - description = forms.CharField(widget=forms.Textarea(attrs={'cols': 85, 'rows': 10})) + description = forms.CharField(widget=forms.Textarea(attrs={'cols': 60, 'rows': 6})) class Meta: model = Name fields = ['short','description'] class NewNameForm(forms.ModelForm): - description = forms.CharField(widget=forms.Textarea(attrs={'cols': 85, 'rows': 10})) + description = forms.CharField(widget=forms.Textarea(attrs={'cols': 60, 'rows': 6})) class Meta: model = Name fields = ['type','value','short','description'] class NameDeleteForm(forms.Form): - recursive = BooleanField(label="Also delete everything below this name?",required=False) + recursive = fields.BooleanField(label="Also delete everything below this name?",required=False) class NameLinkForm(forms.ModelForm): class Meta: @@ -37,4 +38,9 @@ class NameLinkForm(forms.ModelForm): fields = ['dst','type','data'] class NameLinkDeleteForm(forms.Form): - confirm = BooleanField(label="Confirm") \ No newline at end of file + confirm = fields.BooleanField(label="Confirm") + +class PermissionForm(forms.Form): + dst = fields.IntegerField(widget=HiddenInput) + subject = fields.CharField(min_length=1024) + permissions = fields.MultipleChoiceField(widget=CheckboxSelectMultiple,choices=[('r','read'),('w','write'),('l','list'),('i','insert'),('d','delete')]) diff --git a/coip/apps/name/views.py b/coip/apps/name/views.py index bde9954..47f06d0 100644 --- a/coip/apps/name/views.py +++ b/coip/apps/name/views.py @@ -3,15 +3,17 @@ Created on Jul 6, 2010 @author: leifj ''' -from coip.apps.name.models import Name, lookup, traverse +from coip.apps.name.models import Name, lookup, traverse, NameLink from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponseNotFound, HttpResponseForbidden,\ HttpResponseRedirect, Http404 from django.contrib.auth.decorators import login_required from coip.multiresponse import respond_to, json_response, render403 from pprint import pprint -from coip.apps.name.forms import NameEditForm, NewNameForm, NameDeleteForm +from coip.apps.name.forms import NameEditForm, NewNameForm, NameDeleteForm,\ + PermissionForm from twisted.python.reflect import ObjectNotFound +from django.shortcuts import get_object_or_404 @login_required def delete(request,id): @@ -99,6 +101,52 @@ def edit(request,id): @login_required +def editacl(request,id,type): + name = get_object_or_404(Name,pk=id) + + if not name.has_permission(request.user,'w'): + return render403("You do not have permission to change permissions on %s" % (name)) + + if request.method == 'POST': + form = PermissionForm(request.POST) + if form.is_valid(): + dstid = form.cleaned_data['dst'] + dst = get_object_or_404(Name,pk=dstid) + p = form.cleaned_data['permissions'] + if not p: + p = [] + perms = p.join('') + link = NameLink.objects.get_or_create(src=name,dst=dst,type=NameLink.access_control) + link.data = perms + link.save() + + form = PermissionForm() + return respond_to(request,{'text/html': 'apps/name/acls.html'},{'form': form, 'name': name, 'acl': name.lsacl(),'formtitle': 'Add Permission','submitname':'Add'}) + +@login_required +def links(request,id,type=NameLink.access_control): + name = get_object_or_404(Name,pk=id) + if not name.has_permission(request.user,'r'): + return render403("You do not have permission to list name links from %s" % (name)) + + links = name.links.filter(type=type).all + return respond_to(request,{'text/html': 'apps/name/links.html', + 'application/json': json_response(links)}, + {'name': name, 'links': links}) + + +@login_required +def removelink(request,id): + link = get_object_or_404(NameLink,pk=id) + name = link.src + type = link.type + if not name.has_permission(request.user,'w'): + return render403("You do not have permission to remove name links from %s" % (name)) + + link.delete() + return HttpResponseRedirect("/name/{{name.id}}/link/{{type}}") + +@login_required def show_root(request): return respond_to(request, {'text/html': 'apps/name/name.html'}, diff --git a/coip/urls.py b/coip/urls.py index ba71137..c0f2ecf 100644 --- a/coip/urls.py +++ b/coip/urls.py @@ -31,6 +31,10 @@ urlpatterns = patterns('', (r'^name/(?P[0-9]+)/edit$', 'coip.apps.name.views.edit'), (r'^name/(?P[0-9]+)/delete$', 'coip.apps.name.views.delete'), (r'^name/(?P[0-9]+)/add$', 'coip.apps.name.views.add'), + # Name Links + (r'^name/(?P[0-9]+)/link/(?P[0-9]+).json$', 'coip.apps.name.views.links'), + (r'^namelink/(?P[0-9]+)/remove$', 'coip.apps.name.views.removelink'), + (r'^name/(?P[0-9]+)/link/(?P[0-9]+)$', 'coip.apps.name.views.editacl'), # Links (r'^name/(?P[0-9]+)/addlink$', 'coip.apps.link.views.add'), (r'^link/(?P[0-9]+)/remove$', 'coip.apps.link.views.remove'), diff --git a/site-media/css/style.css b/site-media/css/style.css index eda5777..ea5071c 100644 --- a/site-media/css/style.css +++ b/site-media/css/style.css @@ -1,6 +1,6 @@ html { height: 100%; margin: 0; padding: 0;} -body { font: 61.8% "Trebuchet MS", sans-serif; width: 70%; height: 100%; margin:0;padding:0;} -div#container { position: relative; height:auto !important; height:100%; min-height:100%; margin: 0 auto; margin-left: 50px;} +body { font: 61.8% "Trebuchet MS", sans-serif; width: 70%; height: 100%; margin:0; padding:0;} +div#container { position: relative; height:auto !important; height:100%; min-height:100%; margin: 0; margin-left: 50px;} label { display:block; } #modal-dialog { font-size: 110%; } #modal-dialog input.text textarea { margin-bottom:12px; width:95%; padding: .4em; } @@ -15,9 +15,12 @@ div#headline{ font: 300% "Trebuchet MS", sans-serif; margin-bottom: 20px;} div.toolbar{ padding: 4px; float: right; margin-right: 10px; margin-top: 6px; margin-bottom: 20px;} div#left { float: left; width: 30%; padding-left: 5px; } div#right { float: right; width: 65%; padding-left: 20px; border-left: 1px solid #CECECE; } -div#related { position: absolute; bottom: 30%; } +div#related { position: absolute; bottom: 30%;} ul.links { list-style: none inside; padding: 0; margin: 0; } li.links { padding: 0; margin: 0; } +form .ui-widget ul { list-style: none inside; padding: 0; margin: 0; } +form .ui-widget li { float: right; border-right: 1px solid #CECECE; padding-right: 5px; margin: 0; vertical-align: middle;} +.fieldlabel { font-weight: bold; } div#tree { padding-bottom: 50px;} #linklist { float: right; margin-right: 50px; } #linklist ul{ list-style: none; padding: 0; margin: 0; } @@ -26,7 +29,7 @@ div#tree { padding-bottom: 50px;} a { text-decoration: none; } a:hover { text-decoration: underline; } .clear { clear: both; } -div#content { } +div#content { font: 120% "Trebuchet MS", sans-serif; } div#main{ font: 100% "Trebuchet MS", sans-serif; width:95%; height:auto !important; height:100%; min-height: 100%;} .code{font: 110% "Courier", fixed} .infopanel { padding-left: 10px; padding-bottom: 10px;} diff --git a/templates/base.html b/templates/base.html index c79aa4d..55109a5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -72,7 +72,7 @@