Menu

Home

Jean-Marc Libs Alexandre Franke

Le projet kikankoi

But et historique

Ce n'est pas la partie la plus urgente, donc je vais faire court :
Ce code a démarré en 2005 pour gérer les bénévoles des éditions successives des festivals Impropulsion de la compagnie Inédit Théâtre à Strasbourg, surtout ceux qui prenaient la forme de Marathons de l'Impro.
Il a aussi servi aux Rencontres Mondiales du Logiciel Libre 2012 (RMLL), à Strasbourg.
Ça fait longtemps que je voulais le partager, mais ça prend du temps de bien mettre au propre, rendre le code présentable, faire une belle doc, le temps est rare, etc, etc... Bref, je l'ai jamais fait. Mais comme je pense vraiment que ça peut aider, et je connais des gens qui pensent pareil et me tannent gentiment... J'ai décidé de le partager à peu près tel quel, et on nettoiera plus tard.
Ou même, ça pourrait être toi, lecteur et utilisateur, qui souhaite clarifier la doc ou améliorer le code.
Et dieu sait que ce code est bourré d'endroits facilement améliorables même pour quelqu'un qui n'a pas une grande expérience.

Points forts

  • On s'en est vraiment servi, c'est utile et ça fonctionne bien juste avant et pendant l'événement.
  • C'est tout utf-8, donc on peut même gérer des gens qui ont des caractères exotiques dans leur nom.

