diff options
author | Leif Johansson <leifj@sunet.se> | 2010-07-08 21:32:05 +0200 |
---|---|---|
committer | Leif Johansson <leifj@sunet.se> | 2010-07-08 21:32:05 +0200 |
commit | 2bb8b5dd3eee47e665da570eb72cfea87c6ca3fe (patch) | |
tree | 72c79fa02307c1c2e76e93644b82039d51529a52 /coip/apps/name | |
parent | 5a58664f5cf03995c6f35f71812cfcf5637ba76e (diff) |
navigation based on jsTree
Diffstat (limited to 'coip/apps/name')
-rw-r--r-- | coip/apps/name/models.py | 60 | ||||
-rw-r--r-- | coip/apps/name/views.py | 51 |
2 files changed, 93 insertions, 18 deletions
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 |