4 - Documentation technique
Sous le capot.
- UNIVERS TECHNIQUE
- Introduction au code
- Installer Communecter
- API
- CoPi
- Interopérabilité
- Configuration des outils à usage interne
- Créer une application ou un élément
- Créer un COstum
- ActivityPub
- MediaWiki
- Module Graph
UNIVERS TECHNIQUE
MODULES
- MOTEUR DE RECHERCHE TERRITORIAL
- AGENDA
- NEWS
- CLASSIFIEDS
- CHAT (doc)
- API (doc) [COMMUNITY] #page element [MAP] [COFORM] [OCECO]
- NETWORK (doc)
Modules exist in CO but direct links are coming soon to
- PEOPLE
- ORGANIZATIONS
- EVENTS
- PROJECTS
- POINTS OF INTEREST
- DDA : Discuss Decide and Act (doc)
- SOCIAL BOOKMARKING
- PLACES NEEDS SERVICES COMPETENCE (soon)
- GLOOTON : GENERIC IMPORT TOOL
- BABELFISH : GENERIC Semantic translation and conversion
INSTANCES
Basé sur le code de Communecter
- Territoire en transition
- Pacte pour la transition
- NOTRAGORA
- Retrouvez l'ensemble des COSTUMS (co personnalisé) ICI
- Et bientôt plein de petits CoPi (doc)
OPEN SOURCE TOOLS WE USE (doc)
CONNECTING THINGS TOGETHER
OPEN SOURCE PROJECTS WE USE AND LOVE
Introduction au code
N’ayez pas peur ! Le code est écrit de manière accessible afin que vous puissiez y contribuer facilement. Si vous êtes à l’aise avec les méthodes plus “standard” dans l’industrie, il est possible de coder de votre côté et de communiquer via l’API.
Les discussions publiques de l'équipe de développeur se font dans le canal #codev_open.
Ressources pour débuter
- Présentation du code en vidéo (30 minutes)
- Documentation de l’API
- Fonctionnement PHP
- Communauté des développeurs
- Pense-bête de commandes GIT
- Feuille de route des développeurs
Architecture
Le motif utilisé est le classique Modèle-vue-contrôleur. Une grosse partie du code se trouve dans le dépôt CO2 de notre Gitlab, tandis que citizenToolKit gère plutôt le backend.
Installer Communecter
Ubuntu 16.04
Prérequis
Pour utiliser Communecter vous devez avoir
-
Apache 2 & PHP 5.6 (Attention, ne fonctionne pas sur PHP 7)
-
sudo apt-get install apache2 php5.6 -
Pour passer de la version 7 à 5.6 vous pouvez suivre la solution suivante : https://askubuntu.com/questions/761713/how-can-i-downgrade-from-php-7-to-php-5-6-on-ubuntu-16-04
-
Certains modules doivent être installé
- rewrite
sudo a2enmod rewrite - curl
sudo apt-get install php5.6-curl - mcrypt
sudo apt-get install php5.6-mcrypt - gd
sudo apt-get install php5.6-gd - mongo
sudo apt-get install php5.6-mongo - dom
sudo apt-get install php5.6-dom
- rewrite
-
Pour vérifier votre version de PHP
php -v
-
-
MongoDB 3.4 (Ne fonctionne pas avec la 3.6) :
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
Install
Clone from GitHub :
mkdir ~/dev && mkdir ~/dev/communecter
mkdir ~/dev/communecter/modules
cd /var/www/html/
sudo ln -s ~/communecter communecter
cd ~/dev/communecter
git clone https://github.com/pixelhumain/pixelhumain.git
cd modules/
git clone https://github.com/pixelhumain/citizenToolKit.git
git clone https://github.com/pixelhumain/co2.git
ln -s co2 network
git clone https://github.com/pixelhumain/api
git clone https://github.com/pixelhumain/graph.git
git clone https://github.com/pixelhumain/classifieds.git
git clone https://github.com/pixelhumain/ressources.git
git clone https://github.com/pixelhumain/places.git
git clone https://github.com/pixelhumain/chat.git
git clone https://github.com/pixelhumain/learn.git
git clone https://github.com/pixelhumain/survey.git
git clone https://github.com/pixelhumain/interop.git
git clone https://github.com/pixelhumain/cotools.git
git clone https://github.com/pixelhumain/eco.git
cd ../
Installer les dépendances avec Composer :
sudo apt install composer
cd pixelhumain/ph/
composer update
composer install
Rename the dbconfig file :
cd protected/
cp config/dbconfig.exemple.php config/dbconfig.php
Si le fichier dbconfig.php n'existe pas, créer le : nano config/dbconfig.php
<?php
$dbconfig = array(
'class' => 'mongoYii.EMongoClient',
'server' => 'mongodb://127.0.0.1:27017/',
'db' => 'pixelhumain',
);
?>
Création du dossier runtime et assets
mkdir runtime
sudo chmod -R 775 runtime/
cd ../
mkdir assets
sudo chmod -R 775 assets/
cd ../../
sudo chown -R [votreUser]:www-data pixelhumain
sudo chown -R [votreUser]:www-data modules
Configuration
And configure Apache vhost : edit /etc/apache2/sites-available/communecter.conf :
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
Activate the new vhost :
sudo a2ensite communecter
sudo a2enmod rewrite
sudo service apache2 reload
Configurer MongoDB
#Making the Data folder for MongoDB
mkdir data/
mkdir data/db
Import les données :
cd modules/co2/data
unzip cities.json.zip
mongoimport --db pixelhumain --collection cities --file cities.json
Ajouter MongoDB au démarrage et faire le script d’utilisation : sudo nano /etc/init.d/communecterdb
Ajouter ceci :
#!/bin/sh
#
### BEGIN INIT INFO
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Provides: unattended-upgrade-shutdown-check
# Default-Start: 2 3 4 5
# Default-Stop: 0 6
# Short-Description: Check if unattended upgrades are being applied
# Description: Check if unattended upgrades are being applied
# and wait for them to finish
### END INIT INFO
Sauvegardez :
sudo chmod +x /etc/init.d/communecterdb
update-rc.d communecterdb defaults
update-rc.d communecterdb enable
Alternative : créer le script communecterdb.sh, le rendre exécutable et l’ajouter dans /etc/rc.local
Vérifier que tous les composants sont installés
Accéder a l’url suivant : http://127.0.0.1/ph/test
Et réglez tout les points rouges.
C’est bon vous pouvez utiliser COMMUNECTER
Accédez à cette adresse : http://127.0.0.1/ph/
Optionnel
Interface Mongo
Si vous souhaitez avoir une interface pour géré MongoDB vous pouvez télécharger Robo3T : https://robomongo.org/download
Email service to cron
Add
crontab -e : */2 * * * * curl https://127.0.0.1/ph/co2/test/docron
Use
Communecter is now available : http://127.0.0.1/ph/
To try the email service, go to http://127.0.0.1/ph/co2/test/docron
To use in production mode, edit index.php
Update
Create /var/www/html/communecter/update.sh containing :
red=`tput setaf 1`
green=`tput setaf 2`
blue=`tput setaf 0`
bgWhite=`tput setab 7`
reset=`tput sgr0`
Make it executable and launch it.
Docker
Proposition de Marc_Toulouse sur le chat :
https://chat.lescommuns.org/channel/co_dev_open
L’idée en effet est de regrouper les différents façons d’installer Communecter ici : https://wiki.communecter.org/en/installing-communect.html (c’est un clone du wiki de Github)
Voir plus précisément : https://wiki.communecter.org/en/installing-communect-with-docker.html (et pas https://wiki.communecter.org/en/installing-communect-on-ubuntu-16.04.html à priori car ça ne concerne pas docker)
Tibor me parle aussi du nouveau PAD : http://pad.co.tools (sur CryptoPad) : ça c’est pour faire la doc. C’est vraiment ici qu’elle doit être faite : https://wiki.communecter.org/en/installing-communect-with-docker.html : en cliquant sur le crayon, on accès au wiki de Github en mode édition (faut avoir un compte github)
Installation de Communecter via docker
choose community edition CE https://docs.docker.com/engine/installation
example install docker ubuntu https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu
Erreur avec AptGet… OK
docker-ce n’était pas dispo de base, il a fallu ajouter des serveurs
En fait, j’ai du suivre le post:
https://gist.github.com/Stoakes/a5adb36e9211964dbf00b47d36edd181
Post-installation steps for Linux https://docs.docker.com/engine/installation/linux/linux-postinstall
Installer docker-compose
https://docs.docker.com/compose/install
Installer Communecter
git clone https://gitlab.adullact.net/pixelhumain/docker ~/pixelhumain-docker
cd ~/pixelhumain-docker
#pour linux
docker-compose -f docker-compose.yml -f docker-compose.install.yml run ph cotools --install
#ou pour windows/mac utiliser
docker-compose -f docker-compose-no-build.yml -f docker-compose.install-no-build.yml run ph cotools --install
Mise à jour des droits
Modifier les droits pour pouvoir modifier les fichiers :
Pour taper ces commandes, se mettre dans le rep :cd ~/pixelhumain-docker
#modifier le group/user pour pouvoir ouvrir/modifier les fichiers
sudo chown -R ${USER:=$(/usr/bin/id -run)}:$USER code/
sudo chown -R ${USER:=$(/usr/bin/id -run)}:$USER code/pixelhumain/
sudo chown -R ${USER:=$(/usr/bin/id -run)}:$USER code/modules/
sudo chown -R ${USER:=$(/usr/bin/id -run)}:$USER code/log/
Voir aussi “Getting start” : https://docs.docker.com/compose/gettingstarted/#step-3-define-services-in-a-compose-file
Problème d’accès
Suite à cela, je n’avais pas accès à CO.
Nous avons vérifié si un container tournait (voir paragraphe plus bas) -> non
Nous avons supprimé le répertoire code pour tout recommencer.
docker-compose -f docker-compose.yml -f docker-compose.install.yml run ph install
Explication :
la il va rebuilder le container front et utiliser le container install pour faire l’install sur le front
c’est pour ça que l’on a 2 fichier :
- docker-compose.yml
- docker-compose.install.yml
docker-compose.install.yml ne sert que pour l’install et certaine commande
Suite à ces commandes, il clone tout ce qu’il faut en local, ça prend un certain temps en fonction de votre réseau…
Aller sur http://localhost:5080
La première fois, j’ai eu des messages d’erreur d’accès…
Thomas m’a demandé si j’avais le répertoire :/pixelhumain-docker/code/pixelhumain/ph/vendor/
mais je ne l’avais pas…
Nous avons de nouveau supprimé le répertoire code, et modifié le script
/pixelhumain-docker/docker-install/Dockerfile
pour y ajouter curl et php
Voir la présence et lancer un container
Pour savoir si docker tourne, faire "docker ps"
S’il n’y a rien (à part le titre des colonnes du tableau), c’est signe qu’aucun container ne tourne.
Exemple : ici, il n’y a pas de container qui tourne :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Là, il y en a :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92ed85af6a28 pixelhumaindocker_front "/usr/bin/supervisord" 4 weeks ago Up About a minute 9000/tcp, 0.0.0.0:5080->80/tcp, 0.0.0.0:5443->443/tcp, 0.0.0.0:5901->9001/tcp pixelhumaindocker_front_1
8f16ade3a72b mongo "docker-entrypoint..." 4 weeks ago Up About a minute 27017/tcp pixelhumaindocker_mongo_1
Et pour lancer un container :
docker-compose -f docker-compose.yml up
Inscription en local
Une fois sur l’interface d’accueil de CO, il faut remplir le formulaire d’inscription, sauf que le mail d’activation n’est pas envoyé.
Pour passer cette étape, on “triche” avec la commande :
docker-compose -f docker-compose.yml -f docker-compose.install.yml run ph cotools --emailvalid=email@example.com
(en modifiant bien sur : email@example.com par l’email qui a servi à l’inscription)
On rafraîchit la page, on se loge, et ça fonctionne, on arrive dans CO !
Gérer le démarrage auto
sudo systemctl enable docker
Synchronizing state of docker.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable docker
Malgré cela, CO ne démarre pas au lancement de ma machine.
Accès à Communecter
Je n’ai pas encore réussi (pas essayé non plus…) à le lancer au démarrage, donc à chaque fois que je souhaite lancer CO :
- Je vais dans mon répertoire
~/projets/pixelhumain-docker/ - Je lance
docker-compose -f docker-compose.yml up - Je vais sur http://localhost:5080, et ça tourne !
Tout est noté à la fin du script ci-dessus… (je dis ça, car j’ai cherché un peu car je n’avais pas lu…)
Ajout de Fluidgraph dans CO
Administration de la base NoSQL (mongoDB)
Pour avoir accès à mongo en dehors du container il faut ouvrir le port
Voir fichier :
https://github.com/pixelhumain/docker/blob/master/docker-compose.yml
J’ai du ajouter la ligne concernant l’ouverture de port comme l’exemple qui suit :
services:
mongo:
image: mongo
volumes:
- ./code/data/db:/data/db
ports:
- "5017:27017"
Cela m’a permis, via l’outil Robomongo d’ajouter une collection :
{
"_id" : ObjectId("59f1920bc30f30536124355d"),
"name" : "DEV Config",
"key" : "devParams",
"mangoPay" : {
"ClientId" : "communecter",
"ClientPassword" : "XXXXXXXXXXX",
"TemporaryFolder" : "../../tmp"
}
}
Je ne sais pas encore à quoi ça correspond, mais on m’a dit de le faire, sinon, j’avais l’erreur :
ERREUR 403
Missing Configs db.applications.key == prodParamsexists

