summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeif Johansson <leifj@sunet.se>2011-04-07 23:09:06 +0200
committerLeif Johansson <leifj@sunet.se>2011-04-07 23:09:06 +0200
commit55b68e90d84433080481dbbeb5a4d8e203825053 (patch)
tree3519312b626e3b1f8c26a547ffd95b3e9f47a83a
parent83d4517f3341d7c411b0456ce7de1bd7deb0b679 (diff)
attribute-value pairs as connector
-rw-r--r--src/django_co_connector/admin.py4
-rw-r--r--src/django_co_connector/models.py59
-rw-r--r--src/django_co_connector/settings.py10
3 files changed, 58 insertions, 15 deletions
diff --git a/src/django_co_connector/admin.py b/src/django_co_connector/admin.py
index 9e1dd85..6f0c7b7 100644
--- a/src/django_co_connector/admin.py
+++ b/src/django_co_connector/admin.py
@@ -4,6 +4,6 @@ Created on Mar 25, 2011
@author: leifj
'''
from django.contrib import admin
-from django_co_connector.models import GroupConnector
+from django_co_connector.models import URIGroupConnector
-admin.site.register(GroupConnector)
+admin.site.register(URIGroupConnector)
diff --git a/src/django_co_connector/models.py b/src/django_co_connector/models.py
index 5832b88..e41138b 100644
--- a/src/django_co_connector/models.py
+++ b/src/django_co_connector/models.py
@@ -9,6 +9,7 @@ from django.db.models.fields import CharField, URLField, DateTimeField, IntegerF
from django.contrib.auth.models import Group
from django.db.models.fields.related import OneToOneRel
from django.dispatch.dispatcher import Signal
+from django_co_connector.settings import CO_ATTRIBUTES, CO_URI_ATTRIBUTE
class AccessControlEntry(models.Model):
group = OneToOneRel(Group,related_name='acl',blank=True,null=True)
@@ -61,13 +62,29 @@ def can(object,user,permission):
return False
class GroupConnector(models.Model):
- ttl = IntegerField(blank=True)
- uri = URLField(unique=True)
- member_feed = URLField(blank=True)
group = OneToOneRel(Group,related_name='connector')
modify_time = DateTimeField(auto_now=True)
create_time = DateTimeField(auto_now_add=True)
+ class Meta:
+ abstract = True
+
+class AttributeGroupConnector(GroupConnector):
+ attribute = CharField(max_length=1024)
+ value = CharField(max_length=1024)
+
+ def __unicode__(self):
+ return "%s=%s for %s" % (self.attribute,self.value,self.group.name)
+
+ class Meta:
+ unique_together = ('attribute','value')
+
+class URIGroupConnector(GroupConnector):
+ url = URLField(unique=True)
+ activity_url = URLField(blank=True)
+ membership_url = URLField(blank=True)
+ ttl = IntegerField(blank=True)
+
def __unicode__(self):
return "%s for %s" % (self.uri,self.group.name)
@@ -92,23 +109,39 @@ class GroupConnector(models.Model):
remove_member.send(sender=self.group,user=user)
user.groups.remove(self.group)
- def contains(self,user):
- return user in self.members
-
add_member = Signal(providing_args=['user'])
remove_member = Signal(providing_args=['user'])
def co_import_from_request(request):
- epes = request.META.get('HTTP_ENTITLEMENT')
+ epes = request.META.get(CO_URI_ATTRIBUTE)
for uri in epes.split(';'):
- co_import(uri,members=[request.user])
- ## import urn:x-avp:attribute:value URIs aswell
+ if uri.startswith("http"):
+ co_import_uri(uri,members=[request.user])
+
+ for attribute in request.META.get(CO_ATTRIBUTES):
+ values = request.META.get(attribute)
+ for value in values.split(';'):
+ co_import_av(attribute,value,members=[request.user])
+
+def co_import_av(attribute,value,members=None):
+ aco = AttributeGroupConnector.objects.get(attribute=attribute,value=value)
+ if not aco:
+ group = Group.objects.create(name=value)
+ aco = AttributeGroupConnector.objects.create(attribute=attribute,value=value,group=group)
+
+ for user in members:
+ if not aco.group in user.groups:
+ add_member.send(sender=aco.group,user=user)
+ user.groups.apppend(aco.group)
+ user.save()
+
+ return aco
-def co_import(uri,members=None):
- gco = GroupConnector.objects.get(uri=uri)
+def co_import_uri(uri,members=None):
+ gco = URIGroupConnector.objects.get(uri=uri)
if not gco:
group = Group.objects.create(name=uri)
- gco = GroupConnector.objects.create(uri=uri,ttl=0,group=group)
+ gco = URIGroupConnector.objects.create(uri=uri,ttl=0,group=group)
obj = gco.fetch_meta()
changed = False
@@ -127,7 +160,7 @@ def co_import(uri,members=None):
for user in members:
if not gco.group in user.groups:
- add_member.send(sender=gco,user=user)
+ add_member.send(sender=gco.group,user=user)
user.groups.apppend(gco.group)
user.save()
diff --git a/src/django_co_connector/settings.py b/src/django_co_connector/settings.py
new file mode 100644
index 0000000..a590730
--- /dev/null
+++ b/src/django_co_connector/settings.py
@@ -0,0 +1,10 @@
+'''
+Created on Apr 7, 2011
+
+@author: leifj
+'''
+
+from django.conf import settings
+
+CO_ATTRIBUTES = getattr(settings,'CO_ATTRIBUTES',('HTTP_AFFILIATION'))
+CO_URI_ATTRIBUTE = getattr(settings,'CO_URI_ATTRIBUTES','HTTP_ENTITLEMENT') \ No newline at end of file