diff options
Diffstat (limited to 'coip/apps/name/models.py')
-rw-r--r-- | coip/apps/name/models.py | 60 |
1 files changed, 53 insertions, 7 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) |