summaryrefslogtreecommitdiff
path: root/coip/apps
diff options
context:
space:
mode:
authorLeif Johansson <leifj@sunet.se>2010-07-08 21:32:05 +0200
committerLeif Johansson <leifj@sunet.se>2010-07-08 21:32:05 +0200
commit2bb8b5dd3eee47e665da570eb72cfea87c6ca3fe (patch)
tree72c79fa02307c1c2e76e93644b82039d51529a52 /coip/apps
parent5a58664f5cf03995c6f35f71812cfcf5637ba76e (diff)
navigation based on jsTree
Diffstat (limited to 'coip/apps')
-rw-r--r--coip/apps/auth/authz.py16
-rw-r--r--coip/apps/auth/views.py6
-rw-r--r--coip/apps/name/models.py60
-rw-r--r--coip/apps/name/views.py51
4 files changed, 99 insertions, 34 deletions
diff --git a/coip/apps/auth/authz.py b/coip/apps/auth/authz.py
deleted file mode 100644
index b5f3bd5..0000000
--- a/coip/apps/auth/authz.py
+++ /dev/null
@@ -1,16 +0,0 @@
-'''
-Created on Jul 7, 2010
-
-@author: leifj
-'''
-from coip.apps.name.models import Name
-
-#TODO implement acls
-def has_permission_name(user,name,perm):
- return True
-
-def has_permission(user, object, perm):
- if type(object) == Name:
- return has_permission_name(user,object,perm)
-
- return False; \ No newline at end of file
diff --git a/coip/apps/auth/views.py b/coip/apps/auth/views.py
index d38be1f..28ff7de 100644
--- a/coip/apps/auth/views.py
+++ b/coip/apps/auth/views.py
@@ -7,6 +7,7 @@ from django.http import HttpResponseRedirect
from coip.apps.userprofile.models import UserProfile
from django.contrib.auth.models import User
from coip.apps.auth.utils import anonid
+from coip.apps.name.models import lookup
def meta(request,attr):
v = request.META.get(attr)
@@ -50,6 +51,11 @@ def accounts_login_federated(request):
if update:
request.user.save()
profile.save()
+
+ #autocreate a few personal namespaces
+ lookup('user:'+profile.identifier,True,'#l '+request.user+'#rw')
+ lookup(request.user,True,'#l '+request.user+'#rw')
+
next = request.session.get("after_login_redirect", None)
if next is not None:
return HttpResponseRedirect(next)
diff --git a/coip/apps/name/models.py b/coip/apps/name/models.py
index 7801a0d..d68b8bb 100644
--- a/coip/apps/name/models.py
+++ b/coip/apps/name/models.py
@@ -4,8 +4,9 @@ Created on Jun 24, 2010
@author: leifj
'''
from django.db import models
-from django.contrib.auth.models import User
import re
+from twisted.python.reflect import ObjectNotFound
+from pprint import pprint
class Attribute(models.Model):
name = models.CharField(unique=True,max_length=255)
@@ -27,7 +28,6 @@ class Name(models.Model):
acl = models.TextField(blank=True) # fully-qualified-name '#' rights
short = models.CharField(max_length=64,blank=True)
description = models.TextField(blank=True)
- creator = models.ForeignKey(User)
timecreated = models.DateTimeField(auto_now_add=True)
lastupdated = models.DateTimeField(auto_now=True)
@@ -61,19 +61,65 @@ class Name(models.Model):
return str
-def walkto(root,nameparts):
+ def has_permission(self,user,perm):
+ return True
+
+ def permitted_children(self,user,perm):
+ return filter(lambda s: s.has_permission(user,perm),self.children.all())
+
+def roots():
+ return Name.objects.filter(parent=None)
+
+def _traverse(name,callable,user,depth):
+ if not name:
+ return [_traverse(s,callable,user,depth - 1) for s in roots()]
+ else:
+ t = callable(name,depth)
+ if depth > 0:
+ children = [_traverse(s,callable,user,depth - 1) for s in name.permitted_children(user,'#l')]
+ if children:
+ t['children'] = children
+ return t
+
+def traverse(name,callable,user,depth,includeroot=False):
+ if not name:
+ return [_traverse(s,callable,user,depth - 1) for s in roots()]
+ else:
+ if includeroot:
+ t = callable(name,depth)
+ if depth > 0:
+ children = [_traverse(s,callable,user,depth - 1) for s in name.permitted_children(user,'#l')]
+ if children:
+ t['children'] = children
+ return t
+ else:
+ return [_traverse(s,callable,user,depth - 1) for s in name.permitted_children(user,'#l')]
+
+def walkto(root,nameparts,autocreate=False,autoacl='#l'):
name = None
for n in nameparts:
(a,eq,v) = n.partition('=')
if v:
attribute = Attribute.objects.get(name=a)
- name = Name.objects.get(parent=root,type=attribute.id,value=v)
+ try:
+ name = Name.objects.get(parent=root,type=attribute.id,value=v)
+ except ObjectNotFound,e:
+ if autocreate:
+ name = Name.objects.create(parent=root,type=attribute.id,value=v,acl=autoacl)
+ else:
+ raise e
else:
- name = Name.objects.get(parent=root,type=None,value=a)
+ try:
+ name = Name.objects.get(parent=root,type=None,value=a)
+ except ObjectNotFound,e:
+ if autocreate:
+ name = Name.objects.create(parent=root,type=None,value=a,acl=autoacl)
+ else:
+ raise e
return name
-def lookup(name):
- return walkto(None,nameparts=re.compile('[;:]').split(name))
+def lookup(name,autocreate=False,autoacl='#l'):
+ return walkto(None,nameparts=re.compile('[;:]').split(name),autocreate=autocreate,autoacl=autoacl)
def attribute(a):
Attribute.objects.get_or_create(name=a)
diff --git a/coip/apps/name/views.py b/coip/apps/name/views.py
index 9e8d74c..3152b0d 100644
--- a/coip/apps/name/views.py
+++ b/coip/apps/name/views.py
@@ -3,35 +3,64 @@ Created on Jul 6, 2010
@author: leifj
'''
-from coip.apps.name.models import Name, lookup
+from coip.apps.name.models import Name, lookup, traverse
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponseNotFound, HttpResponseForbidden
from django.contrib.auth.decorators import login_required
-from coip.multiresponse import respond_to
-from coip.apps.auth.authz import has_permission
+from coip.multiresponse import respond_to, json_response
+from pprint import pprint
+
+def show_root(request):
+ return respond_to(request, {'text/html': 'apps/name/name.html'}, {'name': None, 'memberships': None, 'children': Name.objects.filter(parent=None)})
def show(request,name):
if not name:
return HttpResponseNotFound()
- if has_permission(request.user,name,'r'):
- memberships = []
- if has_permission(request.user,name,'l'):
- memberships = name.memberships
- return respond_to(request, {'text/html': 'apps/name/name.html'}, {'name': name, 'memberships': memberships})
+ if name.has_permission(request.user,'r'):
+ return respond_to(request, {'text/html': 'apps/name/name.html'}, {'name': name, 'memberships': name.memberships})
else:
return HttpResponseForbidden()
@login_required
-def show_by_name(request,n):
+def show_by_name(request,n=None):
+ if not n:
+ return show_root(request)
try:
return show(request,lookup(n))
except ObjectDoesNotExist:
return HttpResponseNotFound()
@login_required
-def show_by_id(request,id):
+def show_by_id(request,id=None):
+ if not id:
+ return show_root(request)
try:
return show(request,Name.objects.get(id=id))
except ObjectDoesNotExist:
- return HttpResponseNotFound() \ No newline at end of file
+ return HttpResponseNotFound()
+
+def _tree_node(name,depth):
+ state = 'closed'
+ return {'data': { 'title': name.relative_name(), 'attr': {'href': '/name/id/%d' % name.id} },
+ 'state': state,
+ 'attr': {'id': name.id}}
+
+def _tree(request,id=None,includeroot=False):
+ name = None
+ if id:
+ name = Name.objects.get(id=id)
+ depth = 3
+ if request.GET.has_key('depth'):
+ depth = request.GET['depth']
+ t = traverse(name,_tree_node,request.user,depth,includeroot)
+ pprint(t)
+ return json_response(t)
+
+@login_required
+def rtree(request,id=None):
+ return _tree(request,id,True)
+
+@login_required
+def ctree(request,id=None):
+ return _tree(request,id,False) \ No newline at end of file