diff --git a/wcsinst/wcsinst/admin.py b/wcsinst/wcsinst/admin.py index 1feb10e..1016677 100644 --- a/wcsinst/wcsinst/admin.py +++ b/wcsinst/wcsinst/admin.py @@ -1,8 +1,31 @@ from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ -from models import WcsInstance +from models import WcsInstance, ApiSecret, Variable + +class ApiSecretsInline(admin.TabularInline): + model = ApiSecret + verbose_name = _('API secret') + verbose_name_plural = _('API secrets') + +class VariablesInline(admin.TabularInline): + model = Variable + verbose_name = _('variable') + verbose_name_plural = _('variables') class WcsInstanceAdmin(admin.ModelAdmin): prepopulated_fields = {'domain': ('title',)} + fieldsets = ( + (None, {'fields': ('title', 'domain'),}), + ('site-options.cfg', + {'fields': ('postgresql', ('saml2_use_role', 'saml2_role_prefix',), 'backoffice_feed_url' )} + ), + ('site-options.cfg au-quotidien', + {'fields': ('drupal', 'ezldap', 'strongbox', 'clicrdv', 'domino' )} + ), + ) + inlines = [VariablesInline, ApiSecretsInline] + save_as = True + admin.site.register(WcsInstance, WcsInstanceAdmin) diff --git a/wcsinst/wcsinst/migrations/0002_auto__add_variable__add_apisecret__add_field_wcsinstance_postgresql__a.py b/wcsinst/wcsinst/migrations/0002_auto__add_variable__add_apisecret__add_field_wcsinstance_postgresql__a.py new file mode 100644 index 0000000..fc3bcb0 --- /dev/null +++ b/wcsinst/wcsinst/migrations/0002_auto__add_variable__add_apisecret__add_field_wcsinstance_postgresql__a.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Variable' + db.create_table(u'wcsinst_variable', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('key', self.gf('django.db.models.fields.CharField')(max_length=128)), + ('value', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), + ('wcs_instance', self.gf('django.db.models.fields.related.ForeignKey')(related_name='variables', to=orm['wcsinst.WcsInstance'])), + )) + db.send_create_signal(u'wcsinst', ['Variable']) + + # Adding model 'ApiSecret' + db.create_table(u'wcsinst_apisecret', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('key', self.gf('django.db.models.fields.CharField')(max_length=128)), + ('value', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), + ('wcs_instance', self.gf('django.db.models.fields.related.ForeignKey')(related_name='api_secrets', to=orm['wcsinst.WcsInstance'])), + )) + db.send_create_signal(u'wcsinst', ['ApiSecret']) + + # Adding field 'WcsInstance.postgresql' + db.add_column(u'wcsinst_wcsinstance', 'postgresql', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'WcsInstance.saml2_use_role' + db.add_column(u'wcsinst_wcsinstance', 'saml2_use_role', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'WcsInstance.saml2_role_prefix' + db.add_column(u'wcsinst_wcsinstance', 'saml2_role_prefix', + self.gf('django.db.models.fields.CharField')(default='', max_length=128, blank=True), + keep_default=False) + + # Adding field 'WcsInstance.backoffice_feed_url' + db.add_column(u'wcsinst_wcsinstance', 'backoffice_feed_url', + self.gf('django.db.models.fields.URLField')(default='', max_length=128, blank=True), + keep_default=False) + + # Adding field 'WcsInstance.drupal' + db.add_column(u'wcsinst_wcsinstance', 'drupal', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'WcsInstance.ezldap' + db.add_column(u'wcsinst_wcsinstance', 'ezldap', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'WcsInstance.strongbox' + db.add_column(u'wcsinst_wcsinstance', 'strongbox', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'WcsInstance.clicrdv' + db.add_column(u'wcsinst_wcsinstance', 'clicrdv', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + # Adding field 'WcsInstance.domino' + db.add_column(u'wcsinst_wcsinstance', 'domino', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting model 'Variable' + db.delete_table(u'wcsinst_variable') + + # Deleting model 'ApiSecret' + db.delete_table(u'wcsinst_apisecret') + + # Deleting field 'WcsInstance.postgresql' + db.delete_column(u'wcsinst_wcsinstance', 'postgresql') + + # Deleting field 'WcsInstance.saml2_use_role' + db.delete_column(u'wcsinst_wcsinstance', 'saml2_use_role') + + # Deleting field 'WcsInstance.saml2_role_prefix' + db.delete_column(u'wcsinst_wcsinstance', 'saml2_role_prefix') + + # Deleting field 'WcsInstance.backoffice_feed_url' + db.delete_column(u'wcsinst_wcsinstance', 'backoffice_feed_url') + + # Deleting field 'WcsInstance.drupal' + db.delete_column(u'wcsinst_wcsinstance', 'drupal') + + # Deleting field 'WcsInstance.ezldap' + db.delete_column(u'wcsinst_wcsinstance', 'ezldap') + + # Deleting field 'WcsInstance.strongbox' + db.delete_column(u'wcsinst_wcsinstance', 'strongbox') + + # Deleting field 'WcsInstance.clicrdv' + db.delete_column(u'wcsinst_wcsinstance', 'clicrdv') + + # Deleting field 'WcsInstance.domino' + db.delete_column(u'wcsinst_wcsinstance', 'domino') + + + models = { + u'wcsinst.apisecret': { + 'Meta': {'object_name': 'ApiSecret'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'wcs_instance': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'api_secrets'", 'to': u"orm['wcsinst.WcsInstance']"}) + }, + u'wcsinst.variable': { + 'Meta': {'object_name': 'Variable'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'wcs_instance': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variables'", 'to': u"orm['wcsinst.WcsInstance']"}) + }, + u'wcsinst.wcsinstance': { + 'Meta': {'object_name': 'WcsInstance'}, + 'backoffice_feed_url': ('django.db.models.fields.URLField', [], {'max_length': '128', 'blank': 'True'}), + 'clicrdv': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'domino': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'drupal': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'ezldap': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'postgresql': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'saml2_role_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'saml2_use_role': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'strongbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['wcsinst'] \ No newline at end of file diff --git a/wcsinst/wcsinst/models.py b/wcsinst/wcsinst/models.py index fdc45df..ee5add2 100644 --- a/wcsinst/wcsinst/models.py +++ b/wcsinst/wcsinst/models.py @@ -4,6 +4,7 @@ import urllib2 from django.conf import settings from django.db import models +from django.utils.translation import ugettext_lazy as _ logger = logging.getLogger(__name__) @@ -11,9 +12,53 @@ class WcsInstance(models.Model): title = models.CharField(max_length=50) domain = models.CharField(max_length=100) + # site-options.cfg options + postgresql = models.BooleanField(verbose_name=_('postgresql'), + blank=True) + saml2_use_role = models.BooleanField(verbose_name=_('use saml2 roles'), + blank=True) + saml2_role_prefix = models.CharField(verbose_name=_('role prefix'), + blank=True, max_length=128) + backoffice_feed_url = models.URLField(verbose_name=_('backoffice feed url'), + blank=True, max_length=128) + drupal = models.BooleanField(verbose_name=_('drupal'), + blank=True) + ezldap = models.BooleanField(verbose_name=_('ezldap'), + blank=True) + strongbox = models.BooleanField(verbose_name=_('strongbox'), + blank=True) + clicrdv = models.BooleanField(verbose_name=_('clicrdv'), + blank=True) + domino = models.BooleanField(verbose_name=_('domino'), + blank=True) + + def __unicode__(self): return '%s (%s)' % (self.title, self.domain) + def site_options_cfg(self): + d = { + 'postgresql': self.postgresql, + 'saml2_use_role': self.saml2_use_role, + 'saml2_role_prefix': self.saml2_role_prefix, + 'backoffice_feed_url': self.backoffice_feed_url, + 'drupal': self.drupal, + 'ezldap': self.ezldap, + 'strongbox': self.strongbox, + 'clicrdv': self.clicrdv, + 'domino': self.domino, + } + d['api_secrets'] = dict((kv.key, kv.value) for kv in self.api_secrets.all()) + d['variables'] = dict((kv.key, kv.value) for kv in self.variables.all()) + return d + + def to_json(self): + return { + 'title': self.title, + 'domain': self.domain, + 'site_options_cfg': self.site_options_cfg(), + } + def save(self, *args, **kwargs): created = (self.id is None) super(WcsInstance, self).save(*args, **kwargs) @@ -24,10 +69,11 @@ class WcsInstance(models.Model): url = settings.WCSINSTD_URL + 'wcsinstd/create' else: url = settings.WCSINSTD_URL + 'wcsinstd/%s/' % self.domain + post_data = json.dumps(self.to_json()) request = urllib2.Request(url) request.add_header('Accept', 'application/json') request.add_header('Content-Type', 'application/json;charset=UTF-8') - request.add_data(json.dumps({'title': self.title, 'domain': self.domain})) + request.add_data(post_data) try: p = urllib2.urlopen(request) except urllib2.HTTPError as e: @@ -39,3 +85,33 @@ class WcsInstance(models.Model): else: out_data = p.read() p.close() + + class Meta: + verbose_name = _('wcs instance') + verbose_name_plural = _('wcs instances') + + +class KeyValue(models.Model): + key = models.CharField(max_length=128) + value = models.CharField(max_length=1024, blank=True) + + class Meta: + abstract = True + + +class Variable(KeyValue): + wcs_instance = models.ForeignKey(WcsInstance, related_name='variables') + + class Meta: + verbose_name = _('variable') + verbose_name_plural = _('variables') + + +class ApiSecret(KeyValue): + wcs_instance = models.ForeignKey(WcsInstance, related_name='api_secrets') + + class Meta: + verbose_name = _('api secret') + verbose_name_plural = _('api secrets') + +