Points faibles

  • On part du principe que le festival se déroule 24h/24.
  • On part du principe qu'on ne met en place qu'une fois par festival, bien à l'avance sans être pressé, et puis qu'on ne touche plus aux dates et aux créneaux d'activités.
  • Il y a carrément des fichiers qui servent à rien, du code mort (par exemple des fichiers d'avant le passage en utf-8)

Installation

Je vais juste expliquer comment je fais à chaque festival, sur un exemple.

Contexte

J'organise l'édition 2012 du festival "trobien".
Celui-ci dispose d'un nom de domaine dans lequel on peut rajouter des entrées.
Je dispose d'un hébergement permettant le PHP/mysql, avec un accès phpmyadmin aux bases. C'est classique.
J'ai aussi un accès en ligne de commande au serveur qui est sous linux. Oui, je sais, c'est l'idéal, j'ai du bol. C'est ça que je décris, à chacun d'adapter. Ou de proposer une doc faite moins à l'arrache.

Mise en place des sites webs

Au niveau du DNS, à coté de www.trobien.com qui est destiné au grand public, je crée benevoles.trobien.com pour les bénévoles et benevoles-admin.trobien.com pour ceux qui gèrent les bénévoles (c'est aussi souvent des bénévoles, d'ailleurs).
Là, ça peut prendre 3h à faire effet.

Je télécharge le code de kikankoi sur mon hébergement web.


Je vois trois répertoires :
benevoles/
benevoles-admin/
secret/
Je les place comme il faut sur le serveur, par exemple:
/chemin/trobien/benevoles
/chemin/trobien/benevoles-admin
/chemin/trobien/secret

Je configure les serveurs virtuels de benevoles.trobien.com et benevoles-admin.trobien.com pour qu'ils aient pour racines respectives /chemin/trobien/benevoles/ et /chemin/trobien/benevoles-admin/

Chez moi, ça ressemble à ce qui suit. L'important, c'est de bien configurer:
DocumentRoot
ServerName
Directory
Le reste dépend normalement des particularités locales de votre config.

::::::::::::::
/etc/apache2/sites-enabled/210-benevoles-trobien
::::::::::::::
<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /chemin/trobien/benevoles
        ServerName benevoles.trobien.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /chemin/trobien/benevoles/>
                <IfModule mod_php5.c>
                        php_value include_path ".:/include/:include/"
                </IfModule>
                Options Indexes FollowSymLinks MultiViews ExecCGI
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/trobien.log combined
        ServerSignature On

</VirtualHost>
::::::::::::::
/etc/apache2/sites-enabled/211-benevoles-admin-trobien
::::::::::::::
<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /chemin/trobien/benevoles-admin
        ServerName benevoles-admin.trobien.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /chemin/trobien/benevoles-admin/>
                Options Indexes FollowSymLinks MultiViews ExecCGI
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/trobien.log combined
        ServerSignature On

</VirtualHost>

Et un petit coup de
sudo /etc/init.d/apache2 reload
pour faire prendre en compte.

Début de config

À ce stade-là, cher lecteur curieux et impatient, tu peux aller voir http://benevoles.trobien.com
Et voir, normalement, une page !!! Il y a des messages d'erreur en rouge sur le thème Erreur de connexion à la base mais c'est quand même normal : on ne s'en est pas encore occupé, de la base!
Si ça, ça ne marche pas (avoir une page qui a un peu de gueule), il y a un souci (DNS pas propagé encore, apache n'a pas les droits de lecture sur l'endroit où sont les fichiers, etc...)

Si ça "fonctionne" (hum hum), va voir :
http://benevoles-admin.trobien.com
Et là, une pop-up te nargue !
C'est normal : c'est le site des admins, il est sommairement protégé.
Va éditer /chemin/trobien/benevoles-admin/.htaccess comme suit :

AuthUserFile /chemin/trobien/secret/passwords_trobien_admins
AuthName "trobien gestion planning benevoles"
AuthType Basic
require valid-user

Et mets un ou plusieurs couples logins/passwords

Pour le premier, on crée le fichier /chemin/trobien/secret/passwords_trobien_admins
avec un compte nommé par exemple admin

htpasswd -c /chemin/trobien/secret/passwords_rmll_admins admin
New password: ****
Re-type new password: ****

Pour les suivants, on ne recrée pas, on ajoute :

htpasswd /chemin/trobien/secret/passwords_rmll_admins test
New password: ****
Re-type new password: ****

Et maintenant, tu peux accéder à une page à http://benevoles-admin.trobien.com
Il n'y a même pas d'erreurs SQL. Cette page est statique, tu pourras aller y farfouiller plus tard pour lui faire dire ce que tu veux.
Elle contient deux liens vers planning bénévoles 2011 et préparatifs bénévoles 2011 qui vont dans le répertoire 2011.
Tout ce qui nous intéresse y est, ça pourra te permettre de gérer facilement l'édition de l'an prochain et copiant ou renommant le répertoire.

La base de données

Il faut choisir un préfixe pour le festival.
Par exemple, trobien2012

La base et les comptes

À partir de là, je vais dans phpmyadmin (c'est quand même plus simple pour les choses simples).
Je crée une base dbtrobien2012 (ou sinon j'utilise celle qui est là) en utf8_unicode_ci
Je crée un utilisateur trobien_rw local qui peut lire/écrire dans dbtrobien2012.
Je crée un utilisateur trobien_r local qui peut juste lire dans dbtrobien2012 (juste le privilège SELECT).
Ça fait: GRANT SELECT ON dbtrobien2012 . * TO 'trobien_r'@'localhost';

J'édite benevoles/secret/dbaccess.inc.php pour mettre dbtrobien2012, trobien_r, son mot de passe et trobien2012 :

<?php

// Connect database avec utilisateur
$connect=@mysql_connect('localhost',"trobien_r","xxxxxxx");
if(! $connect) {
  info("Erreur de connexion à la base","red");
  $error++;
}

// Nom de la base
if (! mysql_select_db ( "dbtrobien2012",$connect) ){
  info("Erreur de selection de la base","red");
  $error++;
};

$charset = mysql_client_encoding();
#echo "The current character set is: $charset\n";
$query="SET character_set_results = utf8";
$query="SET NAMES 'utf8'";
if( ! mysql_query($query) ) {
  info("Erreur de requète SQL (".mysql_error().") : ".$query, "red");
  $error++;
}
$charset = mysql_client_encoding();

On a moins d'erreurs sur http://benevoles.trobien.com

J'édite benevoles-admin/secret/dbaccess.inc.php pour mettre dbtrobien2012, trobien_rw, son mot de passe et trobien2012 :

<?php

// Connect database
$connect=@mysql_connect('localhost',"trobien_rw","xxxxxxxx");
if(! $connect) {
  info("Erreur de connexion à la base","red");
  $error++;
}

if (! mysql_select_db ( "dbtrobien2012",$connect) ){
  info("Erreur de selection de la base","red");
  $error++;
};

$charset = mysql_client_encoding();
#echo "The current character set is: $charset\n";
$query="SET character_set_results = utf8";
$query="SET NAMES 'utf8'";
if( ! mysql_query($query) ) {
  info("Erreur de requète SQL (".mysql_error().") : ".$query, "red");
  $error++;
}
$charset = mysql_client_encoding();

On a moins d'erreurs sur http://benevoles-admin.trobien.com/rmll2011

Les tables

Voila la structure des tables à créer pour le préfixe trobien2012. Ça peut se balancer dans phpmyadmin.

-- phpMyAdmin SQL Dump
-- version 3.3.2deb1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mer 25 Janvier 2012 à 11:25
-- Version du serveur: 5.1.41
-- Version de PHP: 5.3.2-1ubuntu4.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `dbtrobien2012`
--

-- --------------------------------------------------------

--
-- Structure de la table `trobien2012prepa_creneau`
--

CREATE TABLE IF NOT EXISTS `trobien2012prepa_creneau` (
  `creno_id` int(11) NOT NULL AUTO_INCREMENT,
  `creno_poste_id` tinyint(4) NOT NULL DEFAULT '0',
  `creno_intervenant_id` int(11) NOT NULL DEFAULT '0',
  `creno_debut` int(11) NOT NULL DEFAULT '1',
  `creno_fin` int(11) NOT NULL DEFAULT '125',
  PRIMARY KEY (`creno_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=16 ;

-- --------------------------------------------------------

--
-- Structure de la table `trobien2012prepa_horaire`
--

CREATE TABLE IF NOT EXISTS `trobien2012prepa_horaire` (
  `horaire_id` smallint(6) NOT NULL AUTO_INCREMENT,
  `horaire_label` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `horaire_couleur` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`horaire_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=31 ;

-- --------------------------------------------------------

--
-- Structure de la table `trobien2012_creneau`
--

CREATE TABLE IF NOT EXISTS `trobien2012_creneau` (
  `creno_id` int(11) NOT NULL AUTO_INCREMENT,
  `creno_poste_id` tinyint(4) NOT NULL,
  `creno_intervenant_id` int(11) NOT NULL,
  `creno_debut` int(11) NOT NULL,
  `creno_fin` int(11) NOT NULL,
  PRIMARY KEY (`creno_id`),
  KEY `creno_intervenant_id` (`creno_intervenant_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1137 ;

-- --------------------------------------------------------

--
-- Structure de la table `trobien2012_horaire`
--

CREATE TABLE IF NOT EXISTS `trobien2012_horaire` (
  `horaire_id` smallint(6) NOT NULL AUTO_INCREMENT,
  `horaire_label` varchar(100) COLLATE utf8_bin NOT NULL,
  `horaire_couleur` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`horaire_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=103 ;

-- --------------------------------------------------------

--
-- Structure de la table `trobien2012_intervenant`
--

CREATE TABLE IF NOT EXISTS `trobien2012_intervenant` (
  `intervenant_id` int(11) NOT NULL AUTO_INCREMENT,
  `intervenant_nick` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `intervenant_nom` varchar(127) COLLATE utf8_unicode_ci NOT NULL,
  `intervenant_couleur` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `intervenant_contact` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `intervenant_photo` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`intervenant_id`),
  UNIQUE KEY `intervenant_nick` (`intervenant_nick`,`intervenant_nom`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=179 ;

Seul progrès notable : on a 5 tables dans la base.

Configuration des sites

J'édite benevoles/include/benevoles.inc.php
Il n'y a que 2 valeurs à changer au début, dont un champs de texte libre (qu'on pourra re-changer plus tard).

<?php
$evenement="Festival Trobien 2012"; // Nom à afficher
$prefix="trobien2012";

J'édite benevoles/include/preparation.inc.php en remettant un préfixe (qui dépend de l'autre).
Ici on met la liste des activités préparatoires avant l'événement. Sous forme d'un tableau.

<?php

$liste_poste[1]="scène à voir";
$liste_poste[2]="village";
$liste_poste[3]="accueil";
$liste_poste[4]="village";
$liste_poste[5]="nettoyage";
$liste_poste[6]="nettoyage ext";
$liste_poste[7]="autres";

$prefix="trobien2012prepa";
$table_horaires=$prefix."_horaire";     // A créer
$table_creneau=$prefix."_creneau";      // A créer

Idem pour benevoles/include/planning.inc.php avec les activités pendant l'événement.

<?php

$liste_poste[1]="Léon";
$liste_poste[2]="accueil";
$liste_poste[3]="bagagerie";
$liste_poste[4]="runners ";
$liste_poste[5]="sécurité incendie";
$liste_poste[6]="crous gallia";
$liste_poste[7]="crous robertsau";
$liste_poste[8]="crous weis";
$liste_poste[9]="buvette";
$liste_poste[10]="restauration";
$liste_poste[11]="captation";
$liste_poste[12]="accompagnement";
$liste_poste[13]="bénévoles village";

Voilà, le site http://benevoles.trobien.com fonctionne sans erreurs en rouge, à part qu'il est vide (pas de bénévoles, pas d'horaires, pas de créneaux).

Idem pour benevoles-admin/rmll2011/data.inc.php qui est assez propre
Les postes d'activités doivent coller aux précédents.

<?php
require("../secret/dbaccess.inc.php");

$liste_poste[1]="Léon";
$liste_poste[2]="accueil";
$liste_poste[3]="bagagerie";
$liste_poste[4]="runners ";
$liste_poste[5]="sécurité incendie";
$liste_poste[6]="crous gallia";
$liste_poste[7]="crous robertsau";
$liste_poste[8]="crous weis";
$liste_poste[9]="buvette";
$liste_poste[10]="restauration";
$liste_poste[11]="captation";
$liste_poste[12]="accompagnement";
$liste_poste[13]="bénévoles village";

$evenement="TROBIEN 2012";
$prefix="trobien2012";
$table_horaires=$prefix."_horaire"; // A créer
$table_intervenant=$prefix."_intervenant";  // A créer
$table_creneau=$prefix."_creneau";  // A créer

function select_liste($name,$liste,$previous) {
  echo "<select name='$name'>\n";
  echo "<option value=''>--- choisir ---</option>\n";
  while(list($key,$value)=each($liste)) {
    echo "<option value='$key' ";
    if($key==$previous) echo "selected ";
    echo ">$value</option>\n";
  }
  echo "</select>\n";
}

Idem pour benevoles-admin/rmll2011/data_preparation.inc.php qui est pas propre :-(
Les postes d'activités doivent coller aux précédents (piège: ici c'est pas le cas).

<?php

// Connect database
$connect=@mysql_connect('localhost',"trobien_rw","xxxxxx");
if(! $connect) {
  info("Erreur de connexion à la base","red");
  $error++;
}

if (! mysql_select_db ( "trobien2012_benevoles",$connect) ){
  info("Erreur de selection de la base","red");
  $error++;
};

$query="SET character_set_results = utf8";
$query="SET NAMES 'utf8'";
if( ! mysql_query($query) ) {
  info("Erreur de requète SQL (".mysql_error().") : ".$query, "red");
  $error++;
}

$liste_poste[1]="scène à voir";
$liste_poste[2]="village";
$liste_poste[3]="accueil";
$liste_poste[4]="village";
$liste_poste[5]="nettoyage";
$liste_poste[6]="nettoyage ext";
$liste_poste[7]="autres";

$evenement="TROBIEN 2012";
$prefix="trobien2012prepa";
$table_horaires=$prefix."_horaire"; // A créer
$table_intervenant="trobien2012_intervenant";      // A créer  (partagé)
$table_creneau=$prefix."_creneau";  // A créer

function select_liste($name,$liste,$previous) {
  echo "<select name='$name'>\n";
  echo "<option value=''>--- choisir ---</option>\n";
  while(list($key,$value)=each($liste)) {
    echo "<option value='$key' ";
    if($key==$previous) echo "selected ";
    echo ">$value</option>\n";
  }
  echo "</select>\n";
}

Et là, c'est "fonctionnel". On ne peut pas saisir de créneaux, mais on peut saisir les bénévoles !

Les horaires (exemples)

Par manque de temps pour retrouver mes scripts de création, voila un exemple du résultat qu'on avait obtenu pour les RMLL. C'est pour l'inspiration, histoire de "voir" l'objectif à atteindre.

Avant l'événement

Un créneau par demi-journée.

--
-- Contenu de la table `rmll2011prepa_horaire`
--

INSERT INTO `rmll2011prepa_horaire` (`horaire_id`, `horaire_label`, `horaire_couleur`) VALUES
(1, 'jeu 07<br/>matin', '#CCCCCC'),
(2, 'jeu 07<br/>aprèm', '#CCCCCC'),
(3, 'jeu 07<br/>soir', '#CCCCCC'),
(4, 'ven 08<br/>matin', '#EEEEEE'),
(5, 'ven 08<br/>aprèm', '#EEEEEE'),
(6, 'ven 08<br/>soir', '#EEEEEE'),
(7, 'sam 09<br/>matin', '#CCCCCC'),
(8, 'sam 09<br/>aprèm', '#CCCCCC'),
(9, 'sam 09<br/>soir', '#CCCCCC'),
(10, 'dim 10<br/>matin', '#EEEEEE'),
(11, 'dim 10<br/>aprèm', '#EEEEEE'),
(12, 'dim 10<br/>soir', '#EEEEEE'),
(13, 'lun 11<br/>matin', '#CCCCCC'),
(14, 'lun 11<br/>aprèm', '#CCCCCC'),
(15, 'lun 11<br/>soir', '#CCCCCC'),
(16, 'mar 12<br/>matin', '#EEEEEE'),
(17, 'mar 12<br/>aprèm', '#EEEEEE'),
(18, 'mar 12<br/>soir', '#EEEEEE'),
(19, 'mer 13<br/>matin', '#CCCCCC'),
(20, 'mer 13<br/>aprèm', '#CCCCCC'),
(21, 'mer 13<br/>soir', '#CCCCCC'),
(22, 'jeu 14<br/>matin', '#EEEEEE'),
(23, 'jeu 14<br/>aprèm', '#EEEEEE'),
(24, 'jeu 14<br/>soir', '#EEEEEE'),
(25, 'ven 15<br/>matin', '#CCCCCC'),
(26, 'ven 15<br/>aprèm', '#CCCCCC'),
(27, 'ven 15<br/>soir', '#CCCCCC'),
(28, 'sam 16<br/>matin', '#EEEEEE'),
(29, 'sam 16<br/>aprèm', '#EEEEEE'),
(30, 'sam 16<br/>soir', '#EEEEEE');

Exemple pendant l'événement

Un créneau par heure

--
-- Contenu de la table `rmll2011_horaire`
--

INSERT INTO `rmll2011_horaire` (`horaire_id`, `horaire_label`, `horaire_couleur`) VALUES
(1, 'sam 9 07-08h', '#66FFCC'),
(2, 'sam 9 08-09h', '#66FFCC'),
(3, 'sam 9 09-10h', '#66FFCC'),
(4, 'sam 9 10-11h', '#66FFCC'),
(5, 'sam 9 11-12h', '#66FFCC'),
(6, 'sam 9 12-13h', '#66FFCC'),
(7, 'sam 9 13-14h', '#66FFCC'),
(8, 'sam 9 14-15h', '#66FFCC'),
(9, 'sam 9 15-16h', '#66FFCC'),
(10, 'sam 9 16-17h', '#66FFCC'),
(11, 'sam 9 17-18h', '#66FFCC'),
(12, 'sam 9 18-19h', '#66FFCC'),
(13, 'sam 9 19-20h', '#66FFCC'),
(14, 'sam 9 20-21h', '#66FFCC'),
(15, 'sam 9 21-22h', '#66FFCC'),
(16, 'sam 9 22-23h', '#66FFCC'),
(17, 'sam 9 23-00h', '#66FFCC'),
(18, 'dim 10 07-08h', '#66FF66'),
(19, 'dim 10 08-09h', '#66FF66'),
(20, 'dim 10 09-10h', '#66FF66'),
(21, 'dim 10 10-11h', '#66FF66'),
(22, 'dim 10 11-12h', '#66FF66'),
(23, 'dim 10 12-13h', '#66FF66'),
(24, 'dim 10 13-14h', '#66FF66'),
(25, 'dim 10 14-15h', '#66FF66'),
(26, 'dim 10 15-16h', '#66FF66'),
(27, 'dim 10 16-17h', '#66FF66'),
(28, 'dim 10 17-18h', '#66FF66'),
(29, 'dim 10 18-19h', '#66FF66'),
(30, 'dim 10 19-20h', '#66FF66'),
(31, 'dim 10 20-21h', '#66FF66'),
(32, 'dim 10 21-22h', '#66FF66'),
(33, 'dim 10 22-23h', '#66FF66'),
(34, 'dim 10 23-00h', '#66FF66'),
(35, 'lun 11 07-08h', '#66FFCC'),
(36, 'lun 11 08-09h', '#66FFCC'),
(37, 'lun 11 09-10h', '#66FFCC'),
(38, 'lun 11 10-11h', '#66FFCC'),
(39, 'lun 11 11-12h', '#66FFCC'),
(40, 'lun 11 12-13h', '#66FFCC'),
(41, 'lun 11 13-14h', '#66FFCC'),
(42, 'lun 11 14-15h', '#66FFCC'),
(43, 'lun 11 15-16h', '#66FFCC'),
(44, 'lun 11 16-17h', '#66FFCC'),
(45, 'lun 11 17-18h', '#66FFCC'),
(46, 'lun 11 18-19h', '#66FFCC'),
(47, 'lun 11 19-20h', '#66FFCC'),
(48, 'lun 11 20-21h', '#66FFCC'),
(49, 'lun 11 21-22h', '#66FFCC'),
(50, 'lun 11 22-23h', '#66FFCC'),
(51, 'lun 11 23-00h', '#66FFCC'),
(52, 'mar 12 07-08h', '#66FF66'),
(53, 'mar 12 08-09h', '#66FF66'),
(54, 'mar 12 09-10h', '#66FF66'),
(55, 'mar 12 10-11h', '#66FF66'),
(56, 'mar 12 11-12h', '#66FF66'),
(57, 'mar 12 12-13h', '#66FF66'),
(58, 'mar 12 13-14h', '#66FF66'),
(59, 'mar 12 14-15h', '#66FF66'),
(60, 'mar 12 15-16h', '#66FF66'),
(61, 'mar 12 16-17h', '#66FF66'),
(62, 'mar 12 17-18h', '#66FF66'),
(63, 'mar 12 18-19h', '#66FF66'),
(64, 'mar 12 19-20h', '#66FF66'),
(65, 'mar 12 20-21h', '#66FF66'),
(66, 'mar 12 21-22h', '#66FF66'),
(67, 'mar 12 22-23h', '#66FF66'),
(68, 'mar 12 23-00h', '#66FF66'),
(69, 'mer 13 07-08h', '#66FFCC'),
(70, 'mer 13 08-09h', '#66FFCC'),
(71, 'mer 13 09-10h', '#66FFCC'),
(72, 'mer 13 10-11h', '#66FFCC'),
(73, 'mer 13 11-12h', '#66FFCC'),
(74, 'mer 13 12-13h', '#66FFCC'),
(75, 'mer 13 13-14h', '#66FFCC'),
(76, 'mer 13 14-15h', '#66FFCC'),
(77, 'mer 13 15-16h', '#66FFCC'),
(78, 'mer 13 16-17h', '#66FFCC'),
(79, 'mer 13 17-18h', '#66FFCC'),
(80, 'mer 13 18-19h', '#66FFCC'),
(81, 'mer 13 19-20h', '#66FFCC'),
(82, 'mer 13 20-21h', '#66FFCC'),
(83, 'mer 13 21-22h', '#66FFCC'),
(84, 'mer 13 22-23h', '#66FFCC'),
(85, 'mer 13 23-00h', '#66FFCC'),
(86, 'jeu 14 07-08h', '#66FF66'),
(87, 'jeu 14 08-09h', '#66FF66'),
(88, 'jeu 14 09-10h', '#66FF66'),
(89, 'jeu 14 10-11h', '#66FF66'),
(90, 'jeu 14 11-12h', '#66FF66'),
(91, 'jeu 14 12-13h', '#66FF66'),
(92, 'jeu 14 13-14h', '#66FF66'),
(93, 'jeu 14 14-15h', '#66FF66'),
(94, 'jeu 14 15-16h', '#66FF66'),
(95, 'jeu 14 16-17h', '#66FF66'),
(96, 'jeu 14 17-18h', '#66FF66'),
(97, 'jeu 14 18-19h', '#66FF66'),
(98, 'jeu 14 19-20h', '#66FF66'),
(99, 'jeu 14 20-21h', '#66FF66'),
(100, 'jeu 14 21-22h', '#66FF66'),
(101, 'jeu 14 22-23h', '#66FF66'),
(102, 'jeu 14 23-00h', '#66FF66');

Horaires, comment les créer rapidement

Il y a deux tables d'horaires à créer : celle des créneaux horaires pendant l'événement (trobien2012_horaire) et celle des gros créneaux pendant les préparatifs, typiquement la semaine de mise en place du lieu de l'événement (trobien2012prepa_horaire).

Créneaux horaires pendant l'événement : il s'agit de remplir la table trobien2012_horaire, avec une ligne par créneau, plus des créneaux avant, en changeant la couleur au début, à chaque changement de jour, à la fin.

Notre événement démarre par exemple le 1er avril 2012 à 20h et dure 173h jusqu'au lundi 9 avril à 1h du matin (c'est pas raisonnable, mais bon :-) ...).

D'abord, on vérifie qu'on arrive bien à afficher la liste des créneaux horaires en ligne de commande. Notons qu'on renseigne l'heure avant le démarrage:
debut="20120401 1900"; for((i=1;i<=173;i++)) do echo -n "-- $i -- "; date --date="$debut $i hours"; done

Là, j'ai noté les passages de journées, le début et la fin:
0,4,28,52,76,100,124,148,172,173 et j'ai lancé plusieurs fois le script suivant en dé-commentant à chaque fois une autre ligne. Attention: ça donne des lignes à rentrer dans phpmyadmin, mais il ne faut pas tout prendre à chaque fois.

Par exemple, décommenter la première ligne m'a fourni les créneaux avant l'événement, numérotés de -10 à 0
La deuxième m'a fourni les créneaux de 1 à 4
La troisième et les suivantes fournissent des jours complets.
À la fin, il faut à nouveau coller à la fin de l'événement si on veut prévoir des créneaux après l'événement, comme échanger avec le public, ou faire la fête toute la nuit entre organisateurs ou les deux.

#!/bin/bash

prefix="trobien2012";
debut="20120401 1900 " ;

color0="#FFFFFF" ;
color1="#66FFCC" ;
color2="#66FF66" ;

#À chaque exécution, décommenter une autre ligne et choisir les lignes pertinentes à entrer dans la base

offset=-11; color="$color0" ;
#offset=0; color="$color1" ;
#offset=4; color="$color2" ;
#offset=28; color="$color1" ;
#offset=52; color="$color2" ;
#offset=76; color="$color1" ;
#offset=100; color="$color2" ;
#offset=124; color="$color1" ;
#offset=148; color="$color2" ;
#offset=172; color="$color1" ;
#offset=172; color="$color0" ;

for ((i=1;i<=24;i++));
do
j=$((i+$offset));
string1=`date --date="$debut $j hours" +"%a %H-"`;
string2=`date --date="$debut $j hours 1 hour" +"%Hh"`;
echo "INSERT INTO \`${prefix}_horaire\` VALUES ($j, '$string1$string2', '$color');" ;
done

Pour Les créneaux avant (et éventuellement après) l'événement, je choisis l'une des deux méthodes suivantes:

Première méthode

un peu fastidieuse mais rapide. Je pars d'un fichier comme le suivant, je modifie tout à la main, et j'envoie dans phpmyadmin.

INSERT INTO `trobien2012prepa_horaire` (`horaire_label`, `horaire_couleur`) VALUES 
('jeu 09<br>matin', '#EEEEEE'),
('jeu 09<br>aprèm', '#EEEEEE'),
('jeu 09<br>soir', '#EEEEEE'),
('ven 10<br>matin', '#CCCCCC'),
('ven 10<br>aprèm', '#CCCCCC'),
('ven 10<br>soir', '#CCCCCC'),
('sam 11<br>matin', '#EEEEEE'),
('sam 11<br>aprèm', '#EEEEEE'),
('sam 11<br>soir', '#EEEEEE'),
('dim 12<br>matin', '#CCCCCC'),
('dim 12<br>aprèm', '#CCCCCC'),
('dim 12<br>soir', '#CCCCCC'),
('lun 13<br>matin', '#EEEEEE'),
('lun 13<br>aprèm', '#EEEEEE'),
('lun 13<br>soir', '#EEEEEE'),
('mar 14<br>matin', '#CCCCCC'),
('mar 14<br>aprèm', '#CCCCCC'),
('mar 14<br>soir', '#CCCCCC'),
('mer 15<br>matin', '#EEEEEE'),
('mer 15<br>aprèm', '#EEEEEE'),
('mer 15<br>soir', '#EEEEEE'),
('jeu 16<br>matin', '#CCCCCC'),
('jeu 16<br>aprèm', '#CCCCCC'),
('jeu 16<br>soir', '#CCCCCC'),
('ven 17<br>matin', '#EEEEEE'),
('ven 17<br>aprèm', '#EEEEEE');
Deuxième méthode

Je bidouille un script de ce style

#!/bin/bash

prefix="trobien2012"

daynum=0
for day in ven sam dim lun mar mer jeu ven sam
do daynum=$(($daynum + 1))
  titi=$(( $daynum % 2 ))
  if [ $titi -eq 0 ]
  then
    color="#EEEEEE"
  else
    color="#CCCCCC"
  fi
  for creno in matin aprèm soir
  do sql=$(printf "INSERT INTO \`${prefix}prepa_horaire\` (\`horaire_label\`, \`horaire_couleur\`) VALUES ('%s %02d<br/>$creno', '$color');" $day $daynum )
    echo "$sql"
  done
done

À ce stade, on peut montrer quelque chose aux autres organisateurs et recueillir plein d'idées de présentation à changer :-)

Adaptation charte graphique

Je n'ai pas de méthode bien rôdée. C'est selon, et c'est en éditant les fichiers, principalement dans les répertoires "include/"

Limitations et axes d'améliorations

On ne peut pas supprimer de créneau. On peut juste les renommer ou en rajouter. Ou en laisser un vide.
On ne peut pas déplacer ou supprimer plusieurs créneaux d'un coup.
La mise en place initiale est fastidieuse.
Ce n'est pas multilingue.


The wiki uses Markdown syntax.

Project Admins: