summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeif Johansson <leifj@sunet.se>2010-12-03 23:20:31 +0100
committerLeif Johansson <leifj@sunet.se>2010-12-03 23:20:31 +0100
commitfc10f1fcfdff57a9250ef18daf761d8784be92da (patch)
tree8e355c1bf983c8257e283a02b69243a7fb0d8de0
parentf554f07fe2f4a9d7591bc9ff89e49a160d4eca78 (diff)
coip wsgi driver
-rw-r--r--coip.wsgi8
-rw-r--r--coip/apps/name/forms.py16
-rw-r--r--coip/apps/name/views.py52
-rw-r--r--coip/urls.py4
-rw-r--r--site-media/css/style.css11
-rw-r--r--templates/base.html2
-rw-r--r--templates/edit.html20
7 files changed, 93 insertions, 20 deletions
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<id>[0-9]+)/edit$', 'coip.apps.name.views.edit'),
(r'^name/(?P<id>[0-9]+)/delete$', 'coip.apps.name.views.delete'),
(r'^name/(?P<id>[0-9]+)/add$', 'coip.apps.name.views.add'),
+ # Name Links
+ (r'^name/(?P<id>[0-9]+)/link/(?P<type>[0-9]+).json$', 'coip.apps.name.views.links'),
+ (r'^namelink/(?P<id>[0-9]+)/remove$', 'coip.apps.name.views.removelink'),
+ (r'^name/(?P<id>[0-9]+)/link/(?P<type>[0-9]+)$', 'coip.apps.name.views.editacl'),
# Links
(r'^name/(?P<id>[0-9]+)/addlink$', 'coip.apps.link.views.add'),
(r'^link/(?P<id>[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 @@
<div class="ui-widget ui-state-default ui-corner-all navlist toolbar">
<ul>
{% if render.edit %}
- <li><a class="tip" title="Modify access rights" href="/name/{{name.id}}/editacl"><span class="ui-icon ui-icon-unlocked"></span></a></li>
+ <li><a class="tip" title="Modify access rights" href="/name/{{name.id}}/link/0"><span class="ui-icon ui-icon-unlocked"></span></a></li>
{% endif %}
{% if render.edit %}
<li><a class="tip" title="Modify" href="/name/{{name.id}}/edit"><span class="ui-icon ui-icon-wrench"></span></a></li>
diff --git a/templates/edit.html b/templates/edit.html
index 7ada9a1..404751a 100644
--- a/templates/edit.html
+++ b/templates/edit.html
@@ -4,19 +4,23 @@
$('#id_description').wysiwyg();
{% endblock %}
{% block content %}
+ {% block beforeform %}
+ {% endblock %}
<form method="POST">
<div class="ui-widget-content ui-corner-all infopanel">
<h1>{{formtitle}}</h1>
- <table>
+ <table class="formtable">
{% for field in form %}
<tr>
- {% if field.errors %}
- <td colspan="2">{{ field.errors }}</td>
- {% endif %}
- </tr>
- <tr>
- <td>{{ field.label_tag }}</td>
- <td><div class="ui-widget">{{ field }}</div></td>
+ <td>
+ {% if not field.is_hidden %}
+ <div class="ui-widget fieldlabel">{{ field.label_tag }}</div>
+ {% endif %}
+ {% if field.errors %}
+ <div class="ui-widget ui-state-error">{{ field.errors }}</div>
+ {% endif %}
+ <div class="ui-widget">{{ field }}</div>
+ </td>
</tr>
{% endfor %}
</table>