Services can have their settings defined in-model

This commit is contained in:
2010-05-11 13:04:49 +01:00
parent 64b4d73617
commit 890c8f228e
4 changed files with 52 additions and 3 deletions

View File

@@ -5,3 +5,4 @@ svn co http://django-evolution.googlecode.com/svn/trunk/django_evolution
hg clone http://bitbucket.org/jespern/django-piston/ hg clone http://bitbucket.org/jespern/django-piston/
mv django-piston/piston ./ mv django-piston/piston ./
rm -rf django-piston rm -rf django-piston
git clone http://github.com/bradjasper/django-jsonfield.git djang_jsonfield

View File

@@ -1 +1 @@
SEQUENCE = ['uid_fix'] SEQUENCE = ['uid_fix', 'settings_json']

View File

@@ -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='{}'),
]
#----------------------

View File

@@ -5,6 +5,7 @@ import logging
from django.db import models from django.db import models
from django.db.models import signals from django.db.models import signals
from django.contrib.auth.models import User, UserManager, Group from django.contrib.auth.models import User, UserManager, Group
from django_jsonfield.fields import JSONField
from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerAlliance from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerAlliance
from reddit.models import RedditAccount from reddit.models import RedditAccount
@@ -114,15 +115,21 @@ class SSOUser(models.Model):
signals.post_save.connect(SSOUser.create_user_profile, sender=User) signals.post_save.connect(SSOUser.create_user_profile, sender=User)
class Service(models.Model): 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) name = models.CharField("Service Name", max_length=200)
url = models.CharField("Service URL", max_length=200, blank=True) url = models.CharField("Service URL", max_length=200, blank=True)
active = models.BooleanField(default=True) active = models.BooleanField(default=True)
api = models.CharField("API", max_length=200) api = models.CharField("API", max_length=200)
groups = models.ManyToManyField(Group, blank=False) groups = models.ManyToManyField(Group, blank=False)
settings_json = JSONField("Service Settings", blank=True)
@property @property
def provide_login(self): def provide_login(self):
return self.api_class.settings['provide_login'] return self.settings['provide_login']
@property @property
def api_class(self): def api_class(self):
@@ -131,7 +138,36 @@ class Service(models.Model):
def __str__(self): def __str__(self):
return self.name 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): class ServiceAccount(models.Model):
"""
ServiceAccount represents the user's account on a Service.
"""
user = models.ForeignKey(User, blank=False) user = models.ForeignKey(User, blank=False)
service = models.ForeignKey(Service, blank=False) service = models.ForeignKey(Service, blank=False)
service_uid = models.CharField("Service UID", max_length=200, blank=False) service_uid = models.CharField("Service UID", max_length=200, blank=False)
@@ -147,8 +183,9 @@ class ServiceAccount(models.Model):
def save(self): def save(self):
""" Override default save to setup accounts as needed """ """ 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 = self.service.api_class
api.settings = self.service.settings
if not self.service_uid: if not self.service_uid:
# Create a account if we've not got a UID # Create a account if we've not got a UID
@@ -186,6 +223,7 @@ class ServiceAccount(models.Model):
@staticmethod @staticmethod
def pre_delete_listener( **kwargs ): def pre_delete_listener( **kwargs ):
api = kwargs['instance'].service.api_class api = kwargs['instance'].service.api_class
api.settings = kwargs['instance'].service.settings
if not api.delete_user(kwargs['instance'].service_uid): if not api.delete_user(kwargs['instance'].service_uid):
raise ServiceError('Unable to delete account on related service') raise ServiceError('Unable to delete account on related service')