diff options
-rw-r--r-- | .project | 17 | ||||
-rw-r--r-- | .pydevproject | 10 | ||||
-rw-r--r-- | setup.py | 20 | ||||
-rw-r--r-- | src/django_co_connector/__init__.py | 0 | ||||
-rw-r--r-- | src/django_co_connector/admin.py | 9 | ||||
-rw-r--r-- | src/django_co_connector/models.py | 110 |
6 files changed, 166 insertions, 0 deletions
diff --git a/.project b/.project new file mode 100644 index 0000000..98b8710 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>django-co-connector</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.python.pydev.PyDevBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.python.pydev.pythonNature</nature> + </natures> +</projectDescription> diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 0000000..925c546 --- /dev/null +++ b/.pydevproject @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?eclipse-pydev version="1.0"?> + +<pydev_project> +<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">lobber</pydev_property> +<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property> +<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> +<path>/django-co-connector/src</path> +</pydev_pathproperty> +</pydev_project> diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..9c14c86 --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ +from distutils.core import setup + +setup(name="django-co-connector", + version="0.1", + description="An extension to the Django web framework provides externalized group objects based on JRA5-T2 VO protocol development and COIP", + author="Leif Johansson", + author_email="leifj@nordu.net", + url="http://github.com/leifj/django-co-connector", + #download_url="", + zip_safe=False, + packages=["django_user_channels"], + package_dir={"": "src"}, + #package_data = {"django_user_channels": []}, + classifiers=["Development Status :: 3 - Alpha", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Framework :: Django",])
\ No newline at end of file diff --git a/src/django_co_connector/__init__.py b/src/django_co_connector/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/django_co_connector/__init__.py diff --git a/src/django_co_connector/admin.py b/src/django_co_connector/admin.py new file mode 100644 index 0000000..9e1dd85 --- /dev/null +++ b/src/django_co_connector/admin.py @@ -0,0 +1,9 @@ +''' +Created on Mar 25, 2011 + +@author: leifj +''' +from django.contrib import admin +from django_co_connector.models import GroupConnector + +admin.site.register(GroupConnector) diff --git a/src/django_co_connector/models.py b/src/django_co_connector/models.py new file mode 100644 index 0000000..8104334 --- /dev/null +++ b/src/django_co_connector/models.py @@ -0,0 +1,110 @@ +''' +Created on Apr 5, 2011 + +@author: leifj +''' + +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.dispatch.dispatcher import Signal + +class AccessControlEntry(models.Model): + group = OneToOneRel(Group,related_name='acl') + permission = CharField(max_length=256) + modify_time = DateTimeField(auto_now=True) + create_time = DateTimeField(auto_now_add=True) + + def __unicode__(self): + return "%s can %s" % (self.group.__unicode__(),self.permission) + +def has_permission(object,user,permission): + if hasattr(object,'acl'): + if hasattr(object.acl,'__call__'): + acl = object.acl() + else: + acl = object.acl + + for ace in acl: + if ace.permission == permission and ace.group in user.groups: + return True + + 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) + + def __unicode__(self): + return "%s for %s" % (self.uri,self.group.name) + + def fetch_updates(self): + return ([],[]) + + def fetch_all(self): + return [] + + def fetch_meta(self): + return {} + + def update(self): + # pull JSON to get display and ttl (?) + (added,removed) = self.fetch_updates() + for user in added: + if not self.group in user.groups: + add_member.send(sender=self.group,user=user) + user.groups.append(self.group) + for user in removed: + if self.group in user.groups: + 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') + for uri in epes.split(';'): + co_import(uri,members=[request.user]) + ## import urn:x-avp:attribute:value URIs aswell + +def co_import(uri,members=None): + gco = GroupConnector.objects.get(uri=uri) + if not gco: + group = Group.objects.create(name=uri) + gco = GroupConnector.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,user=user) + user.groups.apppend(gco.group) + user.save() + + if changed: + gco.save() + gco.group.save() + + return gco
\ No newline at end of file |