auquotidien_plugin: add plugin to show categories from many e-service portals

This commit is contained in:
Benjamin Dauvergne 2014-02-10 10:59:25 +01:00
parent ea0f0fac76
commit 5418778fb3
9 changed files with 285 additions and 89 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

View File

@ -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'})
}
}

View File

@ -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')

View File

@ -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);
}
});
});

View File

@ -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>

View File

@ -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 %}