diff options
author | Leif Johansson <leifj@sunet.se> | 2011-04-07 23:09:06 +0200 |
---|---|---|
committer | Leif Johansson <leifj@sunet.se> | 2011-04-07 23:09:06 +0200 |
commit | 55b68e90d84433080481dbbeb5a4d8e203825053 (patch) | |
tree | 3519312b626e3b1f8c26a547ffd95b3e9f47a83a | |
parent | 83d4517f3341d7c411b0456ce7de1bd7deb0b679 (diff) |
attribute-value pairs as connector
-rw-r--r-- | src/django_co_connector/admin.py | 4 | ||||
-rw-r--r-- | src/django_co_connector/models.py | 59 | ||||
-rw-r--r-- | src/django_co_connector/settings.py | 10 |
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 |