From ddbd35be26db63a9bf2f89e513a8e172977167d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Schneider?=
Date: Tue, 1 Apr 2014 15:59:05 +0200
Subject: [PATCH] initial package
---
MANIFEST.in | 32 -
README | 67 -
TODO | 3 -
debian/changelog | 6 +
debian/compat | 1 +
debian/conf/db.conf | 5 +
debian/conf/nginx-example.conf | 41 +
debian/conf/portail-citoyen2.conf | 46 +
debian/conf/syncdb.sh | 7 +
debian/control | 41 +
debian/docs | 1 +
debian/portail-citoyen-manage | 18 +
debian/portail-citoyen2.config | 14 +
debian/portail-citoyen2.dirs | 8 +
debian/portail-citoyen2.docs | 1 +
debian/portail-citoyen2.init | 178 +
debian/portail-citoyen2.install | 4 +
debian/portail-citoyen2.postinst | 87 +
debian/portail-citoyen2.postrm | 32 +
debian/python-portail-citoyen2.install | 1 +
debian/rules | 14 +
debian/source/format | 1 +
help/fr/api-services.page | 310 -
jenkins.sh | 13 -
load-base-data.sh | 5 -
local_settings.py.example | 22 -
portail-citoyen2 | 10 -
portail_citoyen2/__init__.py | 8 -
portail_citoyen2/admin.py | 14 -
.../allauth_authentic2/__init__.py | 0
portail_citoyen2/allauth_authentic2/models.py | 1 -
.../allauth_authentic2/provider.py | 33 -
portail_citoyen2/allauth_authentic2/tests.py | 0
portail_citoyen2/allauth_authentic2/urls.py | 5 -
portail_citoyen2/allauth_authentic2/views.py | 43 -
portail_citoyen2/app_settings.py | 38 -
portail_citoyen2/apps/__init__.py | 0
.../apps/auquotidien_plugin/__init__.py | 0
.../apps/auquotidien_plugin/admin.py | 8 -
.../apps/auquotidien_plugin/cms_plugins.py | 78 -
.../locale/fr/LC_MESSAGES/django.po | 105 -
.../migrations/0001_initial.py | 215 -
.../auquotidien_plugin/migrations/__init__.py | 0
.../apps/auquotidien_plugin/models.py | 82 -
.../auquotidien_plugin/js/categories.js | 54 -
.../auquotidien_plugin/active_forms.html | 10 -
.../auquotidien_plugin/categories.html | 27 -
.../apps/data_source_plugin/__init__.py | 0
.../apps/data_source_plugin/admin.py | 16 -
.../apps/data_source_plugin/cms_plugins.py | 175 -
.../locale/fr/LC_MESSAGES/django.po | 110 -
.../migrations/0001_initial.py | 120 -
.../migrations/0002_rename_hash_algo.py | 80 -
.../data_source_plugin/migrations/__init__.py | 0
.../apps/data_source_plugin/models.py | 115 -
.../apps/data_source_plugin/signature.py | 71 -
.../templates/data_source_plugin/plugin.html | 15 -
.../apps/data_source_plugin/tests.py | 16 -
.../apps/data_source_plugin/views.py | 1 -
portail_citoyen2/apps/feed_plugin/__init__.py | 0
portail_citoyen2/apps/feed_plugin/admin.py | 8 -
.../apps/feed_plugin/cms_plugins.py | 75 -
portail_citoyen2/apps/feed_plugin/forms.py | 10 -
.../locale/fr/LC_MESSAGES/django.po | 59 -
.../feed_plugin/migrations/0001_initial.py | 142 -
.../apps/feed_plugin/migrations/__init__.py | 0
portail_citoyen2/apps/feed_plugin/models.py | 90 -
.../feed_plugin/select_user_feed.html | 15 -
.../templates/feed_plugin/show_user_feed.html | 8 -
portail_citoyen2/apps/feed_plugin/utils.py | 23 -
portail_citoyen2/apps/feed_plugin/widgets.py | 104 -
.../passerelle_register_plugin/__init__.py | 0
.../passerelle_register_plugin/cms_plugins.py | 20 -
.../apps/passerelle_register_plugin/forms.py | 58 -
.../locale/fr/LC_MESSAGES/django.po | 43 -
.../migrations/0001_initial.py | 57 -
.../migrations/__init__.py | 0
.../apps/passerelle_register_plugin/models.py | 122 -
.../passerelle_register_plugin/plugin.html | 39 -
.../apps/passerelle_register_plugin/tests.py | 16 -
.../apps/passerelle_register_plugin/views.py | 1 -
.../passerelle_register_plugin/widgets.py | 104 -
portail_citoyen2/cms_plugins.py | 49 -
portail_citoyen2/context_processors.py | 7 -
portail_citoyen2/dashboard.py | 73 -
portail_citoyen2/fixtures/demo.json | 5588 -----------------
portail_citoyen2/forms.py | 0
.../locale/fr/LC_MESSAGES/django.po | 72 -
portail_citoyen2/menu.py | 4 -
portail_citoyen2/migrations/0001_initial.py | 20 -
portail_citoyen2/migrations/__init__.py | 0
portail_citoyen2/models.py | 35 -
portail_citoyen2/permission_hack.py | 63 -
portail_citoyen2/settings.py | 320 -
.../portail_citoyen/css/Museo500-Regular.otf | Bin 128172 -> 0 bytes
.../static/portail_citoyen/css/Museo_Slab.otf | Bin 62180 -> 0 bytes
.../static/portail_citoyen/css/admin.css | 46 -
.../portail_citoyen/css/button_connexion.gif | Bin 2406 -> 0 bytes
.../static/portail_citoyen/css/e54.png | Bin 1993 -> 0 bytes
.../static/portail_citoyen/css/style.css | 994 ---
.../static/portail_citoyen/img/logo.png | Bin 7876 -> 0 bytes
.../templates/admin/base_site.html | 29 -
portail_citoyen2/templates/base.html | 80 -
.../templates/portail_citoyen/base_help.html | 24 -
.../portail_citoyen/base_one_column.html | 12 -
.../portail_citoyen/base_two_columns.html | 18 -
.../templates/portail_citoyen/block.html | 3 -
.../templates/portail_citoyen/form.html | 11 -
.../portail_citoyen/form_fields.html | 11 -
.../templates/portail_citoyen/top-menu.html | 11 -
portail_citoyen2/templatetags/__init__.py | 0
.../templatetags/portail_citoyen_tags.py | 14 -
portail_citoyen2/urls.py | 35 -
portail_citoyen2/utils.py | 11 -
portail_citoyen2/views.py | 28 -
portail_citoyen2/wsgi.py | 28 -
requirements.txt | 14 -
run.sh | 15 -
setup.py | 139 -
start.sh | 36 -
tools/export_data.sh | 5 -
tools/flush_memcache.py | 5 -
122 files changed, 506 insertions(+), 10696 deletions(-)
delete mode 100644 MANIFEST.in
delete mode 100644 README
delete mode 100644 TODO
create mode 100644 debian/changelog
create mode 100644 debian/compat
create mode 100644 debian/conf/db.conf
create mode 100644 debian/conf/nginx-example.conf
create mode 100644 debian/conf/portail-citoyen2.conf
create mode 100755 debian/conf/syncdb.sh
create mode 100644 debian/control
create mode 100644 debian/docs
create mode 100755 debian/portail-citoyen-manage
create mode 100644 debian/portail-citoyen2.config
create mode 100644 debian/portail-citoyen2.dirs
create mode 100644 debian/portail-citoyen2.docs
create mode 100644 debian/portail-citoyen2.init
create mode 100644 debian/portail-citoyen2.install
create mode 100644 debian/portail-citoyen2.postinst
create mode 100644 debian/portail-citoyen2.postrm
create mode 100644 debian/python-portail-citoyen2.install
create mode 100755 debian/rules
create mode 100644 debian/source/format
delete mode 100644 help/fr/api-services.page
delete mode 100755 jenkins.sh
delete mode 100755 load-base-data.sh
delete mode 100644 local_settings.py.example
delete mode 100755 portail-citoyen2
delete mode 100644 portail_citoyen2/__init__.py
delete mode 100644 portail_citoyen2/admin.py
delete mode 100644 portail_citoyen2/allauth_authentic2/__init__.py
delete mode 100644 portail_citoyen2/allauth_authentic2/models.py
delete mode 100644 portail_citoyen2/allauth_authentic2/provider.py
delete mode 100644 portail_citoyen2/allauth_authentic2/tests.py
delete mode 100644 portail_citoyen2/allauth_authentic2/urls.py
delete mode 100644 portail_citoyen2/allauth_authentic2/views.py
delete mode 100644 portail_citoyen2/app_settings.py
delete mode 100644 portail_citoyen2/apps/__init__.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/__init__.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/admin.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/cms_plugins.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/migrations/0001_initial.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/migrations/__init__.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/models.py
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/active_forms.html
delete mode 100644 portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/categories.html
delete mode 100644 portail_citoyen2/apps/data_source_plugin/__init__.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/admin.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/cms_plugins.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/locale/fr/LC_MESSAGES/django.po
delete mode 100644 portail_citoyen2/apps/data_source_plugin/migrations/0001_initial.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/migrations/0002_rename_hash_algo.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/migrations/__init__.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/models.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/signature.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/templates/data_source_plugin/plugin.html
delete mode 100644 portail_citoyen2/apps/data_source_plugin/tests.py
delete mode 100644 portail_citoyen2/apps/data_source_plugin/views.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/__init__.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/admin.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/cms_plugins.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/forms.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/locale/fr/LC_MESSAGES/django.po
delete mode 100644 portail_citoyen2/apps/feed_plugin/migrations/0001_initial.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/migrations/__init__.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/models.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/templates/feed_plugin/select_user_feed.html
delete mode 100644 portail_citoyen2/apps/feed_plugin/templates/feed_plugin/show_user_feed.html
delete mode 100644 portail_citoyen2/apps/feed_plugin/utils.py
delete mode 100644 portail_citoyen2/apps/feed_plugin/widgets.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/__init__.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/cms_plugins.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/forms.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/locale/fr/LC_MESSAGES/django.po
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/migrations/0001_initial.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/migrations/__init__.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/models.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/templates/passerelle_register_plugin/plugin.html
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/tests.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/views.py
delete mode 100644 portail_citoyen2/apps/passerelle_register_plugin/widgets.py
delete mode 100644 portail_citoyen2/cms_plugins.py
delete mode 100644 portail_citoyen2/context_processors.py
delete mode 100644 portail_citoyen2/dashboard.py
delete mode 100644 portail_citoyen2/fixtures/demo.json
delete mode 100644 portail_citoyen2/forms.py
delete mode 100644 portail_citoyen2/locale/fr/LC_MESSAGES/django.po
delete mode 100644 portail_citoyen2/menu.py
delete mode 100644 portail_citoyen2/migrations/0001_initial.py
delete mode 100644 portail_citoyen2/migrations/__init__.py
delete mode 100644 portail_citoyen2/models.py
delete mode 100644 portail_citoyen2/permission_hack.py
delete mode 100644 portail_citoyen2/settings.py
delete mode 100644 portail_citoyen2/static/portail_citoyen/css/Museo500-Regular.otf
delete mode 100644 portail_citoyen2/static/portail_citoyen/css/Museo_Slab.otf
delete mode 100644 portail_citoyen2/static/portail_citoyen/css/admin.css
delete mode 100644 portail_citoyen2/static/portail_citoyen/css/button_connexion.gif
delete mode 100644 portail_citoyen2/static/portail_citoyen/css/e54.png
delete mode 100644 portail_citoyen2/static/portail_citoyen/css/style.css
delete mode 100644 portail_citoyen2/static/portail_citoyen/img/logo.png
delete mode 100644 portail_citoyen2/templates/admin/base_site.html
delete mode 100644 portail_citoyen2/templates/base.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/base_help.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/base_one_column.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/base_two_columns.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/block.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/form.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/form_fields.html
delete mode 100644 portail_citoyen2/templates/portail_citoyen/top-menu.html
delete mode 100644 portail_citoyen2/templatetags/__init__.py
delete mode 100644 portail_citoyen2/templatetags/portail_citoyen_tags.py
delete mode 100644 portail_citoyen2/urls.py
delete mode 100644 portail_citoyen2/utils.py
delete mode 100644 portail_citoyen2/views.py
delete mode 100644 portail_citoyen2/wsgi.py
delete mode 100644 requirements.txt
delete mode 100755 run.sh
delete mode 100755 setup.py
delete mode 100755 start.sh
delete mode 100755 tools/export_data.sh
delete mode 100755 tools/flush_memcache.py
diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index fa52e87..0000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1,32 +0,0 @@
-recursive-include portail_citoyen2/apps/login_plugin/templates *.html
-recursive-include portail_citoyen2/apps/login_plugin/static *.css *.gif *.png *.js
-recursive-include portail_citoyen2/apps/login_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/data_source_plugin/templates *.html
-recursive-include portail_citoyen2/apps/data_source_plugin/static *.css *.gif *.png *.js
-recursive-include portail_citoyen2/apps/data_source_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/a2_service_list_plugin/templates *.html
-recursive-include portail_citoyen2/apps/a2_service_list_plugin/static *.css *.gif *.png *.js
-recursive-include portail_citoyen2/apps/a2_service_list_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/passerelle_register_plugin/templates *.html
-recursive-include portail_citoyen2/apps/passerelle_register_plugin/static *.css *.gif *.png *.js
-recursive-include portail_citoyen2/apps/passerelle_register_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/auquotidien_plugin/templates *.html
-recursive-include portail_citoyen2/apps/auquotidien_plugin/static *.js
-recursive-include portail_citoyen2/apps/auquotidien_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/federation_plugin/templates *.html
-recursive-include portail_citoyen2/apps/federation_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/feed_plugin/templates *.html
-recursive-include portail_citoyen2/apps/feed_plugin/locale *.po *.mo
-recursive-include portail_citoyen2/apps/msp/templates *.html
-recursive-include portail_citoyen2/apps/msp/static *.css *.gif *.png *.js *.jpg
-recursive-include portail_citoyen2/apps/msp/locale *.po *.mo
-include portail_citoyen2/apps/msp/README.txt
-recursive-include portail_citoyen2/fixtures *.json
-recursive-include portail_citoyen2/templates *.html *.txt
-recursive-include portail_citoyen2/static *.css *.gif *.png *.js
-recursive-include portail_citoyen2/locale *.po *.mo
-recursive-include help *.page
-include local_settings.py.example
-include requirements.txt
-include MANIFEST.in
-include VERSION
diff --git a/README b/README
deleted file mode 100644
index cbaa6a1..0000000
--- a/README
+++ /dev/null
@@ -1,67 +0,0 @@
-How to start
-============
-
-To work on portail-citoyen just execute the following lines (command
-to launch start with $, other lines are expected output)::
-
- $ pip install -r ./requirements
- $ cp local_settings.py.example local_settings.py
- $ ./portail-citoyen syncdb --all # you will be asked to create a new admin user
- Syncing...
- Creating tables ...
- [ snipped ]
- Creating table cmsplugin_a2servicelistplugin
- Creating table registration_registrationprofile
-
- You just installed Django's auth system, which means you don't have any superusers defined.
- Would you like to create one now? (yes/no): yes
- Username: admin
- First name: admin
- Last name: admin
- E-mail address: admin@coin.org
- Password:
- Password (again):
- Superuser created successfully.
- Installing custom SQL ...
- Installing indexes ...
- Installed 2 object(s) from 1 fixture(s)
-
- Synced:
- > django.contrib.auth
- [ snipped ]
- > registration
-
- Not synced (use migrations):
- -
- (use ./manage.py migrate to migrate these)
- $ ./portail-citoyen migrate --fake
- [ lots of migrations running ]
- $ ./portail-citoyen runserver
- Validating models...
-
- 0 errors found
- April 12, 2013 - 16:04:50
- Django version 1.5.1, using settings 'compte_agglo_montpellier.settings'
- Development server is running at http://127.0.0.1:8000/
- Quit the server with CONTROL-C.
-
-The application is now usable at http://localhost:8000/
-
-Settings
---------
-
-Settings can be passed using a local_settings.py file or the shell
-environment. Dictionaries are passed by flattening the variable name and the
-dictionnary key separated by an underscore character. For example to passe the
-variable MAIN_SITE_URL in templates, define the following environment
-variable::
-
- export PORTAIL_CITOYEN_TEMPLATE_VARS_MAIN_SITE_URL=https://main-site.com/
-
-Those variables must be prefixed with PORTAIL_CITOYEN_ when set in a
-local_settings.py file or in the environment.
-
-Name Description
-================================ ============================================
-TEMPLATE_VARS dictionnary of variables passed to templates
-PORTAIL_ADMIN_URL URL of the global administration portal
diff --git a/TODO b/TODO
deleted file mode 100644
index 9407e18..0000000
--- a/TODO
+++ /dev/null
@@ -1,3 +0,0 @@
-- Authentication is handled by authsaml2
-- First user created must be superadmin
-- User admin must be read-only
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..ab8af97
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,6 @@
+portail-citoyen2 (1.0-1) unstable; urgency=medium
+
+ * Initial release
+
+ -- Jérôme Schneider Tue, 01 Apr 2014 15:17:34 +0200
+
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/conf/db.conf b/debian/conf/db.conf
new file mode 100644
index 0000000..4b4df01
--- /dev/null
+++ b/debian/conf/db.conf
@@ -0,0 +1,5 @@
+export DATABASE_ENGINE='django.db.backends.postgresql_psycopg2'
+export DATABASE_NAME='_DBC_DBNAME_'
+export DATABASE_USER='_DBC_DBUSER_'
+export DATABASE_PASSWORD='_DBC_DBPASS_'
+export DATABASE_HOST='localhost'
diff --git a/debian/conf/nginx-example.conf b/debian/conf/nginx-example.conf
new file mode 100644
index 0000000..65a1041
--- /dev/null
+++ b/debian/conf/nginx-example.conf
@@ -0,0 +1,41 @@
+server {
+ listen 443;
+ server_name citoyen.example.fr;
+
+ ssl on;
+ ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
+ ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
+
+ access_log /var/log/nginx/citoyen.example.fr-access.log combined;
+ error_log /var/log/nginx/citoyen.example.fr-error.log;
+
+ location /static {
+ alias /var/lib/portail-citoyen/static;
+ }
+
+ location / {
+ proxy_pass http://unix:/var/run/portail-citoyen/portail-citoyen.sock;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Forwarded-SSL on;
+ proxy_set_header X-Forwarded-Protocol ssl;
+ proxy_set_header X-Forwarded-Proto https;
+ }
+}
+
+server {
+ listen 80;
+ server_name citoyen.example.fr;
+
+ access_log /var/log/nginx/citoyen.example.fr-access.log combined;
+ error_log /var/log/nginx/citoyen.example.fr-error.log;
+
+ location /static {
+ alias /var/lib/portail-citoyen/static;
+ }
+
+ location / {
+ proxy_pass http://unix:/var/run/portail-citoyen/portail-citoyen.sock;
+ proxy_set_header Host $http_host;
+ }
+}
+
diff --git a/debian/conf/portail-citoyen2.conf b/debian/conf/portail-citoyen2.conf
new file mode 100644
index 0000000..ad7cb65
--- /dev/null
+++ b/debian/conf/portail-citoyen2.conf
@@ -0,0 +1,46 @@
+# do not remove this line, it imports db configuration from dbconfig-common
+[ -f /etc/portail-citoyen/db.conf ] && . /etc/portail-citoyen/db.conf
+# do not remove this line, it imports secret which is automatically generated
+[ -f /etc/portail-citoyen/secret ] && . /etc/portail-citoyen/secret
+# import saml certificates (automatically genereted)
+[ -f /etc/portail-citoyen/saml-certs.conf ] && . /etc/portail-citoyen/saml-certs.conf
+
+# Static root directory
+export STATIC_ROOT='/var/lib/portail-citoyen/static'
+
+# Debug
+#export DEBUG=yes
+
+# Define administrators / managers
+export ADMINS='admin eo;admin@entrouvert.com'
+
+# Database configuration (please use dpkg-reconfigure portail-citoyen)
+#export DATABASE_ENGINE='django.db.backends.sqlite3'
+#export DATABASE_NAME='/var/lib/portail-citoyen/portail-citoyen.db'
+
+# Sentry / Raven configuration
+#export export RAVEN_CONFIG_DSN='' # require package python-raven
+
+# Log root directory
+export LOG_ROOT='/var/log/portail-citoyen/portail-citoyen.log'
+
+# We are behind a reverse proxy so we accept every hosts
+export ALLOWED_HOSTS='*'
+
+# Email configuration
+#export EMAIL_HOST='localhost'
+#export EMAIL_PORT='25'
+#export EMAIL_SUBJECT_PREFIX='[Portail Citoyen]'
+#export SERVER_EMAIL='root@test.com'
+#export DEFAULT_FROM_EMAIL='portail-citoyen@test.com'
+
+# Enables some features
+export IDP_SAML2='yes'
+#export IDP_OPENID='yes'
+#export IDP_CAS='yes'
+#export AUTH_SAML2='yes'
+#export AUTH_OPENID='yes'
+#export AUTH_SSL='yes'
+#export AUTH_OATH='yes'
+
+
diff --git a/debian/conf/syncdb.sh b/debian/conf/syncdb.sh
new file mode 100755
index 0000000..b410361
--- /dev/null
+++ b/debian/conf/syncdb.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+. /etc/portail-citoyen/portail-citoyen.conf
+
+python /usr/lib/portail-citoyen/manage.py syncdb --all --noinput
+python /usr/lib/portail-citoyen/manage.py migrate --fake --noinput
+
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..43f8fb1
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,41 @@
+Source: portail-citoyen2
+Maintainer: Jérôme Schneider
+Section: python
+Priority: optional
+Build-Depends: python-setuptools (>= 0.6b3),
+ python-all (>= 2.6.6-3),
+ debhelper (>= 8.0),
+ openssl,
+ python-django (>= 1.5)
+Standards-Version: 3.9.1
+X-Python-Version: >= 2.6
+
+Package: python-portail-citoyen2
+Architecture: all
+Depends: ${misc:Depends}, python (>= 2.6),
+ python-imaging,
+ python-feedparser,
+ python-django (>= 1.5), python-django (<< 1.6),
+ python-authentic2 (>= 2.1.2),
+ python-django-cms (>= 3.0rc1),
+ python-django-admin-tools (>= 0.5),
+ python-django-admin-tools (<< 0.6),
+ python-requests (>= 1.0.0),
+ python-django-allauth (>= 0.14)
+Description: Portail citoyen v2 python module
+Conflicts: python-portail-citoyen
+
+Package: portail-citoyen2
+Architecture: all
+Depends: ${misc:Depends}, adduser,
+ python-portail-citoyen2 (>= 1.0),
+ python-entrouvert (>= 6.0),
+ python-django-south (>= 0.8.4),
+ python-psycopg2,
+ gunicorn, dbconfig-common,
+ debconf | debconf-2.0, ucf
+Recommends: postgresql-client
+Suggests: nginx, postgresql
+Description: Portail citoyen v2 daemon
+Conflicts: portail-citoyen
+
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1 @@
+README
diff --git a/debian/portail-citoyen-manage b/debian/portail-citoyen-manage
new file mode 100755
index 0000000..dfeab6a
--- /dev/null
+++ b/debian/portail-citoyen-manage
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if [ "$(whoami)" != "portail-citoyen" ]; then
+ if which sudo; then
+ if sudo -v -u portail-citoyen; then
+ sudo -u portail-citoyen portail-citoyen-manage "$@"
+ exit $?
+ fi
+ echo "You must run this script with portail-citoyen user"
+ exit 1
+ fi
+fi
+
+if [ -f /etc/portail-citoyen/portail-citoyen.conf ]; then
+ . /etc/portail-citoyen/portail-citoyen.conf
+fi
+
+/usr/lib/portail-citoyen/manage.py "$@"
diff --git a/debian/portail-citoyen2.config b/debian/portail-citoyen2.config
new file mode 100644
index 0000000..373c7e3
--- /dev/null
+++ b/debian/portail-citoyen2.config
@@ -0,0 +1,14 @@
+#!/bin/sh
+# config maintainer script for foo-pgsql
+
+set -e
+
+# source debconf stuff
+. /usr/share/debconf/confmodule
+# source dbconfig-common shell library, and call the hook function
+if [ -f /usr/share/dbconfig-common/dpkg/config.pgsql ]; then
+ . /usr/share/dbconfig-common/dpkg/config.pgsql
+ dbc_go portail-citoyen $@
+fi
+
+#DEBHELPER#
diff --git a/debian/portail-citoyen2.dirs b/debian/portail-citoyen2.dirs
new file mode 100644
index 0000000..d58ab9d
--- /dev/null
+++ b/debian/portail-citoyen2.dirs
@@ -0,0 +1,8 @@
+etc/portail-citoyen
+usr/lib/portail-citoyen
+usr/share/dbconfig-common/scripts/portail-citoyen/install
+var/lib/portail-citoyen/media
+var/lib/portail-citoyen/static
+var/lib/portail-citoyen/extra-static
+var/run/portail-citoyen
+var/log/portail-citoyen
diff --git a/debian/portail-citoyen2.docs b/debian/portail-citoyen2.docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/debian/portail-citoyen2.docs
@@ -0,0 +1 @@
+README
diff --git a/debian/portail-citoyen2.init b/debian/portail-citoyen2.init
new file mode 100644
index 0000000..4c8a25c
--- /dev/null
+++ b/debian/portail-citoyen2.init
@@ -0,0 +1,178 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: portail-citoyen
+# Required-Start: $network $local_fs
+# Required-Stop:
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Portail citoyen
+# Description: Portail citoyen
+### END INIT INFO
+
+# Author: Jérôme Schneider
+
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC=portail-citoyen
+NAME=portail-citoyen
+DAEMON=/usr/bin/gunicorn
+PID_DIR=/var/run/$NAME
+LOG_DIR=/var/log/$NAME
+PIDFILE=$PID_DIR/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+
+USER=portail-citoyen
+GROUP=portail-citoyen
+
+DAEMON_ARGS="--pid $PIDFILE \
+--user $USER --group $GROUP \
+--daemon \
+--access-logfile $LOG_DIR/gunicorn-access.log \
+--log-file $LOG_DIR/gunicorn-error.log \
+--bind=unix:$PID_DIR/$NAME.sock \
+--workers=10 \
+--worker-class=sync \
+--timeout=60 \
+portail_citoyen.wsgi:application"
+
+# Exit if the package is not installed
+[ -x $DAEMON ] || exit 0
+
+# Read configuration variable file if it is present
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+# Load confg
+. /etc/portail-citoyen/portail-citoyen.conf
+
+# Load the VERBOSE setting and other rcS variables
+. /lib/init/vars.sh
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
+. /lib/lsb/init-functions
+
+# Create pid directory
+if [ ! -d $PID_DIR ]; then
+ install -d -m 755 -o $USER -g $GROUP $PID_DIR
+fi
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+ # Return
+ # 0 if daemon has been started
+ # 1 if daemon was already running
+ # 2 if daemon could not be started
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+ || return 1
+ start-stop-daemon --start --quiet --exec $DAEMON -- \
+ $DAEMON_ARGS \
+ || return 2
+}
+
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+ # Return
+ # 0 if daemon has been stopped
+ # 1 if daemon was already stopped
+ # 2 if daemon could not be stopped
+ # other if a failure occurred
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
+ RETVAL="$?"
+ [ "$RETVAL" = 2 ] && return 2
+ # Wait for children to finish too if this is a daemon that forks
+ # and if the daemon is only ever run from this initscript.
+ # If the above conditions are not satisfied then add some other code
+ # that waits for the process to drop all resources that could be
+ # needed by services started subsequently. A last resort is to
+ # sleep for some time.
+ start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+ [ "$?" = 2 ] && return 2
+ # Many daemons don't delete their pidfiles when they exit.
+ rm -f $PIDFILE
+ return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+ #
+ # If the daemon can reload its configuration without
+ # restarting (for example, when it is sent a SIGHUP),
+ # then implement that here.
+ #
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+ return 0
+}
+
+do_migrate() {
+ log_action_msg "Applying new migrations .."
+ su $USER -p -c "/usr/bin/portail-citoyen-manage syncdb --migrate --noinput"
+ log_action_msg ".. done"
+}
+
+
+case "$1" in
+ start)
+ do_migrate
+ log_daemon_msg "Starting $DESC " "$NAME"
+ do_start
+ case "$?" in
+ 0|1) log_end_msg 0 ;;
+ 2) log_end_msg 1 ;;
+ esac
+ ;;
+ stop)
+ log_daemon_msg "Stopping $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1) log_end_msg 0 ;;
+ 2) log_end_msg 1 ;;
+ esac
+ ;;
+ status)
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
+ #reload|force-reload)
+ #
+ # If do_reload() is not implemented then leave this commented out
+ # and leave 'force-reload' as an alias for 'restart'.
+ #
+ #log_daemon_msg "Reloading $DESC" "$NAME"
+ #do_reload
+ #log_end_msg $?
+ #;;
+ restart|force-reload)
+ #
+ # If the "reload" option is implemented then remove the
+ # 'force-reload' alias
+ #
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ do_stop
+ do_migrate
+ case "$?" in
+ 0|1)
+ do_start
+ case "$?" in
+ 0) log_end_msg 0 ;;
+ 1) log_end_msg 1 ;; # Old process is still running
+ *) log_end_msg 1 ;; # Failed to start
+ esac
+ ;;
+ *)
+ # Failed to stop
+ log_end_msg 1
+ ;;
+ esac
+ ;;
+ *)
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+ exit 3
+ ;;
+esac
+
diff --git a/debian/portail-citoyen2.install b/debian/portail-citoyen2.install
new file mode 100644
index 0000000..aa91f67
--- /dev/null
+++ b/debian/portail-citoyen2.install
@@ -0,0 +1,4 @@
+debian/conf/portail-citoyen.conf /etc/portail-citoyen
+debian/conf/nginx-example.conf /etc/portail-citoyen
+debian/conf/db.conf /usr/share/portail-citoyen/templates
+debian/portail-citoyen-manage /usr/bin
diff --git a/debian/portail-citoyen2.postinst b/debian/portail-citoyen2.postinst
new file mode 100644
index 0000000..0e8da04
--- /dev/null
+++ b/debian/portail-citoyen2.postinst
@@ -0,0 +1,87 @@
+#!/bin/sh
+#
+# Postinst script for portail-citoyen
+#
+
+set -e
+
+NAME=portail-citoyen
+USER=portail-citoyen
+GROUP=portail-citoyen
+HOME=/var/lib/$NAME
+
+# source debconf stuff
+. /usr/share/debconf/confmodule
+
+case "$1" in
+ configure)
+ if ! getent group $GROUP > /dev/null 2>&1; then
+ echo -n "Adding group $GROUP.." >&2
+ addgroup --quiet --system $GROUP
+ echo "..done" >&2
+ fi
+ if ! getent passwd $USER > /dev/null 2>&1; then
+ echo -n "Adding user $USER.." >&2
+ adduser --quiet --system --gecos "$NAME daemon" \
+ --ingroup $GROUP \
+ --no-create-home --home $HOME \
+ $USER
+ echo "..done" >&2
+ fi
+ if [ ! -f "/etc/$NAME/secret" ]; then
+ echo -n "Generating Django secret.." >&2
+ echo "export SECRET_KEY='` /etc/$NAME/secret
+ chmod 0640 /etc/$NAME/secret
+ chown root:$GROUP /etc/$NAME/secret
+ echo "..done" >&2
+ fi
+ if [ ! -f "/etc/$NAME/saml-certs.conf" ]; then
+ echo -n "Generating SAML certificates.." >&2
+ openssl genrsa -out /tmp/saml.key 2048 >&2
+ openssl rsa -in /tmp/saml.key -pubout -out /tmp/saml.pub >&2
+ echo SAML_SIGNATURE_PRIVATE_KEY=\"`cat /tmp/saml.key`\" > /etc/$NAME/saml-certs.conf
+ echo SAML_SIGNATURE_PUBLIC_KEY=\"`cat /tmp/saml.pub`\" >> /etc/$NAME/saml-certs.conf
+ rm /tmp/saml.key /tmp/saml.pub
+ echo "..done" >&2
+ fi
+
+ chown $USER:$GROUP /var/lib/portail-citoyen \
+ /var/lib/portail-citoyen/static \
+ /var/lib/portail-citoyen/extra-static \
+ /var/lib/portail-citoyen/media \
+ /var/run/portail-citoyen \
+ /var/log/portail-citoyen
+
+ # source dbconfig-common shell library, and call the hook function
+ if [ -f /usr/share/dbconfig-common/dpkg/postinst.pgsql ]; then
+ . /usr/share/dbconfig-common/dpkg/postinst.pgsql
+ dbc_generate_include="template:/etc/portail-citoyen/db.conf"
+ dbc_generate_include_args="-o template_infile=/usr/share/portail-citoyen/templates/db.conf -U"
+ dbc_generate_include_owner="root:portail-citoyen"
+ dbc_generate_include_perms="640"
+ dbc_pgsql_createdb_encoding="UTF8"
+ dbc_go portail-citoyen $@
+ fi
+
+ echo -n "Generating static files.." >&2
+ su $USER -p -c "/usr/bin/portail-citoyen-manage collectstatic --noinput --link" >&2
+ echo "..done" >&2
+ ;;
+
+ reconfigure|abort-upgrade|abort-remove|abort-deconfigure)
+ ;;
+
+ *)
+ echo "postinst called with unknown argument \`$1'" >&2
+ exit 1
+ ;;
+esac
+
+db_stop
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/portail-citoyen2.postrm b/debian/portail-citoyen2.postrm
new file mode 100644
index 0000000..80a667b
--- /dev/null
+++ b/debian/portail-citoyen2.postrm
@@ -0,0 +1,32 @@
+#!/bin/sh
+# postrm script for portail-citoyen
+#
+# see: dh_installdeb(1)
+
+set -e
+
+case "$1" in purge)
+ deluser --quiet --system portail-citoyen > /dev/null || true
+ rm -f /etc/portail-citoyen/secret
+ rm -rf /var/lib/portail-citoyen/static/*
+ # source debconf stuff
+ . /usr/share/debconf/confmodule
+ # source dbconfig-common shell library, and call the hook function
+ if [ -f /usr/share/dbconfig-common/dpkg/postrm.pgsql ]; then
+ . /usr/share/dbconfig-common/dpkg/postrm.pgsql
+ dbc_go portail-citoyen $@
+ fi
+
+ DBCONF=/etc/portail-citoyen/db.conf
+ if [ "$1" = "purge" ]; then
+ rm -f $DBCONF
+ if which ucf >/dev/null 2>&1; then
+ ucf --purge $DBCONF
+ fi
+ fi
+ ;;
+
+esac
+
+exit 0
+
diff --git a/debian/python-portail-citoyen2.install b/debian/python-portail-citoyen2.install
new file mode 100644
index 0000000..1b91047
--- /dev/null
+++ b/debian/python-portail-citoyen2.install
@@ -0,0 +1 @@
+usr/
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..3e8eefa
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,14 @@
+#!/usr/bin/make -f
+
+d=$(CURDIR)/debian/tmp
+portailcitoyen=$(CURDIR)/debian/portail-citoyen
+
+%:
+ dh $@ --with python2
+
+override_dh_install:
+ install -m 755 -o root -g root debian/conf/syncdb.sh $(portailcitoyen)/usr/share/dbconfig-common/scripts/portail-citoyen/install/pgsql
+ mv $(d)/usr/bin/portail-citoyen2 $(portailcitoyen)/usr/lib/portail-citoyen/manage.py
+ rm -rf $(d)/usr/bin
+ dh_install
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/help/fr/api-services.page b/help/fr/api-services.page
deleted file mode 100644
index 2101ddb..0000000
--- a/help/fr/api-services.page
+++ /dev/null
@@ -1,310 +0,0 @@
-
-
-
-
-
-
-
- Frédéric Péters
- fpeters@entrouvert.com
-
-
- Benjamin Dauvergne
- bdauvergne@entrouvert.com
-
-
- Pierre Cros
- pcros@entrouvert.com
-
- Remontée d'informations de services vers le portail citoyen
-
-
-Remontée d'informations vers le portail citoyen
-
-
-Introduction
-
-Le portail citoyen est une plate-forme dans laquelle sont agrégées des
-informations provenant de sources web diverses.
-
-Afin de permettre cette remontée d'information pour les services ne
-disposant pas nativement d'une API exposée sur le Web, nous proposons
-d'utiliser celle qui est décrite dans ce document.
-
-
-
-
-
-Requête
-
-Le portail effectue des requêtes HTTP GET vers les différents services. Les
-échanges atendus sont conformes au style d'architecture REST.
-
-
-
-Requête identifiante
-
-L'URI utilisée pour ces requêtes peut contenir des informations identifiant
-l'usager concerné.
-
-
-Identifiant SAML
-
-Lorsque le service intègre le protocole de fédération d'identité SAML, la
-requête identifiante utilisera un identifiant SAML, le NameID :
-
-
-https://www.example.com/eservices/pending?NameID=nameid
-
-
-
-
-Adresse électronique
-
-Lorsque le service n'intègre pas le protocole de fédération d'identité SAML,
-la requête identifiante utilisera l'adresse électronique de l'utilisateur :
-
-
-https://www.example.com/eservices/pending?email=email
-
-
-
- Adresses électroniques identiques
- L'utilisation de cette méthode pour identifier l'utilisateur ne fonctionne
- que si ce dernier a employé la même adresse électronique pour la création du
- compte citoyen et la création du compte sur le service.
-
-
-
-
-
-Autres requêtes
-
-Il est possible pour le service d'exposer davantage de données via des
-URL.
-
-
-Données génériques (qui ne concernent pas un utilisateur particulier)
-
-L'applications peut exposer des données génériques (horaires, informations,
-actualités). Elle doit le faire via une URL du type :
-
-https://www.example.com/eservices/horaires/
-
-
-
-Filtres
-
-Il peut être utile pour le portail citoyen de filtrer les données récupérées
-en utilisant des critères divers (catégories, localisations...) via les URL.
-Les filtres doivent être compris dans les URL sous la forme (pour exposer les
-horaires de Montpellier par exemple) :
-
-https://www.example.com/eservices/montpellier/horaires/
-
-
-
-
-
-
-Structure de l'information fournie par les services
-
-En réponse à la requête du portail citoyen, le service doit fournir une
-information structurée. Cette réponse peut prendre plusieurs formes.
-
-
-Fils d'info
-
-Le portail peut intégrer, sans que cela ne nécessite la moindre
-modification, les fils d'information au format RSS et Atom qui sont
-offerts par les services.
-
-
-
-
-HTML
-
-Comme pour les fils d'infos, des blocs de code HTML fournis par les services
-peuvent être intégrés directement dans le portail. À noter toutefois que ce
-HTML doit être "brut" parce qu'il est filtré. Il ne peut pas contenir de
-Javascript par exemple.
-
-
-
-
-JSON
-
-La réponse du service à la requête du portail peut aussi être faite en
-JSON.
-
-
-Liste
-
-Les données exposées au format JSON doivent être organisées sous forme d'un
-tableau associatif. Les clés (variables) de ce tableau sont les suivantes :
-
-
- title
: titre (obligatoire)
- url
: URL (obligatoire)
- description
: description (facultatif)
-
-
-La liste des données doit être attachées à une clé nommée data
.
-
-
-Exemple :
-
-
-{ "data": [
- {"title": "Demande de bac pour ordures",
- "url": "https://eservices.example.com/dechets/demande-bac"},
- {"title": "Demande d'acte de naissance",
- "url": "https://eservices.example.com/actes/naissance",
- "Description": "Faites vos démarches sans vous déplacer"}
- ]
-}
-
-
-
-
-
-Tableau
-
-Le portail citoyen peut aussi recevoir des données qu'il affichera sous
-forme de tableau.
-
-La liste des données doit être attachées à une clé nommée data
-et une clé nommée columns
peut exister pour fournir les libellés
-des colonnes.
-
-
-Exemple :
-
-
-{"data": [
- {"day": "Lundi", "open": "8h", "close": "17h"},
- {"day": "Mardi", "open": "8h", "close": "19h"},
- {"day": "Mercredi", "open": "9h", "close": "17h"}
- ],
- "columns": {
- "day": "Jour",
- "open": "Horaire d'ouverture",
- "close": "Horaire de fermeture"}
-}
-
-
-Le résultat sur le portail citoyen sera l'affichage du tableau suivant :
-
-
-
-
- Jour
- Horaire d'ouverture
- Horaire de fermeture
-
-
-
-
-Lundi
8h
17h
-
-
-Mardi
8h
19h
-
-
-Mercredi
9h
17h
-
-
-
-
-
-
-
-
-
-
-
- Signature de l'URL
-
-
-L'URL doit être signée via une clé partagée à configurer des deux cotés de la
-liaison, la signature est du type HMAC; l'algorithme de hash à employer est
-passé en paramètre.
-
-
-Si le service doit être utilisé par différents requêteurs il est
-recommandé de ne pas utiliser une clé unique; il est ainsi suggéré que l'URL
-attende également un paramètre précisant l'appelant, à travers, par exemple,
-un paramètre supplémentaire apikey
.
-
-
-En ce qui concerne l'algorithme de hash, il est préconisé d'utiliser
-SHA-256 par respect du Référentiel Général
-de Sécurité (RGS).
-
-
-
-La signature est à calculer sur la query string encodée complète, en
-enlevant les paramètres terminaux algo
, timestamp
,
-nonce
et signature
. La formule de calcul de la
-signature est la suivante :
-
-
-
-BASE64(HMAC-HASH(query_string+'algo=HASH×tamp=' + timestamp + '&nonce=" + nonce, clé))
-
-
-
-
-timestamp
est la date dans la zone GMT au format ISO8601
-en se limitant à la précision des secondes (ex : 2012-04-04T12:34:00Z),
-
-
-nonce est une chaîne aléatoire contenant au moins 128 bits d'entropie
-(16 octets aléatoires),
-
-algo est une chaîne représentant l'algorithme de hachage utilisé, sont
-définis : sha1, sha256, sha512 pour les trois algorithmes correspondant.
-L'utilisation d'une valeur différente n'est pas définie.
-
-
-
-
-La query string définitive est ainsi :
-
-
-
-qs_initial &algo=algo ×tamp=ts &nonce=nonce &signature=signature
-
-
-
-Pour la validation il faut contrôler :
-
-
-
-
-que la signature regénérée est identique,
-
-que le timestamp est dans une fenêtre étroite par rapport à la date
-courante, il est recommandé d'accepter un écart de trente secondes
-maximum.
-
-que le nonce n'a encore jamais été vu (associé au timestamp il suffit
-de conserver les nonces pour une durée de 3 ou 4 fois la fenêtre de temps, par
-exemple cinq minutes).
-
-
-
-
-Lors de l'utilisation de ces signatures il est important d'utiliser HTTPS pour
-éviter les interceptions et de stocker les nonces pour éviter les rejeux et à
-maintenir une bonne synchronisation des horloges, en utilisant par exemple le
-protocole NTP.
-
-
-
-
-
diff --git a/jenkins.sh b/jenkins.sh
deleted file mode 100755
index 5993b75..0000000
--- a/jenkins.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash -e
-pip install --upgrade setuptools
-pip install --upgrade pip
-pip install --upgrade pylint
-pip install --upgrade pyOpenSSL==0.13 ndg-httpsclient requests pyasn1
-sed -i 's/^MAX = 64/MAX = 200/' $VIRTUAL_ENV/lib/python*/site-packages/ndg/httpsclient/subj_alt_name.py
-
-pip install --upgrade -r requirements.txt
-
-./portail-citoyen syncdb --migrate --noinput --no-initial-data
-./portail-citoyen loaddata initial_data
-./portail-citoyen validate
-(pylint -f parseable --rcfile /var/lib/jenkins/pylint.django.rc portail_citoyen2/ | tee pylint.out) || /bin/true
diff --git a/load-base-data.sh b/load-base-data.sh
deleted file mode 100755
index 7111c07..0000000
--- a/load-base-data.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-BASE=`dirname $0`
-
-ENV=${ENV:-dev}
-
-$BASE/run.sh loaddata --traceback initial_data
diff --git a/local_settings.py.example b/local_settings.py.example
deleted file mode 100644
index ef804f1..0000000
--- a/local_settings.py.example
+++ /dev/null
@@ -1,22 +0,0 @@
-
-import os
-
-DEBUG = True
-
-if DEBUG:
- DEBUG_TOOLBAR = True
- TEMPLATE_DEBUG = True
- DEBUG_TOOLBAR_CONFIG = {
- 'INTERCEPT_REDIRECTS': False,
- }
-INTERNAL_IPS = ('127.0.0.1',)
-
-SECRET_KEY = 'coin'
-
-DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(os.path.dirname(__file__), 'portail_citoyen.sqlite'),
- },
-}
-
diff --git a/portail-citoyen2 b/portail-citoyen2
deleted file mode 100755
index 3e13785..0000000
--- a/portail-citoyen2
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-if __name__ == "__main__":
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "portail_citoyen2.settings")
-
- from django.core.management import execute_from_command_line
-
- execute_from_command_line(sys.argv)
diff --git a/portail_citoyen2/__init__.py b/portail_citoyen2/__init__.py
deleted file mode 100644
index 7a1d20e..0000000
--- a/portail_citoyen2/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import os.path
-import sys
-
-__version__ = '0.1'
-
-apps_dir = os.path.join(os.path.dirname(__file__), 'apps')
-if apps_dir not in sys.path:
- sys.path.append(apps_dir)
diff --git a/portail_citoyen2/admin.py b/portail_citoyen2/admin.py
deleted file mode 100644
index 40b3e5b..0000000
--- a/portail_citoyen2/admin.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from django.views.decorators.cache import never_cache
-from django.http import HttpResponseRedirect
-from django.utils.http import urlencode
-from django.conf import settings
-from django.contrib.auth import REDIRECT_FIELD_NAME
-from django.contrib import admin
-
-@never_cache
-def login(request, extra_context=None):
- query = urlencode({REDIRECT_FIELD_NAME: request.build_absolute_uri()})
- url = '{0}?{1}'.format(settings.LOGIN_URL, query)
- return HttpResponseRedirect(url)
-
-admin.site.login = login
diff --git a/portail_citoyen2/allauth_authentic2/__init__.py b/portail_citoyen2/allauth_authentic2/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/allauth_authentic2/models.py b/portail_citoyen2/allauth_authentic2/models.py
deleted file mode 100644
index 6b20219..0000000
--- a/portail_citoyen2/allauth_authentic2/models.py
+++ /dev/null
@@ -1 +0,0 @@
-# Create your models here.
diff --git a/portail_citoyen2/allauth_authentic2/provider.py b/portail_citoyen2/allauth_authentic2/provider.py
deleted file mode 100644
index 5abb29c..0000000
--- a/portail_citoyen2/allauth_authentic2/provider.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from allauth.socialaccount import providers
-from allauth.socialaccount.providers.base import ProviderAccount
-from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
-from allauth.account.models import EmailAddress
-
-class Authentic2Account(ProviderAccount):
- def to_str(self):
- return self.account.uid
-
-
-class Authentic2Provider(OAuth2Provider):
- id = 'authentic2'
- name = 'Authentic2'
- package = 'portail_citoyen2.allauth_authentic2'
- account_class = Authentic2Account
-
- def extract_uid(self, data):
- return str(data['username'])
-
- def extract_common_fields(self, data):
- return dict(email=data.get('email'),
- username=data.get('username'),
- name=data.get('displayname'))
-
- def extract_email_addresses(self, data):
- ret = [EmailAddress(email=data['email'],
- verified=True,
- primary=True)]
- return ret
-
-
-
-providers.registry.register(Authentic2Provider)
diff --git a/portail_citoyen2/allauth_authentic2/tests.py b/portail_citoyen2/allauth_authentic2/tests.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/allauth_authentic2/urls.py b/portail_citoyen2/allauth_authentic2/urls.py
deleted file mode 100644
index 69b19e7..0000000
--- a/portail_citoyen2/allauth_authentic2/urls.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
-from .provider import Authentic2Provider
-
-urlpatterns = default_urlpatterns(Authentic2Provider)
-
diff --git a/portail_citoyen2/allauth_authentic2/views.py b/portail_citoyen2/allauth_authentic2/views.py
deleted file mode 100644
index dae345f..0000000
--- a/portail_citoyen2/allauth_authentic2/views.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import urlparse
-import requests
-
-from django.core.exceptions import ImproperlyConfigured
-
-from allauth.socialaccount.providers.oauth2.views import (OAuth2Adapter,
- OAuth2LoginView,
- OAuth2CallbackView)
-from .provider import Authentic2Provider
-
-
-class Authentic2OAuth2Adapter(OAuth2Adapter):
- provider_id = Authentic2Provider.id
-
- def get_url(self):
- provider = self.get_provider()
- try:
- return provider.get_settings()['URL']
- except IndexError:
- raise ImproperlyConfigured('The authentic2 provider needs an URL defined in settings')
-
- @property
- def access_token_url(self):
- return urlparse.urljoin(self.get_url(), 'access_token')
-
- @property
- def authorize_url(self):
- return urlparse.urljoin(self.get_url(), 'authorize')
-
- @property
- def profile_url(self):
- return urlparse.urljoin(self.get_url(), 'user-info')
-
- def complete_login(self, request, app, token, **kwargs):
- resp = requests.get(self.profile_url,
- headers={'authorization': 'Bearer %s' % token.token})
- extra_data = resp.json()
- return self.get_provider().sociallogin_from_response(request,
- extra_data)
-
-
-oauth2_login = OAuth2LoginView.adapter_view(Authentic2OAuth2Adapter)
-oauth2_callback = OAuth2CallbackView.adapter_view(Authentic2OAuth2Adapter)
diff --git a/portail_citoyen2/app_settings.py b/portail_citoyen2/app_settings.py
deleted file mode 100644
index 8779707..0000000
--- a/portail_citoyen2/app_settings.py
+++ /dev/null
@@ -1,38 +0,0 @@
-import sys
-
-from django.core.exceptions import ImproperlyConfigured
-
-class AppSettings(object):
- __defaults = {
- 'PORTAIL_ADMIN_URL': None,
- }
-
- def __init__(self, prefix):
- self.prefix = prefix
-
- def __getattr__(self, name):
- if name in self.__defaults:
- return self._settings(name, self.__defaults[name])
- else:
- return self._settings(name)
-
- @property
- def TEMPLATE_VARS(self):
- v = self._settings('TEMPLATE_VARS', {})
- try:
- from django.conf import settings
- v['LOGOUT_URL'] = settings.LOGOUT_URL
- except AttributeError:
- raise ImproperlyConfigured('LOGOUT_URL is mandatory')
- return v
-
- def _settings(self, name, default=Ellipsis):
- from django.conf import settings
- if default is Ellipsis:
- return getattr(settings, self.prefix + name)
- else:
- return getattr(settings, self.prefix + name, default)
-
-app_settings = AppSettings('PORTAIL_CITOYEN_')
-app_settings.__name__ = __name__
-sys.modules[__name__] = app_settings
diff --git a/portail_citoyen2/apps/__init__.py b/portail_citoyen2/apps/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/auquotidien_plugin/__init__.py b/portail_citoyen2/apps/auquotidien_plugin/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/auquotidien_plugin/admin.py b/portail_citoyen2/apps/auquotidien_plugin/admin.py
deleted file mode 100644
index 48a5e43..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/admin.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from django.contrib import admin
-
-from models import AuQuotidienAPI
-
-class AuQuotidienAPIAdmin(admin.ModelAdmin):
- list_display = [ 'name', 'order', 'active', 'service_provider', 'orig', 'hash_algo', 'verify_certificate', 'allow_redirects', 'timeout' ]
-
-admin.site.register(AuQuotidienAPI, AuQuotidienAPIAdmin)
diff --git a/portail_citoyen2/apps/auquotidien_plugin/cms_plugins.py b/portail_citoyen2/apps/auquotidien_plugin/cms_plugins.py
deleted file mode 100644
index 6e3ca1e..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/cms_plugins.py
+++ /dev/null
@@ -1,78 +0,0 @@
-import logging
-import urlparse
-
-from django.utils.translation import ugettext_lazy as _
-
-
-from cms.plugin_pool import plugin_pool
-
-
-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)
-
-logger = logging.getLogger(__name__)
-
-class FakeSource(object):
- def __init__(self, url, api):
- self.url = url
- self.mime_type = DataSource.JSON
- self.api = api
-
- def __getattr__(self, attribute):
- return getattr(self.api, attribute)
-
-class AuQuotidienBasePlugin(DataSourcePlugin):
- model = AuQuotidienActiveFormsPluginModel
- render_template = None
- text_enabled = True
- inlines = []
- url_template = None
-
- def get_apis(self, context, instance):
- user = context['request'].user
- return instance.apis.filter(service_provider__libertyfederation__user=user, active=True)
-
- def get_sources(self, context, instance):
- 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)
-
- def render(self, context, instance, placeholder):
- ctx = super(AuQuotidienBasePlugin, self).render(context, instance,
- placeholder)
- ctx['instance'] = instance
- return ctx
-
-
-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_citoyen2/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po b/portail_citoyen2/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po
deleted file mode 100644
index 0ec1b74..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/locale/fr/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,105 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-10 16:31+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: cms_plugins.py:59 models.py:67 models.py:68
-msgid "au-quotidien active forms"
-msgstr "affichage des démarches en cours"
-
-#: cms_plugins.py:71 models.py:82
-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:21
-msgid "origin"
-msgstr "origine"
-
-#: models.py:22
-msgid "hashing algorithm"
-msgstr "algorithme de hachage"
-
-#: models.py:24
-msgid "signature key"
-msgstr "clé de signature"
-
-#: 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:50
-msgid "au-quotidien API endpoint"
-msgstr "terminaison de l'API au-quotidien"
-
-#: models.py:51
-msgid "au-quotidien API endpoints"
-msgstr "terminaisons de l'API au-quotidien"
-
-#: models.py:56 models.py:71
-msgid "refresh timeout"
-msgstr "durée de rafraîchissement"
-
-#: models.py:57 models.py:72
-msgid "Number of seconds between two web service calls"
-msgstr "nombre de secondes entre deux appels au web-service"
-
-#: models.py:61 models.py:76
-msgid "refresh {0}"
-msgstr "durée de rafraîchissement {0}s"
-
-#: templates/auquotidien_plugin/categories.html:2
-msgid "Other procedures.."
-msgstr "Autres démarches..."
-
-#: templates/auquotidien_plugin/categories.html:20
-msgid "All categories"
-msgstr "Toutes les démarches"
diff --git a/portail_citoyen2/apps/auquotidien_plugin/migrations/0001_initial.py b/portail_citoyen2/apps/auquotidien_plugin/migrations/0001_initial.py
deleted file mode 100644
index 646dae0..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/migrations/0001_initial.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# -*- coding: utf-8 -*-
-from south.utils import datetime_utils as 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 'AuQuotidienAPI'
- db.create_table(u'auquotidien_plugin_auquotidienapi', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=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'auquotidien_plugin_auquotidienactiveformsplugin', (
- (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', ['AuQuotidienActiveFormsPlugin'])
-
- # Adding M2M table for field apis on 'AuQuotidienActiveFormsPlugin'
- m2m_table_name = db.shorten_name(u'auquotidien_plugin_auquotidienactiveformsplugin_apis')
- db.create_table(m2m_table_name, (
- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
- ('auquotidienactiveformsplugin', models.ForeignKey(orm[u'auquotidien_plugin.auquotidienactiveformsplugin'], null=False)),
- ('auquotidienapi', models.ForeignKey(orm[u'auquotidien_plugin.auquotidienapi'], null=False))
- ))
- db.create_unique(m2m_table_name, ['auquotidienactiveformsplugin_id', 'auquotidienapi_id'])
-
- # Adding model 'AuQuotidienCategoryPlugin'
- db.create_table(u'auquotidien_plugin_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'])
-
- # Adding M2M table for field apis on 'AuQuotidienCategoryPlugin'
- m2m_table_name = db.shorten_name(u'auquotidien_plugin_auquotidiencategoryplugin_apis')
- db.create_table(m2m_table_name, (
- ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
- ('auquotidiencategoryplugin', models.ForeignKey(orm[u'auquotidien_plugin.auquotidiencategoryplugin'], null=False)),
- ('auquotidienapi', models.ForeignKey(orm[u'auquotidien_plugin.auquotidienapi'], null=False))
- ))
- db.create_unique(m2m_table_name, ['auquotidiencategoryplugin_id', 'auquotidienapi_id'])
-
-
- def backwards(self, orm):
- # Deleting model 'AuQuotidienAPI'
- db.delete_table(u'auquotidien_plugin_auquotidienapi')
-
- # Deleting model 'AuQuotidienActiveFormsPlugin'
- db.delete_table(u'auquotidien_plugin_auquotidienactiveformsplugin')
-
- # Removing M2M table for field apis on 'AuQuotidienActiveFormsPlugin'
- db.delete_table(db.shorten_name(u'auquotidien_plugin_auquotidienactiveformsplugin_apis'))
-
- # Deleting model 'AuQuotidienCategoryPlugin'
- db.delete_table(u'auquotidien_plugin_auquotidiencategoryplugin')
-
- # Removing M2M table for field apis on 'AuQuotidienCategoryPlugin'
- db.delete_table(db.shorten_name(u'auquotidien_plugin_auquotidiencategoryplugin_apis'))
-
-
- 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'}),
- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
- 'namespace': ('django.db.models.fields.CharField', [], {'default': "('Default', 'Default')", 'max_length': '100'})
- },
- u'auquotidien_plugin.auquotidienactiveformsplugin': {
- 'Meta': {'object_name': 'AuQuotidienActiveFormsPlugin', '_ormbases': ['cms.CMSPlugin']},
- 'apis': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auquotidien_plugin.AuQuotidienAPI']", 'symmetrical': 'False'}),
- 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'})
- },
- u'auquotidien_plugin.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.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', '_ormbases': ['cms.CMSPlugin']},
- 'apis': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auquotidien_plugin.AuQuotidienAPI']", 'symmetrical': 'False'}),
- 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'},
- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
- },
- 'cms.placeholder': {
- 'Meta': {'object_name': 'Placeholder'},
- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
- },
- 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['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'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'map_attributes_from_push_sources': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'map_attributes_of_filtered_attributes': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
- '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'}),
- 'send_error_and_no_attrs_if_missing_required_attrs': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'source_filter_for_sso_from_push_sources': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'filter attributes of push sources with sources'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['attribute_aggregator.AttributeSource']"})
- },
- u'saml.libertyprovider': {
- 'Meta': {'ordering': "('name',)", 'object_name': 'LibertyProvider'},
- 'ca_cert_chain': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
- 'entity_id': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'}),
- 'entity_id_sha1': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'}),
- 'federation_source': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'metadata': ('django.db.models.fields.TextField', [], {}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '140', 'blank': 'True'}),
- 'protocol_conformance': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}),
- 'public_key': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
- 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '140'}),
- 'ssl_certificate': ('django.db.models.fields.TextField', [], {'blank': 'True'})
- },
- u'saml.libertyproviderpolicy': {
- 'Meta': {'object_name': 'LibertyProviderPolicy'},
- 'authn_request_signature_check_hint': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'})
- },
- u'saml.libertyserviceprovider': {
- 'Meta': {'object_name': 'LibertyServiceProvider'},
- 'attribute_policy': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attribute_policy'", 'null': 'True', 'to': u"orm['idp.AttributePolicy']"}),
- 'enable_following_attribute_policy': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'enable_following_sp_options_policy': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'liberty_provider': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'service_provider'", 'unique': 'True', 'primary_key': 'True', 'to': u"orm['saml.LibertyProvider']"}),
- 'policy': ('django.db.models.fields.related.ForeignKey', [], {'default': '1', 'to': u"orm['saml.LibertyProviderPolicy']", 'null': 'True'}),
- 'sp_options_policy': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sp_options_policy'", 'null': 'True', 'to': u"orm['saml.SPOptionsIdPPolicy']"})
- },
- u'saml.spoptionsidppolicy': {
- 'Meta': {'object_name': 'SPOptionsIdPPolicy'},
- 'accept_slo': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
- 'accepted_name_id_format': ('authentic2.saml.fields.MultiSelectField', [], {'max_length': '1024', 'blank': 'True'}),
- 'ask_user_consent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'authn_request_signed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'default_name_id_format': ('django.db.models.fields.CharField', [], {'default': "'none'", 'max_length': '256'}),
- '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'}),
- 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'})
- }
- }
-
- complete_apps = ['auquotidien_plugin']
\ No newline at end of file
diff --git a/portail_citoyen2/apps/auquotidien_plugin/migrations/__init__.py b/portail_citoyen2/apps/auquotidien_plugin/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/auquotidien_plugin/models.py b/portail_citoyen2/apps/auquotidien_plugin/models.py
deleted file mode 100644
index b4bf2ff..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/models.py
+++ /dev/null
@@ -1,82 +0,0 @@
-from django.utils.translation import ugettext as _
-from django.db import models
-
-
-from cms.models import CMSPlugin
-
-
-from data_source_plugin.models import DataSource
-
-
-__all__ = [ 'AuQuotidienAPI', 'AuQuotidienActiveFormsPlugin' ]
-
-class AuQuotidienAPI(models.Model):
- 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'))
- hash_algo = models.CharField(verbose_name=_('hashing algorithm'),
- 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'))
-
- @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]
-
- def __unicode__(self):
- return self.name
-
- @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 = ('order', 'name')
-
-
-class AuQuotidienActiveFormsPlugin(CMSPlugin):
- refresh = models.IntegerField(verbose_name=_('refresh timeout'), default=60,
- help_text=_('Number of seconds between two web service calls'))
- apis = models.ManyToManyField(AuQuotidienAPI, verbose_name=('au-quotidien API endpoints'))
-
- def __unicode__(self):
- return _('refresh {0}').format(self.refresh)
-
- def copy_relations(self, old_instance):
- self.apis = old_instance.apis.all()
-
- class Meta:
- 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'))
- apis = models.ManyToManyField(AuQuotidienAPI, verbose_name=('au-quotidien API endpoints'))
-
- def __unicode__(self):
- return _('refresh {0}').format(self.refresh)
-
- def copy_relations(self, old_instance):
- self.apis = old_instance.apis.all()
-
- class Meta:
- verbose_name = _('au-quotidien categories')
diff --git a/portail_citoyen2/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js b/portail_citoyen2/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js
deleted file mode 100644
index e6f2da8..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/static/auquotidien_plugin/js/categories.js
+++ /dev/null
@@ -1,54 +0,0 @@
-$(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);
- var $empty = $plugin.attr('data-empty');
-
- if ($plugin.data('initialized')) {
- return;
- }
- $plugin.data('initialized', 1);
-
- $titles.hide();
-
- if ($categories.length > 1) {
- if ($empty) {
- $categories.hide();
- } else {
- $categories.slice(1).hide();
- }
- // Create a selector from titles
- var $p = $('
');
- var $select = $(' ');
- if ($empty) {
- var $option = $(' ');
- $option.text($empty);
- $select.append($option);
- }
- for (var i = 0; i < $titles.length; i++) {
- var $body = $($categories[i]);
- var name = $body.attr('data-name');
- var $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);
- }
- });
-});
diff --git a/portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/active_forms.html b/portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/active_forms.html
deleted file mode 100644
index 64ad199..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/active_forms.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/categories.html b/portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/categories.html
deleted file mode 100644
index 1f68040..0000000
--- a/portail_citoyen2/apps/auquotidien_plugin/templates/auquotidien_plugin/categories.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{% load i18n sekizai_tags staticfiles %}
-
-
- {% for data_source in data_sources %}
- {% with base_url=data_source.data_source.api.base_url name=data_source.data_source.name %}
-
- {% endwith %}
- {% endfor %}
-
-{% addtoblock "js" %}{% endaddtoblock %}
diff --git a/portail_citoyen2/apps/data_source_plugin/__init__.py b/portail_citoyen2/apps/data_source_plugin/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/data_source_plugin/admin.py b/portail_citoyen2/apps/data_source_plugin/admin.py
deleted file mode 100644
index 2bc4be7..0000000
--- a/portail_citoyen2/apps/data_source_plugin/admin.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.contrib import admin
-from copy import copy
-
-from cms_plugins import DataSourcePlugin as DataSourcePluginAdmin
-from models import PluginDataSource, DataSource
-
-class PluginDataSourceInlineAdmin(admin.TabularInline):
- model = PluginDataSource
-
-class DataSourceAdmin(admin.ModelAdmin):
- list_display = [ 'name', 'mime_type', 'url' ]
- list_filter = ['mime_type']
-
-DataSourcePluginAdmin.inlines = copy(DataSourcePluginAdmin.inlines)
-DataSourcePluginAdmin.inlines.append(PluginDataSourceInlineAdmin)
-admin.site.register(DataSource, DataSourceAdmin)
diff --git a/portail_citoyen2/apps/data_source_plugin/cms_plugins.py b/portail_citoyen2/apps/data_source_plugin/cms_plugins.py
deleted file mode 100644
index 55b65ce..0000000
--- a/portail_citoyen2/apps/data_source_plugin/cms_plugins.py
+++ /dev/null
@@ -1,175 +0,0 @@
-import logging
-import hashlib
-from xml.etree import ElementTree as ET
-import time
-import threading
-
-from django.utils.translation import ugettext_lazy as _
-from django.conf import settings
-from django.core.cache import cache
-from django.template import Template
-
-import feedparser
-import requests
-from requests.exceptions import RequestException, HTTPError, Timeout
-
-from cms.plugin_base import CMSPluginBase
-from cms.plugin_pool import plugin_pool
-from models import DataSourcePlugin as DataSourcePluginModel, DataSource, RawInlineTemplatePlugin as RawInlineTemplatePluginModel
-import signature
-
-from allauth.socialaccount.models import SocialToken
-
-logger = logging.getLogger(__name__)
-
-CACHE_SENTINEL = object()
-
-class Data(object):
- '''Encapsulate data from a source'''
- MAPPING = {
- DataSource.JSON: 'json',
- DataSource.RSS: 'rss',
- DataSource.HTML: 'html',
- DataSource.XML: 'xml',
- }
-
- def __init__(self, data_source, context, limit, refresh, request=None):
- self.data_source = data_source
- self.kind = self.MAPPING.get(data_source.mime_type)
- self.context = context
- self.url = Template(self.data_source.url).render(self.context)
- self.limit = limit
- self.refresh = refresh
- self.key = hashlib.md5('datasource-{self.data_source.id}-{self.url}-{self.limit}-{self.refresh}'.format(self=self)).hexdigest()
- self.now = time.time()
- self.__content = CACHE_SENTINEL
- self.request = request
-
- def get_access_token(self):
- user = self.request.user
- try:
- token = SocialToken.objects.get(account__provider='authentic2',
- account__user=user)
- logger.debug('retrieved access token: %r', token)
- return token.token
- except SocialToken.DoesNotExist:
- logger.warning('unable to find a social token for user: %r', user)
- return ''
-
- def update_content(self):
- content = None
- try:
- self.final_url = self.url
- if self.data_source.signature_key:
- # remove the hmac- prefix
- hash_algo = self.data_source.auth_mech[:5]
- self.final_url = signature.sign_url(self.final_url.encode('ascii'),
- self.data_source.signature_key.encode('utf-8'),
- algo=hash_algo)
- logger.debug('getting data source %r from url %r',
- self.data_source.name, self.final_url)
- headers = {
- 'Accept': self.data_source.mime_type,
- }
- if self.data_source.auth_mech == 'oauth2':
- headers['Authorization'] = 'Bearer %s' % self.get_access_token()
- request = requests.get(self.final_url, headers=headers,
- verify=self.data_source.verify_certificate,
- allow_redirects=self.data_source.allow_redirects,
- timeout=self.data_source.timeout)
- request.raise_for_status()
- except HTTPError:
- logger.warning('HTTP Error %s when loading datasource %s from'
- ' URL %s', request.status_code, self.data_source.id, self.final_url)
- except Timeout:
- logger.warning('HTTP Request timeout(%s s) when loading datasource'
- ' %s from URL %s', self.data_source.timeout,
- self.data_source.id, self.final_url)
- except RequestException:
- logger.warning('HTTP Request failed when loading datasource'
- ' %s from URL %s', self.data_source.id, self.final_url)
- else:
- try:
- content = getattr(self, 'get_content_'+self.kind)(request)
- except Exception:
- logger.exception('decoding of content from %s failed', self.final_url)
- else:
- logger.debug('getting data source %r from url %r finished',
- self.data_source.id, self.final_url)
- if self.refresh and content is not None:
- cache.set(self.key, (content, self.now+self.refresh), 3600)
- return content
-
-
- def get_content(self):
- if self.__content is not CACHE_SENTINEL:
- return self.__content
- self.__content, until = cache.get(self.key, (CACHE_SENTINEL, None))
- use_cache = self.__content is not CACHE_SENTINEL
- # do not use cache if refresh timeout is 0
- use_cache = use_cache and self.refresh > 0
- # do not use cache if updatecache is present in the query string
- use_cache = use_cache and 'updatecache' not in self.context['request'].GET
-
- if use_cache:
- if until < self.now:
- # reload cache content asynchronously in a thread
- # and return the current content
- logger.debug('content from %r is stale launching reloading', self.url)
- threading.Thread(target=self.update_content).start()
- else:
- self.__content = self.update_content()
- return self.__content
- content = property(get_content)
-
-
- def get_content_json(self, request):
- try:
- return request.json()
- except ValueError:
- logger.warning('unable to decode json content from %s: %r', self.final_url, request.content[:20])
- return None
-
- def get_content_rss(self, request):
- result = feedparser.parse(request.content)
- result.entries = sorted(result.entries, key=lambda e: e['updated_parsed'])[:self.limit]
- return result
-
- def get_content_html(self, request):
- return request.text
-
- def get_content_xml(self, request):
- try:
- return ET.fromstring(request.content)
- except ET.ParseError:
- logger.error('unable to parse the XML content %r', request.content)
- return None
-
-class RawInlineTemplatePlugin(CMSPluginBase):
- model = RawInlineTemplatePluginModel
- name = _('Raw Inline Template Plugin')
- render_template = "data_source_plugin/plugin.html"
- text_enabled = True
-
- def icon_src(self, instance):
- return settings.STATIC_URL + u"cms/images/plugins/link.png"
-
-class DataSourcePlugin(CMSPluginBase):
- model = DataSourcePluginModel
- name = _('Data Source Plugin')
- render_template = None
- text_enabled = True
-
- def get_sources(self, context, instance):
- request = context['request']
- for source in instance.sources.all():
- yield Data(source.source, context, instance.limit, instance.refresh, request=request)
-
- def render(self, context, instance, placeholder):
- logger.debug('getting context of data source plugin %s', instance.id)
- context['data_sources'] = list(self.get_sources(context, instance))
- logger.debug('finished getting context of data source plugin %s', instance.id)
- return context
-
-plugin_pool.register_plugin(RawInlineTemplatePlugin)
-plugin_pool.register_plugin(DataSourcePlugin)
diff --git a/portail_citoyen2/apps/data_source_plugin/locale/fr/LC_MESSAGES/django.po b/portail_citoyen2/apps/data_source_plugin/locale/fr/LC_MESSAGES/django.po
deleted file mode 100644
index 2254639..0000000
--- a/portail_citoyen2/apps/data_source_plugin/locale/fr/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,110 +0,0 @@
-# Translation of portail-citoyen strings
-# Copyright (C) 2013 Entr'ouvert
-# This file is distributed under the same license as the portail-citoyen package.
-# Benjamin Dauvergne , 2013.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: portail_citoyen2 0.1.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-11-13 16:06+0100\n"
-"PO-Revision-Date: 2013-11-13 16:07+0100\n"
-"Last-Translator: Benjamin Dauvergne \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: cms_plugins.py:124
-msgid "Raw Inline Template Plugin"
-msgstr "Plugin de contenu brut"
-
-#: cms_plugins.py:133
-msgid "Data Source Plugin"
-msgstr "Plugin source de donnée"
-
-#: models.py:25
-msgid "JSON"
-msgstr ""
-
-#: models.py:26
-msgid "RSS"
-msgstr ""
-
-#: models.py:27
-msgid "HTML"
-msgstr ""
-
-#: models.py:28
-msgid "XML"
-msgstr ""
-
-#: models.py:37
-msgid "Name"
-msgstr "Nom"
-
-#: models.py:38
-msgid "MIME Type"
-msgstr "Type MIME"
-
-#: models.py:40
-msgid "URL"
-msgstr ""
-
-#: models.py:42
-msgid "Hashing algorithm"
-msgstr "Algorithme de condensat"
-
-#: models.py:44
-msgid "Signature key"
-msgstr "Clé de signature"
-
-#: models.py:46
-msgid "verify certificate"
-msgstr "Vérifier les certificats"
-
-#: models.py:51
-msgid "You must choose a hashing algorithm if you set a signature key"
-msgstr "Vous devez choisir une algorithme de condensat si vous définissez une clé de signature"
-
-#: models.py:55
-msgid "Data source {name}, url: {url} mime-type: {mime_type}"
-msgstr "Source de donnée {name}, url: {url}, mime-type: {mime_type}"
-
-#: models.py:59
-msgid "Data source"
-msgstr "Source de données"
-
-#: models.py:60
-msgid "Data sources"
-msgstr "Sources de données"
-
-#: models.py:76
-msgid "Overloaded template"
-msgstr "Template surchargé"
-
-#: models.py:91 models.py:95
-msgid "Raw inline template plugin"
-msgstr "Plugin de contenu brut"
-
-#: models.py:92
-msgid "Raw inline template plugins"
-msgstr "Plugins de contenu brut"
-
-#: models.py:99
-msgid "Maximum entries"
-msgstr "Nombre maximum de lignes"
-
-#: models.py:100
-msgid "Refresh timeout"
-msgstr "Temps entre les rafraichissements des données"
-
-#: models.py:101
-msgid "Number of seconds between two web service calls"
-msgstr "Nombre de seconds entre deux appels à un web-service"
-
-#: models.py:108
-#, python-format
-msgid "DataSource with %d sources"
-msgstr "Plugin contenant %d sources"
diff --git a/portail_citoyen2/apps/data_source_plugin/migrations/0001_initial.py b/portail_citoyen2/apps/data_source_plugin/migrations/0001_initial.py
deleted file mode 100644
index d0ed8ee..0000000
--- a/portail_citoyen2/apps/data_source_plugin/migrations/0001_initial.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# -*- coding: utf-8 -*-
-from south.utils import datetime_utils as 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 'DataSource'
- db.create_table(u'data_source_plugin_datasource', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('name', self.gf('django.db.models.fields.CharField')(max_length=32)),
- ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=256)),
- ('url', self.gf('django.db.models.fields.URLField')(max_length=1024)),
- ('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'data_source_plugin', ['DataSource'])
-
- # Adding model 'PluginDataSource'
- db.create_table(u'data_source_plugin_plugindatasource', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('source', self.gf('django.db.models.fields.related.ForeignKey')(related_name='plugins', to=orm['data_source_plugin.DataSource'])),
- ('plugin', self.gf('django.db.models.fields.related.ForeignKey')(related_name='sources', to=orm['data_source_plugin.DataSourcePlugin'])),
- ('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
- ))
- db.send_create_signal(u'data_source_plugin', ['PluginDataSource'])
-
- # Adding model 'RawInlineTemplatePlugin'
- db.create_table(u'data_source_plugin_rawinlinetemplateplugin', (
- (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)),
- ))
- db.send_create_signal(u'data_source_plugin', ['RawInlineTemplatePlugin'])
-
- # Adding model 'DataSourcePlugin'
- db.create_table(u'data_source_plugin_datasourceplugin', (
- (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)),
- ('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'data_source_plugin', ['DataSourcePlugin'])
-
-
- def backwards(self, orm):
- # Deleting model 'DataSource'
- db.delete_table(u'data_source_plugin_datasource')
-
- # Deleting model 'PluginDataSource'
- db.delete_table(u'data_source_plugin_plugindatasource')
-
- # Deleting model 'RawInlineTemplatePlugin'
- db.delete_table(u'data_source_plugin_rawinlinetemplateplugin')
-
- # Deleting model 'DataSourcePlugin'
- db.delete_table(u'data_source_plugin_datasourceplugin')
-
-
- models = {
- 'cms.cmsplugin': {
- 'Meta': {'object_name': 'CMSPlugin'},
- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
- },
- 'cms.placeholder': {
- 'Meta': {'object_name': 'Placeholder'},
- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
- },
- u'data_source_plugin.datasource': {
- 'Meta': {'ordering': "('name',)", 'object_name': 'DataSource'},
- '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'}),
- 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
- 'signature_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}),
- 'timeout': ('django.db.models.fields.IntegerField', [], {'default': '10'}),
- 'url': ('django.db.models.fields.URLField', [], {'max_length': '1024'}),
- 'verify_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
- },
- u'data_source_plugin.datasourceplugin': {
- 'Meta': {'object_name': 'DataSourcePlugin'},
- 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'})
- },
- u'data_source_plugin.plugindatasource': {
- 'Meta': {'ordering': "('order', 'id')", 'object_name': 'PluginDataSource'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
- 'plugin': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sources'", 'to': u"orm['data_source_plugin.DataSourcePlugin']"}),
- 'source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'plugins'", 'to': u"orm['data_source_plugin.DataSource']"})
- },
- u'data_source_plugin.rawinlinetemplateplugin': {
- 'Meta': {'object_name': 'RawInlineTemplatePlugin'},
- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
- 'template_source': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'})
- }
- }
-
- complete_apps = ['data_source_plugin']
\ No newline at end of file
diff --git a/portail_citoyen2/apps/data_source_plugin/migrations/0002_rename_hash_algo.py b/portail_citoyen2/apps/data_source_plugin/migrations/0002_rename_hash_algo.py
deleted file mode 100644
index c89214d..0000000
--- a/portail_citoyen2/apps/data_source_plugin/migrations/0002_rename_hash_algo.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# -*- coding: utf-8 -*-
-from south.db import db
-from south.v2 import SchemaMigration
-
-
-class Migration(SchemaMigration):
- no_dry_run = True
-
- def forwards(self, orm):
- db.rename_column('data_source_plugin_datasource', 'hash_algo', 'auth_mech')
- for ds in orm.DataSource.objects.all():
- if ds.auth_mech.startswith('sha'):
- ds.auth_mech = 'hmac-' + ds.auth_mech
- ds.save()
-
- def backwards(self, orm):
- db.rename_column('data_source_plugin_datasource', 'auth_mech', 'hash_algo')
- for ds in orm.DataSource.objects.all():
- if ds.auth_mech.startswith('hmac-'):
- ds.auth_mech = ds.auth_mech[5:]
- ds.save()
- if ds.auth_mech == 'oauth2':
- ds.delete()
-
- models = {
- 'cms.cmsplugin': {
- 'Meta': {'object_name': 'CMSPlugin'},
- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
- },
- 'cms.placeholder': {
- 'Meta': {'object_name': 'Placeholder'},
- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
- },
- u'data_source_plugin.datasource': {
- 'Meta': {'ordering': "('name',)", 'object_name': 'DataSource'},
- 'allow_redirects': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
- 'auth_mech': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '16', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
- 'signature_key': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128', 'blank': 'True'}),
- 'timeout': ('django.db.models.fields.IntegerField', [], {'default': '10'}),
- 'url': ('django.db.models.fields.URLField', [], {'max_length': '1024'}),
- 'verify_certificate': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
- },
- u'data_source_plugin.datasourceplugin': {
- 'Meta': {'object_name': 'DataSourcePlugin'},
- 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'})
- },
- u'data_source_plugin.plugindatasource': {
- 'Meta': {'ordering': "('order', 'id')", 'object_name': 'PluginDataSource'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
- 'plugin': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sources'", 'to': u"orm['data_source_plugin.DataSourcePlugin']"}),
- 'source': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'plugins'", 'to': u"orm['data_source_plugin.DataSource']"})
- },
- u'data_source_plugin.rawinlinetemplateplugin': {
- 'Meta': {'object_name': 'RawInlineTemplatePlugin'},
- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
- 'template_source': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'})
- }
- }
-
- complete_apps = ['data_source_plugin']
diff --git a/portail_citoyen2/apps/data_source_plugin/migrations/__init__.py b/portail_citoyen2/apps/data_source_plugin/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/data_source_plugin/models.py b/portail_citoyen2/apps/data_source_plugin/models.py
deleted file mode 100644
index 393c9dc..0000000
--- a/portail_citoyen2/apps/data_source_plugin/models.py
+++ /dev/null
@@ -1,115 +0,0 @@
-from django.template import Template
-from django.core.exceptions import ValidationError
-from django.template.base import TemplateSyntaxError
-from django.utils.translation import ugettext as _
-from django.db import models
-
-from cms.models import CMSPlugin
-
-__all__ = [ 'DataSource', 'PluginDataSource', 'DataSourcePlugin' ]
-
-def validate_template(value):
- try:
- Template(value)
- except TemplateSyntaxError, e:
- raise ValidationError(*e.args)
-
-
-class DataSource(models.Model):
- JSON = 'application/json'
- RSS = 'application/rss+xml'
- HTML = 'text/html'
- XML = 'text/xml'
-
- CHOICES = (
- (JSON, _('JSON')),
- (RSS, _('RSS')),
- (HTML, _('HTML')),
- (XML, _('XML')),
- )
-
- HASHES = (
- ('', 'None'),
- ('hmac-sha256', 'HMAC-SHA-256'),
- ('hmac-sha1', 'HMAC-SHA-1'),
- ('oauth2', 'OAuth2'),
- )
-
- name = models.CharField(verbose_name=_('Name'), max_length=32)
- mime_type = models.CharField(max_length=256, verbose_name=_('MIME Type'),
- choices=CHOICES)
- url = models.URLField(verbose_name=_('URL'), max_length=1024,
- validators=[validate_template])
- auth_mech = models.CharField(verbose_name=_('Authentication mechanism'),
- max_length=16, choices=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 clean(self):
- if self.signature_key and (not self.auth_mech or not self.auth_mech.startswith('hmac-')):
- raise ValidationError(_('You must choose a hashing algorithm if '
- 'you set a signature key'))
-
- def __unicode__(self):
- return _('Data source {name}, url: {url} mime-type: {mime_type}').format(
- name=self.name, mime_type=self.mime_type, url=self.url)
-
- class Meta:
- verbose_name = _('Data source')
- verbose_name_plural = _('Data sources')
- ordering = ('name',)
-
-
-class PluginDataSource(models.Model):
- source = models.ForeignKey('DataSource', related_name='plugins')
- plugin = models.ForeignKey('DataSourcePlugin', related_name='sources')
- order = models.IntegerField(default=0)
-
- def __unicode__(self):
- return unicode(self.source)
-
- class Meta:
- ordering = ('order', 'id')
-
-class InlineTemplatePlugin(CMSPlugin):
- template_source = models.TextField(verbose_name=_('Overloaded template'),
- blank=True, default='', validators=[validate_template])
-
- @property
- def render_template(self):
- return Template(self.template_source)
-
- class Meta:
- abstract = True
-
-
-class RawInlineTemplatePlugin(InlineTemplatePlugin):
- class Meta:
- verbose_name = _('Raw inline template plugin')
- verbose_name_plural = _('Raw inline template plugins')
-
- def __unicode__(self):
- return _('Raw inline template plugin')
-
-
-class DataSourcePlugin(InlineTemplatePlugin):
- limit = models.IntegerField(verbose_name=_('Maximum entries'), default=10)
- refresh = models.IntegerField(verbose_name=_('Refresh timeout'), default=60,
- help_text=_('Number of seconds between two web service calls'))
-
- def copy_relations(self, old_instance):
- for source in old_instance.sources.all():
- self.sources.create(source=source.source, order=source.order)
-
- def __unicode__(self):
- s = _('DataSource with %d sources') % self.sources.count()
- return s
diff --git a/portail_citoyen2/apps/data_source_plugin/signature.py b/portail_citoyen2/apps/data_source_plugin/signature.py
deleted file mode 100644
index 67e798b..0000000
--- a/portail_citoyen2/apps/data_source_plugin/signature.py
+++ /dev/null
@@ -1,71 +0,0 @@
-import datetime
-import base64
-import hmac
-import hashlib
-import urllib
-import random
-import urlparse
-
-'''Simple signature scheme for query strings'''
-
-def sign_url(url, key, algo='sha256', timestamp=None, nonce=None):
- parsed = urlparse.urlparse(url)
- new_query = sign_query(parsed.query, key, algo, timestamp, nonce)
- return urlparse.urlunparse(parsed[:4] + (new_query,) + parsed[5:])
-
-def sign_query(query, key, algo='sha256', timestamp=None, nonce=None):
- if timestamp is None:
- timestamp = datetime.datetime.utcnow()
- timestamp = timestamp.strftime('%Y-%m-%dT%H:%M:%SZ')
- if nonce is None:
- nonce = hex(random.getrandbits(128))[2:]
- new_query = query
- if new_query:
- new_query += '&'
- new_query += urllib.urlencode((
- ('algo', algo),
- ('timestamp', timestamp),
- ('nonce', nonce)))
- signature = base64.b64encode(sign_string(new_query, key, algo=algo))
- new_query += '&signature=' + urllib.quote(signature)
- return new_query
-
-def sign_string(s, key, algo='sha256', timedelta=30):
- digestmod = getattr(hashlib, algo)
- hash = hmac.HMAC(key, digestmod=digestmod, msg=s)
- return hash.digest()
-
-def check_url(url, key, known_nonce=None, timedelta=30):
- parsed = urlparse.urlparse(url, 'https')
- return check_query(parsed.query, key)
-
-def check_query(query, key, known_nonce=None, timedelta=30):
- parsed = urlparse.parse_qs(query)
- signature = base64.b64decode(parsed['signature'][0])
- algo = parsed['algo'][0]
- timestamp = parsed['timestamp'][0]
- timestamp = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%SZ')
- nonce = parsed['nonce']
- unsigned_query = query.split('&signature=')[0]
- if known_nonce is not None and known_nonce(nonce):
- return False
- print 'timedelta', datetime.datetime.utcnow() - timestamp
- if abs(datetime.datetime.utcnow() - timestamp) > datetime.timedelta(seconds=timedelta):
- return False
- return check_string(unsigned_query, signature, key, algo=algo)
-
-def check_string(s, signature, key, algo='sha256'):
- # constant time compare
- signature2 = sign_string(s, key, algo=algo)
- if len(signature2) != len(signature):
- return False
- res = 0
- for a, b in zip(signature, signature2):
- res |= ord(a) ^ ord(b)
- return res == 0
-
-if __name__ == '__main__':
- test_key = '12345'
- signed_query = sign_query('NameId=_12345&orig=montpellier', test_key)
- assert check_query(signed_query, test_key, timedelta=0) is False
- assert check_query(signed_query, test_key) is True
diff --git a/portail_citoyen2/apps/data_source_plugin/templates/data_source_plugin/plugin.html b/portail_citoyen2/apps/data_source_plugin/templates/data_source_plugin/plugin.html
deleted file mode 100644
index ac8aaa7..0000000
--- a/portail_citoyen2/apps/data_source_plugin/templates/data_source_plugin/plugin.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% for source in data_sources %}
- {% if plugin.debug %}
-
- Url: {{ source.url }}
- Content:
-
- {{ source.content|pprint }}
-
-
- {% elif source.kind == 'rss' %}
- {% for entry in source.content.entries|dictsort:"updated_parsed" %}
- {{ entry.title }}
- {% endfor %}
- {% endif %}
-{% endfor %}
diff --git a/portail_citoyen2/apps/data_source_plugin/tests.py b/portail_citoyen2/apps/data_source_plugin/tests.py
deleted file mode 100644
index 501deb7..0000000
--- a/portail_citoyen2/apps/data_source_plugin/tests.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-This file demonstrates writing tests using the unittest module. These will pass
-when you run "manage.py test".
-
-Replace this with more appropriate tests for your application.
-"""
-
-from django.test import TestCase
-
-
-class SimpleTest(TestCase):
- def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
- self.assertEqual(1 + 1, 2)
diff --git a/portail_citoyen2/apps/data_source_plugin/views.py b/portail_citoyen2/apps/data_source_plugin/views.py
deleted file mode 100644
index 60f00ef..0000000
--- a/portail_citoyen2/apps/data_source_plugin/views.py
+++ /dev/null
@@ -1 +0,0 @@
-# Create your views here.
diff --git a/portail_citoyen2/apps/feed_plugin/__init__.py b/portail_citoyen2/apps/feed_plugin/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/feed_plugin/admin.py b/portail_citoyen2/apps/feed_plugin/admin.py
deleted file mode 100644
index ec21c06..0000000
--- a/portail_citoyen2/apps/feed_plugin/admin.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from django.contrib import admin
-
-from . import models
-
-class FeedAdmin(admin.ModelAdmin):
- list_display = [ 'name', 'url', 'color_hex', 'css_classes' ]
-
-admin.site.register(models.Feed, FeedAdmin)
diff --git a/portail_citoyen2/apps/feed_plugin/cms_plugins.py b/portail_citoyen2/apps/feed_plugin/cms_plugins.py
deleted file mode 100644
index 08722c7..0000000
--- a/portail_citoyen2/apps/feed_plugin/cms_plugins.py
+++ /dev/null
@@ -1,75 +0,0 @@
-import logging
-
-from django.utils.translation import ugettext_lazy as _
-
-
-from cms.plugin_base import CMSPluginBase
-from cms.plugin_pool import plugin_pool
-
-from . import models
-from . import forms
-
-
-logger = logging.getLogger(__name__)
-
-
-class SelectUserFeedPlugin(CMSPluginBase):
- model = models.SelectUserFeed
- name = _('select user feeds')
- render_template = 'feed_plugin/select_user_feed.html'
- text_enabled = True
-
- def render(self, context, instance, placeholder):
- request = context['request']
- user = request.user
- submit = 'select-user-feed-plugin-%s' % instance.id
- if request.method == 'POST' and submit in request.POST:
- form = forms.FeedForm(data=request.POST)
- if form.is_valid():
- models.FeedPreference.objects.filter(user=user).delete()
- for feed in form.cleaned_data['feeds']:
- models.FeedPreference.objects.get_or_create(
- user=user, feed=feed)
- else:
- initial = dict(feeds=models.FeedPreference.objects.filter(user=user)
- .values_list('feed_id', flat=True))
- form = forms.FeedForm(initial=initial)
- context.update(dict(form=form, submit=submit))
- return context
-
-class ShowUserFeedPlugin(CMSPluginBase):
- model = models.ShowUserFeed
- name = _('show user feeds')
- render_template = 'feed_plugin/show_user_feed.html'
- text_enabled = True
-
- def get_feeds(self, instance, user):
- entries = []
- feeds = models.Feed.objects.filter(feedpreference__user=user) \
- .order_by('id')
- for feed in feeds:
- feed_entries = feed.get_feed_entries(instance.limit,
- instance.timeout)
- if feed_entries:
- for date, title, link in feed_entries:
- entries.append((date, title, link, feed))
- entries.sort(reverse=True)
- entries = entries[:instance.limit]
- entries = [{
- 'title': title,
- 'link': link,
- 'feed_name': feed.name,
- 'color_hex': feed.color_hex,
- 'css_classes': feed.css_classes
- } for date, title, link, feed in entries]
- return entries
-
- def render(self, context, instance, placeholder):
- request = context['request']
- entries = self.get_feeds(instance, request.user)
- context.update({'entries': entries})
- return context
-
-
-plugin_pool.register_plugin(SelectUserFeedPlugin)
-plugin_pool.register_plugin(ShowUserFeedPlugin)
diff --git a/portail_citoyen2/apps/feed_plugin/forms.py b/portail_citoyen2/apps/feed_plugin/forms.py
deleted file mode 100644
index 5506fd4..0000000
--- a/portail_citoyen2/apps/feed_plugin/forms.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django import forms
-from django.utils.translation import ugettext as _
-
-from . import models
-from . import widgets
-
-class FeedForm(forms.Form):
- feeds = forms.ModelMultipleChoiceField(queryset=models.Feed.objects.all(),
- label=_('Your feeds'), widget=widgets.CheckboxMultipleSelect,
- required=False)
diff --git a/portail_citoyen2/apps/feed_plugin/locale/fr/LC_MESSAGES/django.po b/portail_citoyen2/apps/feed_plugin/locale/fr/LC_MESSAGES/django.po
deleted file mode 100644
index c600a5f..0000000
--- a/portail_citoyen2/apps/feed_plugin/locale/fr/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,59 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-24 23:01+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: cms_plugins.py:18
-msgid "select user feeds"
-msgstr "Choisir ses flux"
-
-#: cms_plugins.py:42
-msgid "show user feeds"
-msgstr "Afficher les flux de l'utilisateur"
-
-#: forms.py:8
-msgid "Your feeds"
-msgstr "Vos flux"
-
-#: models.py:11
-msgid "user feed subscription"
-msgstr "abonnement à un flux RSS"
-
-#: models.py:12
-msgid "user feed subscriptions"
-msgstr "abonnements aux flux RSS"
-
-#: models.py:22
-msgid "name"
-msgstr "nom"
-
-#: models.py:24
-msgid "CSS classes"
-msgstr "classe CSS"
-
-#: models.py:27
-msgid "feed"
-msgstr "flux"
-
-#: models.py:28
-msgid "feeds"
-msgstr "flux"
-
-#: templates/feed_plugin/select_user_feed.html:5
-msgid "Validate"
-msgstr "Valider"
diff --git a/portail_citoyen2/apps/feed_plugin/migrations/0001_initial.py b/portail_citoyen2/apps/feed_plugin/migrations/0001_initial.py
deleted file mode 100644
index a521dc6..0000000
--- a/portail_citoyen2/apps/feed_plugin/migrations/0001_initial.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# -*- coding: utf-8 -*-
-from south.utils import datetime_utils as 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 'FeedPreference'
- db.create_table(u'feed_plugin_feedpreference', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
- ('feed', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['feed_plugin.Feed'])),
- ))
- db.send_create_signal(u'feed_plugin', ['FeedPreference'])
-
- # Adding model 'SelectUserFeed'
- db.create_table(u'feed_plugin_selectuserfeed', (
- (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
- ))
- db.send_create_signal(u'feed_plugin', ['SelectUserFeed'])
-
- # Adding model 'ShowUserFeed'
- db.create_table(u'feed_plugin_showuserfeed', (
- (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
- ('limit', self.gf('django.db.models.fields.PositiveIntegerField')(default=10)),
- ('timeout', self.gf('django.db.models.fields.PositiveIntegerField')(default=60)),
- ))
- db.send_create_signal(u'feed_plugin', ['ShowUserFeed'])
-
- # Adding model 'Feed'
- db.create_table(u'feed_plugin_feed', (
- (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('name', self.gf('django.db.models.fields.CharField')(max_length=32)),
- ('url', self.gf('django.db.models.fields.URLField')(max_length=200)),
- ('color_hex', self.gf('django.db.models.fields.CharField')(max_length=6, blank=True)),
- ('css_classes', self.gf('django.db.models.fields.CharField')(max_length=128, blank=True)),
- ))
- db.send_create_signal(u'feed_plugin', ['Feed'])
-
-
- def backwards(self, orm):
- # Deleting model 'FeedPreference'
- db.delete_table(u'feed_plugin_feedpreference')
-
- # Deleting model 'SelectUserFeed'
- db.delete_table(u'feed_plugin_selectuserfeed')
-
- # Deleting model 'ShowUserFeed'
- db.delete_table(u'feed_plugin_showuserfeed')
-
- # Deleting model 'Feed'
- db.delete_table(u'feed_plugin_feed')
-
-
- models = {
- u'auth.group': {
- 'Meta': {'object_name': 'Group'},
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
- 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
- },
- u'auth.permission': {
- 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
- 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
- },
- u'auth.user': {
- 'Meta': {'object_name': 'User'},
- 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
- 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
- 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
- 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
- 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
- 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
- },
- 'cms.cmsplugin': {
- 'Meta': {'object_name': 'CMSPlugin'},
- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
- },
- 'cms.placeholder': {
- 'Meta': {'object_name': 'Placeholder'},
- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
- },
- u'contenttypes.contenttype': {
- 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
- 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
- },
- u'feed_plugin.feed': {
- 'Meta': {'object_name': 'Feed'},
- 'color_hex': ('django.db.models.fields.CharField', [], {'max_length': '6', 'blank': 'True'}),
- 'css_classes': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
- 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
- },
- u'feed_plugin.feedpreference': {
- 'Meta': {'object_name': 'FeedPreference'},
- 'feed': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['feed_plugin.Feed']"}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
- },
- u'feed_plugin.selectuserfeed': {
- 'Meta': {'object_name': 'SelectUserFeed', '_ormbases': ['cms.CMSPlugin']},
- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'})
- },
- u'feed_plugin.showuserfeed': {
- 'Meta': {'object_name': 'ShowUserFeed', '_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.PositiveIntegerField', [], {'default': '10'}),
- 'timeout': ('django.db.models.fields.PositiveIntegerField', [], {'default': '60'})
- }
- }
-
- complete_apps = ['feed_plugin']
\ No newline at end of file
diff --git a/portail_citoyen2/apps/feed_plugin/migrations/__init__.py b/portail_citoyen2/apps/feed_plugin/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/feed_plugin/models.py b/portail_citoyen2/apps/feed_plugin/models.py
deleted file mode 100644
index ad784fc..0000000
--- a/portail_citoyen2/apps/feed_plugin/models.py
+++ /dev/null
@@ -1,90 +0,0 @@
-import hashlib
-import datetime
-import logging
-
-from django.db import models
-from django.conf import settings
-from django.utils.translation import ugettext_lazy as _
-from django.utils.html import strip_tags
-from django.core.cache import cache
-
-import feedparser
-
-from cms.models import CMSPlugin
-
-from . import utils
-
-logger = logging.getLogger(__name__)
-
-class FeedPreference(models.Model):
- user = models.ForeignKey(settings.AUTH_USER_MODEL)
- feed = models.ForeignKey('Feed')
-
- class Meta:
- verbose_name = _('user feed subscription')
- verbose_name_plural = _('user feed subscriptions')
-
-class SelectUserFeed(CMSPlugin):
- pass
-
-class ShowUserFeed(CMSPlugin):
- limit = models.PositiveIntegerField(default=10)
- timeout = models.PositiveIntegerField(default=60)
-
-class Feed(models.Model):
- name = models.CharField(max_length=32, verbose_name=_('name'))
- url = models.URLField()
- color_hex = models.CharField(max_length=6,
- verbose_name=_('Color'),
- help_text=_('as an hexadecimal number'),
- blank=True)
- css_classes = models.CharField(max_length=128,
- verbose_name=_('CSS classes'),
- blank=True)
-
- def load(self, now=None, limit=9999):
- if now is None:
- now = datetime.datetime.utcnow()
- feed = feedparser.parse(self.url)
- key = self.cache_key()
- entries = []
- for entry in feed.entries:
- for attribute in ('published_parsed', 'updated_parsed',
- 'created_parsed', 'expired_parsed'):
- date = getattr(entry, attribute, None)
- if date is not None:
- break
- if date is None:
- continue
- title = strip_tags(entry.title.strip())
- if not title:
- title = strip_tags(entry.description.strip())
- title = ' '.join(title.split(' ')[:30])
- if not title:
- continue
- entries.append((date, title, entry.link))
- entries.sort(reverse=True)
- entries = entries[:limit]
- cache.set(key, (entries, now))
- duration = datetime.datetime.utcnow()-now
- logger.debug('loaded RSS feed %r in %s seconds', self.url, duration.seconds)
- return entries
-
- def cache_key(self):
- return hashlib.md5(self.url).hexdigest()
-
- def get_feed_entries(self, limit=10, timeout=3600):
- key = self.cache_key()
- now = datetime.datetime.utcnow()
- entries, stamp = cache.get(key, (None, None))
- if entries is None or now-stamp > datetime.timedelta(seconds=timeout):
- utils.launch_in_thread(key, self.load, now, limit)
- return entries
-
-
- class Meta:
- verbose_name = _('feed')
- verbose_name_plural = _('feeds')
-
- def __unicode__(self):
- return self.name
diff --git a/portail_citoyen2/apps/feed_plugin/templates/feed_plugin/select_user_feed.html b/portail_citoyen2/apps/feed_plugin/templates/feed_plugin/select_user_feed.html
deleted file mode 100644
index 41ec1aa..0000000
--- a/portail_citoyen2/apps/feed_plugin/templates/feed_plugin/select_user_feed.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% load i18n %}
-
diff --git a/portail_citoyen2/apps/feed_plugin/templates/feed_plugin/show_user_feed.html b/portail_citoyen2/apps/feed_plugin/templates/feed_plugin/show_user_feed.html
deleted file mode 100644
index e13c21b..0000000
--- a/portail_citoyen2/apps/feed_plugin/templates/feed_plugin/show_user_feed.html
+++ /dev/null
@@ -1,8 +0,0 @@
-
diff --git a/portail_citoyen2/apps/feed_plugin/utils.py b/portail_citoyen2/apps/feed_plugin/utils.py
deleted file mode 100644
index f6f37e0..0000000
--- a/portail_citoyen2/apps/feed_plugin/utils.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import logging
-import threading
-
-
-from django.core.cache import cache
-
-logger = logging.getLogger(__name__)
-
-def launch_in_thread(key, function, *args, **kwargs):
- '''Launch a function in a thread, prevent launching the same function many times using a lock'''
- key = 'thread-' + key
- created = cache.add(key, 1)
- if created:
- logger.debug('launching thread for %s', key)
- def f():
- try:
- function(*args, **kwargs)
- finally:
- cache.delete(key)
- thread = threading.Thread(target=f)
- thread.start()
-
-
diff --git a/portail_citoyen2/apps/feed_plugin/widgets.py b/portail_citoyen2/apps/feed_plugin/widgets.py
deleted file mode 100644
index 30a7262..0000000
--- a/portail_citoyen2/apps/feed_plugin/widgets.py
+++ /dev/null
@@ -1,104 +0,0 @@
-from itertools import chain
-
-from django.forms.widgets import SubWidget, SelectMultiple
-from django.forms.util import flatatt
-from django.utils.html import conditional_escape
-from django.utils.encoding import StrAndUnicode, force_unicode
-from django.utils.safestring import mark_safe
-
-class CheckboxInput(SubWidget):
- """
- An object used by CheckboxRenderer that represents a single
- .
- """
- def __init__(self, name, value, attrs, choice, index):
- self.name, self.value = name, value
- self.attrs = attrs
- self.choice_value = force_unicode(choice[0])
- self.choice_label = force_unicode(choice[1])
- self.index = index
-
- def __unicode__(self):
- return self.render()
-
- def render(self, name=None, value=None, attrs=None, choices=()):
- name = name or self.name
- value = value or self.value
- attrs = attrs or self.attrs
-
- if 'id' in self.attrs:
- label_for = ' for="%s_%s"' % (self.attrs['id'], self.index)
- else:
- label_for = ''
- choice_label = conditional_escape(force_unicode(self.choice_label))
- return mark_safe(u'%s %s ' % (label_for, self.tag(), choice_label))
-
- def is_checked(self):
- return self.choice_value in self.value
-
- def tag(self):
- if 'id' in self.attrs:
- self.attrs['id'] = '%s_%s' % (self.attrs['id'], self.index)
- final_attrs = dict(self.attrs, type='checkbox', name=self.name, value=self.choice_value)
- if self.is_checked():
- final_attrs['checked'] = 'checked'
- return mark_safe(u' ' % flatatt(final_attrs))
-
-class CheckboxRenderer(StrAndUnicode):
- def __init__(self, name, value, attrs, choices):
- self.name, self.value, self.attrs = name, value, attrs
- self.choices = choices
-
- def __iter__(self):
- for i, choice in enumerate(self.choices):
- yield CheckboxInput(self.name, self.value, self.attrs.copy(), choice, i)
-
- def __getitem__(self, idx):
- choice = self.choices[idx] # Let the IndexError propogate
- return CheckboxInput(self.name, self.value, self.attrs.copy(), choice, idx)
-
- def __unicode__(self):
- return self.render()
-
- def render(self):
- """Outputs a for this set of checkbox fields."""
- return mark_safe(u'' % u'\n'.join([u'%s '
- % force_unicode(w) for w in self]))
-
-class CheckboxMultipleSelect(SelectMultiple):
- """
- Checkbox multi select field that enables iteration of each checkbox
- Similar to django.forms.widgets.RadioSelect
- """
- renderer = CheckboxRenderer
-
- def __init__(self, *args, **kwargs):
- # Override the default renderer if we were passed one.
- renderer = kwargs.pop('renderer', None)
- if renderer:
- self.renderer = renderer
- super(CheckboxMultipleSelect, self).__init__(*args, **kwargs)
-
- def subwidgets(self, name, value, attrs=None, choices=()):
- for widget in self.get_renderer(name, value, attrs, choices):
- yield widget
-
- def get_renderer(self, name, value, attrs=None, choices=()):
- """Returns an instance of the renderer."""
- if value is None: value = ''
- str_values = set([force_unicode(v) for v in value]) # Normalize to string.
- if attrs is None:
- attrs = {}
- if 'id' not in attrs:
- attrs['id'] = name
- final_attrs = self.build_attrs(attrs)
- choices = list(chain(self.choices, choices))
- return self.renderer(name, str_values, final_attrs, choices)
-
- def render(self, name, value, attrs=None, choices=()):
- return self.get_renderer(name, value, attrs, choices).render()
-
- def id_for_label(self, id_):
- if id_:
- id_ += '_0'
- return id_
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/__init__.py b/portail_citoyen2/apps/passerelle_register_plugin/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/cms_plugins.py b/portail_citoyen2/apps/passerelle_register_plugin/cms_plugins.py
deleted file mode 100644
index 863c8a1..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/cms_plugins.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from django.utils.translation import ugettext_lazy as _
-
-
-from cms.plugin_pool import plugin_pool
-
-
-from portail_citoyen2.cms_plugins import FormPluginBase
-from . import models, forms
-
-
-class PasserelleRegisterPlugin(FormPluginBase):
- model = models.PasserelleRegisterPlugin
- name = _('passerelle register plugin')
- render_template = 'passerelle_register_plugin/plugin.html'
- text_enabled = True
- no_cancel_button = False
- form_class = forms.PasserelleRegisterForm
-
-
-plugin_pool.register_plugin(PasserelleRegisterPlugin)
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/forms.py b/portail_citoyen2/apps/passerelle_register_plugin/forms.py
deleted file mode 100644
index e4f9d9e..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/forms.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import logging
-
-
-from django import forms
-
-
-import widgets
-
-logger = logging.getLogger(__name__)
-
-class PasserelleRegisterForm(forms.Form):
- def __init__(self, *args, **kwargs):
- self.request = kwargs.pop('request')
- self.user = self.request.user
- instance = self.instance = kwargs.pop('plugin_instance')
- try:
- subscriptions = self.subscriptions = self.instance.get_subscriptions(user=self.user.email)
- except:
- subscriptions = self.subscriptions = []
- logger.warning('unable to retrieve subscriptions for %r: %r',
- self.user, self.user.email, exc_info=True)
- super(PasserelleRegisterForm, self).__init__(*args, **kwargs)
- self.all_choices = set()
- for subscription in subscriptions:
- if not instance.check_ressource(subscription['name']):
- continue
- choices = []
- initial = []
- for transport in subscription['transports']['available']:
- if not instance.check_transport(transport):
- continue
- self.all_choices.add(transport)
- choices.append((transport, transport))
- if transport in subscription['transports']['defined']:
- initial.append(transport)
- self.fields[instance.simplify(subscription['name'])] = \
- forms.MultipleChoiceField(label=subscription['description'],
- choices=choices, initial=initial,
- widget=widgets.CheckboxMultipleSelect,
- required=False)
- __init__.need_request = True
- __init__.need_plugin_instance = True
-
-
- def save(self):
- cleaned_data = self.cleaned_data
- subscriptions = []
- for key, value in cleaned_data.iteritems():
- subscriptions.append({
- 'name': key,
- 'transports': value
- })
- try:
- self.instance.set_subscriptions(subscriptions, user=self.user.email)
- except:
- subscriptions = self.subscriptions = []
- logger.warning('unable to save subscriptions for %r: %r',
- self.user, self.user.email, exc_info=True)
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/locale/fr/LC_MESSAGES/django.po b/portail_citoyen2/apps/passerelle_register_plugin/locale/fr/LC_MESSAGES/django.po
deleted file mode 100644
index 1dfb7a4..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/locale/fr/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,43 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-10 15:01+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: cms_plugins.py:36
-msgid "passerelle register plugin"
-msgstr "Plugin de gestion d'abonnements"
-
-#: models.py:20
-msgid "passerelle url"
-msgstr "URL du service d'abonnement"
-
-#: models.py:22
-msgid "ressources restrictions"
-msgstr "Restriction sur les ressources ouvertes aux abonnements"
-
-#: models.py:23
-msgid "transports restrictions"
-msgstr "Restriction sur les modes d'envoi"
-
-#: templates/passerelle_register_plugin/plugin.html:14
-msgid "Name"
-msgstr "Nom"
-
-#: templates/passerelle_register_plugin/plugin.html:37
-msgid "Validate"
-msgstr "Valider"
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/migrations/0001_initial.py b/portail_citoyen2/apps/passerelle_register_plugin/migrations/0001_initial.py
deleted file mode 100644
index c5892f3..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/migrations/0001_initial.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*- coding: utf-8 -*-
-from south.utils import datetime_utils as 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 'PasserelleRegisterPlugin'
- db.create_table(u'passerelle_register_plugin_passerelleregisterplugin', (
- (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
- ('passerelle_url', self.gf('django.db.models.fields.URLField')(max_length=128)),
- ('ressources_restrictions', self.gf('django.db.models.fields.TextField')(blank=True)),
- ('transports_restrictions', self.gf('django.db.models.fields.TextField')(blank=True)),
- ))
- db.send_create_signal(u'passerelle_register_plugin', ['PasserelleRegisterPlugin'])
-
-
- def backwards(self, orm):
- # Deleting model 'PasserelleRegisterPlugin'
- db.delete_table(u'passerelle_register_plugin_passerelleregisterplugin')
-
-
- models = {
- 'cms.cmsplugin': {
- 'Meta': {'object_name': 'CMSPlugin'},
- 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
- 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
- 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
- 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
- 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
- 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
- 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
- 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
- },
- 'cms.placeholder': {
- 'Meta': {'object_name': 'Placeholder'},
- 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
- u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
- },
- u'passerelle_register_plugin.passerelleregisterplugin': {
- 'Meta': {'object_name': 'PasserelleRegisterPlugin', '_ormbases': ['cms.CMSPlugin']},
- u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
- 'passerelle_url': ('django.db.models.fields.URLField', [], {'max_length': '128'}),
- 'ressources_restrictions': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
- 'transports_restrictions': ('django.db.models.fields.TextField', [], {'blank': 'True'})
- }
- }
-
- complete_apps = ['passerelle_register_plugin']
\ No newline at end of file
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/migrations/__init__.py b/portail_citoyen2/apps/passerelle_register_plugin/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/models.py b/portail_citoyen2/apps/passerelle_register_plugin/models.py
deleted file mode 100644
index 4eb75f6..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/models.py
+++ /dev/null
@@ -1,122 +0,0 @@
-import requests
-import requests.exceptions
-import logging
-import json
-
-
-from django.db import models
-from django.utils.translation import ugettext as _
-from django.template.defaultfilters import slugify
-from django.core.cache import cache
-
-
-from cms.models import CMSPlugin
-
-
-logger = logging.getLogger(__name__)
-
-
-class PasserelleRegisterPlugin(CMSPlugin):
- passerelle_url = models.URLField(verbose_name=_('passerelle url'),
- max_length=128)
- ressources_restrictions = models.TextField(verbose_name=_('ressources restrictions'), blank=True)
- transports_restrictions = models.TextField(verbose_name=_('transports restrictions'), blank=True)
-
- __ressources_restrictions = None
- __transports_restrictions = None
-
- def simplify(self, name):
- return slugify(name.strip())
-
- def get_ressources_restrictions(self):
- if self.__ressources_restrictions is None:
- self.__ressources_restrictions = []
- for name in filter(None, map(self.simplify, self.ressources_restrictions.strip().split(','))):
- self.__ressources_restrictions.append(name)
- return self.__ressources_restrictions
-
- def get_transports_restrictions(self):
- if self.__transports_restrictions is None:
- self.__transports_restrictions = []
- for name in filter(None, map(self.simplify, self.transports_restrictions.strip().split(','))):
- self.__transports_restrictions.append(name)
- return self.__transports_restrictions
-
-
- def check_ressource(self, ressource):
- restrictions = self.get_ressources_restrictions()
- if restrictions and self.simplify(ressource) not in restrictions:
- return False
- return True
-
- def check_transport(self, transport):
- restrictions = self.get_transports_restrictions()
- if restrictions and self.simplify(transport) not in restrictions:
- return False
- return True
-
- def key(self, **kwargs):
- return 'passerelle_register_subscriptions_'+slugify(self.passerelle_url+repr(sorted(kwargs.iteritems())))
-
- def get_subscriptions(self, **kwargs):
- key = self.key(**kwargs)
- early_response = cache.get(key)
- if early_response is not None:
- logger.debug('got subscriptions from cache')
- return early_response
- http_response = requests.get(self.passerelle_url, params=kwargs)
- json_response = http_response.json()
- if json_response['err'] == 0:
- logger.debug('got subscriptions from %s: %r', self.passerelle_url,
- json_response['data'])
- cache.set(key, json_response['data'])
- return json_response['data']
- else:
- logger.error('got subscriptions from %(url)s failed: %(json)r',
- { 'url': self.passerelle_url,
- 'json': json_response })
- return []
-
- def set_subscriptions(self, subscriptions, **kwargs):
- old_subscriptions = self.get_subscriptions(**kwargs)
- index = {}
- for subscription in subscriptions:
- index[subscription['name']] = subscription
- post = []
- for subscription in old_subscriptions:
- new_defined = set(subscription['transports']['defined'])
- if self.simplify(subscription['name']) in index:
- new_subscription = index[subscription['name']]
- for transport in subscription['transports']['available']:
- stransport = self.simplify(transport)
- if self.check_transport(transport):
- if stransport in new_subscription['transports']:
- new_defined.add(transport)
- else:
- new_defined.discard(transport)
- post.append(dict(name=subscription['name'],
- transports=list(new_defined)))
- headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
- try:
- response = requests.post(self.passerelle_url, params=kwargs,
- data=json.dumps(post), headers=headers)
- response.raise_for_status()
- except requests.exceptions.HTTPError:
- logger.error(u'set subscriptions on %s returned an HTTP error code: %s',
- response.request.url, response.status_code)
- except requests.exceptions.RequestException, e:
- logger.error(u'set subscriptions on %s failed with exception: %s',
- response.request.url, e)
- else:
- logger.debug(u'set subscriptions on %s: post %r', response.request.url,
- post)
- logger.debug(u'set subscriptions on %s: response %r',
- response.request.url, response.content)
- cache.delete(self.key(**kwargs))
- if response.json()['err'] != 0:
- logger.error(u'set subscriptions on %s returned an error: %r',
- response.request.url, response.json())
-
-
- def __unicode__(self):
- return u'' % self.passerelle_url
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/templates/passerelle_register_plugin/plugin.html b/portail_citoyen2/apps/passerelle_register_plugin/templates/passerelle_register_plugin/plugin.html
deleted file mode 100644
index 817aeb6..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/templates/passerelle_register_plugin/plugin.html
+++ /dev/null
@@ -1,39 +0,0 @@
-{% load i18n %}
-
-
- {{ form.non_field_errors }}
- {% for field in form %}
- {{ field.errors }}
- {% endfor %}
-
-
-
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/tests.py b/portail_citoyen2/apps/passerelle_register_plugin/tests.py
deleted file mode 100644
index 501deb7..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/tests.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-This file demonstrates writing tests using the unittest module. These will pass
-when you run "manage.py test".
-
-Replace this with more appropriate tests for your application.
-"""
-
-from django.test import TestCase
-
-
-class SimpleTest(TestCase):
- def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
- self.assertEqual(1 + 1, 2)
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/views.py b/portail_citoyen2/apps/passerelle_register_plugin/views.py
deleted file mode 100644
index 60f00ef..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/views.py
+++ /dev/null
@@ -1 +0,0 @@
-# Create your views here.
diff --git a/portail_citoyen2/apps/passerelle_register_plugin/widgets.py b/portail_citoyen2/apps/passerelle_register_plugin/widgets.py
deleted file mode 100644
index 30a7262..0000000
--- a/portail_citoyen2/apps/passerelle_register_plugin/widgets.py
+++ /dev/null
@@ -1,104 +0,0 @@
-from itertools import chain
-
-from django.forms.widgets import SubWidget, SelectMultiple
-from django.forms.util import flatatt
-from django.utils.html import conditional_escape
-from django.utils.encoding import StrAndUnicode, force_unicode
-from django.utils.safestring import mark_safe
-
-class CheckboxInput(SubWidget):
- """
- An object used by CheckboxRenderer that represents a single
- .
- """
- def __init__(self, name, value, attrs, choice, index):
- self.name, self.value = name, value
- self.attrs = attrs
- self.choice_value = force_unicode(choice[0])
- self.choice_label = force_unicode(choice[1])
- self.index = index
-
- def __unicode__(self):
- return self.render()
-
- def render(self, name=None, value=None, attrs=None, choices=()):
- name = name or self.name
- value = value or self.value
- attrs = attrs or self.attrs
-
- if 'id' in self.attrs:
- label_for = ' for="%s_%s"' % (self.attrs['id'], self.index)
- else:
- label_for = ''
- choice_label = conditional_escape(force_unicode(self.choice_label))
- return mark_safe(u'%s %s ' % (label_for, self.tag(), choice_label))
-
- def is_checked(self):
- return self.choice_value in self.value
-
- def tag(self):
- if 'id' in self.attrs:
- self.attrs['id'] = '%s_%s' % (self.attrs['id'], self.index)
- final_attrs = dict(self.attrs, type='checkbox', name=self.name, value=self.choice_value)
- if self.is_checked():
- final_attrs['checked'] = 'checked'
- return mark_safe(u' ' % flatatt(final_attrs))
-
-class CheckboxRenderer(StrAndUnicode):
- def __init__(self, name, value, attrs, choices):
- self.name, self.value, self.attrs = name, value, attrs
- self.choices = choices
-
- def __iter__(self):
- for i, choice in enumerate(self.choices):
- yield CheckboxInput(self.name, self.value, self.attrs.copy(), choice, i)
-
- def __getitem__(self, idx):
- choice = self.choices[idx] # Let the IndexError propogate
- return CheckboxInput(self.name, self.value, self.attrs.copy(), choice, idx)
-
- def __unicode__(self):
- return self.render()
-
- def render(self):
- """Outputs a for this set of checkbox fields."""
- return mark_safe(u'' % u'\n'.join([u'%s '
- % force_unicode(w) for w in self]))
-
-class CheckboxMultipleSelect(SelectMultiple):
- """
- Checkbox multi select field that enables iteration of each checkbox
- Similar to django.forms.widgets.RadioSelect
- """
- renderer = CheckboxRenderer
-
- def __init__(self, *args, **kwargs):
- # Override the default renderer if we were passed one.
- renderer = kwargs.pop('renderer', None)
- if renderer:
- self.renderer = renderer
- super(CheckboxMultipleSelect, self).__init__(*args, **kwargs)
-
- def subwidgets(self, name, value, attrs=None, choices=()):
- for widget in self.get_renderer(name, value, attrs, choices):
- yield widget
-
- def get_renderer(self, name, value, attrs=None, choices=()):
- """Returns an instance of the renderer."""
- if value is None: value = ''
- str_values = set([force_unicode(v) for v in value]) # Normalize to string.
- if attrs is None:
- attrs = {}
- if 'id' not in attrs:
- attrs['id'] = name
- final_attrs = self.build_attrs(attrs)
- choices = list(chain(self.choices, choices))
- return self.renderer(name, str_values, final_attrs, choices)
-
- def render(self, name, value, attrs=None, choices=()):
- return self.get_renderer(name, value, attrs, choices).render()
-
- def id_for_label(self, id_):
- if id_:
- id_ += '_0'
- return id_
diff --git a/portail_citoyen2/cms_plugins.py b/portail_citoyen2/cms_plugins.py
deleted file mode 100644
index 10c5776..0000000
--- a/portail_citoyen2/cms_plugins.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from django.utils.translation import ugettext as _
-from django.core.exceptions import ImproperlyConfigured
-from django.forms import ModelForm
-
-
-from cms.plugin_base import CMSPluginBase
-
-from . import utils
-
-class FormPluginBase(CMSPluginBase):
- form_class = None
- no_cancel_button = True
- submit_text = None
- add_form_prefix = True
- cache = False
-
- def get_form_class(self, request, context, instance, placeholder):
- return self.form_class
-
- def render(self, context, instance, placeholder):
- request = context['request']
- class_name = self.__class__.__name__.lower()
- context['submit_name'] = submit = 'submit-{class_name}-{instance_id}'.format(
- class_name=class_name,
- instance_id=instance.id)
- context['submit_value'] = self.submit_text or _('Modify')
- context['instance'] = instance
- context['no_cancel_button'] = self.no_cancel_button
- kwargs = {}
- if self.add_form_prefix:
- kwargs['prefix'] = class_name
- form_class = self.get_form_class(request, context, instance,
- placeholder)
- if issubclass(form_class, ModelForm):
- if not hasattr(self, 'get_object'):
- raise ImproperlyConfigured('Your plugin class is missing a get_object method but use a ModelForm')
- kwargs['instance'] = context['object'] = self.get_object(request, context, instance, placeholder)
- if utils.callable_has_arg(form_class.__init__, 'plugin_instance'):
- kwargs['plugin_instance'] = instance
- if utils.callable_has_arg(form_class.__init__, 'request'):
- kwargs['request'] = request
- if request.method == 'POST' and submit in request.POST:
- form = form_class(data=request.POST, **kwargs)
- if form.is_valid():
- form.save()
- else:
- form = form_class(**kwargs)
- context['form'] = form
- return context
diff --git a/portail_citoyen2/context_processors.py b/portail_citoyen2/context_processors.py
deleted file mode 100644
index b363983..0000000
--- a/portail_citoyen2/context_processors.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from . import app_settings
-
-def template_vars(request):
- ctx = app_settings.TEMPLATE_VARS.copy()
- if app_settings.PORTAIL_ADMIN_URL:
- ctx['PORTAIL_ADMIN_URL'] = app_settings.PORTAIL_ADMIN_URL
- return ctx
diff --git a/portail_citoyen2/dashboard.py b/portail_citoyen2/dashboard.py
deleted file mode 100644
index fae5d41..0000000
--- a/portail_citoyen2/dashboard.py
+++ /dev/null
@@ -1,73 +0,0 @@
-from django.utils.translation import ugettext_lazy as _
-from admin_tools.dashboard import modules, Dashboard, AppIndexDashboard
-
-
-class CustomIndexDashboard(Dashboard):
- """
- Custom index dashboard for Compte Orleans
- """
- def init_with_context(self, context):
- # append an app list module for "Applications"
- self.children.append(modules.ModelList(
- _('Contents'),
- models=(
- 'cms.models.pagemodel.Page',
- 'data_source_plugin.models.DataSource',
- 'feed_plugin.models.Feed',
- ),
- ))
-
- self.children.append(modules.ModelList(
- _('Announces'),
- models=(
- 'portail_citoyen_announces.*',
- ),
- ))
-
- # append a recent actions module
- self.children.append(modules.RecentActions(_('Recent Actions'), 5))
-
- # append another link list module for "support".
- self.children.append(modules.LinkList(
- _('Support'),
- children=[
- {
- 'title': _('Project site'),
- 'url': 'https://dev.entrouvert.org/projects/portail-citoyen/',
- 'external': True,
- },
- {
- 'title': _('Report a bug'),
- 'url': 'https://dev.entrouvert.org/projects/portail-citoyen/issues/new',
- 'external': True,
- },
- ]
- ))
-
-
-class CustomAppIndexDashboard(AppIndexDashboard):
- """
- Custom app index dashboard for Compte Orleans
- """
-
- # we disable title because its redundant with the model list module
- title = ''
-
- def __init__(self, *args, **kwargs):
- AppIndexDashboard.__init__(self, *args, **kwargs)
-
- # append a model list module and a recent actions module
- self.children += [
- modules.ModelList(self.app_title, self.models),
- modules.RecentActions(
- _('Recent Actions'),
- include_list=self.get_app_content_types(),
- limit=5
- )
- ]
-
- def init_with_context(self, context):
- """
- Use this method if you need to access the request context.
- """
- return super(CustomAppIndexDashboard, self).init_with_context(context)
diff --git a/portail_citoyen2/fixtures/demo.json b/portail_citoyen2/fixtures/demo.json
deleted file mode 100644
index c63b044..0000000
--- a/portail_citoyen2/fixtures/demo.json
+++ /dev/null
@@ -1,5588 +0,0 @@
-[
-{
- "pk": 1,
- "model": "sites.site",
- "fields": {
- "domain": "portail-citoyen.au-quotidien.com",
- "name": "Portail citoyen"
- }
-},
-{
- "pk": 4,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 5,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 6,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 9,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche.html",
- "default_width": null
- }
-},
-{
- "pk": 10,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite.html",
- "default_width": null
- }
-},
-{
- "pk": 11,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 13,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 14,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 15,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 16,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 17,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 18,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 19,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 20,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 21,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 22,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 23,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 24,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 25,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 26,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 27,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 28,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 29,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 30,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 31,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 32,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 33,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 34,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 35,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 36,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 37,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 38,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 39,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 40,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 41,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 42,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 43,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 44,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 53,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 54,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 55,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 56,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 57,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 58,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 59,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 60,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 61,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 62,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 63,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 64,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 65,
- "model": "cms.placeholder",
- "fields": {
- "slot": "Titre colonne gauche",
- "default_width": null
- }
-},
-{
- "pk": 66,
- "model": "cms.placeholder",
- "fields": {
- "slot": "gauche",
- "default_width": null
- }
-},
-{
- "pk": 67,
- "model": "cms.placeholder",
- "fields": {
- "slot": "centre",
- "default_width": null
- }
-},
-{
- "pk": 68,
- "model": "cms.placeholder",
- "fields": {
- "slot": "droite",
- "default_width": null
- }
-},
-{
- "pk": 71,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 72,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 73,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 74,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 75,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 76,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 78,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 79,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 80,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 81,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 82,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 83,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 84,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 85,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 86,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 87,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 88,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 89,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 90,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 91,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 92,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 93,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 94,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 95,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 96,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 97,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 98,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 99,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 100,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 101,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 102,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 103,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 104,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 105,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 106,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 107,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 108,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 109,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 110,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 119,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 120,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 121,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 122,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 123,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 124,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 125,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 126,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 127,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 128,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 129,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 130,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 131,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 132,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 133,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 134,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 135,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 136,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 137,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 138,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 139,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 140,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 141,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 142,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 143,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 144,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 145,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 146,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 147,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 148,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 149,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 150,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 152,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 157,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 158,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 159,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 160,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 161,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 162,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 163,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 164,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 165,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 166,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 167,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 168,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 169,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 170,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 171,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 172,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 173,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 174,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 175,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 176,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 177,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 178,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 179,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 180,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 181,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 182,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 183,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 184,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 185,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 186,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 187,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 188,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 189,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 190,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 191,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 192,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 193,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 194,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 195,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 196,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 197,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 198,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 199,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 200,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 204,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 205,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 206,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 207,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 208,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 209,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 210,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 211,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 212,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 213,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 214,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 215,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 216,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 217,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 218,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 219,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 220,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 221,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 222,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 223,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 224,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 225,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 226,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 227,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 228,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 229,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 230,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 231,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 232,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 233,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 234,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 235,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 236,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 240,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 241,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 242,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 243,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 244,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 245,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 246,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 247,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 248,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 249,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 250,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 251,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 252,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 253,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 254,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 255,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 256,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 257,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 258,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 259,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 260,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 261,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 262,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 263,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 264,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 265,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 266,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 267,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 268,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 269,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 270,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 271,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 272,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 273,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 274,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 275,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 276,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 277,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 278,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 279,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 280,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 281,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 282,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 283,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 284,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 285,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 286,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 287,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 288,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 289,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 290,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 291,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 292,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 293,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 294,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 295,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 296,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 297,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 298,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 299,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 300,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 301,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 302,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 303,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 304,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 305,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 306,
- "model": "cms.placeholder",
- "fields": {
- "slot": "admin-links",
- "default_width": null
- }
-},
-{
- "pk": 307,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 308,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 309,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 310,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 311,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 312,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 319,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 320,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 321,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 322,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 323,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 324,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 326,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 327,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 328,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 329,
- "model": "cms.placeholder",
- "fields": {
- "slot": "right",
- "default_width": null
- }
-},
-{
- "pk": 330,
- "model": "cms.placeholder",
- "fields": {
- "slot": "left",
- "default_width": null
- }
-},
-{
- "pk": 331,
- "model": "cms.placeholder",
- "fields": {
- "slot": "stack_content",
- "default_width": null
- }
-},
-{
- "pk": 332,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 333,
- "model": "cms.placeholder",
- "fields": {
- "slot": "center",
- "default_width": null
- }
-},
-{
- "pk": 602,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-04-17T17:18:02.731Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-03-19T15:54:03.304Z",
- "lft": 1,
- "tree_id": 139,
- "position": 0,
- "placeholder": 5,
- "plugin_type": "A2ServiceListPlugin"
- }
-},
-{
- "pk": 603,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-04-17T17:18:02.819Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-03-21T08:17:08.384Z",
- "lft": 1,
- "tree_id": 140,
- "position": 2,
- "placeholder": 5,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 604,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-04-17T17:18:02.938Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-03-21T14:08:42.833Z",
- "lft": 1,
- "tree_id": 141,
- "position": 3,
- "placeholder": 5,
- "plugin_type": "RawInlineTemplatePlugin"
- }
-},
-{
- "pk": 605,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-04-17T17:18:03.026Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-03-21T14:10:39.535Z",
- "lft": 1,
- "tree_id": 142,
- "position": 4,
- "placeholder": 5,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 606,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-05T08:24:54.989Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-03-19T15:53:50.436Z",
- "lft": 1,
- "tree_id": 143,
- "position": 0,
- "placeholder": 6,
- "plugin_type": "LoginPlugin"
- }
-},
-{
- "pk": 608,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-05T08:24:54.997Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-03-29T12:19:18.285Z",
- "lft": 1,
- "tree_id": 145,
- "position": 1,
- "placeholder": 6,
- "plugin_type": "RawInlineTemplatePlugin"
- }
-},
-{
- "pk": 609,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-05T08:24:55.006Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-10T08:51:44.887Z",
- "lft": 1,
- "tree_id": 146,
- "position": 2,
- "placeholder": 6,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 758,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-04-23T17:01:21.745Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-23T16:57:49.967Z",
- "lft": 1,
- "tree_id": 183,
- "position": 2,
- "placeholder": 78,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 759,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-04-23T16:58:20.435Z",
- "parent": 758,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-04-23T16:58:18.595Z",
- "lft": 2,
- "tree_id": 183,
- "position": 0,
- "placeholder": 78,
- "plugin_type": "SelectUserFeedPlugin"
- }
-},
-{
- "pk": 760,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-05-12T11:52:53.258Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-23T16:58:42.289Z",
- "lft": 1,
- "tree_id": 184,
- "position": 3,
- "placeholder": 78,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 761,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-04-24T07:39:02.605Z",
- "parent": 760,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-04-23T16:59:03.038Z",
- "lft": 2,
- "tree_id": 184,
- "position": 1,
- "placeholder": 78,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 1289,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-05T08:24:55.104Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-18T08:35:19.946Z",
- "lft": 1,
- "tree_id": 244,
- "position": 0,
- "placeholder": 80,
- "plugin_type": "LoginPlugin"
- }
-},
-{
- "pk": 1290,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-05-12T06:16:35.005Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-07T02:51:36.702Z",
- "lft": 1,
- "tree_id": 245,
- "position": 0,
- "placeholder": 143,
- "plugin_type": "VideoPlugin"
- }
-},
-{
- "pk": 1291,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-05-07T03:10:30.607Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-07T02:52:15.528Z",
- "lft": 1,
- "tree_id": 246,
- "position": 0,
- "placeholder": 144,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 1292,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-05-08T07:16:35.183Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-07T02:53:55.914Z",
- "lft": 1,
- "tree_id": 247,
- "position": 1,
- "placeholder": 144,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 1586,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-06-20T10:19:37.289Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-06-20T10:18:31.253Z",
- "lft": 1,
- "tree_id": 302,
- "position": 4,
- "placeholder": 78,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 1588,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 8,
- "changed_date": "2013-09-10T19:15:28.654Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-06-21T14:47:36.308Z",
- "lft": 1,
- "tree_id": 303,
- "position": 1,
- "placeholder": 161,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 1589,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-09-05T08:24:54.671Z",
- "parent": 1588,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-06-21T14:47:55.017Z",
- "lft": 2,
- "tree_id": 303,
- "position": 1,
- "placeholder": 161,
- "plugin_type": "SelectUserFeedPlugin"
- }
-},
-{
- "pk": 1590,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-09-18T09:36:11.360Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-06-21T14:48:13.432Z",
- "lft": 1,
- "tree_id": 304,
- "position": 0,
- "placeholder": 160,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 1666,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-07-30T09:09:44.363Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-07T02:51:36.702Z",
- "lft": 1,
- "tree_id": 320,
- "position": 0,
- "placeholder": 145,
- "plugin_type": "VideoPlugin"
- }
-},
-{
- "pk": 1667,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-07-30T09:09:44.396Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-07T02:52:15.528Z",
- "lft": 1,
- "tree_id": 321,
- "position": 0,
- "placeholder": 146,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 1668,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-07-30T09:09:44.403Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-07T02:53:55.914Z",
- "lft": 1,
- "tree_id": 322,
- "position": 1,
- "placeholder": 146,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2153,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-08-12T12:57:15.926Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T20:49:51.192Z",
- "lft": 1,
- "tree_id": 331,
- "position": 0,
- "placeholder": 71,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2155,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-05T08:24:54.838Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-28T15:50:44.472Z",
- "lft": 1,
- "tree_id": 333,
- "position": 1,
- "placeholder": 71,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2225,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-09-18T09:36:15.587Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-23T16:57:49.967Z",
- "lft": 1,
- "tree_id": 353,
- "position": 2,
- "placeholder": 79,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2226,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-09-18T09:36:15.495Z",
- "parent": 2225,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-04-23T16:58:18.595Z",
- "lft": 2,
- "tree_id": 353,
- "position": 0,
- "placeholder": 79,
- "plugin_type": "SelectUserFeedPlugin"
- }
-},
-{
- "pk": 2227,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-09-18T09:36:15.611Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-23T16:58:42.289Z",
- "lft": 1,
- "tree_id": 354,
- "position": 3,
- "placeholder": 79,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2228,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-09-18T09:36:15.545Z",
- "parent": 2227,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-04-23T16:59:03.038Z",
- "lft": 2,
- "tree_id": 354,
- "position": 1,
- "placeholder": 79,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2229,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-18T09:36:15.628Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-06-20T10:18:31.253Z",
- "lft": 1,
- "tree_id": 355,
- "position": 4,
- "placeholder": 79,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2230,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2013-09-18T09:36:15.690Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-06-21T14:48:13.432Z",
- "lft": 1,
- "tree_id": 356,
- "position": 0,
- "placeholder": 162,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2232,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-09-18T09:36:15.748Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-06-21T14:47:36.308Z",
- "lft": 1,
- "tree_id": 357,
- "position": 1,
- "placeholder": 164,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2233,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-09-18T09:36:15.727Z",
- "parent": 2232,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-06-21T14:47:55.017Z",
- "lft": 2,
- "tree_id": 357,
- "position": 1,
- "placeholder": 164,
- "plugin_type": "SelectUserFeedPlugin"
- }
-},
-{
- "pk": 2272,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-12-24T08:57:40.277Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-12-23T09:44:40.980Z",
- "lft": 1,
- "tree_id": 361,
- "position": 0,
- "placeholder": 326,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2273,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-12-24T08:57:40.244Z",
- "parent": 2272,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-12-23T09:49:51.846Z",
- "lft": 2,
- "tree_id": 361,
- "position": 1,
- "placeholder": 326,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2274,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2013-12-24T10:07:52.042Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-10-15T14:42:11.789Z",
- "lft": 1,
- "tree_id": 362,
- "position": 2,
- "placeholder": 311,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2275,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2013-12-24T10:07:51.203Z",
- "parent": 2274,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-10-15T15:37:12.072Z",
- "lft": 2,
- "tree_id": 362,
- "position": 0,
- "placeholder": 311,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2287,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2014-01-21T15:14:43.292Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T09:46:38.654Z",
- "lft": 1,
- "tree_id": 365,
- "position": 0,
- "placeholder": 328,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2288,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T15:42:03.167Z",
- "parent": 2287,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T09:46:58.929Z",
- "lft": 2,
- "tree_id": 365,
- "position": 1,
- "placeholder": 328,
- "plugin_type": "ProfileFormPlugin"
- }
-},
-{
- "pk": 2289,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-21T09:48:10.212Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T09:47:41.788Z",
- "lft": 1,
- "tree_id": 366,
- "position": 0,
- "placeholder": 327,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2290,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T14:24:03.489Z",
- "parent": 2289,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T09:48:06.757Z",
- "lft": 2,
- "tree_id": 366,
- "position": 1,
- "placeholder": 327,
- "plugin_type": "AccountManagementPlugin"
- }
-},
-{
- "pk": 2291,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-21T15:19:50.635Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T09:48:22.921Z",
- "lft": 1,
- "tree_id": 367,
- "position": 2,
- "placeholder": 327,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2466,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2014-01-21T11:31:35.423Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T11:31:27.895Z",
- "lft": 1,
- "tree_id": 372,
- "position": null,
- "placeholder": 331,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2473,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T15:19:49.026Z",
- "parent": 2291,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T15:19:47.230Z",
- "lft": 2,
- "tree_id": 367,
- "position": 0,
- "placeholder": 327,
- "plugin_type": "FederationPlugin"
- }
-},
-{
- "pk": 2474,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-21T15:19:56.833Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T09:47:41.788Z",
- "lft": 1,
- "tree_id": 373,
- "position": 0,
- "placeholder": 329,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2475,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T15:19:56.818Z",
- "parent": 2474,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T15:19:56.816Z",
- "lft": 2,
- "tree_id": 373,
- "position": 1,
- "placeholder": 329,
- "plugin_type": "AccountManagementPlugin"
- }
-},
-{
- "pk": 2476,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-21T15:19:56.841Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T09:48:22.921Z",
- "lft": 1,
- "tree_id": 374,
- "position": 2,
- "placeholder": 329,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2477,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T15:19:56.827Z",
- "parent": 2476,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T15:19:47.230Z",
- "lft": 2,
- "tree_id": 374,
- "position": 0,
- "placeholder": 329,
- "plugin_type": "FederationPlugin"
- }
-},
-{
- "pk": 2479,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-21T15:19:56.867Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2014-01-21T09:46:38.654Z",
- "lft": 1,
- "tree_id": 376,
- "position": 0,
- "placeholder": 330,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2480,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T15:42:03.203Z",
- "parent": 2479,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T09:46:58.929Z",
- "lft": 2,
- "tree_id": 376,
- "position": 1,
- "placeholder": 330,
- "plugin_type": "ProfileFormPlugin"
- }
-},
-{
- "pk": 2574,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-21T18:17:09.254Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-10-15T14:42:11.789Z",
- "lft": 1,
- "tree_id": 382,
- "position": 2,
- "placeholder": 312,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2575,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-21T18:17:09.229Z",
- "parent": 2574,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-10-15T15:37:12.072Z",
- "lft": 2,
- "tree_id": 382,
- "position": 0,
- "placeholder": 312,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2687,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-23T10:11:53.173Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T21:21:00.789Z",
- "lft": 1,
- "tree_id": 388,
- "position": 1,
- "placeholder": 74,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2688,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-23T10:11:53.119Z",
- "parent": 2687,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T17:34:02.998Z",
- "lft": 2,
- "tree_id": 388,
- "position": 1,
- "placeholder": 74,
- "plugin_type": "ShowUserFeedPlugin"
- }
-},
-{
- "pk": 2689,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-23T10:13:22.469Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T21:23:01.669Z",
- "lft": 1,
- "tree_id": 389,
- "position": 0,
- "placeholder": 74,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2690,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-23T10:13:21.458Z",
- "parent": 2689,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-05-06T16:23:46.648Z",
- "lft": 2,
- "tree_id": 389,
- "position": 0,
- "placeholder": 74,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2691,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2014-01-23T10:11:53.221Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-14T07:01:23.187Z",
- "lft": 1,
- "tree_id": 390,
- "position": 0,
- "placeholder": 147,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2692,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-23T10:12:17.505Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T21:09:42.797Z",
- "lft": 1,
- "tree_id": 391,
- "position": 1,
- "placeholder": 73,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2693,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-23T10:12:15.450Z",
- "parent": 2692,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-05-06T16:20:41.631Z",
- "lft": 2,
- "tree_id": 391,
- "position": 0,
- "placeholder": 73,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2694,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2014-01-23T10:11:53.335Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-12T05:07:52.469Z",
- "lft": 1,
- "tree_id": 392,
- "position": 2,
- "placeholder": 73,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2703,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2014-01-23T10:13:26.069Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-14T07:01:23.187Z",
- "lft": 1,
- "tree_id": 393,
- "position": 0,
- "placeholder": 148,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2704,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-23T10:13:26.173Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T21:09:42.797Z",
- "lft": 1,
- "tree_id": 394,
- "position": 1,
- "placeholder": 75,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2705,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-23T10:13:26.132Z",
- "parent": 2704,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-05-06T16:20:41.631Z",
- "lft": 2,
- "tree_id": 394,
- "position": 0,
- "placeholder": 75,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 2706,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 2,
- "changed_date": "2014-01-23T10:13:26.188Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-05-12T05:07:52.469Z",
- "lft": 1,
- "tree_id": 395,
- "position": 2,
- "placeholder": 75,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2707,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-23T10:13:26.279Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T21:21:00.789Z",
- "lft": 1,
- "tree_id": 396,
- "position": 1,
- "placeholder": 76,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2708,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-23T10:13:26.223Z",
- "parent": 2707,
- "language": "fr",
- "level": 1,
- "creation_date": "2014-01-21T17:34:02.998Z",
- "lft": 2,
- "tree_id": 396,
- "position": 1,
- "placeholder": 76,
- "plugin_type": "ShowUserFeedPlugin"
- }
-},
-{
- "pk": 2709,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 4,
- "changed_date": "2014-01-23T10:13:26.302Z",
- "parent": null,
- "language": "fr",
- "level": 0,
- "creation_date": "2013-04-17T21:23:01.669Z",
- "lft": 1,
- "tree_id": 397,
- "position": 0,
- "placeholder": 76,
- "plugin_type": "TextPlugin"
- }
-},
-{
- "pk": 2710,
- "model": "cms.cmsplugin",
- "fields": {
- "rght": 3,
- "changed_date": "2014-01-23T10:13:26.253Z",
- "parent": 2709,
- "language": "fr",
- "level": 1,
- "creation_date": "2013-05-06T16:23:46.648Z",
- "lft": 2,
- "tree_id": 397,
- "position": 0,
- "placeholder": 76,
- "plugin_type": "DataSourcePlugin"
- }
-},
-{
- "pk": 3,
- "model": "cms.page",
- "fields": {
- "rght": 22,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T14:38:00.576Z",
- "lft": 1,
- "in_navigation": true,
- "reverse_id": "top-page",
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 6,
- "placeholders": [
- 141,
- 142,
- 149,
- 21,
- 22,
- 23,
- 24
- ],
- "changed_date": "2013-04-17T19:57:53.782Z",
- "limit_visibility_in_menu": null,
- "parent": null,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T16:52:43.112Z",
- "publisher_public": 6,
- "level": 0,
- "changed_by": "admin",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 4,
- "model": "cms.page",
- "fields": {
- "rght": 3,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T14:38:21.017Z",
- "lft": 2,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": true,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 6,
- "placeholders": [
- 81,
- 147,
- 25,
- 26,
- 27,
- 28,
- 73,
- 74
- ],
- "changed_date": "2014-01-23T10:13:26.321Z",
- "limit_visibility_in_menu": 1,
- "parent": 3,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T16:52:46.846Z",
- "publisher_public": 7,
- "level": 1,
- "changed_by": "jschneider",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 5,
- "model": "cms.page",
- "fields": {
- "rght": 7,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T14:38:34.539Z",
- "lft": 6,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": true,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 6,
- "placeholders": [
- 78,
- 150,
- 160,
- 161,
- 29,
- 30,
- 31,
- 32
- ],
- "changed_date": "2013-09-18T09:36:15.787Z",
- "limit_visibility_in_menu": 1,
- "parent": 3,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T16:52:49.637Z",
- "publisher_public": 8,
- "level": 1,
- "changed_by": "admin",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 6,
- "model": "cms.page",
- "fields": {
- "rght": 34,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T16:52:47.741Z",
- "lft": 1,
- "in_navigation": true,
- "reverse_id": "top-page",
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 1,
- "placeholders": [
- 33,
- 34,
- 35,
- 36
- ],
- "changed_date": "2013-04-17T19:57:53.490Z",
- "limit_visibility_in_menu": null,
- "parent": null,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T16:52:43.112Z",
- "publisher_public": 3,
- "level": 0,
- "changed_by": "admin",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 7,
- "model": "cms.page",
- "fields": {
- "rght": 7,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T16:52:51.490Z",
- "lft": 4,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": true,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 1,
- "placeholders": [
- 76,
- 82,
- 148,
- 37,
- 38,
- 39,
- 40,
- 75
- ],
- "changed_date": "2014-01-23T10:13:25.891Z",
- "limit_visibility_in_menu": 1,
- "parent": 6,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T16:52:46.846Z",
- "publisher_public": 4,
- "level": 1,
- "changed_by": "jschneider",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 8,
- "model": "cms.page",
- "fields": {
- "rght": 11,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T16:52:54.294Z",
- "lft": 10,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": true,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 1,
- "placeholders": [
- 79,
- 162,
- 163,
- 164,
- 41,
- 42,
- 43,
- 44
- ],
- "changed_date": "2013-09-18T09:36:15.241Z",
- "limit_visibility_in_menu": 1,
- "parent": 6,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T16:52:49.637Z",
- "publisher_public": 5,
- "level": 1,
- "changed_by": "admin",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 11,
- "model": "cms.page",
- "fields": {
- "rght": 21,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T17:16:05.199Z",
- "lft": 10,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 6,
- "placeholders": [
- 143,
- 144,
- 165,
- 166,
- 53,
- 54,
- 55,
- 56
- ],
- "changed_date": "2013-07-30T09:09:44.417Z",
- "limit_visibility_in_menu": null,
- "parent": 3,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T17:16:05.110Z",
- "publisher_public": 14,
- "level": 1,
- "changed_by": "admin",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 14,
- "model": "cms.page",
- "fields": {
- "rght": 33,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-04-17T17:16:26.509Z",
- "lft": 22,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 1,
- "placeholders": [
- 145,
- 146,
- 167,
- 168,
- 65,
- 66,
- 67,
- 68
- ],
- "changed_date": "2013-07-30T09:09:44.257Z",
- "limit_visibility_in_menu": null,
- "parent": 6,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-04-17T17:16:05.110Z",
- "publisher_public": 11,
- "level": 1,
- "changed_by": "admin",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 18,
- "model": "cms.page",
- "fields": {
- "rght": 16,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:10:39.765Z",
- "lft": 11,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 6,
- "placeholders": [
- 169,
- 170
- ],
- "changed_date": "2013-07-30T09:13:15.507Z",
- "limit_visibility_in_menu": null,
- "parent": 11,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:10.503Z",
- "publisher_public": 23,
- "level": 2,
- "changed_by": "admin",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 19,
- "model": "cms.page",
- "fields": {
- "rght": 18,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:11:13.857Z",
- "lft": 17,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 6,
- "placeholders": [
- 171,
- 172,
- 173,
- 174
- ],
- "changed_date": "2013-07-30T09:13:20.346Z",
- "limit_visibility_in_menu": null,
- "parent": 11,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:15.342Z",
- "publisher_public": 26,
- "level": 2,
- "changed_by": "admin",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 20,
- "model": "cms.page",
- "fields": {
- "rght": 20,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:11:42.715Z",
- "lft": 19,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 6,
- "placeholders": [
- 175,
- 176,
- 177,
- 332
- ],
- "changed_date": "2014-01-22T07:36:49.907Z",
- "limit_visibility_in_menu": null,
- "parent": 11,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:17.404Z",
- "publisher_public": 27,
- "level": 2,
- "changed_by": "serghei",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 21,
- "model": "cms.page",
- "fields": {
- "rght": 13,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:12:20.405Z",
- "lft": 12,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 6,
- "placeholders": [
- 178,
- 179,
- 180,
- 199
- ],
- "changed_date": "2014-01-21T21:04:34.498Z",
- "limit_visibility_in_menu": null,
- "parent": 18,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:12.209Z",
- "publisher_public": 24,
- "level": 3,
- "changed_by": "serghei",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 22,
- "model": "cms.page",
- "fields": {
- "rght": 15,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:13:01.527Z",
- "lft": 14,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 6,
- "placeholders": [
- 181,
- 182,
- 183,
- 301
- ],
- "changed_date": "2014-01-21T21:05:39.041Z",
- "limit_visibility_in_menu": null,
- "parent": 18,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:14.358Z",
- "publisher_public": 25,
- "level": 3,
- "changed_by": "serghei",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 23,
- "model": "cms.page",
- "fields": {
- "rght": 28,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:13:15.466Z",
- "lft": 23,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 1,
- "placeholders": [
- 184,
- 185
- ],
- "changed_date": "2013-07-30T09:13:15.466Z",
- "limit_visibility_in_menu": null,
- "parent": 14,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:10.463Z",
- "publisher_public": 18,
- "level": 2,
- "changed_by": "admin",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 24,
- "model": "cms.page",
- "fields": {
- "rght": 25,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:13:17.169Z",
- "lft": 24,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 1,
- "placeholders": [
- 186,
- 187,
- 188,
- 200
- ],
- "changed_date": "2014-01-21T21:04:34.430Z",
- "limit_visibility_in_menu": null,
- "parent": 23,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:12.209Z",
- "publisher_public": 21,
- "level": 3,
- "changed_by": "serghei",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 25,
- "model": "cms.page",
- "fields": {
- "rght": 27,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:13:19.313Z",
- "lft": 26,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 1,
- "placeholders": [
- 189,
- 190,
- 191,
- 302
- ],
- "changed_date": "2014-01-21T21:05:38.973Z",
- "limit_visibility_in_menu": null,
- "parent": 23,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:14.358Z",
- "publisher_public": 22,
- "level": 3,
- "changed_by": "serghei",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 26,
- "model": "cms.page",
- "fields": {
- "rght": 30,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:13:20.292Z",
- "lft": 29,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 1,
- "placeholders": [
- 192,
- 193,
- 194,
- 195
- ],
- "changed_date": "2013-07-30T09:13:20.292Z",
- "limit_visibility_in_menu": null,
- "parent": 14,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:15.289Z",
- "publisher_public": 19,
- "level": 2,
- "changed_by": "admin",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 27,
- "model": "cms.page",
- "fields": {
- "rght": 32,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-07-30T09:13:22.365Z",
- "lft": 31,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": false,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_help.html",
- "tree_id": 1,
- "placeholders": [
- 196,
- 197,
- 198,
- 333
- ],
- "changed_date": "2014-01-22T07:36:49.822Z",
- "limit_visibility_in_menu": null,
- "parent": 14,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-07-30T09:13:17.404Z",
- "publisher_public": 20,
- "level": 2,
- "changed_by": "serghei",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 60,
- "model": "cms.page",
- "fields": {
- "rght": 9,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-10-15T14:39:49.607Z",
- "lft": 8,
- "in_navigation": false,
- "reverse_id": null,
- "login_required": false,
- "created_by": "jschneider",
- "publication_end_date": null,
- "template": "base_one_column.html",
- "tree_id": 6,
- "placeholders": [
- 307,
- 308,
- 311
- ],
- "changed_date": "2014-01-21T18:17:09.274Z",
- "limit_visibility_in_menu": null,
- "parent": 3,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-10-15T14:39:53.632Z",
- "publisher_public": 61,
- "level": 1,
- "changed_by": "jschneider",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 61,
- "model": "cms.page",
- "fields": {
- "rght": 19,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2013-10-15T14:39:58.464Z",
- "lft": 12,
- "in_navigation": false,
- "reverse_id": null,
- "login_required": false,
- "created_by": "jschneider",
- "publication_end_date": null,
- "template": "base_one_column.html",
- "tree_id": 1,
- "placeholders": [
- 309,
- 310,
- 312
- ],
- "changed_date": "2014-01-21T18:17:09.037Z",
- "limit_visibility_in_menu": null,
- "parent": 6,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2013-10-15T14:39:53.632Z",
- "publisher_public": 60,
- "level": 1,
- "changed_by": "jschneider",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 68,
- "model": "cms.page",
- "fields": {
- "rght": 5,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2014-01-21T08:37:00.814Z",
- "lft": 4,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": true,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 6,
- "placeholders": [
- 327,
- 328
- ],
- "changed_date": "2014-01-21T15:19:56.875Z",
- "limit_visibility_in_menu": 1,
- "parent": 3,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2014-01-21T08:37:06.415Z",
- "publisher_public": 69,
- "level": 1,
- "changed_by": "admin",
- "publisher_is_draft": true,
- "published": true
- }
-},
-{
- "pk": 69,
- "model": "cms.page",
- "fields": {
- "rght": 9,
- "navigation_extenders": "",
- "site": 1,
- "creation_date": "2014-01-21T08:37:11.341Z",
- "lft": 8,
- "in_navigation": true,
- "reverse_id": null,
- "login_required": true,
- "created_by": "admin",
- "publication_end_date": null,
- "template": "base_two_columns.html",
- "tree_id": 1,
- "placeholders": [
- 329,
- 330
- ],
- "changed_date": "2014-01-21T15:19:56.748Z",
- "limit_visibility_in_menu": 1,
- "parent": 6,
- "publisher_state": 0,
- "soft_root": false,
- "publication_date": "2014-01-21T08:37:06.415Z",
- "publisher_public": 68,
- "level": 1,
- "changed_by": "admin",
- "publisher_is_draft": false,
- "published": true
- }
-},
-{
- "pk": 1,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2013-07-31T14:14:01.444Z",
- "page": 3,
- "user": null
- }
-},
-{
- "pk": 3,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T14:09:37.634Z",
- "page": 5,
- "user": null
- }
-},
-{
- "pk": 4,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2013-04-18T13:22:50.673Z",
- "page": 3,
- "user": null
- }
-},
-{
- "pk": 5,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T14:09:37.669Z",
- "page": 11,
- "user": null
- }
-},
-{
- "pk": 6,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2013-07-31T14:14:01.594Z",
- "page": 11,
- "user": null
- }
-},
-{
- "pk": 7,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T14:09:37.697Z",
- "page": 19,
- "user": null
- }
-},
-{
- "pk": 8,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2013-07-31T14:14:01.697Z",
- "page": 18,
- "user": null
- }
-},
-{
- "pk": 9,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2013-07-31T14:14:01.715Z",
- "page": 19,
- "user": null
- }
-},
-{
- "pk": 13,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T16:40:36.513Z",
- "page": 3,
- "user": null
- }
-},
-{
- "pk": 15,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T16:40:36.552Z",
- "page": 5,
- "user": null
- }
-},
-{
- "pk": 17,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T16:40:36.638Z",
- "page": 11,
- "user": null
- }
-},
-{
- "pk": 18,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T16:40:36.689Z",
- "page": 18,
- "user": null
- }
-},
-{
- "pk": 19,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T16:40:36.706Z",
- "page": 19,
- "user": null
- }
-},
-{
- "pk": 24,
- "model": "cms.pagemoderatorstate",
- "fields": {
- "action": "ADD",
- "message": "",
- "created": "2014-01-21T16:40:36.884Z",
- "page": 68,
- "user": null
- }
-},
-{
- "pk": 3,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "/mes-e-services",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "top-page",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T14:38:00.809Z",
- "page": 3,
- "path": "",
- "meta_description": "",
- "slug": "top-page"
- }
-},
-{
- "pk": 4,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Mes e-services",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T14:38:21.239Z",
- "page": 4,
- "path": "mes-e-services",
- "meta_description": "",
- "slug": "mes-e-services"
- }
-},
-{
- "pk": 5,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Mes abonnements",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T14:38:34.760Z",
- "page": 5,
- "path": "mes-abonnements",
- "meta_description": "",
- "slug": "mes-abonnements"
- }
-},
-{
- "pk": 6,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "/mes-e-services",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "top-page",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T14:38:00.809Z",
- "page": 6,
- "path": "",
- "meta_description": "",
- "slug": "top-page"
- }
-},
-{
- "pk": 7,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Mes e-services",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T14:38:21.239Z",
- "page": 7,
- "path": "mes-e-services",
- "meta_description": "",
- "slug": "mes-e-services"
- }
-},
-{
- "pk": 8,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Mes abonnements",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T14:38:34.760Z",
- "page": 8,
- "path": "mes-abonnements",
- "meta_description": "",
- "slug": "mes-abonnements"
- }
-},
-{
- "pk": 11,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Aide",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T17:16:05.421Z",
- "page": 11,
- "path": "aide",
- "meta_description": "",
- "slug": "aide"
- }
-},
-{
- "pk": 14,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Aide",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-04-17T17:16:05.421Z",
- "page": 14,
- "path": "aide",
- "meta_description": "",
- "slug": "aide"
- }
-},
-{
- "pk": 17,
- "model": "cms.title",
- "fields": {
- "menu_title": null,
- "redirect": null,
- "meta_keywords": null,
- "page_title": null,
- "language": "fr",
- "title": "Qu'est-ce que mon compte citoyen ?",
- "has_url_overwrite": false,
- "application_urls": null,
- "creation_date": "2013-07-30T09:10:39.788Z",
- "page": 18,
- "path": "aide/quest-ce-que-mon-compte-citoyen",
- "meta_description": null,
- "slug": "quest-ce-que-mon-compte-citoyen"
- }
-},
-{
- "pk": 18,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Qu'est-ce que mes e-services ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:11:13.880Z",
- "page": 19,
- "path": "aide/quest-ce-que-mes-e-services",
- "meta_description": "",
- "slug": "quest-ce-que-mes-e-services"
- }
-},
-{
- "pk": 19,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Qu'est-ce que mes abonnements ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:11:42.736Z",
- "page": 20,
- "path": "aide/quest-ce-que-mes-abonnements",
- "meta_description": "",
- "slug": "quest-ce-que-mes-abonnements"
- }
-},
-{
- "pk": 20,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Pourquoi cr\u00e9er un compte citoyen ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:12:20.429Z",
- "page": 21,
- "path": "aide/quest-ce-que-mon-compte-citoyen/pourquoi-creer-un-compte-citoyen",
- "meta_description": "",
- "slug": "pourquoi-creer-un-compte-citoyen"
- }
-},
-{
- "pk": 21,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Comment cr\u00e9e-t-on un compte ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:13:01.552Z",
- "page": 22,
- "path": "aide/quest-ce-que-mon-compte-citoyen/comment-cree-t-un-compte",
- "meta_description": "",
- "slug": "comment-cree-t-un-compte"
- }
-},
-{
- "pk": 22,
- "model": "cms.title",
- "fields": {
- "menu_title": null,
- "redirect": null,
- "meta_keywords": null,
- "page_title": null,
- "language": "fr",
- "title": "Qu'est-ce que mon compte citoyen ?",
- "has_url_overwrite": false,
- "application_urls": null,
- "creation_date": "2013-07-30T09:10:39.788Z",
- "page": 23,
- "path": "aide/quest-ce-que-mon-compte-citoyen",
- "meta_description": null,
- "slug": "quest-ce-que-mon-compte-citoyen"
- }
-},
-{
- "pk": 23,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Pourquoi cr\u00e9er un compte citoyen ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:12:20.429Z",
- "page": 24,
- "path": "aide/quest-ce-que-mon-compte-citoyen/pourquoi-creer-un-compte-citoyen",
- "meta_description": "",
- "slug": "pourquoi-creer-un-compte-citoyen"
- }
-},
-{
- "pk": 24,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Comment cr\u00e9e-t-on un compte ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:13:01.552Z",
- "page": 25,
- "path": "aide/quest-ce-que-mon-compte-citoyen/comment-cree-t-un-compte",
- "meta_description": "",
- "slug": "comment-cree-t-un-compte"
- }
-},
-{
- "pk": 25,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Qu'est-ce que mes e-services ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:11:13.880Z",
- "page": 26,
- "path": "aide/quest-ce-que-mes-e-services",
- "meta_description": "",
- "slug": "quest-ce-que-mes-e-services"
- }
-},
-{
- "pk": 26,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Qu'est-ce que mes abonnements ?",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-07-30T09:11:42.736Z",
- "page": 27,
- "path": "aide/quest-ce-que-mes-abonnements",
- "meta_description": "",
- "slug": "quest-ce-que-mes-abonnements"
- }
-},
-{
- "pk": 59,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Services li\u00e9s",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-10-15T14:39:49.759Z",
- "page": 60,
- "path": "mediatheque",
- "meta_description": "",
- "slug": "mediatheque"
- }
-},
-{
- "pk": 60,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Services li\u00e9s",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2013-10-15T14:39:49.759Z",
- "page": 61,
- "path": "mediatheque",
- "meta_description": "",
- "slug": "mediatheque"
- }
-},
-{
- "pk": 67,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Mon compte",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2014-01-21T08:37:00.890Z",
- "page": 68,
- "path": "mon-compte",
- "meta_description": "",
- "slug": "mon-compte"
- }
-},
-{
- "pk": 68,
- "model": "cms.title",
- "fields": {
- "menu_title": "",
- "redirect": "",
- "meta_keywords": "",
- "page_title": "",
- "language": "fr",
- "title": "Mon compte",
- "has_url_overwrite": false,
- "application_urls": "",
- "creation_date": "2014-01-21T08:37:00.890Z",
- "page": 69,
- "path": "mon-compte",
- "meta_description": "",
- "slug": "mon-compte"
- }
-},
-{
- "pk": 758,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Vos flux
",
- "wrapper": "block"
- }
-},
-{
- "pk": 760,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Newsletters \nVos abonnements sont marqu\u00e9s d'une \u2713 et affich\u00e9s en vert.
\n
",
- "wrapper": "block"
- }
-},
-{
- "pk": 1291,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Utilisation du compte citoyen Votre compte citoyen va vous permettre :
d'accomplir vos d\u00e9marches en ligne 24h/24 aupr\u00e8s de Montpellier Agglo dans un premier temps puis \u00e0 terme aupr\u00e8s de la m\u00e9diath\u00e8que, de l'\u00e9coloth\u00e8que, du conservatoire et de votre commune. De suivre le traitement de vos d\u00e9marches apr\u00e8s avoir rempli un formulaire en ligne, qu'il s'agisse par exemple de contacter le r\u00e9seau des piscines, de demander un abonnement \u00e0 la t\u00e9l\u00e9alarme, de contacter le service des d\u00e9chets... De pr\u00e9remplir vos coordonn\u00e9es directement dans les formulaires, \u00e0 partir de celles que vous aurez indiqu\u00e9es sur votre compte. ",
- "wrapper": "block"
- }
-},
-{
- "pk": 1292,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Trouver de l'aide Pour aller plus loin dans la compr\u00e9hension du fonctionnement du compte citoyen vous pouvez consulter l'aide en ligne ou contacter le support .
",
- "wrapper": "block"
- }
-},
-{
- "pk": 1586,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Annonces SMS
",
- "wrapper": "block"
- }
-},
-{
- "pk": 1588,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes flux d'infos S\u00e9lectionnez ici les flux d'informations que vous souhaitez suivre.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 1590,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Newsletters Cliquez sur une newsletter pour vous (d\u00e9s)abonner et sauvegardez les changements avec le bouton Valider.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 1667,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Utilisation du compte citoyen Votre compte citoyen va vous permettre :
d'accomplir vos d\u00e9marches en ligne 24h/24 aupr\u00e8s de Montpellier Agglo dans un premier temps puis \u00e0 terme aupr\u00e8s de la m\u00e9diath\u00e8que, de l'\u00e9coloth\u00e8que, du conservatoire et de votre commune. De suivre le traitement de vos d\u00e9marches apr\u00e8s avoir rempli un formulaire en ligne, qu'il s'agisse par exemple de contacter le r\u00e9seau des piscines, de demander un abonnement \u00e0 la t\u00e9l\u00e9alarme, de contacter le service des d\u00e9chets... De pr\u00e9remplir vos coordonn\u00e9es directement dans les formulaires, \u00e0 partir de celles que vous aurez indiqu\u00e9es sur votre compte. ",
- "wrapper": "block"
- }
-},
-{
- "pk": 1668,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Trouver de l'aide Pour aller plus loin dans la compr\u00e9hension du fonctionnement du compte citoyen vous pouvez consulter l'aide en ligne ou contacter le support .
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2153,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Compte lecteur Ici bient\u00f4t les informations de votre compte lecteur
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2225,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Vos flux
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2227,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Newsletters \nVos abonnements sont marqu\u00e9s d'une \u2713 et affich\u00e9s en vert.
\n
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2229,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Annonces SMS
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2230,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Newsletters Cliquez sur une newsletter pour vous (d\u00e9s)abonner et sauvegardez les changements avec le bouton Valider.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2232,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes flux d'infos S\u00e9lectionnez ici les flux d'informations que vous souhaitez suivre.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2272,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Compte lecteur \n",
- "wrapper": "block"
- }
-},
-{
- "pk": 2274,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Compte lecteur \n
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2287,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mon profil
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2289,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "G\u00e9rer mon compte
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2291,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes liaisons
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2466,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Bienvenue sur le portail Internet de Montpellier Agglom\u00e9ration \n\nUn site Internet pour et par l\u2019usager \n\n\nInnovante, Montpellier Agglom\u00e9ration lance un site in\u00e9dit, personnalisable \u00e0\nvolont\u00e9, pour que chaque internaute puisse cr\u00e9er sa propre version en fonction\nde ses centres d\u2019int\u00e9r\u00eats et de ses envies\u00a0!\n
\n\n\nE-services accessibles 24h/24 et 7jrs/7 en un clic, navigation qui s\u2019adapte \u00e0\nl\u2019internaute\u2026 avec la nouvelle version de son site lanc\u00e9e en septembre 2012,\nvous avez acc\u00e8s \u00e0 un graphisme \u00e9pur\u00e9 pour plus de confort de lecture, des\npr\u00e9sentations ludiques et interactives, des photos, des vid\u00e9os\u2026 et une mine\nd\u2019informations \u00e0 d\u00e9couvrir au fil de votre parcours ou de vos recherches.\n
Une offre de services performante \n\n\nContacter une piscine ou le service des d\u00e9chets\u00a0? R\u00e9aliser une modification de\nvotre abonnement \u00e0 la t\u00e9l\u00e9alarme\u00a0? Effectuer une demande de raccordement au\nr\u00e9seau d'assainissement\u00a0? R\u00e9pondre \u00e0 une offre d'emploi ou d\u00e9poser une\ncandidature spontan\u00e9e\u00a0?\n
\n\n\nLa plate-forme de services d\u00e9mat\u00e9rialis\u00e9s \u00e9volue et vous permet d'accomplir la\nplupart de vos d\u00e9marches en ligne, 24h/24 et 7j/7, de suivre le traitement de\nvos demandes de \u00ab\u00a0e-services\u00a0\u00bb.\n
\n\n\nPour cela il vous suffit de vous connecter avec votre compte citoyen de\nMontpellier Agglo pour acc\u00e9der au portail et \u00e0 ses \u00ab\u00a0e-services\u00a0\u00bb.\n
\n\n\nSi vous ne disposez pas encore de compte citoyen de Montpellier Agglo ?\nN'h\u00e9sitez plus et inscrivez-vous d\u00e8s maintenant, votre compte vous donnera\n\u00e9galement acc\u00e8s \u00e0 votre compte lecteur du r\u00e9seau des M\u00e9diath\u00e8que, \u00e0 votre\ncompte famille \u00e0 l'Ecoloth\u00e8que ou le compte \u00e9l\u00e8ve au Conservatoire, et enfin\nd'acc\u00e9der directement \u00e0 vos espaces personnalis\u00e9s, sans avoir \u00e0 re-saisir vos\nidentifiants et mots de passe.\n
",
- "wrapper": ""
- }
-},
-{
- "pk": 2474,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "G\u00e9rer mon compte
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2476,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes liaisons
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2479,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mon profil
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2574,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Compte lecteur \n
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2687,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes flux d'infos \nLes informations proviennent des flux s\u00e9lectionn\u00e9s dans \u00ab\u00a0Mes abonnements \u00a0\u00bb.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2689,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes d\u00e9marches en cours Cliquez sur une de vos d\u00e9marches en cours pour en afficher le d\u00e9tail.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2692,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "D\u00e9marches en ligne \nRetrouvez ici les cat\u00e9gories de d\u00e9marches en ligne disponibles.
\n\n\n",
- "wrapper": "block"
- }
-},
-{
- "pk": 2694,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Liens utiles Diff\u00e9rents liens en relation avec la collectivit\u00e9
\nSite Web d'Issy-les-Moulineaux
\nIssy sur Wikip\u00e9dia
\nCarte d'Issy-les-Moulineaux
\n",
- "wrapper": "block"
- }
-},
-{
- "pk": 2704,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "D\u00e9marches en ligne \nRetrouvez ici les cat\u00e9gories de d\u00e9marches en ligne disponibles.
\n\n\n",
- "wrapper": "block"
- }
-},
-{
- "pk": 2706,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Liens utiles Diff\u00e9rents liens en relation avec la collectivit\u00e9
\nSite Web d'Issy-les-Moulineaux
\nIssy sur Wikip\u00e9dia
\nCarte d'Issy-les-Moulineaux
\n",
- "wrapper": "block"
- }
-},
-{
- "pk": 2707,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes flux d'infos \nLes informations proviennent des flux s\u00e9lectionn\u00e9s dans \u00ab\u00a0Mes abonnements \u00a0\u00bb.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 2709,
- "model": "cmsplugin_text_wrapper.textwrapper",
- "fields": {
- "body": "Mes d\u00e9marches en cours Cliquez sur une de vos d\u00e9marches en cours pour en afficher le d\u00e9tail.
",
- "wrapper": "block"
- }
-},
-{
- "pk": 1290,
- "model": "video.video",
- "fields": {
- "fullscreen": false,
- "loadingbarcolor": "828282",
- "buttonovercolor": "000000",
- "auto_hide": false,
- "movie": "",
- "image": "cms_page_media/11/compte-citoyen.png",
- "buttonoutcolor": "333333",
- "seekbarcolor": "13ABEC",
- "bgcolor": "000000",
- "height": 371,
- "width": 495,
- "seekbarbgcolor": "333333",
- "auto_play": false,
- "buttonhighlightcolor": "FFFFFF",
- "textcolor": "FFFFFF",
- "loop": false,
- "movie_url": "https://www.youtube.com/watch?v=4ria7AhD7ro"
- }
-},
-{
- "pk": 1666,
- "model": "video.video",
- "fields": {
- "fullscreen": false,
- "loadingbarcolor": "828282",
- "buttonovercolor": "000000",
- "auto_hide": false,
- "movie": "",
- "image": "cms_page_media/11/compte-citoyen.png",
- "buttonoutcolor": "333333",
- "seekbarcolor": "13ABEC",
- "bgcolor": "000000",
- "height": 371,
- "width": 495,
- "seekbarbgcolor": "333333",
- "auto_play": false,
- "buttonhighlightcolor": "FFFFFF",
- "textcolor": "FFFFFF",
- "loop": false,
- "movie_url": "https://www.youtube.com/watch?v=4ria7AhD7ro"
- }
-},
-{
- "pk": 606,
- "model": "login_plugin.loginplugin",
- "fields": {}
-},
-{
- "pk": 1289,
- "model": "login_plugin.loginplugin",
- "fields": {}
-},
-{
- "pk": 2,
- "model": "data_source_plugin.datasource",
- "fields": {
- "name": "Formulaires",
- "url": "https://eservices.au-quotidien.com/myspace/json/forms?NameID={{federations.service_1.links.0}}&orig=portail-citoyen.au-quotidien.com",
- "verify_certificate": false,
- "hash_algo": "sha256",
- "signature_key": "12345",
- "mime_type": "text/json"
- }
-},
-{
- "pk": 3,
- "model": "data_source_plugin.datasource",
- "fields": {
- "name": "Liste des formulaires e-services",
- "url": "https://eservices.au-quotidien.com/json?NameID={{federations.service_1.links.0}}&orig=portail-citoyen.au-quotidien.com",
- "verify_certificate": false,
- "hash_algo": "sha256",
- "signature_key": "12345",
- "mime_type": "text/json"
- }
-},
-{
- "pk": 6,
- "model": "data_source_plugin.datasource",
- "fields": {
- "name": "Flux RSS SGMAP",
- "url": "http://www.modernisation.gouv.fr/rss.xml",
- "verify_certificate": true,
- "hash_algo": "",
- "signature_key": "",
- "mime_type": "application/rss+xml"
- }
-},
-{
- "pk": 7,
- "model": "data_source_plugin.datasource",
- "fields": {
- "name": "Informations utilisateur",
- "url": "https://eservices.au-quotidien.com/user?format=json&NameID={{federations.service_1.links.0}}&orig=portail-citoyen.au-quotidien.com",
- "verify_certificate": false,
- "hash_algo": "sha256",
- "signature_key": "12345",
- "mime_type": "text/json"
- }
-},
-{
- "pk": 8,
- "model": "data_source_plugin.datasource",
- "fields": {
- "name": "Cat\u00e9gories de formulaire",
- "url": "https://eservices.au-quotidien.com/categories?format=json&NameID={{federations.service_1.links.0}}&orig=portail-citoyen.au-quotidien.com",
- "verify_certificate": false,
- "hash_algo": "sha256",
- "signature_key": "12345",
- "mime_type": "text/json"
- }
-},
-{
- "pk": 110,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 2,
- "order": 0,
- "plugin": 605
- }
-},
-{
- "pk": 111,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 3,
- "order": 0,
- "plugin": 609
- }
-},
-{
- "pk": 483,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 7,
- "order": 0,
- "plugin": 2155
- }
-},
-{
- "pk": 578,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 2,
- "order": 0,
- "plugin": 2690
- }
-},
-{
- "pk": 579,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 7,
- "order": 0,
- "plugin": 2691
- }
-},
-{
- "pk": 580,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 8,
- "order": 0,
- "plugin": 2693
- }
-},
-{
- "pk": 584,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 7,
- "order": 0,
- "plugin": 2703
- }
-},
-{
- "pk": 585,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 8,
- "order": 0,
- "plugin": 2705
- }
-},
-{
- "pk": 586,
- "model": "data_source_plugin.plugindatasource",
- "fields": {
- "source": 2,
- "order": 0,
- "plugin": 2710
- }
-},
-{
- "pk": 604,
- "model": "data_source_plugin.rawinlinetemplateplugin",
- "fields": {
- "template_source": ""
- }
-},
-{
- "pk": 608,
- "model": "data_source_plugin.rawinlinetemplateplugin",
- "fields": {
- "template_source": "{% load i18n %}\r\n{% if user.is_authenticated %}\r\n\r\n{% endif %}"
- }
-},
-{
- "pk": 603,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% if user.is_authenticated %}\r\nMes abonnements aux newsletters \r\n\r\n{% for name, subscribed in data_sources.0.content.newsletters.items %}\r\n{{ name }} \r\n{% endfor %}\r\n \r\n\r\n{% endif %}",
- "limit": 10,
- "refresh": 30
- }
-},
-{
- "pk": 605,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% if request.user.is_authenticated and data_sources.0.content %}\r\nMes d\u00e9marches en cours... \r\n\r\n{% for data in data_sources.0.content %}\r\n{{data.title}} \r\n{% endfor %}\r\n \r\n{% endif %}",
- "limit": 10,
- "refresh": 30
- }
-},
-{
- "pk": 609,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% if user.is_authenticated %}\r\nLes d\u00e9marches \r\nMontpellier agglom\u00e9ration \r\n\r\n{% for d in data_sources.0.content|dictsort:\"count\" %}\r\n{{ d.title }}
\r\n{% endfor %}\r\n\r\n{% endif %}",
- "limit": 10,
- "refresh": 30
- }
-},
-{
- "pk": 761,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "\r\n{% for name, subscribed in data_sources.0.content.newsletters.items %}\r\n{{ name }} \r\n{% endfor %}\r\n \r\n",
- "limit": 10,
- "refresh": 30
- }
-},
-{
- "pk": 2155,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "\r\n{% with user_info=data_sources.0.content %}\r\n\r\n{% endwith %}\r\n",
- "limit": 10,
- "refresh": 30
- }
-},
-{
- "pk": 2228,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "\r\n{% for name, subscribed in data_sources.0.content.newsletters.items %}\r\n{{ name }} \r\n{% endfor %}\r\n \r\n",
- "limit": 10,
- "refresh": 30
- }
-},
-{
- "pk": 2273,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% if data_sources.0.content.d.ClientAccount.ShortAccount %}\r\nVotre carte d'abonnement num\u00e9ro {{\u00a0data_sources.0.content.d.ClientAccount.Identity.BarCode }} est valable jusqu'au {{\u00a0data_sources.0.content.d.ClientAccount.Identity.ExpirationDate }}.
\r\n\r\nVous avez actuellement {{ data_sources.0.content.d.ClientAccount.ShortAccount.NombrePrets\u00a0}} oeuvre(s) en pr\u00eat :\r\n
\r\n{% for loan in data_sources.0.content.d.ClientAccount.Loans\u00a0%}\r\n {{\u00a0loan.DisplayName\u00a0}} - {{ loan.SearchItemAdapter.Resource.Crtr }} {% if loan.IsLate %}(en retard){% endif %} \r\n{% endfor %}\r\n \r\n\r\n\r\nVous avec actuellement {{ data_sources.0.content.d.ClientAccount.ShortAccount.NombreDemandeReservations }} oeuvre(s) en r\u00e9servation\r\n
\r\n\r\n{% if data_sources.0.content.d.ClientAccount.ShortAccount.NombreMessages %}\r\nVous avez {{\u00a0data_sources.0.content.d.ClientAccount.ShortAccount.NombreMessages }}
\r\n{% else %}\r\nVous n'avez pas de message
\r\n{% endif %}\r\n\r\n{% else %}\r\n\r\nVous n'avez actuellement pas de compte m\u00e9diath\u00e8que raccord\u00e9 ou votre compte n'est plus valide.
\r\nCliquer ici pour raccorder votre compte m\u00e9diath\u00e8que
\r\n\r\n{% endif %}",
- "limit": 10,
- "refresh": 60
- }
-},
-{
- "pk": 2275,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% if data_sources.0.content.d.ClientAccount.ShortAccount %}\r\nVotre carte d'abonnement num\u00e9ro {{\u00a0data_sources.0.content.d.ClientAccount.Identity.BarCode }} est valable jusqu'au {{\u00a0data_sources.0.content.d.ClientAccount.Identity.ExpirationDate }}.
\r\n\r\nVous avez actuellement {{ data_sources.0.content.d.ClientAccount.ShortAccount.NombrePrets\u00a0}} oeuvre(s) en pr\u00eat :\r\n
\r\n{% for loan in data_sources.0.content.d.ClientAccount.Loans\u00a0%}\r\n {{\u00a0loan.DisplayName\u00a0}} - {{ loan.SearchItemAdapter.Resource.Crtr }} {% if loan.IsLate %}(en retard){% endif %} \r\n{% endfor %}\r\n \r\n\r\n\r\nVous avec actuellement {{ data_sources.0.content.d.ClientAccount.ShortAccount.NombreDemandeReservations }} oeuvre(s) en r\u00e9servation\r\n
\r\n\r\n{% if data_sources.0.content.d.ClientAccount.ShortAccount.NombreMessages %}\r\nVous avez {{\u00a0data_sources.0.content.d.ClientAccount.ShortAccount.NombreMessages }}
\r\n{% else %}\r\nVous n'avez pas de message
\r\n{% endif %}\r\n\r\nCliquer ici pour vous connecter sur le site des m\u00e9diath\u00e8ques.
\r\n{% else %}\r\n\r\nVous n'avez actuellement pas de compte m\u00e9diath\u00e8que raccord\u00e9 ou votre compte n'est plus valide.
\r\n\r\nCliquer ici pour raccorder votre compte m\u00e9diath\u00e8que
\r\n\r\n{% endif %}",
- "limit": 10,
- "refresh": 1
- }
-},
-{
- "pk": 2575,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% if data_sources.0.content.d.ClientAccount.ShortAccount %}\r\nVotre carte d'abonnement num\u00e9ro {{\u00a0data_sources.0.content.d.ClientAccount.Identity.BarCode }} est valable jusqu'au {{\u00a0data_sources.0.content.d.ClientAccount.Identity.ExpirationDate }}.
\r\n\r\nVous avez actuellement {{ data_sources.0.content.d.ClientAccount.ShortAccount.NombrePrets\u00a0}} oeuvre(s) en pr\u00eat :\r\n
\r\n{% for loan in data_sources.0.content.d.ClientAccount.Loans\u00a0%}\r\n {{\u00a0loan.DisplayName\u00a0}} - {{ loan.SearchItemAdapter.Resource.Crtr }} {% if loan.IsLate %}(en retard){% endif %} \r\n{% endfor %}\r\n \r\n\r\n\r\nVous avec actuellement {{ data_sources.0.content.d.ClientAccount.ShortAccount.NombreDemandeReservations }} oeuvre(s) en r\u00e9servation\r\n
\r\n\r\n{% if data_sources.0.content.d.ClientAccount.ShortAccount.NombreMessages %}\r\nVous avez {{\u00a0data_sources.0.content.d.ClientAccount.ShortAccount.NombreMessages }}
\r\n{% else %}\r\nVous n'avez pas de message
\r\n{% endif %}\r\n\r\nCliquer ici pour vous connecter sur le site des m\u00e9diath\u00e8ques.
\r\n{% else %}\r\n\r\nVous n'avez actuellement pas de compte m\u00e9diath\u00e8que raccord\u00e9 ou votre compte n'est plus valide.
\r\n\r\nCliquer ici pour raccorder votre compte m\u00e9diath\u00e8que
\r\n\r\n{% endif %}",
- "limit": 10,
- "refresh": 1
- }
-},
-{
- "pk": 2690,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "\r\n{% for data in data_sources.0.content reversed %}\r\n{{data.title}} \r\n{% endfor %}\r\n ",
- "limit": 10,
- "refresh": 3
- }
-},
-{
- "pk": 2691,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% with user_info=data_sources.0.content %}\r\n{% if user_info %}\r\n {% if user_info.user_admin_access %}\r\n Administration \r\n {% elif user_info.user_backoffice_access %}\r\n Back office \r\n {% endif %}\r\n{% endif %}\r\n{% endwith %}",
- "limit": 10,
- "refresh": 600
- }
-},
-{
- "pk": 2693,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "",
- "limit": 10,
- "refresh": 3600
- }
-},
-{
- "pk": 2703,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "{% with user_info=data_sources.0.content %}\r\n{% if user_info %}\r\n {% if user_info.user_admin_access %}\r\n Administration \r\n {% elif user_info.user_backoffice_access %}\r\n Back office \r\n {% endif %}\r\n{% endif %}\r\n{% endwith %}",
- "limit": 10,
- "refresh": 600
- }
-},
-{
- "pk": 2705,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "",
- "limit": 10,
- "refresh": 3600
- }
-},
-{
- "pk": 2710,
- "model": "data_source_plugin.datasourceplugin",
- "fields": {
- "template_source": "\r\n{% for data in data_sources.0.content reversed %}\r\n{{data.title}} \r\n{% endfor %}\r\n ",
- "limit": 10,
- "refresh": 3
- }
-},
-{
- "pk": 602,
- "model": "a2_service_list_plugin.a2servicelistplugin",
- "fields": {}
-},
-{
- "pk": 2688,
- "model": "feed_plugin.showuserfeed",
- "fields": {
- "limit": 5,
- "timeout": 60
- }
-},
-{
- "pk": 2708,
- "model": "feed_plugin.showuserfeed",
- "fields": {
- "limit": 5,
- "timeout": 60
- }
-},
-{
- "pk": 3,
- "model": "feed_plugin.feed",
- "fields": {
- "url": "https://www.facebook.com/feeds/page.php?format=rss20&id=132492983441286",
- "name": "Facebook SGMAP",
- "color_hex": "dbc82c",
- "css_classes": "facebook"
- }
-},
-{
- "pk": 4,
- "model": "feed_plugin.feed",
- "fields": {
- "url": "http://www.modernisation.gouv.fr/rss.xml",
- "name": "Flux RSS SGMAP",
- "color_hex": "dbc82c",
- "css_classes": ""
- }
-},
-{
- "pk": 5,
- "model": "feed_plugin.feed",
- "fields": {
- "url": "http://www.cnil.fr/rss-cnil/",
- "name": "Flux RSS CNIL",
- "color_hex": "",
- "css_classes": ""
- }
-},
-{
- "pk": 1,
- "model": "idp.attributepolicy",
- "fields": {
- "filter_source_of_filtered_attributes": false,
- "name": "Default",
- "ask_consent_attributes": false,
- "output_namespace": "Default",
- "allow_attributes_selection": false,
- "enabled": true,
- "output_name_format": "urn:oasis:names:tc:SAML:2.0:attrname-format:uri",
- "source_filter_for_sso_from_push_sources": [
- 1
- ],
- "forward_attributes_from_push_sources": false,
- "map_attributes_from_push_sources": false,
- "attribute_filter_for_sso_from_push_sources": null,
- "attribute_list_for_sso_from_pull_sources": 2,
- "map_attributes_of_filtered_attributes": false,
- "send_error_and_no_attrs_if_missing_required_attrs": false
- }
-},
-{
- "pk": 1,
- "model": "attribute_aggregator.attributeitem",
- "fields": {
- "source": 1,
- "required": false,
- "attribute_name": "cn",
- "output_name_format": "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
- "output_namespace": "Default"
- }
-},
-{
- "pk": 2,
- "model": "attribute_aggregator.attributeitem",
- "fields": {
- "source": 1,
- "required": false,
- "attribute_name": "email",
- "output_name_format": "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
- "output_namespace": "Default"
- }
-},
-{
- "pk": 3,
- "model": "attribute_aggregator.attributeitem",
- "fields": {
- "source": 1,
- "required": false,
- "attribute_name": "role",
- "output_name_format": "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
- "output_namespace": "Default"
- }
-},
-{
- "pk": 4,
- "model": "attribute_aggregator.attributeitem",
- "fields": {
- "source": 1,
- "required": false,
- "attribute_name": "gn",
- "output_name_format": "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
- "output_namespace": "Default"
- }
-},
-{
- "pk": 5,
- "model": "attribute_aggregator.attributeitem",
- "fields": {
- "source": 1,
- "required": false,
- "attribute_name": "sn",
- "output_name_format": "urn:oasis:names:tc:SAML:2.0:attrname-format:basic",
- "output_namespace": "Default"
- }
-},
-{
- "pk": 2,
- "model": "attribute_aggregator.attributelist",
- "fields": {
- "attributes": [
- 1,
- 2,
- 3,
- 4,
- 5
- ],
- "name": "Profile"
- }
-},
-{
- "pk": 1,
- "model": "attribute_aggregator.attributesource",
- "fields": {
- "namespace": "Default",
- "name": "USER_PROFILE"
- }
-}
-]
diff --git a/portail_citoyen2/forms.py b/portail_citoyen2/forms.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/locale/fr/LC_MESSAGES/django.po b/portail_citoyen2/locale/fr/LC_MESSAGES/django.po
deleted file mode 100644
index 26f784e..0000000
--- a/portail_citoyen2/locale/fr/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,72 +0,0 @@
-# Translation of portail-citoyen strings
-# Copyright (C) 2013 Entr'ouvert
-# This file is distributed under the same license as the portail-citoyen package.
-# Benjamin Dauvergne , 2013.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: portail_citoyen2 0.1.0\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-03-26 15:15+0100\n"
-"PO-Revision-Date: 2014-03-26 15:15+0100\n"
-"Last-Translator: Benjamin Dauvergne \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: cms_plugins.py:26
-msgid "Modify"
-msgstr "Modifier"
-
-#: dashboard.py:12
-msgid "Contents"
-msgstr "Contenus"
-
-#: dashboard.py:21
-msgid "Announces"
-msgstr "Annonces"
-
-#: dashboard.py:28 dashboard.py:63
-msgid "Recent Actions"
-msgstr "Actions récentes"
-
-#: dashboard.py:32
-msgid "Support"
-msgstr ""
-
-#: dashboard.py:35
-msgid "Project site"
-msgstr "Site du projet"
-
-#: dashboard.py:40
-msgid "Report a bug"
-msgstr "Reporter un bug"
-
-#: models.py:17
-#, python-format
-msgid ""
-"Required, %s characters or fewer. Only letters, numbers, and @, ., +, -, or "
-"_ characters."
-msgstr ""
-
-#: settings.py:45
-msgid "French"
-msgstr "Français"
-
-#: templates/admin/base_site.html:4 templates/admin/base_site.html.py:19
-msgid "Citizen portal administration"
-msgstr "Administration du portail citoyen"
-
-#: templates/admin/base_site.html:17
-msgid "Administration portal"
-msgstr "Portail d'administration"
-
-#: templates/portail_citoyen/form.html:7
-msgid "Submit"
-msgstr "Envoyer"
-
-#: templates/portail_citoyen/form.html:9
-msgid "Back"
-msgstr "Retour"
diff --git a/portail_citoyen2/menu.py b/portail_citoyen2/menu.py
deleted file mode 100644
index 032c3a7..0000000
--- a/portail_citoyen2/menu.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from admin_tools.menu import Menu
-
-class CustomMenu(Menu):
- pass
diff --git a/portail_citoyen2/migrations/0001_initial.py b/portail_citoyen2/migrations/0001_initial.py
deleted file mode 100644
index 68011a8..0000000
--- a/portail_citoyen2/migrations/0001_initial.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- coding: utf-8 -*-
-from south.utils import datetime_utils as datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
- def forwards(self, orm):
- pass
-
- def backwards(self, orm):
- pass
-
- models = {
-
- }
-
- complete_apps = ['portail_citoyen2']
\ No newline at end of file
diff --git a/portail_citoyen2/migrations/__init__.py b/portail_citoyen2/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/portail_citoyen2/models.py b/portail_citoyen2/models.py
deleted file mode 100644
index 7dcfad9..0000000
--- a/portail_citoyen2/models.py
+++ /dev/null
@@ -1,35 +0,0 @@
-from django.core.validators import MaxLengthValidator
-from django.utils.translation import ugettext as _
-from django.db.models.signals import class_prepared
-
-MAX_USERNAME_LENGTH = 255
-
-def longer_username_signal(sender, *args, **kwargs):
- if (sender.__name__ == "User" and
- sender.__module__ == "django.contrib.auth.models"):
- patch_user_model(sender)
-class_prepared.connect(longer_username_signal)
-
-def patch_user_model(model):
- field = model._meta.get_field("username")
-
- field.max_length = MAX_USERNAME_LENGTH
- field.help_text = _("Required, %s characters or fewer. Only letters, "
- "numbers, and @, ., +, -, or _ "
- "characters." % MAX_USERNAME_LENGTH)
-
- # patch model field validator because validator doesn't change if we change
- # max_length
- for v in field.validators:
- if isinstance(v, MaxLengthValidator):
- v.limit_value = MAX_USERNAME_LENGTH
-
-from django.contrib.auth.models import User
-
-# https://github.com/GoodCloud/django-longer-username/issues/1
-# django 1.3.X loads User model before class_prepared signal is connected
-# so we patch model after it's prepared
-
-# check if User model is patched
-if User._meta.get_field("username").max_length != MAX_USERNAME_LENGTH:
- patch_user_model(User)
diff --git a/portail_citoyen2/permission_hack.py b/portail_citoyen2/permission_hack.py
deleted file mode 100644
index 169ad55..0000000
--- a/portail_citoyen2/permission_hack.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import sys
-
-from django.contrib.auth.management import _get_all_permissions
-from django.contrib.auth.models import Permission
-from django.contrib.contenttypes.management import update_contenttypes
-from django.contrib.contenttypes.models import ContentType
-from django.db import models
-
-def create_proxy_permissions(app, created_models, verbosity, **kwargs):
- """
- Creates permissions for proxy models which are not created automatically
- by `django.contrib.auth.management.create_permissions`.
- see https://code.djangoproject.com/ticket/11154
- This method is inspired by `django.contrib.auth.managment.create_permissions`.
-
- Since we can't rely on `get_for_model' we must fallback to `get_by_natural_key`.
- However, this method doesn't automatically create missing `ContentType` so
- we must ensure all the model's `ContentType` are created before running this method.
- We do so by unregistering the `update_contenttypes` `post_syncdb` signal and calling
- it in here just before doing everything.
- """
- update_contenttypes(app, created_models, verbosity, **kwargs)
- app_models = models.get_models(app)
- # This will hold the permissions we're looking for as
- # (content_type, (codename, name))
- searched_perms = list()
- # The codenames and ctypes that should exist.
- ctypes = set()
- for model in app_models:
- opts = model._meta
- if opts.proxy:
- # We can't use `get_for_model` here since it doesn't return
- # the correct `ContentType` for proxy models.
- # see https://code.djangoproject.com/ticket/17648
- app_label, model = opts.app_label, opts.object_name.lower()
- ctype = ContentType.objects.get_by_natural_key(app_label, model)
- ctypes.add(ctype)
- for perm in _get_all_permissions(opts, ctype):
- searched_perms.append((ctype, perm))
-
- # Find all the Permissions that have a content_type for a model we're
- # looking for. We don't need to check for codenames since we already have
- # a list of the ones we're going to create.
- all_perms = set(Permission.objects.filter(
- content_type__in=ctypes,
- ).values_list(
- "content_type", "codename"
- ))
-
- objs = [
- Permission(codename=codename, name=name, content_type=ctype)
- for ctype, (codename, name) in searched_perms
- if (ctype.pk, codename) not in all_perms
- ]
- Permission.objects.bulk_create(objs)
- if verbosity >= 2:
- for obj in objs:
- sys.stdout.write("Adding permission '%s'" % obj)
-
-models.signals.post_syncdb.connect(create_proxy_permissions)
-# see `create_proxy_permissions` docstring to understand why we unregister
-# this signal handler.
-models.signals.post_syncdb.disconnect(update_contenttypes)
diff --git a/portail_citoyen2/settings.py b/portail_citoyen2/settings.py
deleted file mode 100644
index 4f881cd..0000000
--- a/portail_citoyen2/settings.py
+++ /dev/null
@@ -1,320 +0,0 @@
-from django.core.exceptions import ImproperlyConfigured
-
-import os
-import logging.handlers
-
-gettext_noop = lambda s: s
-# Python dotted path to the WSGI application used by Django's runserver.
-WSGI_APPLICATION = 'portail_citoyen2.wsgi.application'
-DEBUG = 'DEBUG' in os.environ
-DEBUG_PROPAGATE_EXCEPTIONS = 'DEBUG_PROPAGATE_EXCEPTIONS' in os.environ
-TEMPLATE_DEBUG = DEBUG
-
-PROJECT_PATH = os.path.join(os.path.dirname(__file__))
-PROJECT_NAME = 'portail-citoyen2'
-
-ADMINS = ()
-if 'ADMINS' in os.environ:
- ADMINS = filter(None, os.environ.get('ADMINS').split(':'))
- ADMINS = [ admin.split(';') for admin in ADMINS ]
- for admin in ADMINS:
- assert len(admin) == 2, 'ADMINS setting must be a colon separated list of name and emails separated by a semi-colon'
- assert '@' in admin[1], 'ADMINS setting pairs second value must be emails'
-
-MANAGERS = ADMINS
-
-DATABASES = {
- 'default': {
- 'ENGINE': os.environ.get('DATABASE_ENGINE', 'django.db.backends.sqlite3'),
- 'NAME': os.environ.get('DATABASE_NAME', os.path.join(PROJECT_PATH, '..', PROJECT_NAME + '.db')),
- 'USER': os.environ.get('DATABASE_USER', ''),
- 'PASSWORD': os.environ.get('DATABASE_PASSWORD', ''),
- 'HOST': os.environ.get('DATABASE_HOST', ''),
- 'PORT': os.environ.get('DATABASE_PORT', '')
- }
-}
-
-# Hey Entr'ouvert is in France !!
-TIME_ZONE = 'Europe/Paris'
-LANGUAGE_CODE = 'fr'
-SITE_ID = 1
-USE_I18N = True
-USE_TZ = True
-
-LANGUAGES = (
- ('fr', gettext_noop('French')),
-)
-USE_L10N = True
-
-# Static files
-
-STATIC_ROOT = os.environ.get('STATIC_ROOT', '/var/lib/%s/static' % PROJECT_NAME)
-STATIC_URL = os.environ.get('STATIC_URL', '/static/')
-MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/var/lib/%s/media' % PROJECT_NAME)
-MEDIA_URL = os.environ.get('MEDIA_URL', '/media/')
-
-# passerelle address & apikey
-PASSERELLE_URL = os.environ.get('PASSERELLE_URL', '')
-PASSERELLE_APIKEY = os.environ.get('PASSERELLE_APIKEY', '')
-
-if 'STATICFILES_DIRS' in os.environ:
- STATICFILES_DIRS = os.environ['STATICFILES_DIRS'].split(':')
-
-TEMPLATE_LOADERS = (
- 'django.template.loaders.filesystem.Loader',
- 'django.template.loaders.app_directories.Loader',
-)
-
-TEMPLATE_CONTEXT_PROCESSORS = (
- 'django.core.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'allauth.account.context_processors.account',
- 'allauth.socialaccount.context_processors.socialaccount',
- 'django.core.context_processors.debug',
- 'django.core.context_processors.i18n',
- 'django.core.context_processors.media',
- 'django.core.context_processors.static',
- 'django.core.context_processors.tz',
- 'django.contrib.messages.context_processors.messages',
- 'cms.context_processors.media',
- 'sekizai.context_processors.sekizai',
- 'portail_citoyen2.context_processors.template_vars',
-)
-
-MIDDLEWARE_CLASSES = (
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.http.ConditionalGetMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.middleware.locale.LocaleMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.transaction.TransactionMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- 'cms.middleware.page.CurrentPageMiddleware',
- 'cms.middleware.user.CurrentUserMiddleware',
- 'cms.middleware.toolbar.ToolbarMiddleware',
- 'entrouvert.djommon.middleware.VersionMiddleware',
-)
-
-ROOT_URLCONF = 'portail_citoyen2.urls'
-
-TEMPLATE_DIRS = ['/var/lib/%s/templates' % PROJECT_NAME, os.path.join(PROJECT_PATH, 'templates')]
-if os.environ.get('TEMPLATE_DIRS'):
- TEMPLATE_DIRS = os.environ['TEMPLATE_DIRS'].split(':') + TEMPLATE_DIRS
-
-INSTALLED_APPS = (
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.sites',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'admin_tools',
- 'admin_tools.theming',
- 'admin_tools.menu',
- 'admin_tools.dashboard',
- 'django.contrib.admin',
- 'south',
- 'mptt',
- 'sekizai',
- 'cms',
- 'menus',
- 'djangocms_text_ckeditor',
- # 'cmsplugin_text_wrapper',
- # 'cms_ajax_text_plugin',
- 'passerelle_register_plugin',
- 'feed_plugin',
- 'data_source_plugin',
- 'allauth',
- 'allauth.account',
- 'allauth.socialaccount',
- # ... include the providers you want to enable:
- 'portail_citoyen2.allauth_authentic2',
- 'portail_citoyen2',
-)
-
-AUTHENTICATION_BACKENDS = (
- 'django.contrib.auth.backends.ModelBackend',
- 'allauth.account.auth_backends.AuthenticationBackend',
-)
-# auth and allauth settings
-LOGIN_REDIRECT_URL = os.environ.get('LOGIN_REDIRECT_URL', '/')
-LOGOUT_URL = os.environ.get('LOGOUT_URL', '/accounts/logout/')
-LOGIN_URL = os.environ.get('LOGIN_URL', '/accounts/authentic2/login/?process=login')
-SOCIALACCOUNT_QUERY_EMAIL = True
-SOCIALACCOUNT_PROVIDERS = {
- 'authentic2': {
- 'URL': 'http://localhost:9000/idp/oauth2/',
- 'SCOPE': ['read', 'write'],
- },
-}
-SOCIALACOUNT_AUTO_SIGNUP = True
-ACCOUNT_LOGOUT_ON_GET = True
-ACCOUNT_UNIQUE_EMAIL = False
-
-MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
-
-# sessions
-SESSION_EXPIRE_AT_BROWSER_CLOSE = True
-SESSION_COOKIE_NAME = 'portail-citoyen'
-SESSION_COOKIE_PATH = os.environ.get('SESSION_COOKIE_PATH', '/')
-SESSION_COOKIE_SECURE = 'SESSION_COOKIE_SECURE' in os.environ
-
-# email settings
-EMAIL_HOST = os.environ.get('EMAIL_HOST', 'localhost')
-EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER', '')
-EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD', '')
-EMAIL_PORT = int(os.environ.get('EMAIL_PORT', 25))
-EMAIL_SUBJECT_PREFIX = os.environ.get('EMAIL_SUBJECT_PREFIX', '[Portail citoyen]')
-EMAIL_USE_TLS = 'EMAIL_USE_TLS' in os.environ
-SERVER_EMAIL = os.environ.get('SERVER_EMAIL', 'root@localhost')
-DEFAULT_FROM_EMAIL = os.environ.get('DEFAULT_FROM_EMAIL', 'ne-pas-repondre@portail-citoyen.fr')
-
-# web & network settings
-if 'ALLOWED_HOSTS' in os.environ:
- ALLOWED_HOSTS = os.environ['ALLOWED_HOSTS'].split(':')
-else:
- ALLOWED_HOSTS = ('127.0.0.1', 'localhost')
-USE_X_FORWARDED_HOST = 'USE_X_FORWARDED_HOST' in os.environ
-
-if 'INTERNAL_IPS' in os.environ:
- INTERNAL_IPS = os.environ['INTERNAL_IPS'].split(':')
-else:
- INTERNAL_IPS = ('127.0.0.1')
-
-SECRET_KEY = os.environ.get('SECRET_KEY', '0!=(1kc6kri-ui+tmj@mr+*0bvj!(p*r0duu2n=)7@!p=pvf9n')
-
-
-SAML_METADATA_ROOT = 'metadata'
-
-LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': True,
- 'formatters': {
- 'syslog': {
- 'format': 'portail-citoyen(pid=%(process)d) %(levelname)s %(name)s: %(message)s',
- },
- 'syslog_debug': {
- 'format': 'portail-citoyen(pid=%(process)d) %(levelname)s %(asctime)s t_%(thread)s %(name)s: %(message)s',
- },
- },
- 'handlers': {
- 'syslog': {
- 'level': 'DEBUG',
- 'class': 'entrouvert.logging.handlers.SysLogHandler',
- 'formatter': 'syslog_debug' if DEBUG else 'syslog',
- 'facility': logging.handlers.SysLogHandler.LOG_LOCAL0,
- 'address': '/dev/log',
- 'max_length': 999,
- },
- 'mail_admins': {
- 'level': 'ERROR',
- 'class': 'django.utils.log.AdminEmailHandler',
- 'filters': [],
- },
- 'console': {
- 'class': 'logging.StreamHandler',
- 'formatter': 'syslog_debug',
- 'level': 'DEBUG',
- },
- },
- 'loggers': {
- 'requests': {
- 'handlers': ['mail_admins','syslog'],
- 'level': 'ERROR',
- 'propagate': False,
- },
- 'portail_citoyen2': {
- 'handlers': ['mail_admins','syslog'],
- 'level': 'DEBUG' if DEBUG else 'INFO',
- 'propagate': False,
- },
- 'django': {
- 'handlers': ['mail_admins','syslog'],
- 'level': 'DEBUG' if DEBUG else 'INFO',
- 'propagate': False,
- },
- 'django.db': {
- 'handlers': ['mail_admins','syslog'],
- 'level': 'INFO',
- 'propagate': False,
- },
- '': {
- 'handlers': ['mail_admins','syslog'],
- 'level': 'DEBUG' if DEBUG else 'INFO',
- 'propagate': True,
- },
- }
-}
-SOUTH_TESTS_MIGRATE = False
-
-# Admin tools
-ADMIN_TOOLS_INDEX_DASHBOARD = 'portail_citoyen2.dashboard.CustomIndexDashboard'
-ADMIN_TOOLS_APP_INDEX_DASHBOARD = 'portail_citoyen2.dashboard.CustomAppIndexDashboard'
-ADMIN_TOOLS_MENU = 'portail_citoyen2.menu.CustomMenu'
-ADMIN_TOOLS_THEMING_CSS = 'portail_citoyen/css/admin.css'
-
-
-# cms settings
-CMS_TEMPLATES = (
- ('portail_citoyen/base_two_columns.html', 'Canevas sur deux colonnes'),
- ('portail_citoyen/base_one_column.html', 'Canevas sur une colonne'),
- ('portail_citoyen/base_help.html', 'Canevas de l\'aide'),
-)
-if 'CMS_TEMPLATES' in os.environ:
- CMS_TEMPLATES = map(lambda x: x.split(';'),
- os.environ('CMS_TEMPLATES').split(':'))
-CMS_REDIRECTS = True
-CMS_TEXT_WRAPPERS = (
- ('block', {
- 'render_template': 'portail_citoyen/block.html',
- 'extra_context': {},
- }),
-)
-CMS_TEXT_WRAPPER_CLASSES = []
-# necessary for plugin displaying a form to have a fresh csrftoken
-CMS_PLACEHOLDER_CACHE = False
-CMS_PAGE_CACHE = False
-
-# Do we use memcached ?
-if 'USE_MEMCACHED' in os.environ:
- CACHES = {
- 'default': {
- 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
- 'LOCATION': '127.0.0.1:11211',
- 'KEY_PREFIX': 'portail-citoyen',
- }
- }
- SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
-
-
-if 'USE_DEBUG_TOOLBAR' in os.environ:
- try:
- import debug_toolbar
- MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
- INSTALLED_APPS += ('debug_toolbar',)
- DEBUG_TOOLBAR_CONFIG = {'INTERCEPT_REDIRECTS': False}
- except ImportError:
- print "Debug toolbar missing, not loaded"
-
-# extract any key starting with setting
-for key in os.environ:
- if key.startswith('SETTING_'):
- setting_key = key[len('SETTING_'):]
- value = os.environ[key]
- try:
- value = int(value)
- except ValueError:
- pass
- globals()[setting_key] = value
-
-# try to import local_settings.py (useless, in theory)
-try:
- from local_settings import *
-except ImportError, e:
- if 'local_settings' in e.args[0]:
- pass
-
-if not CMS_TEMPLATES:
- raise ImproperlyConfigured('You must define CMS_TEMPLATES')
diff --git a/portail_citoyen2/static/portail_citoyen/css/Museo500-Regular.otf b/portail_citoyen2/static/portail_citoyen/css/Museo500-Regular.otf
deleted file mode 100644
index da52e9cc3376c85b77567c8841a991fd56a29c9c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 128172
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