Ce qui m’a permis de faire fonctionner mon instance locale.
API
Accès à l’interface graphique de l’API : communecter.org/api
Get : Récupérer des informations
Depuis l’API vous avez la possibilité de récupérer différentes informations en provenance de Communecter :
-
[citoyens]Citoyen -
[organizations]Organisation -
[projects]Projet -
[events]Événement -
[needs]Besoin -
[news]News
Récupérer toutes les entités
Structure
/api/[project || person || organization || event || need || news]/get/
Exemple
https://www.communecter.org/api/organization/get
Pour voir la description du résultat aller dans la rubrique “Les attributs”.
Paramétrer la recherche
Vous avez la possibilité d’ajouter des paramètres pour peaufiner votre recherche :
-
[id]Identifiant -
[tags]Tags -
[insee]Code Insee -
[format]Format
Récupérer une entité via son identifiant
/ph/communecter/data/get/type/(projects || citoyens || organizations || events || news)/id/[id_entity]
Exemple : https://www.communecter.org/api/organization/get/id/57186ed894ef47210d7b242d
Rechercher par tags
Vous avez la possibilité de paramétrer la recherche des entités en fonctions des tags. Vous pouvez ajouter plusieurs tags qui devront être séparé par une virgule. Par défauts, si vous avez mis plusieurs tags, il suffit pour l’entité d’avoir un de ces tags pour être affiché. Si vous souhaitez que l’entité possède tout les tags alors il faut mettre le paramètre suivant : /multiTags/true
Exemples :
https://www.communecter.org/api/organization/get?tags=nuitdebout
https://www.communecter.org/api/organization/get?tags=education,social
https://www.communecter.org/api/organization/get?tags=education,social/multiTags/true
Rechercher par code Insee
Si vous connaissez le code Insee de votre commune, vous pouvez faire une recherche via ce code.
Exemple :
https://www.communecter.org/api/organization/get?insee=33402
Formats
L’API prend en compte différents formats pour le résultat. Par défaut, c’est le format que propose Communecter. Nous prenons aussi en comptes les formats suivant :
- SCHEMA
/ph/communecter/data/get/type/organizations/format/schema - PLP
/ph/communecter/data/get/type/citoyens/format/plp - RSS
/ph/api/news/get/format/rss - JSONFEED
/ph/api/news/get/format/jsonfeed - KML
/ph/api/event/get/format/kml - GEOJSON
/ph/api/person/get/format/geojson - CSV
/ph/api/person/get/format/csv
Attention certains formats ne retourne pas forcement toutes les entités, voici la liste pour chaque format.
COMMUNECTER
-
[citoyens]Citoyen -
[organizations]Organisation -
[projects]Projet -
[events]Événement -
[needs]Besoin -
[news]News
SCHEMA
-
[citoyens]Citoyen -
[organizations]Organisation -
[projects]Projet -
[events]Événement -
[needs]Besoin - City
-
[news]News
PLP
-
[citoyens]Citoyen
KML
-
[citoyens]Citoyen -
[organizations]Organisation -
[projects]Projet -
[events]Événement -
[needs]Besoin - City
-
[news]News
GEOJSON
-
[citoyens]Citoyen -
[organizations]Organisation -
[projects]Projet -
[events]Événement -
[needs]Besoin - City
-
[news]News
CSV
-
[organizations]Organisation
RSS
-
[news]news
JSONFEED
-
[news]news
Les attributs
Ici, vous aurez la description de tout les attribues des différentes entités qui sont retournés via l’API.
Format Communecter
-
limitNombre d’entités retournée -
nexturl retournant la suite des entités -
previousurl retournant la liste précédente des entités
entities toutes les entités en leurs identifiants en clé
-
nameNom de l’entité -
imageUrl de l’image de profil de l’entité -
urlCommunecterUrl de la fiche de l’entité sur Communecter -
urlApiUrl qui retourne les informations d’une entité via l’API -
address-
streetAddressNuméro et nom de la rue -
postalCodeCode postal -
addressLocalityNom de la commune -
addressCountryNom du Pays -
codeInseeCode Insee de la commune
-
-
geolatitudelongitude
-
geoPositionAutre format pour la position géographique de l’entité -
shortDescriptionCourte description de l’entité -
descriptionDescription de l’entité. -
emailL’email de l’entité. -
phoneL’ensemble des numéros de téléphones de l’entité ( fixe, mobile et fax) -
socialNetworkL’ensemble des liens vers les autres réseaux sociaux de l’entité -
tagsTous les tags associés à l’entité -
linksLes différents liens que l’entité a avec les autres :-
memberOfListe des organisations dont l’entité est membre -
projectsListe des projets dont l’entité contribue -
eventsListe des événements dont l’entité est invitée ou participe -
followersListe des citoyens dont l’entité suit. -
membersListe des citoyens membres de l’entité. -
needsListe des besoins de l’entité.
-
Convert : Récupérer des données en onthologie PH
Depuis l’API, vous avez la possibilité de convertir les données sous différents format que vous possédez directement en onthologie PH.
-
[geojson]GeoJson -
[wikipedia]Json issu de l’API de Wikidata -
[datagouv]Json issu de l’API de Data.gouv -
[osm]Json issu de l’API de Open Street Map -
[ods]JSon issu de l’API de OpenDataSoft (on intéroge uniquement la base SIRENE) -
[datanova]Json issu de l’API de Datanova -
[poleemploi]Json issu de l’API de Pôle Emploi -
[educstruct]Json issu de l’API de ScanR(structures de recherche) -
[educetab]Json issu de l’API de ScanR (établissements impliqués dans la recherche) -
[educmembre]Json issu de l’API de ScanR (membre des universités de France) -
[educecole]Json issu de l’API de ScanR (école doctorales accrédités)
Obtenir l’ontologie ph pour un type d’élément donnée via une url
Structure
/ph/communecter/api/convert/geojson/type/[organizations || citoyens || events || projects]?url="http://votreurl"
Exemple
https://www.communecter.org/api/convert/geojson/type/organizations?url=http://umap.openstreetmap.fr/en/datalayer/306808/
Cas particuliers : les uMap
Structure
L’API permet de convertir les données geojson d’une uMap donnée via la paramètre “url”.
On peut aussi mettre en paramètre l’URL courte d’une uMap (visible en appuyant sur le bouton partager à gauche de la uMap). Attention pour le moment, il faut que l’url soit en “http” et non pas en “https”, retirez le “s” si tel est le cas.
https://www.communecter.org/api/convert/geojson/type/organizations?url=[URL]
Exemples
URL longue :
https://www.communecter.org/api/convert/geojson/type/organizations?url=http://umap.openstreetmap.fr/en/datalayer/306808/
URL Courte :
/ph/communecter/api/convert/type/organizations?url=http://u.osmfr.org/m/62176/
Obtenir l’ontologie ph pour un type d’élément donnée via un fichier
Il faut envoyer à l’API le paramètre “file” via méthode POST. (en utilisant curl ou RESTED par exemple).
Obtenir l’ontologie ph pour une url intérrogeant une API externe
/ph/communecter/api/convert/[type interop]?url="http://votreurlinterop"
Wikidata
Structure
/ph/api/convert/wikipedia?url=https://www.wikidata.org/wiki/Special:EntityData/[wikidataID].json
Exemple
Ville de Saint-Louis - WikidataID = Q47045 :
/ph/api/convert/wikipedia?url=https://www.wikidata.org/wiki/Special:EntityData/Q47045.json
Data.gouv
Structure
/ph/api/convert/datagouv?url=https://www.data.gouv.fr/api/1/spatial/zone/fr/town/[insee]/datasets
Exemple
Ville de Rodez - Code INSEE 12202 :
/ph/api/convert/datagouv?url=https://www.data.gouv.fr/api/1/spatial/zone/fr/town/12202/datasets
On va pouvoir ensuite obtenir l’ensemble des datasets de la ville mentionnée et au final parcourir l’ensemble des différents jeux de données de la ville.
OpenStreetMap
Structure
/ph/api/convert/osm?url=http://overpass-api.de/api/interpreter?data=[out:json];node[%22name%22](poly:[geoshape]);out;
Exemple
Ville de Saint-Louis :
/ph/api/convert/osm?url=http://overpass-api.de/api/interpreter?data=[out:json];node[%22name%22](poly:%22-21.303505996763%2055.403919253998%20-21.292626813288%2055.391189163162%20-21.282029142394%2055.381522536523%20-21.256155186265%2055.392395046639%20-21.232012804782%2055.387888015185%20-21.211100938923%2055.390619722192%20-21.199480966855%2055.382654775478%20-21.185882138486%2055.385961778627%20-21.173346518752%2055.389949958731%20-21.16327583783%2055.399563417107%20-21.14709868917%2055.405379688232%20-21.166028899095%2055.414700890276%20-21.184085220909%2055.432085218794%20-21.190290936422%2055.440880800108%20-21.195166490948%2055.462318490892%20-21.237553168259%2055.459769285867%20-21.258726107298%2055.463692709631%20-21.286021128961%2055.455515913879%20-21.294777773557%2055.419916682666%20-21.303505996763%2055.403919253998%22);out;
On va pouvoir filtrer l’enssemble des noeuds qui sont présent dans le geoshape fourni et enfin filtrer tous les noeuds qui possède au moins le tag “name”.
OpenDataSoft
Structure
On va pouvoir filtrer l’ensemble des éléments présent dans le geofilter fournit. On peut filtrer les éléments par thématique en mentionnant des refine.libapen dans l’url.
/ph/api/convert/ods?url=https://data.opendatasoft.com/api/records/1.0/search/?dataset=sirene%40public&sort=datemaj&facet=categorie&facet=proden&facet=libapen&facet=siege&facet=libreg_new&facet=saisonat&facet=libtefen&facet=depet&facet=libnj&facet=libtca&facet=liborigine&rows=30&start=0&geofilter.polygon=[geofilter]
Exemples
Ville de Saint-Louis :
/ph/api/convert/ods?url=https://data.opendatasoft.com/api/records/1.0/search/?dataset=sirene%40public&sort=datemaj&facet=categorie&facet=proden&facet=libapen&facet=siege&facet=libreg_new&facet=saisonat&facet=libtefen&facet=depet&facet=libnj&facet=libtca&facet=liborigine&rows=30&start=0&geofilter.polygon=(-21.303505996763,55.403919253998),(-21.292626813288,55.391189163162),(-21.282029142394,55.381522536523),(-21.256155186265,55.392395046639),(-21.232012804782,55.387888015185),(-21.211100938923,55.390619722192),(-21.199480966855,55.382654775478),(-21.185882138486,55.385961778627),(-21.173346518752,55.389949958731),(-21.16327583783,55.399563417107),(-21.14709868917,55.405379688232),(-21.166028899095,55.414700890276),(-21.184085220909,55.432085218794),(-21.190290936422,55.440880800108),(-21.195166490948,55.462318490892),(-21.237553168259,55.459769285867),(-21.258726107298,55.463692709631),(-21.286021128961,55.455515913879),(-21.294777773557,55.419916682666),(-21.303505996763,55.403919253998)
L’exemple suivant fait la même chose que l’exemple précédent sauf qu’il filtre tous les éléments qui sont dans le secteur d’activité : Pratique dentaire
/ph/api/convert/ods?url=https://data.opendatasoft.com/api/records/1.0/search/?dataset=sirene%40public&facet=categorie&facet=proden&facet=libapen&facet=siege&facet=libreg_new&facet=saisonat&facet=libtefen&facet=depet&facet=libnj&facet=libtca&facet=liborigine&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)&refine.libapen=Pratique%20dentaire
Datanova
Structure
On récupère l’ensemble des enseignes La Poste présent dans le geofilter donné.
/ph/api/convert/datanova?url=https://datanova.laposte.fr/api/records/1.0/search/?dataset=laposte_poincont&rows=30&start=0&geofilter.polygon=[geofilter]
Exemple
Ville de Bordeaux
/ph/api/convert/datanova?url=https://datanova.laposte.fr/api/records/1.0/search/?dataset=laposte_poincont&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)
Pôle Emploi
Introduction
- On demande à avoir un token :
https://entreprise.pole-emploi.fr/connexion/oauth2/access_token?realm=%2Fpartenaire
avec en paramètre POST :
- grant_type = client_credential
- client_id = [identifiant]
- scope = [mot de passe]
Ensuite on lance la requête :
https://api.emploi-store.fr/partenaire/infotravail/v1/datastore_search_sql?sql=SELECT%20%2A%20FROM%20%22421692f5%2Df342%2D4223%2D9c51%2D72a27dcaf51e%22%20WHERE%20%22CITY_CODE%22=%27[insee]%27%
Exemple (ville de Saint-Louis) :
https://api.emploi-store.fr/partenaire/infotravail/v1/datastore_search_sql?sql=SELECT%20%2A%20FROM%20%22421692f5%2Df342%2D4223%2D9c51%2D72a27dcaf51e%22%20WHERE%20%22CITY_CODE%22=%2797414%27%
Il faut indiquer en paramètre POST ses identifiants du Pôle Emploi (inscription sur emploi-store-dev.fr) et aussi mettre un token dans le HEADER : “Authorization: Bearer [token]”.
Structure
L’url à passer en paramètre est du type :
/ph/api/convert?url=https://api.emploi-store.fr/partenaire/infotravail/v1/datastore_search_sql?sql=SELECT%20%2A%20FROM%20%22421692f5%2Df342%2D4223%2D9c51%2D72a27dcaf51e%22%20WHERE%20%22CITY_CODE%22=%27[insee]%27%
Exemples
Ville de Saint-Louis :
/ph/api/convert?url=https://api.emploi-store.fr/partenaire/infotravail/v1/datastore_search_sql?sql=SELECT%20%2A%20FROM%20%22421692f5%2Df342%2D4223%2D9c51%2D72a27dcaf51e%22%20WHERE%20%22CITY_CODE%22=%2797414%27%
ScanR
Structure
ScanR comporte 4 jeux de données que l’on peut intéroger :
Structure de recherche publique :
/ph/api/convert/educstruct?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-structures-recherche-publiques-actives&facet=numero_national_de_structure&facet=annee_de_creation&facet=tutelles&facet=type_de_tutelle&facet=nature_de_tutelle&facet=nature_de_structure&facet=type_de_structure&facet=niveau_de_structure&facet=domaine_scientifique&facet=panel_erc&facet=theme_de_recherche&facet=commune&facet=unite_urbaine&facet=departement&facet=region&facet=pays&facet=comue&facet=region_avant_2016&rows=30&start=0&geofilter.polygon=[geofilter]
Etablissement impliqués dans la recherche :
/ph/api/convert/educetab?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-etablissements-publics-prives-impliques-recherche-developpement&facet=siren&facet=libelle&facet=date_de_creation&facet=categorie&facet=libelle_ape&facet=tranche_etp&facet=categorie_juridique&facet=wikidata&facet=commune&facet=unite_urbaine&facet=departement&facet=region&facet=pays&facet=badge&facet=region_avant_2016&rows=30&start=0&geofilter.polygon=[geofilter]
Membres des universités de France :
/ph/api/convert/educmembre?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-iuf-les-membres&rows=30&start=0&geofilter.polygon=[geofilter]
Liste des écoles doctorales accréditées :
/ph/api/convert/educecole?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-ecoles_doctorales_annuaire&facet=numero&facet=groupe_disciplinaire&facet=toutes_les_disciplines&facet=discipline_principale&facet=localisation&facet=liste_tous_etablissements&facet=laboratoires_rattaches&facet=annee_de_creation&facet=annee_accreditation&facet=etablissement_support&facet=liste_codes_tous_etablissements&facet=identifiants_des_laboratoires&facet=libelle_unite_urbaine&facet=libelle_departement&facet=libelle_academie&facet=libelle_region&rows=30&start=0&geofilter.polygon=[geofilter]
Exemples
Structure de recherche publique de Saint-Louis :
/ph/api/convert/educstruct?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-structures-recherche-publiques-actives&facet=numero_national_de_structure&facet=annee_de_creation&facet=tutelles&facet=type_de_tutelle&facet=nature_de_tutelle&facet=nature_de_structure&facet=type_de_structure&facet=niveau_de_structure&facet=domaine_scientifique&facet=panel_erc&facet=theme_de_recherche&facet=commune&facet=unite_urbaine&facet=departement&facet=region&facet=pays&facet=comue&facet=region_avant_2016&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)
Etablissement impliqués dans la recherche de Bordeaux :
/ph/api/convert/educetab?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-etablissements-publics-prives-impliques-recherche-developpement&facet=siren&facet=libelle&facet=date_de_creation&facet=categorie&facet=libelle_ape&facet=tranche_etp&facet=categorie_juridique&facet=wikidata&facet=commune&facet=unite_urbaine&facet=departement&facet=region&facet=pays&facet=badge&facet=region_avant_2016&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)
Membres des universités de France de Bordeaux :
/ph/api/convert/educmembre?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-iuf-les-membres&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)
Liste des écoles doctorales accréditées de Bordeaux :
/ph/api/convert/educecole?url=https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-ecoles_doctorales_annuaire&facet=numero&facet=groupe_disciplinaire&facet=toutes_les_disciplines&facet=discipline_principale&facet=localisation&facet=liste_tous_etablissements&facet=laboratoires_rattaches&facet=annee_de_creation&facet=annee_accreditation&facet=etablissement_support&facet=liste_codes_tous_etablissements&facet=identifiants_des_laboratoires&facet=libelle_unite_urbaine&facet=libelle_departement&facet=libelle_academie&facet=libelle_region&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)
REST Services
- Almost every actions could be exposed as a REST service.
Register a new user
- url : xxxxx.communecter.org/communecter/person/register
- params dans le post :
-
namestring -
usernamestring. Unique on the plateforme -
emailwell formated email -
cpexisting postalCode -
geoPosLatitudefloat -
geoPosLongitudefloat -
pwd :non encrypted password -
cityString Insee code -
pendingUserIdString. Si l’utilisateur est déjà en base de données (il a été invité et son profil est temporaire), son identifiant est passé en paramètre. Dans ce cas l’utilisateur n’est pas créé, mais il est mis à jour.
-
- Retour (json) :
-
resultboolean -
msgString : message d’erreur -
ididentifiant de l’utilisateur nouvellement créé.
-
- Fonctionnement :
- L’utilisateur est créé en base de données.
- Il n’est pas encore validé et ne pourra pas se logguer
- Un mail lui est envoyé avec un lien de validation pour activer son compte
- En version bêta, il y a un flag
betaTesterqui est positionné pour filtrer les utilisateurs bêta testeur. Par défaut, il est àfalse.
Le code utilisé est ici : citizenToolKit/controllers/person/RegisterAction.php (lien mort)
CoPi
Une instance de Communecter installée sur une Raspberry Pi
### Features- Installation de CO sur une debian (apache, mongoDb)
- Un COPI peut se connecter à un autre CoPi
Matériel disponible
- CO Light
- Raspberry Pi
- Micro
- Camera
- Mode Connecté
- ConnecTIC : (Domino, 3G, LAN, Partage de connections)
CoPiMix
Agrégateur de source CoPi
CoPi Copy
Sauvegarde d’instance CoPi
CoPi Bank
Système de monétisation interne à une organisation
Interopérabilité
Vue d’ensemble du chantier sur l’interopérabilité
À gauche, la liste des sources extérieurs sur lesquelles on récupère les données :
- Wikidata
- Wikipédia
- OpenStreetMap
- OpenDataSoft (la base SIRENE)
- Data.gouv
- Datanova (les enseignes La Poste)
- Pôle Emploi
- SCANR
Au milieu, le processus de Conversion des données (détails sur le prochain schéma)
A droite, l’affichage des données converties sur le site de Communecter ainsi que des exemple d’usage de ces données par des sites extérieurs.
Conversion des données sémantiques
We interoperate with
using their API
Wikidata
For any city, We retreive main information available on Wikidata
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
The convert system will interrogate the Wikidata API to get data in JSON.
The next exemple is the data for the city of Saint-Denis, capital city of Réunion island :
And convert this data in the pivot language named “PH onthology”
/ph/api/convert/wikipedia?url=https://www.wikidata.org/wiki/Special:EntityData/Q47045.json
Here are the mapping
| Source’s data | PH onthology |
|---|---|
| itemLabel.value | name |
| coor.latitude | geo.latitude |
| coor.longitude | geo.longitude |
| item.value | url |
| itemDescription.value | description |
- We’ll want to contributing back any extra data we can offer with COpédia (coming soon)
DBpedia
- For any city, We retreive main information available on Wikipedia
OpenStreetMap
For any city, we retreive main information avaible on OSM
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
The next exemple is all the OSM data of the city of Saint-Louis :
http://overpass-api.de/api/interpreter?data=[out:json];node[%22name%22](poly:%22-21.303505996763%2055.403919253998%20-21.292626813288%2055.391189163162%20-21.282029142394%2055.381522536523%20-21.256155186265%2055.392395046639%20-21.232012804782%2055.387888015185%20-21.211100938923%2055.390619722192%20-21.199480966855%2055.382654775478%20-21.185882138486%2055.385961778627%20-21.173346518752%2055.389949958731%20-21.16327583783%2055.399563417107%20-21.14709868917%2055.405379688232%20-21.166028899095%2055.414700890276%20-21.184085220909%2055.432085218794%20-21.190290936422%2055.440880800108%20-21.195166490948%2055.462318490892%20-21.237553168259%2055.459769285867%20-21.258726107298%2055.463692709631%20-21.286021128961%2055.455515913879%20-21.294777773557%2055.419916682666%20-21.303505996763%2055.403919253998%22);out%2030;
Here are the mapping
| Source’s data | PH onthology |
|---|---|
| tags.name | name |
| lat | geo.latitude |
| long | geo.longitude |
| type | type |
| tags.amenity | tags.0 |
- We’ll want to contributin back any extra data we can offer with COSM (coming soon)
Contribuez à OSM
COSM a pour but donner à l'utilisateur une meilleur visibilité des éléments OSM d'un territoire, de pouvoir contribuez a enrichir les tags OSM d'un OSM.
COSM permet à l'utilisateur de pouvoir lister l'intégralité des éléments OSM pour un scope géographique (uniquement les villes pour le moment).
Les éléments sont afficher en bleu s'il ont un type. C'est à dire, soit :
- un tag "amenity"
- un tag "place"
- un tag "office"
- un tag "leisure"
- un tag "shop"
L'utilisateur peut à tout moment cliquer sur le bouton "Voir tous les tags" pour ... voir tous les tags de l'élément OSM.
Dans le cadre listant tous les tags de l'élément l'utiliseur peut en cliquant sur "Modifier/Ajouter un tag" ajouter ou modifier un tag. Pour on ne peut ajouter que les 5 tags cités plus haut.
L'information sera directement pusher vers la page OSM de l'élément en question.
Data.gouv
For any city, we retreive main information of the organizations placed in this city
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
The module will find all the organizations placed in the geographic scope filter and then extract all the data in the differents datasets available.
The next exemple is all the data of the different structure of Méto-France, meteorological center of France.
https://www.data.gouv.fr/api/1/datasets/54a12162c751df720a04805a/
Here are the mapping
| Source’s data | PH onthology |
|---|---|
| slug | name |
| page | url |
| tags[] | tag[] |
| item.value | url |
| owner | creator |
Pôle emploi
For any city, we retreive all the job offer. (no exact localisation of the job place)
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
To get data with the Pôle emploi’s API, a token is needed.
The next exemple fetch all the job offer of the city of Saint-Louis.
https://api.emploi-store.fr/partenaire/infotravail/v1/datastore_search_sql?sql=SELECT%20%2A%20FROM%20%22421692f5-f342-4223-9c51-72a27dcaf51e%22%20WHERE%20%22CITY_CODE%22=%2797414%27%20LIMIT%2030
OpenDataSoft (SIREN database)
For any city, we retreive all the organizations and the association of the SIREN’s database.
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
The next exemple will fetch all the data in the SIRENE database for the city of Saint-Louis.
https://data.opendatasoft.com/api/records/1.0/search/?dataset=sirene%40public&facet=categorie&facet=proden&facet=libapen&facet=siege&facet=libreg_new&facet=saisonat&facet=libtefen&facet=depet&facet=libnj&facet=libtca&facet=liborigine&rows=30&start=0&geofilter.polygon=(-21.303505996763,55.403919253998),(-21.292626813288,55.391189163162),(-21.282029142394,55.381522536523),(-21.256155186265,55.392395046639),(-21.232012804782,55.387888015185),(-21.211100938923,55.390619722192),(-21.199480966855,55.382654775478),(-21.185882138486,55.385961778627),(-21.173346518752,55.389949958731),(-21.16327583783,55.399563417107),(-21.14709868917,55.405379688232),(-21.166028899095,55.414700890276),(-21.184085220909,55.432085218794),(-21.190290936422,55.440880800108),(-21.195166490948,55.462318490892),(-21.237553168259,55.459769285867),(-21.258726107298,55.463692709631),(-21.286021128961,55.455515913879),(-21.294777773557,55.419916682666),(-21.303505996763,55.403919253998)
Here are the mapping
| Source’s data | PH onthology |
|---|---|
| fields.l1_declaree | name |
| fields.categorie | type |
| fields.siret | shortDescription |
| fields.coordonnees.0 | geo.latitude |
| fields.coordonnees.1 | geo.longitude |
| fields.libapen | tags.0 |
ScanR ( National Education )
For any city, we retreive main information from the national education of France
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
The next exemple fetch all the actives research strutures of the city of Bordeaux :
https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-etablissements-publics-prives-impliques-recherche-developpement&facet=siren&facet=libelle&facet=date_de_creation&facet=categorie&facet=libelle_ape&facet=tranche_etp&facet=categorie_juridique&facet=wikidata&facet=commune&facet=unite_urbaine&facet=departement&facet=region&facet=pays&facet=badge&facet=region_avant_2016&rows=30&start=0&geofilter.polygon=(44.810795852605,-0.5738778170842),(44.817148298105,-0.57643460444186),(44.823910193873,-0.58695822406613),(44.818476638462,-0.60304723869607),(44.822474304509,-0.61064859861704),(44.824937843733,-0.61415033833008),(44.835177466959,-0.61079419661495),(44.841384923705,-0.62771243191386),(44.860667021743,-0.63833642556746),(44.871658097695,-0.63105127891779),(44.86227970331,-0.61630176568479),(44.854215265872,-0.59460939385687),(44.865671076253,-0.57646019656194),(44.869188961886,-0.57608874140575),(44.909402227434,-0.58088555560083),(44.908480410411,-0.57648917779388),(44.916666965125,-0.54773554113942),(44.889099273803,-0.53553255107571),(44.869138522062,-0.54141014437767),(44.868086689933,-0.53680669655034),(44.861267174723,-0.53784686147751),(44.848134506953,-0.53761462401784),(44.842390488778,-0.5422310311368),(44.836291776079,-0.54665943781219),(44.829021270567,-0.53642317794196),(44.822772234064,-0.53766321563778),(44.813135278103,-0.55606047183132),(44.810795852605,-0.5738778170842)
Here are the mapping :
| Source’s data | PH onthology |
|---|---|
| fields.libelle | name |
| fields.site_web | shortDescription |
| fields.geolocalisation.0 | geo.latitude |
| fields.geolocalisation.1 | geo.longitude |
- Datasets used :
- Public or private research and development structures
- Member of the university institute of France
Datanova ( La Poste )
For any city, we retreive the location of all buildings of La Poste
The process is the following :
- We choose a geographic scope (a country) to filter
- We call our own semantic convert system (doc avaible here) :
The next exemple will fetch all La Poste buildings localised in the city of Saint-Louis.
https://datanova.laposte.fr/api/records/1.0/search/?dataset=laposte_poincont&rows=30&start=0&geofilter.polygon=(-21.303505996763,55.403919253998),(-21.292626813288,55.391189163162),(-21.282029142394,55.381522536523),(-21.256155186265,55.392395046639),(-21.232012804782,55.387888015185),(-21.211100938923,55.390619722192),(-21.199480966855,55.382654775478),(-21.185882138486,55.385961778627),(-21.173346518752,55.389949958731),(-21.16327583783,55.399563417107),(-21.14709868917,55.405379688232),(-21.166028899095,55.414700890276),(-21.184085220909,55.432085218794),(-21.190290936422,55.440880800108),(-21.195166490948,55.462318490892),(-21.237553168259,55.459769285867),(-21.258726107298,55.463692709631),(-21.286021128961,55.455515913879),(-21.294777773557,55.419916682666),(-21.303505996763,55.403919253998)
Here are the mapping
| Source’s data | PH onthology |
|---|---|
| fields.libelle_du_site | name |
| recordid | type |
| fields.adresse | address.streetAddress |
| fields.latlong.0 | geo.latitude |
| fields.latlong.1 | geo.longitude |
| fields.libapen | tags.0 |
Smart Citizen (coming soon)
- onclick : we’ll show all SCK kits for a given city
Umaps (coming soon)
- POI’s of type geoJson, on click we show the content on our map
WordPress RSS (coming soon)
- any WP blog’s RSS can be pluggued to an elements wall
using an iframe
FramaPads
- users can use Framapads from inside CO(simple Iframe)
Copédia
Une autre façon de voir Wikipédia ...
Accessible depuis l'url suivante : /co2/#interoperability.copedia
Dans Copédia, le but est de permettre à l'utilisateur d'avoir une autre vision d'une page Wikipédia, de faciliter sa recherche et de la rendre plus intuitive.
Consulter la données Wikipédia
Copédia permet en selectionnant un scope géographique (uniquement les villes pour le moment) de lister tous les arcticles Wikipédia en liens avec la page Wikipédia de la ville selectionné (tout liens hypertexte renvoyant vers une autre page Wikipédia).
Les liens Wikipédia listés sont ainsi catégorisés parmis 5 grands types :
- Evenement
- Organisation
- Lieu
- Personne
- Autre (Possède un type mais qui ne rentre pas dans les catégories précedemment citées)
- Indéfini (Ne possède pas de type)
Il est possible à tous moment de pouvoir filtrer parmis ces 6 grands types et ainsi obtenir par exemple uniquement les personnes d'une page Wikipédia.
Copédia met également les dates en relations avec certains éléments, dans une frise chronologique.
Les dates que Copédia affiche sont :
- La date de début d'un évenement (un point) ou alors toute la durée de l'évenement (si possible)
- La date de création d'une organisation
- La date de naissance d'une naissance
Pour tous les éléments listés il est possible de :
- Consulter leur page Wikipédia (en cliquant sur l'icone de Wikipédia)
- Consulter leur page DBPédia (en cliquant sur l'icone de DBPédia)
- Consulter leur page Wikidata (en cliquant sur l'icone de Wikidata)
- Consulter un résumé de la page Wikipédia (avec photo si disponible) de la page Wikipédia de l'élément (en cliquant sur le nom de l'élément)
- Effectuer une "recherche Copédia" listant l'intégralité des liens Wikipédia contenu dans la page Wikipédia de l'élément ciblé et ainsi pouvoir répéter tous le processus décrit plus haut. (en cliquant sur l'icone de Copédia)
Contribuer à Wikipédia
Si un élément ne possède pas de type, il est possible d'ajouter vous même un type à cet élément en cliquant sur le bouton "Ajouter un type (Wikidata)" qui va permettre à l'utilisateur de pusher lui même un type directement dans la page Wikidata de l'élément parmis ces 4 grands type :
- Personne
- Lieu
- Organisation
- Evenement
Configuration des outils à usage interne
Créer une application ou un élément
Définition
CO2 est le nom du module correspondant à la 2nd version du module Communecter (www.communecter.org). Le module CO2 fait parti du projet PixelHumain, au même titre que d'autres modules développés au sein de PixelHumain (qu'est qu'un module ?).
CO2 a lui même été construit de façon à pouvoir intégrer facilement de nouvelles applications, et les activer/désactiver très facilement, via 1 seul fichier de configuration : https://github.com/pixelhumain/co2/blob/master/config/CO2/params.json
Les applications actuellement activées pour le site communecter.org sont : welcome, recherche, agenda, annonces, live, page, et info. Ce fichier sert à configurer un certain nombre de paramètres pour chaque application, ce qui permet de configurer très rapidement une nouvelle app, sans toucher au code commun qui gère toutes les applications.
Cela permet aussi de mettre en place des instances différentes de communecter.org (exemple : autrerezo.org, makietjichel.com, ou autres...), sur lesquelles les administrateurs de l'instance peuvent activer et désactiver les applications qu'ils souhaitent utiliser, sans avoir à supprimer ou modifier du code.
Les développeurs peuvent aussi créer de nouvelles applications à volonté.
Créer une nouvelle application dans CO2
1 - Ajouter l'application dans le fichier /modules/co2/config/CO2/params.json, en suivant l'exemple suivant :
Il convient bien évidemment de remplacer "#nomdelapplication" par le nom de votre application, les titres ect ... Pour l'icône, choisir un nom parmi cette liste : http://fontawesome.io/icons/
"#nomdelapplication": {
"inMenu" : true,
"useHeader" : true,
"open" : true,
"subdomain" : "nomdelapplication",
"subdomainName" : "Nomdelapplication",
"hash" : "#app.nomdelapplication",
"icon" : "nomDeLIconeFontawesome",
"mainTitle" : "Nom de l'application",
"placeholderMainSearch" : "Rechercher dans ..."
},
(il est conseillé d'indiquer tous les paramètres, mais il est possible d'en enlever ou d'en rajouter selon vos besoins.)
2- Ajouter une nouvelle fonction dans le fichier AppController.php du module CO2
Ouvrir le fichier /modules/co2/controllers/AppController.php et rajouter par exemple :
public function actionNomdelapplication(){
CO2Stat::incNbLoad("co2-nomdelapplication");
echo $this->renderPartial("nomdelapplication", array(), true);
}
3- Créer les liens vers les actions
Dans /modules/co2/components/CommunecterController.php, il faut ajouter votre lien dans l'array "app" : (l'array app se situe environ à la ligne 460 du fichier)
"app" => array(
"nomdelapplication" => array('href' => "/ph/communecter/app/nomdelapplication", "public" => true),
),
4- Créer la vue
Elle est appelée par le contrôleur pour gérer l'affichage (code HTML, CSS, JS).
Créer le fichier /modules/co2/views/app/nomdelapplication.php
On peut inclure le code d'une autre vue en utilisant $this->renderPartial
5- Accéder à votre application
Bravo ! Maintenant vous n'avez plus qu'à accéder à votre application grâce à l'url suivante :
http://127.0.0.1/ph/co2#nomdelapplication
Créer un nouvel élément dans CO2
Communecter permet déjà de gérer plusieurs éléments : citoyens, organisations, projets, événement, news, point d'intérets, annonces, etc...)
Voici la marche à suivre pour ajouter et gérer un nouvel élément : (si vous créez une nouvelle application, vous aurez probablement besoin de gérer un (ou plusieurs) nouveau(x) type(s) d'élément(s))
1- Créer un nouveau controller dans le module CitizenToolKit
Créer le dossier /modules/citizenToolKit/controllers/nomdelelement
Ce dossier contiendra l'ensemble de la logique métier.
A l'intérieur de ce dossier, créer les actions dont vous avez besoin. IndexAction est l'action par défaut. Pour créer une action, créer un fichier comme "/modules/citizenToolKit/controllers/nomdelelement/IndexAction.php" qui contiendra par exemple :
<?php
class IndexAction extends CAction
{
public function run( $type=null, $id= null )
{
$controller=$this->getController();
$params = array();
$params["itemId"] = $id;
$params['itemType'] = $type;
if(Yii::app()->request->isAjaxRequest)
echo $controller->renderPartial("index", $params,true);
else
$controller->render( "index" , $params );
}
}
Et le fichier "/modules/citizenToolKit/controllers/nomdelelement/AutreAction.php"
class AutreAction extends CAction
{
public function run()
{
...
}
}
Créer les autres actions de la même manière : "/modules/citizenToolKit/controllers/nomdelelement/searchAction.php" "/modules/citizenToolKit/controllers/nomdelelement/saveAction.php" etc
2- Créer un nouveau modèle dans le module CitizenToolKit (si besoin)
Créer le fichier /modules/citizenToolKit/models/nomdelelement.php
<?php
class Nomdelelement {
const COLLECTION = "nomdelelement";
const CONTROLLER = "nomdelelement";
const ICON = "fa-rss";
const COLOR = "#F9B21A";
public static function nomdelafonction() {
}
}
3- Créer un nouveau controller dans le module CO2
C'est lui qui sera appelé en premier et qui redigirera vers le controller du module CitizenToolKit. Créer le fichier /modules/co2/controllers/NomdelelementController.php et le remplir comme dans l'exemple suivant :
<?php
/**
* NomdelelementController.php
*
* description
*
* @author: Prénom Nom <email@email.ext>
* Date: dd/mm/yyyy
*/
class NomdelelementController extends CommunecterController {
protected function beforeAction($action) {
parent::initPage();
return parent::beforeAction($action);
}
public function actions()
{
return array(
'index' => 'citizenToolKit.controllers.nomdelelement.IndexAction',
'autre' => 'citizenToolKit.controllers.nomdelelement.AutreAction'
);
}
}
L'array retourné par la fonction actions() contient l'essemble des pages qui seront traitées par les classes précédemment créées dans le module CitizenToolKit.
4- Créer les liens vers les actions
Dans /modules/co2/components/CommunecterController.php, il faut créer les liens vers les actions (qui afficheront les sous pages) dans l'array $pages :
"nomdelelement" => array(
"index" => array("href" => "/ph/communecter/nomdelelement/index", "public" => true),
"autre" => array("href" => "/ph/communecter/nomdelelement/autre", "public" => true)
),
5- Créer la vue
Elle est appelée par le contrôleur pour gérer l'affichage (code HTML, CSS, JS).
Créer le dossier /modules/co2/views/nomdelelement puis fichiers nommés en fonction du nom des actions :
- /modules/co2/views/nomdelelement/index.php
- /modules/co2/views/nomdelelement/autre.php
6- Accéder à l'élément
http://127.0.0.1/co2/nomdelelement/index ou http://127.0.0.1/co2/nomdelelement/autre
Créer un COstum
Comment créer votre propre COstum
Vous êtes autonome et vous souhaitez créer votre propre COstum de A à Z, nous allons vous expliquer les étapes pour mettre en place votre COstum.
Création d’un élément
Pour créer votre COstum, vous devrez le créer un élément, pour cela rendez-vous sur votre plateforme communecter installer sur votre machine et créer un élément qui doit être soit une organisation soit un projet.
Dans votre base de données, ajouter à votre élément la ligne suivante :
costum : {
slug : votreSlugCostum
}
Le slug de votre COstum doit correspond à celui que vous l’avez donné dans votre fichier json, en général le nom du slug dans costum et le même que celle de votre élément.
Préparer le fichier json de votre COstum
Vous devrez créer un fichier json dans le dossier qui se trouve dans costum.data.
Le nom du fichier doit être indique à celui de votre slug élément. Nous vous conseillons de récupérer le code basant sur l’un des COstums que nous avons créée dans un premier temps puis de vous renseigner sur https://www.communecter.org/costum/ pour mieux comprendre la structure de la donnée e
Mise en place du COstum
Crée un dossier dans costum.view.custom.nomDeVotreSlug.
Et dans ce dossier, crée le fichier home et fait le pointer depuis votre fichier json, vous pouvez ensuite tester votre costum depuis http://127.0.0.1/ph/costum/co/index/id/votreNomElement.
Ou rendez-vous sur votre page élément et cliquer sur le bouton “Has costum".
ActivityPub
Informations générales
Comment utiliser ActivityPub
Pour utiliser ActivityPub (AP) vous devrez avoir un acteur accessible en public. Le format de votre acteur doit être en JSON-LD. Votre acteur doit ressembler à ceci : exemple acteur sur le site communecter partir développement.
L'id doit correspond à l'URL du document, tous les liens doivent être en HTTPS.
Vous aurez besoin d'une inbox car les instances qui utilisent AP ont besoin de savoir si un acteur possède une inbox. Chaque acteur doit avoir une paire de clés (publique et privée) qui peut être générée avec openssl.
JSON ne prend en charge les sauts de ligne, on doit remplacer les sauts de ligne par \n (pour la partie publicKeyPEM).
Le Webfinger permet de demander à un site web s'il a un utilisateur correspondant au nom recheché. Ce dernier doit répondre au webfinger en renvoyant les liens de ressource correspondants. Le noeud final d'un Webfinger se trouve toujours en /.well-known/webfinger et recevoir des requêtes telles que /.well-known/webfinger?resource=acct:name@my-example.com.
Pour pouvoir envoyer un message (par exemple avec le verbe Create), il est nécessaire d'avoir l'inbox de la personne concernée et d'utiliser une signature HTTP qui permettra d'authentifier l'utilisateur envoyant le message.
Une signature HTTP est un en-tête HTTP signé par la paire de clés RSA. Pour avoir plus d'information sur la création d'une signature HTTP, visitez le lien suivant : How to implement a basic ActivityPub server.
Liens pratiques :
- Setting Up a WebFinger Server
- How to implement a basic ActivityPub server
- ActivityPub W3
- Decentralizing Social Interactions with ActivityPub
Développement en cours (Tony et Pierre)
Réalisation d'un acteur AP sur Communecter
J'ai créé une API qui permet de générer un acteur AP sur communecter, vous pouvez trouver un exemple en cliquant ici. Petite précision : la clé publique est au format brute.
Comment ça fonctionne : Vous devrez indiquer dans le lien l'ID de la personne ici : http://dev.communecter.org/api/activitypub/actor/id/ + id.
Fichier modifié : TranslateActivityStream.php / Rest.php. Fichier créé : ActivityPubController.php / ActorAction.php.
Création d'un client mastodon
Nous avons créé avec Pierre un client Mastodon qui permet de poster/récupérer les statuts, récupérer les followers et voir la timeline publique en utilisant l'API REST de Mastodon. Cette preuve de concept se base sur la librairie mastodon.js par Kirschn. Vous pouvez retrouver nos codes sur le gitlab de l'adullact: mastodon_api
Test d'un serveur express-activitypub en nodejs
J'ai suivi ce tutoriel là pour pouvoir envyer un message sur mamot.fr : Decentralizing Social Interactions with ActivityPub. Pierre a détaillé plus en bas comment réaliser le tutoriel.
Remarque constatée : Pour pouvoir voir un message sur mamot.fr, nous étions dans l'obligation de suivre notre acteur créé par express activitypub. Sans cela, il nous est impossible de voir nos message dans la timeline. Ce problème est réccurent quand on a tenté avec un compte Pixelfed de communiquer avec mamot.fr.
La réalisation d'une inbox (non fonctionnelle)
Je me suis basé sur le script crée par Darius Kazemi sur son tutoriel Decentralizing Social Interactions with ActivityPub. Malheureusement je n'arrive pas à faire fonctionner mon inbox car je n'arrive pas a encoder la signature.
Création d'un client Mastodon
Utilisation de l'API Mamot pour pouvoir afficher les timelines publiques, locales et ajouter un post.
Mon code source est disponible sur gitlab Code Source
Ajout d'un acteur ActivityPub sur l'API de Communecter
Afin d'avoir un aperçu du format d'un acteur ActivityPub en ajoutant votre id a la fin du lien mon lien pour accéder à l'acteur + id
Test d'envoi d'un message sur Mamot
- Taper la commande
git clone https://github.com/dariusk/express-activitypub.gitdans votre terminal.- Installer ngrok, en suivante les instructions https://ngrok.com/download.
- Taper la commande
/.ngrok/http 3000 - Ensuite allez dans le dossier
express-activityPub, modifier le dossierconfig.jsondans route. - Mettre un nom d'utilisateur
- Mettre un mot de passe
- Le port sera 3000, et le domain sera l'adresse en https de ngrok, mais il faut retirer le https, pour obtenir ceci exemple:
d40f1818.ngrok.io - Taper la commande
node index.js - Acceder a l'url du site en https et rajouter admin exemple:
[https://d40f1818.ngrok.io/admin](https://d40f1818.ngrok.io/admin) - Crée un compte test saisissez le nom d'utlisateur et le mot de passe, ensuite il y aura des données qui seront générés, afficher le account WebFinger url, copier le suject sans la acct:
- Connecter vous a https://mamot.fr.
- Rechercher le webfinger url, cliquer sur le bouton pour follow.
- Ensuite saisir test dans account name, Copier coller l'API Key, et saisir votre message exemple : Hello world !
Et vous pourrez voir le message envoyer sur mtps://mamot.fr
MediaWiki
Introduction
Cette partie du module interop, cherche en cas de mediawiki existant à le connecter avec communecter et de permettre via un bouton a créer des éléments du type de la page du wiki, ou en cas d'élément présent de fournir le lien.
MediawikiController
/interop/mediaWiki/index
Si pas de mediawiki connécté =>
return $this->renderPartial("interop.views.create.index"); =>
dynForm insertWikiForm (assets/forms/insertWiki.js). =>
/interop/mediaWiki/chooseCategory qui insert nom du wiki et url du wiki en db
Sinon
return $this->renderPartial("interop.views.default.indexMediaWiki");
/interop/mediaWiki/chooseCategory
Ici on vérifie qu'un médiawiki avec l'url rentré par l'utilisateur n'existe pas deja en db
return $this->renderPartial("interop.views.create.index");
dynForm insertCatWikiForm (assets/forms/chooseCat.js) =>
/interop/mediaWiki/insertCat qui insert le choix de l'user des catégorie en fonctions des élément acteurs(person, organization), ressources, projets.
Sinon
return $this->renderPartial("interop.views.default.indexMediaWiki");
/interop/mediaWiki/menuLeft
Comme son nom l'indique cette route s'occupe de chercher la data pour le menuleft
et renvoie la vue avec les differente page en accordeon dans menu left.
return $this->renderPartial("interop.views.menus.pages");
/interop/mediaWiki/page
Cette fois c'est pour la data d'une page spécifique.
Tout un process est en route dans les models afin de cherché la data
sur le wiki et la trier pour la rendre a la celon toujours le méme schema.
Un tour est fait dans citizenToolKit pour le convert et translate de la data du wiki.
return $this->renderPartial("interop.views.menus.pages");
/interop/mediaWiki/edit
Ici la route est appelé en cas de page communecter au méme nom que sur le wiki, et choix de l'user de marquer la page du wiki ce cette présence.
!! Attention ici un réglage sur le wiki est a faire afin d'intégrer
la propriétés |pageCo= dans le modéle des pages du wiki.
renvoi une string message sur le succés ou non de l'opération
Module Graph
Module graph communecter
- analyse de l'architecture modele vue controlleur<
- comprendre le fonctionnemment d'un controlleur
- utilisation de la librairie D3.js
- analyse du module graph
- mise place d'un controlleur dans le module graph
- mise en place d'une vue dans le module graph
- manipulation de données en json
- 1manipulation d'une base de données json
- mettre des données sur le graph("name")
- réapprentissage de l'algorithmique
- apprendre a récursivité (fibonnaci)
Le graph nodes and edges (d3follow)
Dans le controlleur (D3FollowAction) :
-
J'ai fait apelle a la base de données pour avoir les données sur les citoyens, quelle sont leurs - projets, leurs événements, leurs organisations, leurs followers...
-
J'ai modifier le tableau $root pour achicher les données au bon format json du graph (nodes and edges).
-
J'ai fait une sucssesion de condition avec (if , elseif , else , foreach) pour remplire le tableau $root avec les données de le base de données ( "name").
Dans la vue (d3follow)
-
Mettre les données du tableaux $root dans une variable et utiliser (json encode)
-
Ajout des balises script de d3js pour faire apelle a la librarie de D3.
-
Remdre les nodes cliquables (si on clique sur la node d'un follower sa affiche son propre graph avec ses propres données).
-
Faire un fonction couleur pour les principaux nodes du graph.
Autre
-
j'ai fait d'autre type de graph(de la meme façon que le graph nodes and edges).
-
graph avec des barre, graph ciculaire, graph hierarchical.
-
Un algorithme récursif (fibonnaci) en javascript.
Dans le module graph
-
Création du controller LinearAction et de la view Linear pour mon style de graphe choisie
-
Je me suis basé sur D3Action et de la view pour le principal
-
Les modifications apportés au controller :
- modification de la requête root pour s'adapter au format de donnée du graphe
- L'affichage du nouveau graphe est simple car rien qu'avec la base du graphe D3, l'affichage des nodes est possible
- modification dans la boucle foreach de "links" pour s'adapter au nouveau graphe et ainsi afficher les noms de chaque organisation, projets, évènements...
- ajout des données comme : "Mes experiences ", "Sondages","Actions", "Abonnées" : une boulce pour chaque catégorie qui parcours la base de donnée et l'affiche comme les autres données comme projets
- ajout de nodes cliquable : juste après la dernière donnée (dernière organisation ou projet), une node "ajouter" est visible et ouvre le formulaire de la catégorie choisie (formulaire d'ajout d'organisation ou de projet)
- ajout d'une node libre : à la fin du graphe il y a une node que lorsque l'on clique un formulaire s'affiche. Ce formulaire permet d'ajouter une donnée libre au graphe
-
Modification de la view :
- ajout de l'algorithme du graphe
- ajout des librairies d3.js Modification de la fonction "click" pour ajouter des liens sur les nodes : exemple en cliquant sur une organisation cela affiche le graphe de l'organisation
- ajout des liens sur les nodes "Ajouter..." qui affiche le formaulaire de la catégorie choisie. Pour ce faire il fallait aller chercher les librairies et les formulaires appelé "dynform"
- Ajout d'une fonction Color qui affiche les mêmes couleurs que le site voici mon lien gitlab avec ton mon travail