From 890c8f228e8a5725b0bc386a619777018084c63f Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Tue, 11 May 2010 13:04:49 +0100 Subject: [PATCH] Services can have their settings defined in-model --- init.sh | 1 + sso/evolutions/__init__.py | 2 +- sso/evolutions/settings_json.py | 10 ++++++++ sso/models.py | 42 +++++++++++++++++++++++++++++++-- 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 sso/evolutions/settings_json.py diff --git a/init.sh b/init.sh index e6981ac..e2050b9 100755 --- a/init.sh +++ b/init.sh @@ -5,3 +5,4 @@ svn co http://django-evolution.googlecode.com/svn/trunk/django_evolution hg clone http://bitbucket.org/jespern/django-piston/ mv django-piston/piston ./ rm -rf django-piston +git clone http://github.com/bradjasper/django-jsonfield.git djang_jsonfield diff --git a/sso/evolutions/__init__.py b/sso/evolutions/__init__.py index 5f070df..8ea4732 100644 --- a/sso/evolutions/__init__.py +++ b/sso/evolutions/__init__.py @@ -1 +1 @@ -SEQUENCE = ['uid_fix'] +SEQUENCE = ['uid_fix', 'settings_json'] diff --git a/sso/evolutions/settings_json.py b/sso/evolutions/settings_json.py new file mode 100644 index 0000000..deb723c --- /dev/null +++ b/sso/evolutions/settings_json.py @@ -0,0 +1,10 @@ +#----- Evolution for sso +from django_evolution.mutations import * +from django.db import models +from django_jsonfield.fields import JSONField + +MUTATIONS = [ + AddField('Service', 'settings_json', JSONField, initial='{}'), +] +#---------------------- + diff --git a/sso/models.py b/sso/models.py index bc2a0b9..1d5dff0 100644 --- a/sso/models.py +++ b/sso/models.py @@ -5,6 +5,7 @@ import logging from django.db import models from django.db.models import signals from django.contrib.auth.models import User, UserManager, Group +from django_jsonfield.fields import JSONField from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerAlliance from reddit.models import RedditAccount @@ -114,15 +115,21 @@ class SSOUser(models.Model): signals.post_save.connect(SSOUser.create_user_profile, sender=User) class Service(models.Model): + """ + Service model represents a service available to users, either a website or + a connection service like Jabber or IRC. + """ + name = models.CharField("Service Name", max_length=200) url = models.CharField("Service URL", max_length=200, blank=True) active = models.BooleanField(default=True) api = models.CharField("API", max_length=200) groups = models.ManyToManyField(Group, blank=False) + settings_json = JSONField("Service Settings", blank=True) @property def provide_login(self): - return self.api_class.settings['provide_login'] + return self.settings['provide_login'] @property def api_class(self): @@ -131,7 +138,36 @@ class Service(models.Model): def __str__(self): return self.name + def save(self): + if not self.settings_json: + if self.api: + self.settings_json = self.settings + else: + self.settings_json = {} + + return models.Model.save(self) + + @property + def settings(self): + + if self.settings_json: + setdict = self.settings_json + else: + setdict = {} + + # Load defaults from the module's settings dict + if self.api: + modset = self.api_class.settings + for k in modset: + if not k in setdict: + setdict[k] = modset[k] + + return setdict + class ServiceAccount(models.Model): + """ + ServiceAccount represents the user's account on a Service. + """ user = models.ForeignKey(User, blank=False) service = models.ForeignKey(Service, blank=False) service_uid = models.CharField("Service UID", max_length=200, blank=False) @@ -147,8 +183,9 @@ class ServiceAccount(models.Model): def save(self): """ Override default save to setup accounts as needed """ - # Grab the API class + # Grab the API class and load the settings api = self.service.api_class + api.settings = self.service.settings if not self.service_uid: # Create a account if we've not got a UID @@ -186,6 +223,7 @@ class ServiceAccount(models.Model): @staticmethod def pre_delete_listener( **kwargs ): api = kwargs['instance'].service.api_class + api.settings = kwargs['instance'].service.settings if not api.delete_user(kwargs['instance'].service_uid): raise ServiceError('Unable to delete account on related service')