From 5418778fb371ad1ade79cada328dc5500608a887 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 10 Feb 2014 10:59:25 +0100 Subject: [PATCH] auquotidien_plugin: add plugin to show categories from many e-service portals --- MANIFEST.in | 2 +- .../apps/auquotidien_plugin/admin.py | 2 +- .../apps/auquotidien_plugin/cms_plugins.py | 71 ++++++++++------ .../locale/fr/LC_MESSAGES/django.po | 76 ++++++++++++----- .../migrations/0001_initial.py | 85 ++++++++++++------- .../apps/auquotidien_plugin/models.py | 55 +++++++++--- .../auquotidien_plugin/js/categories.js | 46 ++++++++++ .../auquotidien_plugin/active_forms.html | 10 +++ .../auquotidien_plugin/categories.html | 27 ++++++ 9 files changed, 285 insertions(+), 89 deletions(-) create mode 100644 portail_citoyen/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js create mode 100644 portail_citoyen/apps/auquotidien_plugin/templates/auquotidien_plugin/active_forms.html create mode 100644 portail_citoyen/apps/auquotidien_plugin/templates/auquotidien_plugin/categories.html diff --git a/MANIFEST.in b/MANIFEST.in index 53b047b..6f05fa9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -11,7 +11,7 @@ recursive-include portail_citoyen/apps/passerelle_register_plugin/templates *.ht recursive-include portail_citoyen/apps/passerelle_register_plugin/static *.css *.gif *.png *.js recursive-include portail_citoyen/apps/passerelle_register_plugin/locale *.po *.mo recursive-include portail_citoyen/apps/auquotidien_plugin/templates *.html -recursive-include portail_citoyen/apps/auquotidien_plugin/static *.css *.gif *.png *.js +recursive-include portail_citoyen/apps/auquotidien_plugin/static *.js recursive-include portail_citoyen/apps/auquotidien_plugin/locale *.po *.mo recursive-include portail_citoyen/apps/federation_plugin/templates *.html recursive-include portail_citoyen/apps/federation_plugin/locale *.po *.mo diff --git a/portail_citoyen/apps/auquotidien_plugin/admin.py b/portail_citoyen/apps/auquotidien_plugin/admin.py index 8f79a45..48a5e43 100644 --- a/portail_citoyen/apps/auquotidien_plugin/admin.py +++ b/portail_citoyen/apps/auquotidien_plugin/admin.py @@ -3,6 +3,6 @@ from django.contrib import admin from models import AuQuotidienAPI class AuQuotidienAPIAdmin(admin.ModelAdmin): - list_display = [ '__unicode__', 'orig', 'hash_algo' ] + list_display = [ 'name', 'order', 'active', 'service_provider', 'orig', 'hash_algo', 'verify_certificate', 'allow_redirects', 'timeout' ] admin.site.register(AuQuotidienAPI, AuQuotidienAPIAdmin) diff --git a/portail_citoyen/apps/auquotidien_plugin/cms_plugins.py b/portail_citoyen/apps/auquotidien_plugin/cms_plugins.py index 79fa6bd..fad929f 100644 --- a/portail_citoyen/apps/auquotidien_plugin/cms_plugins.py +++ b/portail_citoyen/apps/auquotidien_plugin/cms_plugins.py @@ -5,50 +5,67 @@ from django.utils.translation import ugettext_lazy as _ from cms.plugin_pool import plugin_pool -from .models import AuQuotidienActiveFormsPlugin as AuQuotidienActiveFormsPluginModel from data_source_plugin.cms_plugins import DataSourcePlugin, Data from data_source_plugin.models import DataSource +from .models import (AuQuotidienActiveFormsPlugin as AuQuotidienActiveFormsPluginModel, + AuQuotidienCategoryPlugin as AuQuotidienCategoryPluginModel, AuQuotidienAPI) + logger = logging.getLogger(__name__) class FakeSource(object): - def __init__(self, id, name, mime_type, url, hash_algo, signature_key): - self.id = id - self.name = name - self.mime_type = mime_type + def __init__(self, url, api): self.url = url - self.hash_algo = hash_algo - self.signature_key = signature_key + self.mime_type = DataSource.JSON + self.api = api -class AuQuotidienActiveFormsPlugin(DataSourcePlugin): + def __getattr__(self, attribute): + return getattr(self.api, attribute) + +class AuQuotidienBasePlugin(DataSourcePlugin): model = AuQuotidienActiveFormsPluginModel - name = _('au-quotidien active forms plugin') render_template = None text_enabled = True inlines = [] + url_template = None + + def get_apis(self, context, instance): + user = context['request'].user + return AuQuotidienAPI.objects.filter(service_provider__libertyfederation__user=user, active=True) def get_sources(self, context, instance): - api = instance.au_quotidien_api - provider = api.service_provider.liberty_provider - url = provider.entity_id - url = url.split('/saml/')[0] - url_suffix = '/myspace/json/forms?NameID={{{{federations.service_{provider_id}.links.0}}}}&orig={orig}' - id = provider.id - orig = api.orig - url_suffix = url_suffix.format(provider_id=id, orig=orig) - url = urlparse.urljoin(url, url_suffix) - logger.debug('built actives forms URL %s', url) + for api in self.get_apis(context, instance): + url = api.base_url + url_suffix = self.url_template + orig = api.orig + url_suffix = url_suffix.format(provider_id=api.provider_id, + orig=orig) + url = urlparse.urljoin(url, url_suffix) + source = FakeSource(url=url, api=api) + yield Data(source, context, 0, instance.refresh) - source = FakeSource( - id=api.id, - name=provider.name, - mime_type=DataSource.JSON, - url=url, - hash_algo=api.hash_algo, - signature_key=api.signature_key) - yield Data(source, context, instance.limit, instance.refresh) +class AuQuotidienActiveFormsPlugin(AuQuotidienBasePlugin): + model = AuQuotidienActiveFormsPluginModel + name = _('au-quotidien active forms') + render_template = 'auquotidien_plugin/active_forms.html' + text_enabled = True + inlines = [] + url_template = '/myspace/json/forms?format=json&NameID={{{{federations.service_{provider_id}.links.0}}}}&orig={orig}' + plugin_pool.register_plugin(AuQuotidienActiveFormsPlugin) + + +class AuQuotidienCategoryPlugin(AuQuotidienBasePlugin): + model = AuQuotidienCategoryPluginModel + name = _('au-quotidien categories') + render_template = 'auquotidien_plugin/categories.html' + text_enabled = True + inlines = [] + url_template = '/categories?format=json&NameID={{{{federations.service_{provider_id}.links.0}}}}&orig={orig}' + + +plugin_pool.register_plugin(AuQuotidienCategoryPlugin) diff --git a/portail_citoyen/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po b/portail_citoyen/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po index 72bb50b..35387b2 100644 --- a/portail_citoyen/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po +++ b/portail_citoyen/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-26 15:42+0200\n" +"POT-Creation-Date: 2014-02-10 10:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,46 +18,84 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: cms_plugins.py:27 models.py:43 -msgid "au-quotidien active forms plugin" -msgstr "plugin d'affichage des formulaires actifs sur Au-Quotidien" +#: cms_plugins.py:52 models.py:60 models.py:61 +msgid "au-quotidien active forms" +msgstr "affichage des démarches en cours" -#: models.py:18 +#: cms_plugins.py:64 models.py:71 +msgid "au-quotidien categories" +msgstr "affichage des catégories de démarches" + +#: models.py:14 +msgid "name" +msgstr "nom" + +#: models.py:16 +msgid "active" +msgstr "actif" + +#: models.py:17 +msgid "order" +msgstr "ordre" + +#: models.py:19 msgid "liberty service provider for the au-quotidien service" msgstr "fournisseur de service liberty associé au service au-quotidien" -#: models.py:20 +#: models.py:21 msgid "origin" msgstr "origine" -#: models.py:21 +#: models.py:22 msgid "hashing algorithm" msgstr "algorithme de hachage" -#: models.py:23 +#: models.py:24 msgid "signature key" msgstr "clé de signature" -#: models.py:30 models.py:37 +#: models.py:26 +msgid "verify certificate" +msgstr "vérifier le certificat SSL" + +#: models.py:28 +msgid "allows HTTP redirections" +msgstr "permettre les redirections HTTP" + +#: models.py:29 +msgid "it can improve latencies to forbid redirection follow" +msgstr "" +"cela peut améliorer les performances en cas d'absence de service d'interdire " +"les redirections" + +#: models.py:31 +msgid "timeout" +msgstr "temps d'expiration pour la requête HTTP" + +#: models.py:33 +msgid "time in second to wait before failing to download a datasource" +msgstr " " + +#: models.py:47 msgid "au-quotidien API endpoint" msgstr "terminaison de l'API au-quotidien" -#: models.py:31 +#: models.py:48 msgid "au-quotidien API endpoints" msgstr "terminaisons de l'API au-quotidien" -#: models.py:38 -msgid "maximum forms" -msgstr "nombre maximum de demandes à afficher" - -#: models.py:39 +#: models.py:53 models.py:64 msgid "refresh timeout" msgstr "durée de rafraîchissement" -#: models.py:40 +#: models.py:54 models.py:65 msgid "Number of seconds between two web service calls" msgstr "nombre de secondes entre deux appels au web-service" -#: models.py:44 -msgid "au-quotidien active forms plugins" -msgstr "plugins d'affichage des formulaires actifs sur Au-Quotidien" +#: models.py:57 models.py:68 +msgid "refresh {0}" +msgstr "durée de rafraîchissement {0}s" + +#: templates/auquotidien_plugin/categories.html:20 +msgid "All categories" +msgstr "Toutes les démarches" diff --git a/portail_citoyen/apps/auquotidien_plugin/migrations/0001_initial.py b/portail_citoyen/apps/auquotidien_plugin/migrations/0001_initial.py index 488452c..5d7b9ba 100644 --- a/portail_citoyen/apps/auquotidien_plugin/migrations/0001_initial.py +++ b/portail_citoyen/apps/auquotidien_plugin/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import datetime +from south.utils import datetime_utils as datetime from south.db import db from south.v2 import SchemaMigration from django.db import models @@ -11,23 +11,33 @@ class Migration(SchemaMigration): # Adding model 'AuQuotidienAPI' db.create_table(u'auquotidien_plugin_auquotidienapi', ( (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('service_provider', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['saml.LibertyServiceProvider'], unique=True)), + ('name', self.gf('django.db.models.fields.CharField')(default='', max_length=128, blank=True)), + ('active', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('order', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('service_provider', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['saml.LibertyServiceProvider'])), ('orig', self.gf('django.db.models.fields.CharField')(max_length=64)), ('hash_algo', self.gf('django.db.models.fields.CharField')(default='', max_length=16, blank=True)), ('signature_key', self.gf('django.db.models.fields.CharField')(default='', max_length=128, blank=True)), + ('verify_certificate', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('allow_redirects', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('timeout', self.gf('django.db.models.fields.IntegerField')(default=10)), )) db.send_create_signal(u'auquotidien_plugin', ['AuQuotidienAPI']) # Adding model 'AuQuotidienActiveFormsPlugin' db.create_table(u'cmsplugin_auquotidienactiveformsplugin', ( (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), - ('template_source', self.gf('django.db.models.fields.TextField')(default='', blank=True)), - ('au_quotidien_api', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auquotidien_plugin.AuQuotidienAPI'], unique=True)), - ('limit', self.gf('django.db.models.fields.IntegerField')(default=10)), ('refresh', self.gf('django.db.models.fields.IntegerField')(default=60)), )) db.send_create_signal(u'auquotidien_plugin', ['AuQuotidienActiveFormsPlugin']) + # Adding model 'AuQuotidienCategoryPlugin' + db.create_table(u'cmsplugin_auquotidiencategoryplugin', ( + (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), + ('refresh', self.gf('django.db.models.fields.IntegerField')(default=60)), + )) + db.send_create_signal(u'auquotidien_plugin', ['AuQuotidienCategoryPlugin']) + def backwards(self, orm): # Deleting model 'AuQuotidienAPI' @@ -36,8 +46,26 @@ class Migration(SchemaMigration): # Deleting model 'AuQuotidienActiveFormsPlugin' db.delete_table(u'cmsplugin_auquotidienactiveformsplugin') + # Deleting model 'AuQuotidienCategoryPlugin' + db.delete_table(u'cmsplugin_auquotidiencategoryplugin') + models = { + u'attribute_aggregator.attributeitem': { + 'Meta': {'object_name': 'AttributeItem'}, + 'attribute_name': ('django.db.models.fields.CharField', [], {'default': "('OpenLDAProotDSE', 'OpenLDAProotDSE')", 'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'output_name_format': ('django.db.models.fields.CharField', [], {'default': "('urn:oasis:names:tc:SAML:2.0:attrname-format:uri', 'SAMLv2 URI')", 'max_length': '100'}), + 'output_namespace': ('django.db.models.fields.CharField', [], {'default': "('Default', 'Default')", 'max_length': '100'}), + 'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['attribute_aggregator.AttributeSource']", 'null': 'True', 'blank': 'True'}) + }, + u'attribute_aggregator.attributelist': { + 'Meta': {'object_name': 'AttributeList'}, + 'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'attributes of the list'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['attribute_aggregator.AttributeItem']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) + }, u'attribute_aggregator.attributesource': { 'Meta': {'object_name': 'AttributeSource'}, u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), @@ -45,20 +73,28 @@ class Migration(SchemaMigration): 'namespace': ('django.db.models.fields.CharField', [], {'default': "('Default', 'Default')", 'max_length': '100'}) }, u'auquotidien_plugin.auquotidienactiveformsplugin': { - 'Meta': {'object_name': 'AuQuotidienActiveFormsPlugin', 'db_table': "u'cmsplugin_auquotidienactiveformsplugin'"}, - 'au_quotidien_api': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auquotidien_plugin.AuQuotidienAPI']", 'unique': 'True'}), + 'Meta': {'object_name': 'AuQuotidienActiveFormsPlugin', 'db_table': "u'cmsplugin_auquotidienactiveformsplugin'", '_ormbases': ['cms.CMSPlugin']}, u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), - 'limit': ('django.db.models.fields.IntegerField', [], {'default': '10'}), - 'refresh': ('django.db.models.fields.IntegerField', [], {'default': '60'}), - 'template_source': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}) + 'refresh': ('django.db.models.fields.IntegerField', [], {'default': '60'}) }, u'auquotidien_plugin.auquotidienapi': { - 'Meta': {'ordering': "('provider__name',)", 'object_name': 'AuQuotidienAPI'}, + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'AuQuotidienAPI'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'allow_redirects': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'hash_algo': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '16', 'blank': 'True'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), 'orig': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'service_provider': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['saml.LibertyServiceProvider']", 'unique': 'True'}), - 'signature_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}) + 'service_provider': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['saml.LibertyServiceProvider']"}), + 'signature_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}), + 'timeout': ('django.db.models.fields.IntegerField', [], {'default': '10'}), + 'verify_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + u'auquotidien_plugin.auquotidiencategoryplugin': { + 'Meta': {'object_name': 'AuQuotidienCategoryPlugin', 'db_table': "u'cmsplugin_auquotidiencategoryplugin'", '_ormbases': ['cms.CMSPlugin']}, + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'refresh': ('django.db.models.fields.IntegerField', [], {'default': '60'}) }, 'cms.cmsplugin': { 'Meta': {'object_name': 'CMSPlugin'}, @@ -81,27 +117,12 @@ class Migration(SchemaMigration): u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) }, - u'idp.attributeitem': { - 'Meta': {'object_name': 'AttributeItem'}, - 'attribute_name': ('django.db.models.fields.CharField', [], {'default': "('OpenLDAProotDSE', 'OpenLDAProotDSE')", 'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'output_name_format': ('django.db.models.fields.CharField', [], {'default': "('urn:oasis:names:tc:SAML:2.0:attrname-format:uri', 'SAMLv2 URI')", 'max_length': '100'}), - 'output_namespace': ('django.db.models.fields.CharField', [], {'default': "('Default', 'Default')", 'max_length': '100'}), - 'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['attribute_aggregator.AttributeSource']", 'null': 'True', 'blank': 'True'}) - }, - u'idp.attributelist': { - 'Meta': {'object_name': 'AttributeList'}, - 'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'attributes of the list'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['idp.AttributeItem']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) - }, u'idp.attributepolicy': { 'Meta': {'object_name': 'AttributePolicy'}, 'allow_attributes_selection': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 'ask_consent_attributes': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'attribute_filter_for_sso_from_push_sources': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filter attributes of push sources with list'", 'null': 'True', 'to': u"orm['idp.AttributeList']"}), - 'attribute_list_for_sso_from_pull_sources': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes from pull sources'", 'null': 'True', 'to': u"orm['idp.AttributeList']"}), + 'attribute_filter_for_sso_from_push_sources': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filter attributes of push sources with list'", 'null': 'True', 'to': u"orm['attribute_aggregator.AttributeList']"}), + 'attribute_list_for_sso_from_pull_sources': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attributes from pull sources'", 'null': 'True', 'to': u"orm['attribute_aggregator.AttributeList']"}), 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'filter_source_of_filtered_attributes': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'forward_attributes_from_push_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), @@ -154,10 +175,14 @@ class Migration(SchemaMigration): 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'encrypt_assertion': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'encrypt_nameid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'federation_mode': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), 'forward_slo': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'http_method_for_slo_request': ('django.db.models.fields.IntegerField', [], {'default': '4'}), u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'idp_initiated_sso': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'iframe_logout_timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '300'}), 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'needs_iframe_logout': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'prefered_assertion_consumer_binding': ('django.db.models.fields.CharField', [], {'default': "'meta'", 'max_length': '4'}) } } diff --git a/portail_citoyen/apps/auquotidien_plugin/models.py b/portail_citoyen/apps/auquotidien_plugin/models.py index e8aa289..d0655c6 100644 --- a/portail_citoyen/apps/auquotidien_plugin/models.py +++ b/portail_citoyen/apps/auquotidien_plugin/models.py @@ -2,13 +2,20 @@ from django.utils.translation import ugettext as _ from django.db import models -from data_source_plugin.models import DataSource, InlineTemplatePlugin +from cms.models import CMSPlugin + + +from data_source_plugin.models import DataSource __all__ = [ 'AuQuotidienAPI', 'AuQuotidienActiveFormsPlugin' ] class AuQuotidienAPI(models.Model): - service_provider = models.OneToOneField('saml.LibertyServiceProvider', + name = models.CharField(verbose_name=_('name'), max_length=128, blank=True, + default='') + active = models.BooleanField(verbose_name=_('active'), default=True) + order = models.IntegerField(verbose_name=_('order'), default=0) + service_provider = models.ForeignKey('saml.LibertyServiceProvider', verbose_name=_('liberty service provider for the au-quotidien ' 'service')) orig = models.CharField(max_length=64, verbose_name=_('origin')) @@ -16,23 +23,49 @@ class AuQuotidienAPI(models.Model): max_length=16, choices=DataSource.HASHES, default='', blank=True) signature_key = models.CharField(verbose_name=_('signature key'), max_length=128, default='', blank=True) + verify_certificate = models.BooleanField(verbose_name=_('verify ' + 'certificate'), default=True, blank=True) + allow_redirects = models.BooleanField(verbose_name=_('allows HTTP redirections'), + help_text=_('it can improve latencies to forbid redirection follow'), + default=True) + timeout = models.IntegerField(verbose_name=_('timeout'), + default=10, + help_text=_('time in second to wait before ' + 'failing to download a datasource')) - def __unicode__(self): - return self.service_provider.liberty_provider.name + @property + def base_url(self): + '''Base URL of the Au-Quotidien service''' + url = self.service_provider.liberty_provider.entity_id + return url.split('/saml/')[0] + + @property + def provider_id(self): + return self.service_provider.liberty_provider.pk class Meta: verbose_name = _('au-quotidien API endpoint') verbose_name_plural = _('au-quotidien API endpoints') - ordering = ('service_provider__liberty_provider__name',) + ordering = ('order', 'name') -class AuQuotidienActiveFormsPlugin(InlineTemplatePlugin): - au_quotidien_api = models.OneToOneField('AuQuotidienAPI', - verbose_name=_('au-quotidien API endpoint')) - limit = models.IntegerField(verbose_name=_('maximum forms'), default=10) +class AuQuotidienActiveFormsPlugin(CMSPlugin): refresh = models.IntegerField(verbose_name=_('refresh timeout'), default=60, help_text=_('Number of seconds between two web service calls')) + def __unicode__(self): + return _('refresh {0}').format(self.refresh) + class Meta: - verbose_name = _('au-quotidien active forms plugin') - verbose_name_plural = _('au-quotidien active forms plugins') + verbose_name = _('au-quotidien active forms') + verbose_name_plural = _('au-quotidien active forms') + +class AuQuotidienCategoryPlugin(CMSPlugin): + refresh = models.IntegerField(verbose_name=_('refresh timeout'), default=60, + help_text=_('Number of seconds between two web service calls')) + + def __unicode__(self): + return _('refresh {0}').format(self.refresh) + + class Meta: + verbose_name = _('au-quotidien categories') diff --git a/portail_citoyen/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js b/portail_citoyen/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js new file mode 100644 index 0000000..679631f --- /dev/null +++ b/portail_citoyen/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js @@ -0,0 +1,46 @@ +$(document).ready(function () { + $('.aq-catgr-plg').each(function (i, elt) { + var $plugin = $(elt); + var $titles = $('.aq-catgr-plg-title', elt); + var $categories = $('.aq-catgr-plg-body', elt); + + if ($plugin.data('initialized')) { + return; + } + $plugin.data('initialized', 1); + + $titles.hide(); + + // Hide all but first + $categories.slice(1).hide(); + + if ($categories.length > 1) { + // Create a selector from titles + var $p = $('

'); + var $select = $('