auquotidien_plugin: add plugin to show categories from many e-service portals
This commit is contained in:
parent
ea0f0fac76
commit
5418778fb3
|
@ -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/static *.css *.gif *.png *.js
|
||||||
recursive-include portail_citoyen/apps/passerelle_register_plugin/locale *.po *.mo
|
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/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/auquotidien_plugin/locale *.po *.mo
|
||||||
recursive-include portail_citoyen/apps/federation_plugin/templates *.html
|
recursive-include portail_citoyen/apps/federation_plugin/templates *.html
|
||||||
recursive-include portail_citoyen/apps/federation_plugin/locale *.po *.mo
|
recursive-include portail_citoyen/apps/federation_plugin/locale *.po *.mo
|
||||||
|
|
|
@ -3,6 +3,6 @@ from django.contrib import admin
|
||||||
from models import AuQuotidienAPI
|
from models import AuQuotidienAPI
|
||||||
|
|
||||||
class AuQuotidienAPIAdmin(admin.ModelAdmin):
|
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)
|
admin.site.register(AuQuotidienAPI, AuQuotidienAPIAdmin)
|
||||||
|
|
|
@ -5,50 +5,67 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
from cms.plugin_pool import plugin_pool
|
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.cms_plugins import DataSourcePlugin, Data
|
||||||
from data_source_plugin.models import DataSource
|
from data_source_plugin.models import DataSource
|
||||||
|
|
||||||
|
from .models import (AuQuotidienActiveFormsPlugin as AuQuotidienActiveFormsPluginModel,
|
||||||
|
AuQuotidienCategoryPlugin as AuQuotidienCategoryPluginModel, AuQuotidienAPI)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class FakeSource(object):
|
class FakeSource(object):
|
||||||
def __init__(self, id, name, mime_type, url, hash_algo, signature_key):
|
def __init__(self, url, api):
|
||||||
self.id = id
|
|
||||||
self.name = name
|
|
||||||
self.mime_type = mime_type
|
|
||||||
self.url = url
|
self.url = url
|
||||||
self.hash_algo = hash_algo
|
self.mime_type = DataSource.JSON
|
||||||
self.signature_key = signature_key
|
self.api = api
|
||||||
|
|
||||||
class AuQuotidienActiveFormsPlugin(DataSourcePlugin):
|
def __getattr__(self, attribute):
|
||||||
|
return getattr(self.api, attribute)
|
||||||
|
|
||||||
|
class AuQuotidienBasePlugin(DataSourcePlugin):
|
||||||
model = AuQuotidienActiveFormsPluginModel
|
model = AuQuotidienActiveFormsPluginModel
|
||||||
name = _('au-quotidien active forms plugin')
|
|
||||||
render_template = None
|
render_template = None
|
||||||
text_enabled = True
|
text_enabled = True
|
||||||
inlines = []
|
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):
|
def get_sources(self, context, instance):
|
||||||
api = instance.au_quotidien_api
|
for api in self.get_apis(context, instance):
|
||||||
provider = api.service_provider.liberty_provider
|
url = api.base_url
|
||||||
url = provider.entity_id
|
url_suffix = self.url_template
|
||||||
url = url.split('/saml/')[0]
|
orig = api.orig
|
||||||
url_suffix = '/myspace/json/forms?NameID={{{{federations.service_{provider_id}.links.0}}}}&orig={orig}'
|
url_suffix = url_suffix.format(provider_id=api.provider_id,
|
||||||
id = provider.id
|
orig=orig)
|
||||||
orig = api.orig
|
url = urlparse.urljoin(url, url_suffix)
|
||||||
url_suffix = url_suffix.format(provider_id=id, orig=orig)
|
source = FakeSource(url=url, api=api)
|
||||||
url = urlparse.urljoin(url, url_suffix)
|
yield Data(source, context, 0, instance.refresh)
|
||||||
logger.debug('built actives forms URL %s', url)
|
|
||||||
|
|
||||||
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)
|
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)
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \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"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,46 +18,84 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
#: cms_plugins.py:27 models.py:43
|
#: cms_plugins.py:52 models.py:60 models.py:61
|
||||||
msgid "au-quotidien active forms plugin"
|
msgid "au-quotidien active forms"
|
||||||
msgstr "plugin d'affichage des formulaires actifs sur Au-Quotidien"
|
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"
|
msgid "liberty service provider for the au-quotidien service"
|
||||||
msgstr "fournisseur de service liberty associé au service au-quotidien"
|
msgstr "fournisseur de service liberty associé au service au-quotidien"
|
||||||
|
|
||||||
#: models.py:20
|
#: models.py:21
|
||||||
msgid "origin"
|
msgid "origin"
|
||||||
msgstr "origine"
|
msgstr "origine"
|
||||||
|
|
||||||
#: models.py:21
|
#: models.py:22
|
||||||
msgid "hashing algorithm"
|
msgid "hashing algorithm"
|
||||||
msgstr "algorithme de hachage"
|
msgstr "algorithme de hachage"
|
||||||
|
|
||||||
#: models.py:23
|
#: models.py:24
|
||||||
msgid "signature key"
|
msgid "signature key"
|
||||||
msgstr "clé de signature"
|
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"
|
msgid "au-quotidien API endpoint"
|
||||||
msgstr "terminaison de l'API au-quotidien"
|
msgstr "terminaison de l'API au-quotidien"
|
||||||
|
|
||||||
#: models.py:31
|
#: models.py:48
|
||||||
msgid "au-quotidien API endpoints"
|
msgid "au-quotidien API endpoints"
|
||||||
msgstr "terminaisons de l'API au-quotidien"
|
msgstr "terminaisons de l'API au-quotidien"
|
||||||
|
|
||||||
#: models.py:38
|
#: models.py:53 models.py:64
|
||||||
msgid "maximum forms"
|
|
||||||
msgstr "nombre maximum de demandes à afficher"
|
|
||||||
|
|
||||||
#: models.py:39
|
|
||||||
msgid "refresh timeout"
|
msgid "refresh timeout"
|
||||||
msgstr "durée de rafraîchissement"
|
msgstr "durée de rafraîchissement"
|
||||||
|
|
||||||
#: models.py:40
|
#: models.py:54 models.py:65
|
||||||
msgid "Number of seconds between two web service calls"
|
msgid "Number of seconds between two web service calls"
|
||||||
msgstr "nombre de secondes entre deux appels au web-service"
|
msgstr "nombre de secondes entre deux appels au web-service"
|
||||||
|
|
||||||
#: models.py:44
|
#: models.py:57 models.py:68
|
||||||
msgid "au-quotidien active forms plugins"
|
msgid "refresh {0}"
|
||||||
msgstr "plugins d'affichage des formulaires actifs sur Au-Quotidien"
|
msgstr "durée de rafraîchissement {0}s"
|
||||||
|
|
||||||
|
#: templates/auquotidien_plugin/categories.html:20
|
||||||
|
msgid "All categories"
|
||||||
|
msgstr "Toutes les démarches"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import datetime
|
from south.utils import datetime_utils as datetime
|
||||||
from south.db import db
|
from south.db import db
|
||||||
from south.v2 import SchemaMigration
|
from south.v2 import SchemaMigration
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
@ -11,23 +11,33 @@ class Migration(SchemaMigration):
|
||||||
# Adding model 'AuQuotidienAPI'
|
# Adding model 'AuQuotidienAPI'
|
||||||
db.create_table(u'auquotidien_plugin_auquotidienapi', (
|
db.create_table(u'auquotidien_plugin_auquotidienapi', (
|
||||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
(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)),
|
('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)),
|
('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)),
|
('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'])
|
db.send_create_signal(u'auquotidien_plugin', ['AuQuotidienAPI'])
|
||||||
|
|
||||||
# Adding model 'AuQuotidienActiveFormsPlugin'
|
# Adding model 'AuQuotidienActiveFormsPlugin'
|
||||||
db.create_table(u'cmsplugin_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)),
|
(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)),
|
('refresh', self.gf('django.db.models.fields.IntegerField')(default=60)),
|
||||||
))
|
))
|
||||||
db.send_create_signal(u'auquotidien_plugin', ['AuQuotidienActiveFormsPlugin'])
|
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):
|
def backwards(self, orm):
|
||||||
# Deleting model 'AuQuotidienAPI'
|
# Deleting model 'AuQuotidienAPI'
|
||||||
|
@ -36,8 +46,26 @@ class Migration(SchemaMigration):
|
||||||
# Deleting model 'AuQuotidienActiveFormsPlugin'
|
# Deleting model 'AuQuotidienActiveFormsPlugin'
|
||||||
db.delete_table(u'cmsplugin_auquotidienactiveformsplugin')
|
db.delete_table(u'cmsplugin_auquotidienactiveformsplugin')
|
||||||
|
|
||||||
|
# Deleting model 'AuQuotidienCategoryPlugin'
|
||||||
|
db.delete_table(u'cmsplugin_auquotidiencategoryplugin')
|
||||||
|
|
||||||
|
|
||||||
models = {
|
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': {
|
u'attribute_aggregator.attributesource': {
|
||||||
'Meta': {'object_name': 'AttributeSource'},
|
'Meta': {'object_name': 'AttributeSource'},
|
||||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
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'})
|
'namespace': ('django.db.models.fields.CharField', [], {'default': "('Default', 'Default')", 'max_length': '100'})
|
||||||
},
|
},
|
||||||
u'auquotidien_plugin.auquotidienactiveformsplugin': {
|
u'auquotidien_plugin.auquotidienactiveformsplugin': {
|
||||||
'Meta': {'object_name': 'AuQuotidienActiveFormsPlugin', 'db_table': "u'cmsplugin_auquotidienactiveformsplugin'"},
|
'Meta': {'object_name': 'AuQuotidienActiveFormsPlugin', 'db_table': "u'cmsplugin_auquotidienactiveformsplugin'", '_ormbases': ['cms.CMSPlugin']},
|
||||||
'au_quotidien_api': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auquotidien_plugin.AuQuotidienAPI']", 'unique': 'True'}),
|
|
||||||
u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
|
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'})
|
||||||
'refresh': ('django.db.models.fields.IntegerField', [], {'default': '60'}),
|
|
||||||
'template_source': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'})
|
|
||||||
},
|
},
|
||||||
u'auquotidien_plugin.auquotidienapi': {
|
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'}),
|
'hash_algo': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '16', 'blank': 'True'}),
|
||||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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'}),
|
'orig': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||||
'service_provider': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['saml.LibertyServiceProvider']", 'unique': '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'})
|
'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': {
|
'cms.cmsplugin': {
|
||||||
'Meta': {'object_name': 'CMSPlugin'},
|
'Meta': {'object_name': 'CMSPlugin'},
|
||||||
|
@ -81,27 +117,12 @@ class Migration(SchemaMigration):
|
||||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': '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': {
|
u'idp.attributepolicy': {
|
||||||
'Meta': {'object_name': 'AttributePolicy'},
|
'Meta': {'object_name': 'AttributePolicy'},
|
||||||
'allow_attributes_selection': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
'allow_attributes_selection': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||||
'ask_consent_attributes': ('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_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['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['attribute_aggregator.AttributeList']"}),
|
||||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
'filter_source_of_filtered_attributes': ('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'}),
|
'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'}),
|
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
'encrypt_assertion': ('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'}),
|
'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'}),
|
'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'}),
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
'idp_initiated_sso': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
'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'}),
|
'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'})
|
'prefered_assertion_consumer_binding': ('django.db.models.fields.CharField', [], {'default': "'meta'", 'max_length': '4'})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,13 +2,20 @@ from django.utils.translation import ugettext as _
|
||||||
from django.db import models
|
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' ]
|
__all__ = [ 'AuQuotidienAPI', 'AuQuotidienActiveFormsPlugin' ]
|
||||||
|
|
||||||
class AuQuotidienAPI(models.Model):
|
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 '
|
verbose_name=_('liberty service provider for the au-quotidien '
|
||||||
'service'))
|
'service'))
|
||||||
orig = models.CharField(max_length=64, verbose_name=_('origin'))
|
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)
|
max_length=16, choices=DataSource.HASHES, default='', blank=True)
|
||||||
signature_key = models.CharField(verbose_name=_('signature key'),
|
signature_key = models.CharField(verbose_name=_('signature key'),
|
||||||
max_length=128, default='', blank=True)
|
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):
|
@property
|
||||||
return self.service_provider.liberty_provider.name
|
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:
|
class Meta:
|
||||||
verbose_name = _('au-quotidien API endpoint')
|
verbose_name = _('au-quotidien API endpoint')
|
||||||
verbose_name_plural = _('au-quotidien API endpoints')
|
verbose_name_plural = _('au-quotidien API endpoints')
|
||||||
ordering = ('service_provider__liberty_provider__name',)
|
ordering = ('order', 'name')
|
||||||
|
|
||||||
|
|
||||||
class AuQuotidienActiveFormsPlugin(InlineTemplatePlugin):
|
class AuQuotidienActiveFormsPlugin(CMSPlugin):
|
||||||
au_quotidien_api = models.OneToOneField('AuQuotidienAPI',
|
|
||||||
verbose_name=_('au-quotidien API endpoint'))
|
|
||||||
limit = models.IntegerField(verbose_name=_('maximum forms'), default=10)
|
|
||||||
refresh = models.IntegerField(verbose_name=_('refresh timeout'), default=60,
|
refresh = models.IntegerField(verbose_name=_('refresh timeout'), default=60,
|
||||||
help_text=_('Number of seconds between two web service calls'))
|
help_text=_('Number of seconds between two web service calls'))
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return _('refresh {0}').format(self.refresh)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('au-quotidien active forms plugin')
|
verbose_name = _('au-quotidien active forms')
|
||||||
verbose_name_plural = _('au-quotidien active forms plugins')
|
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')
|
||||||
|
|
|
@ -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 = $('<p/>');
|
||||||
|
var $select = $('<select/>');
|
||||||
|
for (var i = 0; i < $titles.length; i++) {
|
||||||
|
var $body = $($categories[i]);
|
||||||
|
var name = $body.attr('data-name');
|
||||||
|
var $option = $('<option/>');
|
||||||
|
$option.text(name);
|
||||||
|
$option.data('body', $body);
|
||||||
|
$option.val($body[0].id);
|
||||||
|
$select.append($option);
|
||||||
|
}
|
||||||
|
$p.append($select);
|
||||||
|
$('.aq-catgr-plg-selector-container', elt).append($p);
|
||||||
|
|
||||||
|
// Show selected categories
|
||||||
|
var on_select_change = function(event) {
|
||||||
|
console.log(event.target);
|
||||||
|
var $option = $('option:selected', event.target);
|
||||||
|
console.log($option);
|
||||||
|
var id = '#' + $option.val();
|
||||||
|
console.log(id);
|
||||||
|
$categories.not(id).hide();
|
||||||
|
$(id).show();
|
||||||
|
}
|
||||||
|
$select.bind('change', on_select_change);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,10 @@
|
||||||
|
<ul class="aq-forms-plg-listing">
|
||||||
|
{% for data_source in data_sources %}
|
||||||
|
{% for data in data_source.content reversed %}
|
||||||
|
<li class="aq-forms-plg-item">
|
||||||
|
<a class="aq-forms-plg-link"
|
||||||
|
href="{{data.url}}">{{data.title}}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
|
@ -0,0 +1,27 @@
|
||||||
|
{% load i18n sekizai_tags staticfiles %}
|
||||||
|
<div class="aq-catgr-plg">
|
||||||
|
<div class="aq-catgr-plg-selector-container"></div>
|
||||||
|
{% for data_source in data_sources %}
|
||||||
|
{% with base_url=data_source.data_source.api.base_url name=data_source.data_source.name %}
|
||||||
|
<div id="aq-catgr-plg-body-{{data_source.data_source.api.pk}}" data-name="{{name}}" class="aq-catgr-plg-body">
|
||||||
|
<h3 class="aq-catgr-plg-title">{{name}}</h3>
|
||||||
|
<ul class="aq-catgr-plg-listing">
|
||||||
|
{% for category in data_source.content.data|dictsort:"title" %}
|
||||||
|
<li class="aq-catgr-plg-item">
|
||||||
|
<a class="aq-catgr-plg-link"
|
||||||
|
href="{{base_url}}/login/?ReturnUrl={{ category.url }}">
|
||||||
|
{{ category.title }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
<a class="aq-catgr-plg-all-catgrs-link"
|
||||||
|
href="{{base_url}}/login/">{% trans "All categories" %}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endwith %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% addtoblock "js" %}<script type="text/javascript" src="{% static "auquotidien_plugin/js/categories.js" %}"></script>{% endaddtoblock %}
|
Reference in New Issue