summaryrefslogtreecommitdiff
path: root/coip/apps/name/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'coip/apps/name/models.py')
-rw-r--r--coip/apps/name/models.py60
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)