Evolution #81
ferméModifications sur la gestion des sessions
100%
Description
Dans le cadre de la réalisation d'une nouvelle version avec révision complète du code et de la BDD, plusieurs changements sont attendus au niveau des sessions, tant en corrections qu'en évolutions :
- Le comptage des participants n'est pas toujours correct. Selon le type de session, les besoins et donc les infos sont différentes, mais leur présentation fait souvent apparaitre des doublons de liste et des compteurs peu pertinents (effet perturbant).
- La gestion des récurrences est complexe. L'interface pour les définir est un peu lourde, d'autres approches peuvent être envisagées, bien qu'aucune solution ne soit simple pour gérer celà. De plus la mise à jour de telles sessions liées semblent problematique dans certains cas (modifications à apporter sur la session éditée ou sur l'ensemble ? risque de duplication de sessions en opérant des changements de dates).
Il serait peut-être nécessaire de distinguer plus nettement 2 usages : la programmation d'un type de sessions récurrentes (ex session libre tous les matins) et la définition d'une série de sessions (ex plusieurs ateliers liés au sein d'un parcours).
On peut imaginer qu'avec une création (semi)automatisée des sessions libres (d'après une remontée des données de connexions des utilisateurs sur P3Portal/P3Server) le besoin de définir des sessions récurrentes soit moindre.
Une alternative (ou une fonction complémentaire) serait la possibilité de cloner une session : cele permettrait de faciliter la création de plusieurs sessions similaires, plutôt que d'avoir recours à un système complexe de récurrence.
- L'usage de sessions de type "atelier" est à simplifier. Il fait appel à des "modules d'atelier", sorte de modèles communautaires, classés par thèmes. L'idée est de s'en passer pour ne garder en information sur chaque session atelier qu'un libellé de thème (liste commune définie par l'admin, organisée en 2 niveaux catégories/thèmes).
- A défaut de "modules d'atelier", il est souhaitable de conserver néanmoins un système de ressources documentaires partagées. Celles-ci seraient constituées de documents téléchargés sur le serveur et mis à disposition, mais aussi tout simplement de liens web offrant un annuaire thématique. Les ressources pourraient être organisées avec un système de tags, mais surtout elles reprendraient l'organisation catégories/thèmes utilisée pour les ateliers. Ainsi il deviendrait aisé de proposer les ressources pertinentes pour les ateliers créés.
- Il faut également pouvoir gérer des groupes de participants, qui ne seraient pas inscrits individuellement, mais doivent apparaitre dans le comptage (ex: une session avec une classe, chaque enfant ne dispose pas d'un compte, un seul contact correspondant à la classe est inscrit, mais le nombre d'enfants doit être pris en considération).
Pour cela 2 voix sont à étudier : un type de contact spécial groupe, qui contiendrait un nombre de membres / un type de session particulier, dans lequel on saisit un seul contact tout en spécifiant le nombre réel de participants.
La seconde approche semble plus souple : le nombre de participants d'un même groupe peut varier pour chaque session. Ceci n'empêche pas une approche mixte, permettant de qualifier ces contacts particulier avec un nombre de membres qui serviraient de données par défaut pour chaque session.
- Une simplification des états des personnes inscrites est à voir, principalement pour les ateliers. De trop nombreux états font qu'ils ne sont pas forcément mis à jour correctement (ce qui peut fausser les comptages). L'idée est de limiter le nombre d'état et de revoir l'état par défaut pour qu'il convienne sans intervention (ie "présent" par défaut au lieu de juste "inscrit").
- La saisie de toutes les sessions est un peu fastidieuse, encore plus lorqu'il faut y associer tous les participants. Une aide à la saisie peut être envisagée en récupérant les informations de navigation web authentifiées via un webservice (et un script analysant les logs pour l'alimenter). Le système ne serait pas complétement automatique pour laisser la décision/validation à la charge des animateurs : une page présenterait les informations (utilisateur, date/horaires, poste) en tentant au mieux un rapprochement avec les données présentes dans EpnAdmin, l'animateur n'aurait plus qu'à les confirmer/rectifier/rejeter pour maintenir à jour ses sessions.
A noter que ce procédé ne pourra remplacer complétement la saisie manuelle, en premier lieu parce qu'il ne prend en compte que l'utilisation du net (et même seulement du web pour le moment). Un utilisateur qui se contenterait de bureautique ou d'un jeu local sans aller sur le net ne pourra pas être remarqué.
Par contre, il est envisageable de rendre facultatif la création des sessions libres et qu'elles soient créés automatiquement par la validation de données de connexion. Les sessions libres n'apparaitraient plus alors comme étant les plages d'ouvertures de l'EPN, mais uniquement selon leur utilisation.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- Statut changé de Nouveau à In Progress
- % réalisé changé de 0 à 10
Modifications de la base de données pour les ateliers :¶
Les changements concernant les sessions de type atelier, avec la suppression des "modules d'atelier" au profit d'une simple liste de thèmes catégorisés, impliquent d'importantes modifications sur les tables de la BDD :
- La table 'initiations' qui contenait les "modules" est transformée en 'workshop_theme', les modules actuels devenant les futurs thèmes (et leurs thèmes devenant les catégories).
- La table de liens 'session_initiation' est renommée en 'session_workshop', elle reste utilisée pour ajouter des champs extras propres aux sessions de type atelier.
- Il existait un doublon entre le champs extra 'comments' et le champs 'feedback' des sessions. C'est ce dernier qui sera conservé, pouvant être utile pour d'autres types de sessions. La colonne 'comments' est donc supprimée après copie de ses données vers les champs 'feedback' qui étaient vides.
- Les "modules" contenaient un champs 'goals' (objectifs) qui n'a plus lieu d'être dans la nouvelle table gérant simplement des thèmes. Par contre il peut être pertinent en champs extra sur chaque session de type atelier. Cette colonne est donc supprimée après que son contenu ait été copié vers une nouvelle colonne de la table de liens 'session_workshop'.
- Beaucoup d'autres colonnes contenant des infos propres aux "modules d'atelier" sont également supprimées, ainsi que les tables annexes pour les versions, les fichiers et les questions.
- Deux champs sont passés en type 'boolean' (des tinyint en fait sous MySQL, à 0 ou 1). Ils étaient auparavant en varchar (y ou n) et en int (0, 1, 2), leurs valeurs auront été migrées pour correspondre au nouveau type.
- Les index ainsi que les clés étrangères ont été redéfinies proprement pour supprimer les doublons et être cohérents avec la charte de nommage.
Détail des commandes SQL pour effectuer la migration des tables et données :
ALTER TABLE session_initiation DROP FOREIGN KEY session_initiation_FK_1, DROP FOREIGN KEY session_initiation_FK_2; ALTER TABLE session_initiation DROP FOREIGN KEY session_initiation_ibfk_1, DROP FOREIGN KEY session_initiation_ibfk_2; UPDATE session,session_initiation SET feedback=comments WHERE session.id=session_id AND feedback=''; ALTER TABLE session_initiation DROP comments; ALTER TABLE session_initiation ADD goals TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' AFTER initiation_id; UPDATE session_initiation,initiations SET goals=in_goals WHERE initiation_id=initiations.id; UPDATE session_initiation SET subscription_by_user=1 WHERE subscription_by_user='y'; UPDATE session_initiation SET subscription_by_user=0 WHERE subscription_by_user='n'; ALTER TABLE session_initiation CHANGE subscription_by_user subscription_by_user TINYINT(1) NOT NULL DEFAULT '0'; ALTER TABLE session_initiation DROP INDEX idx_id; ALTER TABLE session_initiation DROP INDEX session_initiation_FI_1; ALTER TABLE session_initiation DROP INDEX session_initiation_FI_2; ALTER TABLE session_initiation CHANGE initiation_id workshop_theme_id INT(11) NOT NULL; ALTER TABLE session_initiation ADD INDEX (workshop_theme_id); RENAME TABLE session_initiation TO session_workshop; ALTER TABLE initiations DROP in_goals, DROP in_course, DROP in_evaluation, DROP in_language, DROP in_share, DROP in_necessary, DROP in_prolongation, DROP in_duration, DROP in_nb_part, DROP in_id_share, DROP in_last_id_share; ALTER TABLE initiations CHANGE in_id id INT(11) NOT NULL AUTO_INCREMENT; ALTER TABLE initiations CHANGE in_label label VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL; ALTER TABLE initiations CHANGE in_comment description TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL; ALTER TABLE initiations CHANGE in_status active TINYINT(1) NOT NULL DEFAULT '1'; ALTER TABLE initiations CHANGE in_it_id category INT(11) NOT NULL; UPDATE initiations SET active=1 WHERE active=0; UPDATE initiations SET active=0 WHERE active=2; RENAME TABLE initiations TO workshop_theme; ALTER TABLE session_workshop ADD CONSTRAINT session_workshop_FK_1 FOREIGN KEY (session_id) REFERENCES session (id) ON DELETE CASCADE; ALTER TABLE session_workshop ADD CONSTRAINT session_workshop_FK_2 FOREIGN KEY (workshop_theme_id) REFERENCES workshop_theme (id) ON DELETE CASCADE; DROP TABLE initiations_questions; DROP TABLE initiations_versions; DROP TABLE initiations_files;
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
Modifications publiées sur le svn (r334) :
Première publication des modifications du code concernant les sessions.
L'ensemble est encore très incomplet, donc peu fonctionnel. Le schéma de la BDD a été mis à jour pour prendre en compte les modifications précédentes, ainsi les objets et modules liés aux 'initiations' disparaissent au profit des 'workshop_theme' et 'session_workshop'. Mais ces derniers doivent encore être travaillés.
Néanmoins, la liste des sessions est déjà opérationnelle, voire complète, avec quelques légères améliorations, dont notamment :- système de pagination des résultats avec module de navigation (permet de ne plus limiter la liste arbitrairement aux 100 premières sessions trouvées)
- filtre supplémentaire sur les salles (liste dynamique tenant compte de la sélection GEPN/EPN)
- sélecteur d'accès direct par mois ne proposant que les mois contenant des sessions (règle le problème de déterminer l'intervalle et n'allonge pas la liste inutilement) - de plus le nombre de sessions est indiqué pour chacun des mois proposés
La mise en place du calendrier par semaines des sessions n'est pas jugé prioritaire et sera vu ultérieurement.
Il est possible de voir les fiches des sessions, ainsi que les formulaires de création/édition, mais tout celà est encore à un stade très basique. Les particularités des sessions ne sont pas encore prises en compte, pas plus que les inscriptions des participants... à suivre.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- % réalisé changé de 10 à 20
Modifications publiées sur le svn (r353) :
Mise en place du module permettant l'administration des thèmes d'atelier.¶
Les thèmes sont la version très allegée de ce qu'étaient auparavant les modules d'atelier. A présent, ils définissent uniquement un titre, une description et un état actif/inactif, en étant classés par catégories.
La liste des catégories provient toujours des listes administrables, par contre elle a été renommée de initiations_themes en workshop_theme.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- % réalisé changé de 20 à 60
Modifications publiées sur le svn (r355) :
Mise en place du nouveau système de sessions¶
Les 4 types principaux¶
A présent, les différents types de sessions sont regroupés en 4 types principaux :- free : pour les accès libres autonomes (1) et accompagnés (2)
- training : pour les téléformations (3)
- workshop : pour les ateliers (4)
- events : pour les évenements locaux (5), réseaux (6) ou mise à disposition (7)
L'intéret de ces regroupements est la similarité des sessions les constituants, autant dans leurs propriétés, leurs logiques, que leurs utilisations.
Le premier impact concerne les formulaires de création / édition des sessions, qui sont désormais générés pour l'un des 4 types principaux, sans changement de l'un à l'autre à la volée. Ceci impliquait beaucoup de lourdeur et de complexité pour adapter la forme et les champs du formulaire vu les différences parfois fondamentales.
Ce nouveau principe, s'il permet des formulaires plus simples et plus fiables, impose les contraintes suivantes :- Une session existante ne peut plus changé de type principal : ayant peu de sens celà a été jugé inutile (par contre il est toujours possible de changer par exemple un accès libre autonome en accompagné, ou un évenement local en évenement réseau).
- La création d'une nouvelle session doit être initiée en indiquant son type principal avant de pouvoir accéder au formulaire adéquat. Celà est rendu possible soit par une première page de sélection entre les 4 types, ou directement par la présence de 4 liens de créations.
Nouvelle définition des accès libres¶
Auparavant les sessions libres représentaient les plages d'ouvertures d'une salle pour accueillir des accès libres. Ces sessions devaient donc être toutes créées au préalable pour ensuite y effectuer les enregistrements des éventuels usagers.
Ce système pouvait être pénible à l'usage, les accès libres étant souvent ouverts autant que peut l'être un EPN, celà représentait beaucoup de sessions à définir... L'usage d'un système de récurrence n'est pas une solution ultime, la définition d'une récurrence étant complexe tant au niveau du code que pour l'ergonomie des formulaires.
A présent le changement est radical : les sessions libres enregistrées correspondent simplement à l'utilisation d'un poste par un usager sur une tranche horaire. Donc pour chaque usagers en accès libre correspond une session à part, par contre il n'y a plus de définition de session potentiellement vide à créer systématiquement en amont.
Cette réorganisation offre plusieurs avantages, en particulier au niveau du code où les données des sessions ont pu être mieux uniformisérs entre les différents types, ce qui facilitera les fonctionnalités à suivre (comptages des utilisateurs, statistiques, occupation des postes, historique et parcours des usagers).
idées à suivre...¶
Pour autant, avec cette multitude de sessions libres individuelles, il n'est pas exclu de pouvoir les regrouper artificiellement à l'affichage dans l'interface (selon la date et la salle). Ceci permettrait de proposer des présentations plus compactes et plus pratiques (fiche globale listant les accès individuels, bloc commun dans une vue de calendrier global).
Une autre idée consiste à ce que chaque EPN puisse définir ses "préférences" sur les accès libres, de manière générale : horaires pour chaque salles sur une semaine normale. Ces informations pourront avoir un double intérêt : d'une part présenter aux usagers les plages d'accès, d'autre part être utilisées en valeurs par défaut sur les formulaires de création.
La notion de groupe est également envisagée : certaines fiches d'usager ne sont pas personnelles mais correspondent à un groupe de personne, dont l'identité de chacun importe peu et qu'il serait donc fastidieux de définir individuellement (ex: la classe CM2 de telle école).
C'est fiches particulières devront être référencées comme telles (case à cocher sur la fiche) afin d'être correctement interprétées dans le comptage des utilisateurs sur une session.
Pour un accès libre, préciser qu'il s'agit d'un groupe pourra restreindre le choix de l'usager à ces seules fiches, rendre la sélection d'ordinateurs multiple, et faire apparaitre un champs de saisie afin d'indiquer le nombre de personnes présentes.
De plus, il est toujours envisagé de pouvoir alimenter semi-automatiquement la liste des sessions via une API web. Ainsi un outils tiers effectuant une analyse de logs pourra remonter les informations de connexion des usagers, l'animateur n'ayant plus qu'à rectifier/compléter/valider la création de la session correspondante.
Modifications de la base de données¶
Les changements décrits précédements, ajoutés à quelques renommages de champs, adaptations de types et autres contraintes de clés étrangères, amènent à d'importants changements de la BdD.
Les opérations SQL suivantes permettent une migration des tables depuis la version EpnAdmin-CTN, autant sur les structures que sur les données :
UPDATE session_initiation SET subscription_by_user=1 WHERE subscription_by_user='y'; UPDATE session_initiation SET subscription_by_user=0 WHERE subscription_by_user='n'; ALTER TABLE session_initiation CHANGE subscription_by_user registration TINYINT(1) NOT NULL DEFAULT '0'; ALTER TABLE session_initiation ADD goals TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '' AFTER initiation_id; ALTER TABLE session_initiation ADD people_max SMALLINT NOT NULL DEFAULT '1' AFTER goals; UPDATE session_initiation,initiations SET goals=in_goals WHERE initiation_id=in_id; UPDATE session_initiation, session SET people_max=nbr_of_people WHERE session_id=session.id; UPDATE session,session_initiation SET feedback=comments WHERE session.id=session_id AND feedback=''; ALTER TABLE session_initiation DROP comments; ALTER TABLE session_initiation DROP status; RENAME TABLE session_initiation TO session_workshop; ALTER TABLE session_workshop CHANGE initiation_id theme_id INT NULL; ALTER TABLE session_workshop DROP INDEX idx_id; ALTER TABLE session_workshop DROP INDEX session_initiation_FI_1; ALTER TABLE session_workshop DROP INDEX session_initiation_FI_2; ALTER TABLE session_workshop ADD PRIMARY KEY (session_id); ALTER TABLE session_workshop ADD INDEX (theme_id); ALTER TABLE initiations DROP in_goals, DROP in_course, DROP in_evaluation, DROP in_language, DROP in_share, DROP in_necessary, DROP in_prolongation, DROP in_duration, DROP in_nb_part, DROP in_id_share, DROP in_last_id_share; ALTER TABLE initiations CHANGE in_id id INT(11) NOT NULL AUTO_INCREMENT; ALTER TABLE initiations CHANGE in_label label VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL; ALTER TABLE initiations CHANGE in_comment description TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL; ALTER TABLE initiations CHANGE in_status active TINYINT(1) NOT NULL DEFAULT '1'; ALTER TABLE initiations CHANGE in_it_id category INT(11) NOT NULL; UPDATE initiations SET active=1 WHERE active=0; UPDATE initiations SET active=0 WHERE active=2; DROP TABLE initiations_questions; DROP TABLE initiations_versions; DROP TABLE initiations_files; RENAME TABLE initiations TO workshop_theme; ALTER TABLE workshop_theme ADD INDEX (category); CREATE TABLE `workshop_resource` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `theme_id` INT NOT NULL, `legend` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `description` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL, `filepath` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `filesize` INT NOT NULL, `filetype` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `language` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `tags` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `status` TINYINT NOT NULL DEFAULT '1', `created_at` DATETIME NULL DEFAULT NULL, `created_by` INT NULL DEFAULT NULL, `updated_at` DATETIME NULL DEFAULT NULL, `updated_by` INT NULL DEFAULT NULL ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE workshop_resource ADD INDEX theme_id (theme_id); ALTER TABLE workshop_resource ADD INDEX tags (tags); ALTER TABLE workshop_resource ADD FOREIGN KEY (theme_id) REFERENCES workshop_theme (id); CREATE TABLE `workshop_bookmark` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `theme_id` INT NOT NULL, `legend` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `description` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL, `url` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `type` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `language` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `tags` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `status` TINYINT NOT NULL DEFAULT '1', `created_at` DATETIME NULL DEFAULT NULL, `created_by` INT NULL DEFAULT NULL, `updated_at` DATETIME NULL DEFAULT NULL, `updated_by` INT NULL DEFAULT NULL ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE workshop_bookmark ADD INDEX theme_id (theme_id); ALTER TABLE workshop_bookmark ADD INDEX tags (tags); ALTER TABLE workshop_bookmark ADD FOREIGN KEY (theme_id) REFERENCES workshop_theme (id); RENAME TABLE session_remote_training TO session_training; ALTER TABLE session_training DROP INDEX idx_id; ALTER TABLE session_training DROP INDEX session_remote_training_FI_1; ALTER TABLE session_training DROP INDEX session_remote_training_FI_2; ALTER TABLE session_training CHANGE user_id user_id INT NULL DEFAULT NULL; ALTER TABLE session_training ADD PRIMARY KEY (session_id); ALTER TABLE session_training ADD INDEX (user_id); UPDATE session_training SET training_status='1' WHERE training_status='y'; UPDATE session_training SET training_status='0' WHERE training_status='n'; ALTER TABLE session_training CHANGE training_status completed TINYINT(1) NOT NULL DEFAULT '0'; ALTER TABLE session_training CHANGE training_company_id company_id INT NOT NULL; ALTER TABLE session_computer CHANGE computer_id computer_id INT NULL; RENAME TABLE users_courses TO session_user; ALTER TABLE session_user CHANGE uc_status status VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'required'; ALTER TABLE session_user CHANGE uc_id_session session_id INT NOT NULL; ALTER TABLE session_user ADD user_id INT NULL AFTER session_id; UPDATE session_user SET user_id=uc_id_user; ALTER TABLE session_user DROP uc_id_user; ALTER TABLE session_user DROP uc_id_initiation; ALTER TABLE session_user DROP INDEX users_courses_FI_1; ALTER TABLE session_user DROP INDEX users_courses_FI_2; ALTER TABLE session_user ADD INDEX session_id (session_id); ALTER TABLE session_user ADD INDEX user_id (user_id); RENAME TABLE session TO session_old; CREATE TABLE session ( `id` int(11) NOT NULL AUTO_INCREMENT, `type_id` SMALLINT NOT NULL, `name` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `description` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL, `room_id` INT NOT NULL, `date` DATE NOT NULL, `time_from` TIME NOT NULL, `time_until` TIME NOT NULL, `people_nb` SMALLINT NULL DEFAULT '1', `instructor_id` INT NULL DEFAULT NULL, `supervisor` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `network_name` VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `show_in_feeds` TINYINT NOT NULL DEFAULT '0', `feedback` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL, `chain_key` INT NULL DEFAULT NULL, `created_at` DATETIME NULL DEFAULT NULL, `created_by` INT NULL DEFAULT NULL, `updated_at` DATETIME NULL DEFAULT NULL, `updated_by` INT NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE=utf8_unicode_ci; ALTER TABLE session ADD INDEX room_id (room_id); ALTER TABLE session ADD INDEX instructor_id (instructor_id); ALTER TABLE session ADD INDEX chain_key (chain_key); UPDATE session_old SET nbr_of_people=se_count WHERE type_id=3; UPDATE session_old SET parent_id=id WHERE parent_id IS NULL AND recurrency=1; INSERT INTO session (id, chain_key, type_id, name, description, room_id, `date`, time_from, time_until, people_nb, instructor_id, supervisor, network_name, show_in_feeds, feedback, created_at, created_by, updated_at, updated_by) (SELECT id, parent_id, type_id, name, description, room_id, `date`, time_from, time_until, nbr_of_people, facilitator_id, supervisor, network_name, show_in_feeds, feedback, created_at, created_by, updated_at, updated_by FROM session_old WHERE type_id>2); INSERT IGNORE INTO session (id, chain_key, type_id, name, description, room_id, `date`, time_from, time_until, people_nb, instructor_id, supervisor, network_name, show_in_feeds, feedback, created_at, created_by, updated_at, updated_by) (SELECT id, parent_id, type_id, name, description, room_id, `date`, time_from, time_until, nbr_of_people, facilitator_id, supervisor, network_name, show_in_feeds, feedback, created_at, created_by, updated_at, updated_by FROM session_user INNER JOIN session_old ON session_id=session_old.id WHERE type_id<3); INSERT INTO session (type_id, name, description, room_id, `date`, time_from, time_until, instructor_id, supervisor, network_name, show_in_feeds, feedback, created_at, created_by, updated_at, updated_by) (SELECT type_id, name, description, room_id, `date`, us_begin, us_end, facilitator_id, supervisor, us_id_user, show_in_feeds, us_id_equipment, created_at, created_by, updated_at, updated_by FROM uses INNER JOIN session_old ON us_id_session=session_old.id); DELETE session_computer FROM session_computer LEFT JOIN session ON session_id=session.id WHERE session.id IS NULL; INSERT INTO session_computer (session_id, computer_id) (SELECT id, feedback FROM session WHERE type_id<=2); INSERT INTO session_user (session_id, user_id, status) (SELECT id, network_name, type_id FROM session WHERE type_id<=2); UPDATE session SET feedback='', network_name='' WHERE type_id<=2; UPDATE session_user SET status='autonome' WHERE status='1'; UPDATE session_user SET status='accompagné' WHERE status='2'; INSERT INTO session_user (user_id, session_id, status) (SELECT user_id, session_id, 'formation' FROM session_training); ALTER TABLE session_training DROP user_id; -- substitution des animateurs supprimés par des animateurs existants UPDATE session SET instructor_id=28 WHERE instructor_id=12; UPDATE session SET instructor_id=28 WHERE instructor_id=20; UPDATE session SET instructor_id=35 WHERE instructor_id=19; UPDATE session SET instructor_id=26 WHERE instructor_id=18; UPDATE session SET instructor_id=620 WHERE instructor_id=364; ALTER TABLE session ADD FOREIGN KEY (room_id) REFERENCES room (id); ALTER TABLE session ADD FOREIGN KEY (instructor_id) REFERENCES sf_guard_user (id) ON DELETE SET NULL; ALTER TABLE session_workshop ADD FOREIGN KEY (session_id) REFERENCES session (id) ON DELETE CASCADE; ALTER TABLE session_workshop ADD FOREIGN KEY (theme_id) REFERENCES workshop_theme (id) ON DELETE SET NULL; ALTER TABLE session_training ADD FOREIGN KEY (session_id) REFERENCES session (id) ON DELETE CASCADE; ALTER TABLE session_computer ADD FOREIGN KEY (session_id) REFERENCES session (id) ON DELETE CASCADE; ALTER TABLE session_computer ADD FOREIGN KEY (computer_id) REFERENCES equipment_computer (id) ON DELETE SET NULL; ALTER TABLE session_user ADD FOREIGN KEY (session_id) REFERENCES session (id) ON DELETE CASCADE; ALTER TABLE session_user ADD FOREIGN KEY (user_id) REFERENCES sf_guard_user (id) ON DELETE SET NULL; DROP TABLE uses; DROP TABLE session_old; UPDATE session SET type_id = type_id + 1 WHERE type_id > 2; UPDATE session SET type_id = 3 WHERE type_id = 8;
TODO¶
Pour le moment, le code gère les fonctionnalités de base : liste / ajout / édition / suppression.
Les formulaires sont adaptés aux différents types de sessions. la sélection de la salle recharge la liste des animateurs et des ordinateurs. Les fiches présententent l'ensemble des informations de manière encore un peu brute et exhaustive.
- d'affiner la présentation des fiches
- de filtrer la liste des sessions pour les utilisateurs normaux (visitor/user)
- de gérer les inscriptions d'usagers et changements d'état aux ateliers
- de rendre utilisable la notion de sessions liées (via l'attribut chain_key)
- de remettre en place un calendrier avec vues par semaines
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- % réalisé changé de 60 à 70
Gestion des inscriptions aux sessions¶
Modifications publiées sur le svn (r356) :
Ajout des actions pour inscrire / modifier / retirer un usager d'une session.
Seules sont concernées les sessions de type Atelier où les inscriptions sont multiples.
La fiche de la session présente la liste des inscrits, un lien pour les retirer ainsi qu'un formulaire pour en ajouter. Le nombre d'inscrits de la fiche est maintenu à jour, le nombre max de participants est controllé.
TODO: Il n'y a pas pour le moment de prise en compte du 'status' d'une inscription
Une purge de plusieurs méthodes obsolètes a également été effectuée.
Liste des sessions en vue calendrier¶
Modifications publiées sur le svn (r357) :
Le calendrier javascript fait son retour pour afficher le planning des sessions.
Le mode de vue peut être hebdomadaire (sur 7 ou 5 jours) ou journalier. Les types de filtres utilisés pour la liste sont disponibles (structure, salle, type, mois) et s'appliquent pour recharger la liste des évenèments à afficher (via AJAX). Des évènements partageant une tranche horaires seront affichés cote-à-cote plutot que superposés.
Le plugin jQuery vient à l'origine du projet 'WeeklyCalendar' :
http://www.redredred.com.au/new-jquery-weekly-calendar-plugin/
Mais ce dernier semble mal supporter les dernières versions de jQuery, et d'ailleurs son auteur conseil de se reporter sur un fork actif du projet :
https://github.com/themouette/jquery-week-calendar
La version utilisée ici est un nouveau fork personnel du précédent, afin d'apporter quelques modifications/correction selon les besoins :
https://github.com/proxyconcept/jquery-week-calendar
Améliorations des fiches et formulaires des sessions¶
Modifications publiées sur le svn (r358) :
Diverses rectifications, meilleur présentation des fiches selon leur type, amélioration de certains formulaires pour faciliter leur saisie...
Le menu contextuel propose les 4 liens de création de sessions sur les pages de liste mais aussi de création. Une entrée vers le calendrier est ajoutée au menu principal. Au passage le menu d'accessibilité est masqué avec la CSS par défaut.
Les formulaires d'éditions indiquent désormais la durée de la session en minutes, valeur mise à jour automatiquement en manipulant les sélecteurs d'horaires. De plus, un widget jQuery-UI de type slider est ajouté pour sélectionner directement une durée (de 15mn à 120mn par pas de 15mn), permettant de positionner automatiquement l'heure de fin d'après l'heure de début.
Concernant les téléformations, davantage d'informations sont disponibles sur la fiche (concernant le thème : catégorie et description). Sur le formulaire, le sélecteur de thème dispose désormais des catégories pour les regrouper.
La génération automatique des noms des sessions a changé :- Pour les accès libre, le nom de base est "Accès libre". Avant chaque enregistrement d'une fiche, le nom de l'usager est concaténé à la suite. La méthode getName() est réécrite pour supprimer automatiquement ce nom, tandis qu'une méthode getFullName() permet d'obtenir la version intégrale.
- Pour les téléformations, le principe est le même sauf qu'il n'y a pas de nom de base, le champs "name" devenant éditable dans le formulaire. Le nom de l'usager sera toujours absent dans le champs texte, et bien entendu il sera ajouté/modifié à chaque enregistrement.
- Les autres types de sessions ne sont pas impactés, le nom restant tel qu'il doit être défini dans le formulaire.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- % réalisé changé de 70 à 90
Filtrage bas-niveau des sessions personnelles¶
Modifications publiées sur le svn (r360) :
Lorsqu'un utilisateur de ProxyEPN ne dispose pas d'un rôle particulier (simple usager ou visiteur anonyme), si l'accès à la liste des sessions est souhaitable, pour autant il ne doit voir que les sessions "publiques". Les sessions personnelles (accès libres et téléformations) doivent absolument être filtrées des résultats et rendu non accessible. Exception faite cependant pour un utilisateur authentifié sur ses propres sessions personnelles.
Pour celà l'objet Context dispose désormais en propriétés supplémentaires du rôle et de l'id de l'utilisateur. Ces données peuvent ainsi être utilisée dans la génération des critères de recherche de sessions pour les restreindre.
En appliquant ces conditions à ce niveau, elles deviennent systématiques et assurent la fiabilité des résultats quelque soit l'usage qui est en fait (liste future, passée, calendrier, homepage, flux, etc). A ce titre, une condition du type "exclude_teleformation" précédemment utilisée n'a plus lieu d'être.
Clonage et sessions liées¶
Modifications publiées sur le svn (r363) :
Pour finaliser les fonctionnalités de base des sessions, il fallait traiter le cas des sessions liées (utilisées typiquement pour des séries de téléformations ou d'ateliers). Il n'est pas question de récurence, principe généralement lourd et pas spécialement adapté à la situation.
Le chainage de sessions¶
Un identifiant (le chain_key) est utilisé comme lien commun à plusieurs sessions. A noter qu'il n'y a pas non plus de notion de session "mère" : le chain_key est un identifiant quelconque (et non un id de session) commun à toute les sessions d'une même série.
A la création/édition de sessions de type formation ou atelier, le chainage peut être établi. Un sélecteur propose la liste des autres sessions du même type, celles faisant déjà parti d'un chainage étant présentées en premier et regroupées en un choix unique (les dates sont indiquées pour chaque choix, avec dans le cas d'une série la première et la dernière date).
Quand un chainage est défini, il apparait sur les fiches de chacune des sessions concernées : la liste complète des sessions liées est affichée par ordre chronologique.
Le clonage de session¶
Le clonage est une fonctionnalité pratique pour créer une nouvelle session à partir d'une session existante. Ainsi un nouveau lien de création est disponible sur chaque fiche de session pour la "cloner". Le formulaire de création est alors déjà préinitialisé avec toutes les infos semblables à la session d'origine (y compris les tables annexes), mais c'est bien une nouvelle session indépendante qui sera créée.
Une exception est faite pour la date et les horaires : ils ne sont pas hérités de la session d'origine mais laissé par défaut à la date actuelle, comme pour une nouvelle session classique.
Cette fonctionnalité est applicable à toute session, quelque soit sont type. Néanmoins elle se trouve particulièrement adaptée aux sessions utilisant le chainage : une session clone propose par défaut d'établir le chainage avec sa session d'origine.
Chainage et inscriptions (cf #19)¶
Pour les sessions utilisant les inscriptions d'usagers (ie les ateliers), si la session fait parti d'une série, alors est offerte la possibilité d'inscrire un usager également sur toutes les autres sessions liées (ou seulement sur celles qui suivent).
Note : à voir s'il est pertinent de laisser les deux choix (toutes / suivantes) ou si le formulaire gagnerait en simplicité avec uniquement l'option la plus utile.
Si l'inscription demandée est multiple, les tests sont effectués au préalable pour savoir si elle est possible sur toutes les sessions concernées. Si ce n'est pas le cas (l'une des sessions serait complète !) alors aucune inscription n'est effectuée.
TODO: Chainage et autres opérations (cf #11)¶
Si le chainage est pris en compte sur les inscriptions, on peut attendre qu'il le soit aussi sur les désinscriptions (pouvoir retirer un usager de toutes les sessions liées d'un atelier).
Les autres cas sont plus complexes et concernent l'édition d'une session faisant partie d'une série. Actuellement la modification d'un champs ne concerne que la session éditée. Parfois on pourrait souhaiter que la modification affecte toutes les sessions liées... mais ce n'est pas toujours le cas !
Un cas particulier serait celui de l'usager attaché à une téléformation : s'il est modifié sur une session il parait dans ce cas logique de reporter le changement sur toute la série.
A défaut de pouvoir ainsi identifier un besoin clair, pour lequel la mise à jour sur toutes les fiches parait évident et sûr (applicable systématiquement), la modification d'un champs pour toute la série n'est pas simple à proposer.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
Nommage automatique et migration des sessions existantes¶
- Pour les sessions "accès libres" (autonomes ou accompagnées), le nom de la session ne fait pas partie du formulaire : il est généré automatiquement sous la forme "Accès libre [NOM de l'usager]"
- Pour les sessions "téléformations", le nom de session reste à saisir dans le formulaire, par contre il n'est plus nécessaire d'y mettre le nom de l'usager, celui-ci étant automatiquement ajouté en suffixe sous la forme "Votre nom pour la formation [NOM de l'usager]"
Ainsi sur ces sessions dîtes "personnelles", le nom de l'usager figure automatiquement dans leur nom, ajouté de manière transparente pour l'animateur.
Par contre il est préférable de renommer toutes les sessions déjà existantes pour qu'elles correspondent à ce modèle de nommage... Quelques requêtes SQL permettent d'opérer le renommage de ces champs au mieux :
-- Renommage de toutes les sessions "accès libre" UPDATE session, session_user, sf_guard_user_profile SET session.name = CONCAT("Accès libre\t[", lastname, " ", firstname, "]") WHERE session.type_id<3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id;
Pour les téléformations : nettoyage au préalable de toute référence au nom de l'usager dans le nom des sessions
-- les tirets sont remplacés par des espaces UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, '-', ' ') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; -- suppression des occurences du prénom et du nom de l'usager UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, firstname, '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, lastname, '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, LOWER(lastname), '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, 'Betton', '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; -- suppression des occurences de titres (M. ou Mme) UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, 'de M.', '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, 'de Mme', '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, 'M.', '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, 'Mme', '') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id; -- Suppression des espaces multiples UPDATE session, session_user, sf_guard_user_profile SET session.name = REPLACE(session.name, ' ', ' ') WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id;
Enfin renommage des téléformations en ajoutant le nom de l'usager en suffixe du nom de session nettoyé :
UPDATE session, session_user, sf_guard_user_profile SET session.name = CONCAT(session.name, "\t[", lastname, " ", firstname, "]") WHERE session.type_id=3 AND session_user.session_id=session.id AND session_user.user_id=sf_guard_user_profile.user_id;
Requête SQL permettant de lister les noms obtenus :
SELECT session.id, session.name, firstname, lastname FROM session INNER JOIN session_user ON (session.type_id=3 AND session_user.session_id=session.id) INNER JOIN sf_guard_user_profile ON session_user.user_id=sf_guard_user_profile.user_id LIMIT 0,1000;
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
Modifications publiées sur le svn (r381) :
Vérification des nombres d'inscrits par session¶
Ajout d'un controle à l'édition d'une session atelier sur le nombre max d'inscriptions :
il est à présent impossible d'indiquer un nombre inférieur au nombre d'inscrits en cours.
- people_nb vaut 1 pour toutes les sessions personnelles (accès libres et téléformations)
- people_max vaut au minimum 1 pour toutes les sessions de type atelier
- people_max vaut au minimum le nombre d'inscrit (people_nb) toujours pour les ateliers
Modifications sur la base de données¶
Détails des opérations SQL de migration/correction des valeurs des sessions existantes :
-- Nombre d'inscrits toujours à 1 pour les sessions personnelles UPDATE session SET people_nb = 1 WHERE type_id <= 3; -- Nombre max d'inscrits non nul (1 minimum) pour les ateliers UPDATE session, session_workshop SET people_max = 1 WHERE type_id=4 AND session_id=id AND (people_max<1 OR people_max IS NULL); -- Nombre max d'inscrits non inférieur au nombre d'inscrits pour les ateliers UPDATE session, session_workshop SET people_max = people_nb WHERE type_id=4 AND session_id=id AND people_nb>people_max;
Mis à jour par Grégory MARIGOT - TEICEE il y a plus de 13 ans
- Statut changé de In Progress à Résolu
- % réalisé changé de 90 à 100
Modifications publiées sur le svn (r423, r428) :
Gestion de l'état des inscriptions (ateliers)¶
Liste des états¶
Les inscriptions d'un usager sur une session contient une info d'état. Celle-ci est simplifiée à la liste suivante : Préinscrit / Inscrit / Absent / Désinscrire.
Les noms des états sont constitués d'une lettre, c'est cette valeur qui est mémorisée dans la BdD. La classe statique SessionUserPeer possède des constantes pour y accéder :- SessionUserPeer::REQUEST = 'R' (Préinscrit)
- SessionUserPeer::PRESENT = 'P' (Inscrit)
- SessionUserPeer::ABSENT = 'A' (Absent)
- SessionUserPeer::DELETE = 'D' (Désinscrire)
De plus pour les présenter dans l'interface, la liste définie dans le fichier 'data/lists/register_status.ini' offre une correspondance entre les lettres et un libellé.
A noter que l'état 'D' est particulier puisqu'il ne doit jamais être trouvé dans la BdD : quand on choisit de passer une inscription sur l'état "Désinscrire", elle est tout simplement supprimée.
Etat initial¶
A l'inscription d'un usager par un animateur, l'état est directement mis à "P: Inscrit".
Cet état vaut à la fois pour signifier inscrit/présent/effectué, donc nul besoin de le metter à jour en général.
Si les inscriptions sont permises directement par les usagers (évolution à venir), l'état initial devra alors être "R: Préinscrit". Ceci nécessite alors une validation de la part d'un animateur pour confirmer la demande de l'usager et passer son inscription en "Inscrit".
A noter que les "préinscrits" ne sont pas comptabilisés dans le nombre de personnes inscrites.
Pour les autres types de sessions qui n'ont pas utilité de cet état, il est simplement initialisé par le nom du type (free, training...) mais sans que cette donnée n'ait à être exploitée.
Modification de l'état¶
La fiche d'une session présente la liste des utilisateurs inscrits avec l'état. Si l'utilisateur dispose des droits suffisant, alors l'état se trouve dans un sélecteur permettant de le changer et de valider.
Les états ne sont modifiables que un par un, la validation entraine un rechargement de la fiche. Le compteur du nombre d'inscrit est automatiquement mis à jour en tenant compte des états (exclusion des préinscrits) dès qu'une inscription est enregistrée/supprimée.
Migration de la base de données¶
La liste des états ayant changée et s'étant réduite, les opérations suivantes sont à effectuer :
DELETE FROM session_user WHERE status = 'désinscrire'; UPDATE session_user SET status = 'P' WHERE status = 'inscrit(e)'; UPDATE session_user SET status = 'P' WHERE status = 'effectué'; UPDATE session_user SET status = 'P' WHERE status = 'problème (exclu(e))'; UPDATE session_user SET status = 'A' WHERE status = 'absent(e)'; UPDATE session_user SET status = 'A' WHERE status = 'en retard - refusé(e)'; UPDATE session_user SET status = 'free' WHERE status = 'autonome'; UPDATE session_user SET status = 'free' WHERE status = 'accompagné'; UPDATE session_user SET status = 'training' WHERE status = 'formation'; UPDATE session_user SET status = 'P' WHERE status = 'required';
Une fois cela fait, le champs people_nb des sessions de type atelier mériterait d'être recalculé en fonction des inscriptions effectives dans la BdD :
UPDATE session SET people_nb=(SELECT count(user_id) FROM session_user WHERE session_id=id AND status!='R') WHERE type_id=4; UPDATE session, session_workshop SET people_max = people_nb WHERE type_id=4 AND session_id=id AND people_nb>people_max;
Mis à jour par Grégory MARIGOT - TEICEE il y a plus de 13 ans
- Statut changé de Résolu à Fermé