diff options
author | Leif Johansson <leifj@sunet.se> | 2011-04-11 15:08:51 +0200 |
---|---|---|
committer | Leif Johansson <leifj@sunet.se> | 2011-04-11 15:08:51 +0200 |
commit | 69a0a519a58b44bb9fc9c57a00508dd5701be744 (patch) | |
tree | d0945f4269c7d432c5280f46d703f42d54080321 | |
parent | 55b68e90d84433080481dbbeb5a4d8e203825053 (diff) |
merge to a single connector type
-rw-r--r-- | src/django_co_connector/models.py | 119 | ||||
-rw-r--r-- | src/django_co_connector/settings.py | 3 |
2 files changed, 47 insertions, 75 deletions
diff --git a/src/django_co_connector/models.py b/src/django_co_connector/models.py index e41138b..7cddb9a 100644 --- a/src/django_co_connector/models.py +++ b/src/django_co_connector/models.py @@ -7,12 +7,12 @@ Created on Apr 5, 2011 from django.db import models from django.db.models.fields import CharField, URLField, DateTimeField, IntegerField from django.contrib.auth.models import Group -from django.db.models.fields.related import OneToOneRel +from django.db.models.fields.related import OneToOneField, ForeignKey from django.dispatch.dispatcher import Signal -from django_co_connector.settings import CO_ATTRIBUTES, CO_URI_ATTRIBUTE +from django_co_connector.settings import CO_ATTRIBUTES class AccessControlEntry(models.Model): - group = OneToOneRel(Group,related_name='acl',blank=True,null=True) + group = ForeignKey(Group,related_name='+',blank=True,null=True) permission = CharField(max_length=256) modify_time = DateTimeField(auto_now=True) create_time = DateTimeField(auto_now_add=True) @@ -62,31 +62,20 @@ def can(object,user,permission): return False class GroupConnector(models.Model): - 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) + activity_url = URLField(blank=True) + membership_url = URLField(blank=True) + ttl = IntegerField(blank=True) + group = OneToOneField(Group,related_name='connector') + modify_time = DateTimeField(auto_now=True) + create_time = DateTimeField(auto_now_add=True) 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) def fetch_updates(self): return ([],[]) @@ -113,59 +102,43 @@ add_member = Signal(providing_args=['user']) remove_member = Signal(providing_args=['user']) def co_import_from_request(request): - epes = request.META.get(CO_URI_ATTRIBUTE) - for uri in epes.split(';'): - 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]) + co_import_av(request.user,attribute,values.split(';')) -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(uri,members=None): - gco = URIGroupConnector.objects.get(uri=uri) - if not gco: - group = Group.objects.create(name=uri) - gco = URIGroupConnector.objects.create(uri=uri,ttl=0,group=group) - - obj = gco.fetch_meta() - changed = False - if obj.has_key('name'): - gco.group.name = obj['name'] - changed = True - if obj.has_key('ttl'): - gco.ttl = obj['ttl'] - changed = True - if obj.has_key('member-feed'): - gco.member_feed = obj['member-feed'] - changed = True - - if not members: - members = gco.fetch_all() - - for user in members: - if not gco.group in user.groups: - add_member.send(sender=gco.group,user=user) - user.groups.apppend(gco.group) - user.save() - - if changed: - gco.save() - gco.group.save() - - return gco
\ No newline at end of file +def co_import_av(user,attribute,values): + for value in values: + gco = GroupConnector.objects.filter(attribute=attribute,value=value) + if not gco: + group = Group.objects.create(name=value) + gco = GroupConnector.objects.create(attribute=attribute,value=value,group=group) + + meta = gco.fetch_meta() + changed = False + for attr in ('name','ttl','activity_url','membership_url'): + if meta.has_key(attr): + setattr(gco,attr,meta.get(attr)) + changed = True + + #members = gco.fetch_all() + #for user in members: + # if not gco.group in user.groups: + # add_member.send(sender=gco.group,user=user) + # user.groups.apppend(gco.group) + # user.save() + + if changed: + gco.save() + gco.group.save() + + for gco in GroupConnector.objects.filter(attribute=attribute): + if not gco.value in values: + if gco.group in user.groups: + remove_member.send(sender=gco.group,user=user) + user.groups.remove(gco.group) + user.save() + else: + if not gco.group in user.groups: + 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 index a590730..ad69c8b 100644 --- a/src/django_co_connector/settings.py +++ b/src/django_co_connector/settings.py @@ -6,5 +6,4 @@ Created on Apr 7, 2011 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 +CO_ATTRIBUTES = getattr(settings,'CO_ATTRIBUTES',('HTTP_AFFILIATION','HTTP_ENTITLEMENT'))
\ No newline at end of file |