Vitefait2
Jacques Adamski1
17 mai 2004
1Merci à Denis Bitouzé pour son aide sur la documentation
Table des matières
1 Objet 3
2 Installation 4
3 Principe de fonctionnement 5
3.1 Nom du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 Dessin du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Les touches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.4 Les champs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.5 Les programmes générés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.6 Les exits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.7 Tests et code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.7.1 Le codage d'un test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.7.2 Utiliser les conditions de recherches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.8 Variables spéciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.9 Méthodes diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.10 Dessin non formaté . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.11 Nom de la table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.12 Les touches de Vitefait2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1
4 Exemples 17
4.1 Création d'un répertoire tout simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Traitement d'une demande de travaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2.1 Module de demande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2.2 Module de traitement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2
Chapitre 1
Objet
Vitefait2 est une application permettant de réaliser un interfaçage entre des pages web disposant de champs a remplir
et des tables SQL. Son intérêt est de pouvoir réaliser des applications Web sur la plate forme Zope.
Par exemple, Vitefait2 permet de réaliser très rapidement des applications de traitement de formulaires. Il n'est pas
nécessaire de connaître le langage HTML ou PHP ou SQL : Vitefait2 utilise un langage de balise simplifié qui correspond
aux champs.
Vous dessinez directement votre écran avec Vitefait2 puis vous demandez la génération des programmes, c'est tout
votre application est opérationnelle. Le code généré vous permet de créer tout de suite votre table SQL (quelle que soit
votre base de données) et vous pouvez exploiter votre formulaire directement. Tout le code généré peut être modifié à tout
moment par Vitefait2 (mais aussi manuellement, même si cela est moins conseillé). Vitefait2 a aussi un but didactique.
Par l'examen du code généré, il sera facile de comprendre le DTML.
3
Chapitre 2
Installation
Placez vitefait2.zexp dans votre dossier import, puis à partir de l'interface ZMI de Zope, lancer un import dans le
dossier root. Si vous avez déjà utilisé Gadfly connectez vous par http://server:8080/vitefait2 et c'est tout, sinon supprimez
l'objet vitefait_base puis recréez un objet ZGadflyDatabseConnexion nommé vitefait_base et connectez vous par
http://server:8080/vitefait2.
Lors de sa première utilisation, Vitefait2 va créer la table SQL dont il a besoin pour travailler. Par défaut ce sera du
Gadfly mais il su
ffit que votre connexion soit en PostgreSQL (que je vous conseille) ou autre (avec Zope, vous avez le
choix) pour que Vitefait2 utilise cette base.
4
Chapitre 3
Principe de fonctionnement
3.1 Nom du programme
Tout d'abord trouvez un nom à votre programme. Ce nom doit respecter les conventions Zope. Évitez les caractères
spéciaux et préférez les lettres et chi ffres. Afin de permettre une certaine souplesse, Vitefait2 laissera Zope tester la
validité de tous les noms que vous donnerez. En cas d'erreur ceci vous sera indiqué lors de la génération du code ou des
tables SQL.
3.2 Dessin du formulaire
Vous dessinez directement dans la zone. Vous dessinez tel que vous le voulez le formulaire en sortie. Ce formulaire sera
formaté grâce aux espaces et retours à la ligne.
Vous pouvez, si vous le voulez, ajouter des balises HTML. L'option « dessin non formaté » permet de ne pas tenir compte
des espaces et retours à la ligne, dans ce cas, vous gérez vous même le code HTML.
À l'intérieur du dessin vous utilisez des caractères réservés pour marquer les champs.
5
Le mode non formaté peut être utile pour récupérer le code généré par un éditeur HTML. Néanmoins, pour commencer,
je vous conseille le dessin en ligne.
Pour
1. un champ
(a) modifiable, mettez autant de caractères $ que nécessaires pour définir la taille prévue pour votre champ ;
(b) non modifiable, mettez autant de § que nécessaires pour définir la taille prévue pour votre champ ;
(c) de type radio (choix simple) mettez un ^ ;
(d) de type case à cocher (choix multiple) mettez un # ;
2. un mot de passe, mettez autant de £ que la taille que nécessaires pour définir la taille prévue pour votre champ ;
3. une liste déroulante, mettez autant de ~ que nécessaires pour définir la taille prévue pour votre champ ;
4. un texte long (textarea) mettez le nombre de ligne et de colonnes entre crochets sous la forme : [rows=x cols=y]
Le caractère \ mis devant un champ de n'importe quel type rendra ce champ « disabled » : rien ne pourra être entré dans le
champ et le champ ne rendra pas ce qu'il contient au programme chargé de traiter le formulaire.
3.3 Les touches
Vous pouvez mettre autant de touches que vous le voulez dans votre image, vos touches doivent être séparées par des
virgules ou des retours à la ligne ou les deux. Chaque touche sera ajoutée à votre image (à raison de 6 par ligne).
Un traitement se mettra en route, appelant le programme correspondant à votre touche.
Le nom des touches doit respecter les conventions Zope, de préférence mettez des caractères et des chi ffres.
ATTENTION ! Le nom ne doit pas être ni précédé ni suivi d'espace sinon une erreur sera indiquée à la génération.
EXEMPLE 1. Vous avez appelé votre programme machin, vous avez défini une touche truc. En cliquant sur la touche
truc , vous appellerez le programme machin_prog_truc.
6
Un certain nombre de programmes sont générés par défaut ; par exemple, dans le cas où votre programme s'appelle
machin
, le programme
1. machin_prog_voir sera appelé par la touche voir et servira à voir une ligne de la table ;
2. machin_prog_ajouter sera appelé par la touche ajouter et servira à ajouter une ligne à la table ;
3. machin_prog_modifier sera appelé par la touche modifier et servira à modifier une ou des lignes de la table ;
4. machin_prog_supprimer sera appelé par la touche supprimer et servira à supprimer une ou des lignes de la table ;
5. machin_prog_lister sera appelé par la touche lister et servira à lister une ou des lignes de la table. Attention, ce
programme lister a besoin du programme voir (dans notre exemple machin_prog_voir) car il crée pour chaque
ligne un raccourci vers cette fonction voir.
Si vous souhaitez que la touche voir ne soit pas générée, placez un dièse à la fin (voir#).
De même, si vous souhaitez prévoir l'appel d'un code mais sans générer automatiquement les touches, insérez un dièse
à la fin.
Dans ce cas, vous pouvez positionner manuellement votre touche en ajoutant le code HTML suivant :
Exemple de code HTML
1 <INPUT class="bouton" type="SUBMIT" name="machin_prog_touche" value="truc">
Dans ce cas en cliquant sur la touche vous appellerez le code machin_prog_truc.
3.4 Les champs
Pour chacun des champs que vous avez préparé dans votre dessin, donnez un nom de champ (respectez les conventions
SQL
, de préférence utilisez des caractères et des chi ffres).
Vous pouvez ajouter un champ dans lequel s'a ffichera le message d'erreur, il doit s'appeler msg_erreur.
Vos champs doivent être séparés par des virgules ou des retours à la ligne ou les deux.
Chaque champ peut être su ffixé pour indiquer son type.
ATTENTION ! Le nom ne doit pas être ni précédé ni suivi d'espace sinon une erreur sera indiquée à la génération.
7
Le su
ffixe
$ correspond à integer ;
£ correspond à float ;
/ correspond à date ;
@ correspond à blob.
Chaque champ correspond à une colonne SQL (sauf msg_erreur). Si vous voulez qu'un champ soit un champ de travail,
su ffixez le par un dièse.
Chaque champ commençant par k_ sera considéré comme faisant partie de la clé.
Si aucun champ ne commence par k_ la clé sera le premier champ trouvé.
Les champs clé ne pourront pas être modifiés.
Si vous désirez qu'un champ non clé soit non modifiable, terminez en le nom par un point d'exclamation (éventuellement
derrière les su ffixes).
NB : le point d'exclamation doit suivre le su ffixe, il ne peut pas être utilisé avec un suffixe dièse.
La syntaxe peut vous paraître di
fficile mais pensez que les deux suffixes dièse et point d'exclamation sont les seuls à
pouvoir être complémentaires à un autre su ffixe et ne peuvent pas être suivis par un autre caractère.
3.5 Les programmes générés
Nous supposerons toujours que nous avons appelé notre programme machin. Alors, le programme
1. machin.export sera le code généré par la fonction export ;
2. machin.html sera le code HTML du formulaire ;
3. machin_prog sera le code principal ;
4. machin_prog_ajouter sera le code nécessaire aux ajouts ;
5. machin_prog_lister sera le code appelé par la fonction lister ;
6. machin_prog_modifier sera le code de la fonction modification ;
7. machin_prog_rab sera le code de la remise à blanc du formulaire ;
8
8. machin_prog_supprimer sera le code de suppression ;
9. machin_code_voir sera le code de visualisation.
Il est déconseillé de modifier ces programmes, utilisez plutôt les exits.
3.6 Les exits
Un exit est un programme que vous créez et qui aura un nom précis en fonction de l'endroit où il sera appelé.
Ce programme n'existe pas par défaut à la génération, c'est vous qui décidez de le générer ou non. Il peut être codé en
Python ou en DTML.
ATTENTION ! Si vous codez en DTML vous profiterez de tous les bienfaits de l'acquisition, ce qui ne sera pas le cas en Python.
Python de son côté vous permettra un code plus clair, surtout pour les tests grâce à l'instruction « métatest » de Vitefait2
que vous allez découvrir.
Si vous avez appelé votre programme machin :
1. le programme machin_prog_ajout_modif_tests sera appelé en tout début des programmes ajouter et modifier.
2. les programmes
(a) machin_prog_ajouter_trait ;
(b) machin_prog_lister_trait ;
(c) machin_prog_modifier_trait ;
(d) machin_prog_supprimer_trait ;
(e) machin_prog_voir_trait ;
seront appelés avant l'appel SQL pour leurs programmes respectifs ;
3. le programme machin_prog_ajout_modif_trait sera appelé après le trait des programmes ajouter et modifier ;
4. le programme machin_prog_lister_trait_chaque sera appelé pour chaque ligne SQL de la fonction lister ;
9
5. les programmes
(a) machin_prog_ajouter_trait_fin ;
(b) machin_prog_lister_trait_fin ;
(c) machin_prog_modifier_trait_fin ;
(d) machin_prog_supprimer_trait_fin ;
(e) machin_prog_voir_trait_fin ;
seront appelés après l'appel SQL pour leurs programmes respectifs sauf en cas d'erreur SQL ;
6. les programmes
(a) machin_prog_ajouter_trait_erreur ;
(b) machin_prog_lister_trait_erreur ;
(c) machin_prog_modifier_trait_erreur ;
(d) machin_prog_supprimer_trait_erreur ;
(e) machin_prog_voir_trait_erreur ;
seront appelés en cas d'erreur SQL pour leurs programmes respectifs ;
7. le programme machin_prog_remplit sera appelé avant d'envoyer l'image.
3.7 Tests et code
La zone nommée « tests et code » va servir à créer tous les programmes d'exit précédemment décrits. Le premier exit
sera créé implicitement sans que l'on ait à indiquer son nom. Cet exit est l'exit principal de test machin_prog_ajout_
modif_tests .
10
3.7.1 Le codage d'un test
Le test se code en Python en préfixant chaque champ par la commande val..
Vitefait2 a prévu une instruction « métatest ». Donc, un test simple s'écrit sous la forme :
1 ! condition_obligatoire : message d'erreur si la condition n'est pas remplie
EXEMPLE 2.
1 ! val.nom <> '' : le champ nom n'a pas été rempli
mais vous pouvez aussi coder directement en Python en oubliant le signe !
EXEMPLE 3.
1 if val.nom <> '':
2 raise 'problème','msg_erreur','veuillez remplir le champ nom'
Après avoir rempli tous les tests nécessaires, vous pouvez passer à la création d'exit.
Placez /**/ seul sur une ligne pour séparer chaque programme, mettez le su ffixe du nom derrière un #prog= ou mettez
le nom entier derrière un #prog !.
EXEMPLE 4.
1 #prog=ajouter_trait_erreur
créera un programme du nom de machin_prog_ajouter_trait_erreur
1 #prog!machin_prog_ajouter_trait_erreur
créera un programme du nom de machin_prog_ajouter_trait_erreur
11
La commande #prog créera des programmes Python. Si vous préférez coder en DTML, mettez #dtml à la place.
ATTENTION ! Collez le nom du programme à #prog= et allez à la ligne ensuite, votre nom doit respecter les conventions
Zope, #prog et #dtml doivent être en minuscule. N'oubliez surtout pas les séparateurs de programme, sinon vos deux
programmes seront regroupés en un seul ayant le dernier nom.
Si vous voulez appeler une méthode préfixez le nom de la méthode par prg.
EXEMPLE 5.
1 val.bidule = prg.mamethode(val.machin)
ou
1 call prg.mamethode()
Si à partir d'un programme en Python vous voulez appeler un programme en DTML codez
1 val.bidule = prg.nomdudtml(prg,val)
pour pouvoir bénéficier de l'acquisition.
3.7.2 Utiliser les conditions de recherches
La méthode sql_lister permet d'ajouter des conditions de recherche.
Vous pouvez utiliser prog_lister.
EXEMPLE 6. Votre programme s'appelle truc, vous avez deux colonnes nom et prenom. Vous pouvez alors saisir le
code suivant :
1 val.set('eq_nom','toto')
2 val.set('eq_prenom','jean')
3 call prg.machin_prog_lister()
12
EXEMPLE 7.
1 !not(prg.machin_sql_lister(eq_nom=val.nom)):le nom existe déjà
Ce simple test vous donnera un message d'erreur si le nom est trouvé dans la table. Puissant, non ? !
Chaque condition de recherche a un préfixe, les conditions sont cumulatives.
Le préfixe
eq_ teste l'égalité ;
ne_ teste la di fférence ;
gt_ teste « supérieur à » ;
ge_ teste « supérieur ou égal à » ;
le_ teste « inférieur ou égal à » ;
lt_ teste « inférieur à » ;
like_ fera un like SQL.
EXEMPLE 8. Pour obtenir tous les noms contenant aze :
1 like_nom='%aze%'
La comparaison like_ ne fonctionne pas avec une base Gadfly. Vous pouvez ajouter des conditions de tri à votre méthode en
positionnant la variable ordre. Si votre programme s'appelle bidule la variable ordre se nommera bidule_prog_ordre et
comprendra l'ordre au format SQL. Si votre variable contient un point-virgule, elle sera ignorée pour des raisons de sécurité
SQL
.
EXEMPLE 9. Pour faire un tri descendant sur nom et ascendant sur prenom. obtenir tous les noms contenant aze, il
su ffit de saisir le code suivant :
1 val.set('bidule_ordre','nom DESC, prenom')
13
3.8 Variables spéciales
Toujours pour notre programme machin, si l'on positionne machin_affiche_pas, le prochain a
ffichage de l'image de
machin sera annulé.
Si l'on positionne
vitefait_debut_affiche_pas, le code HTML de début ne sera pas a ffiché ;
vitefait_fin_affiche_pas, le code HTML de fin ne sera pas a ffiché ;
msg_erreur_box, les messages d'erreur s'a fficheront dans une boîte de dialogue en javascript.
Ces variables sont positionnées par,
en Python :
1 val.set('machin_affiche_pas','x')
en DTML :
1 <dtml-call '' REQUEST.set('machin_affiche_pas','x') ''>
On peut aussi à tout moment remplir la zone de message d'erreur.
EXEMPLE 10. La remise à blanc de cette zone s'effectue par :
1 val.set('msg_erreur','')
3.9 Méthodes diverses
La méthode
vitefait_css contient la feuille de style ;
vitefait_debut contient le code HTML de début ;
vitefait_fin contient le code HTML de fin ;
vitefait_nb_lignes_a_afficher contient le nombre de lignes à a fficher par page en mode liste ;
14
js_msg_erreur contient le javascript d'a ffichage du message d'erreur ;
vitefait_base est la connexion à la base de données. Pour passer en connexion PostgreSQL, MySQL ou autre type
de base, supprimez cette connexion et créez une connexion du même nom à votre base.
3.10 Dessin non formaté
Cocher cette case évite le mode dessin pur. Vous mettez dans ce cas les balises HTML nécessaires aux retours à la ligne et
espaces. Ce mode peut être pratique si votre image provient d'un composeur de pages Web.
3.11 Nom de la table
Par défaut le nom de la table est égal au nom du programme. Si vous êtes obligé d'utiliser plusieurs programmes pour la
même table, remplissez ce champ.
3.12 Les touches de Vitefait2
Vitefait2 a été créé avec Vitefait2. Il stocke tous ses programmes dans une table SQL.
Voici les fonctions des touches :
voir, ajouter, modifier, supprimer servent à la gestion SQL ;
rab sert à remettre l'image à blanc pour créer un nouveau programme ;
gen_code sert à générer tout le code ;
sup_code à supprimer tout le code ;
gen_table sert à générer la table SQL ;
sup_table à supprimer la table SQL (en utilisant le code généré) ;
tester vous permet de tester directement le code généré ;
zope ouvre l'interface Zope dans le dossier des programmes générés ;
15
export exporte toutes les infos que vous avez saisies pour votre programme. La fonction export va créer un do-
cument su ffixé par .import (exemple : bidule.import) dans votre dossier. La fonction import ira rechercher ce
document.1
import importe toutes les infos que vous avez saisies pour votre programme. La fonction import ira rechercher un
document .import dans votre dossier.
1Comme toutes les données de Vitefait2 sont stockées dans une base SQL ceci va être utile pour passer votre application d'une machine à une
autre. Depuis la version 2.0.8 un export est généré automatiquement lors des ajouts et modifications.
16
Chapitre 4
Exemples
4.1 Création d'un répertoire tout simple
Nous allons créer un répertoire tout simple sur une base de données relationnelle. Ce répertoire contiendra 3 champs :
nom , prénom, téléphone. Les champs noms et prénoms formeront une clé unique.
Nom du programme : annuaire ;
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <h1><center>mon petit annuaire</center></h1>
2
3
4 nom $$$$$$$$$$$$$$$$$$$$$$$$$
5
6 prénom $$$$$$$$$$$$$$$$$$$$$$$$$
7
8 téléphone $$$$$$$$$$
9
17
10 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 voir#,ajouter,modifier,supprimer,lister
La touche voir est suivie d'un dièse, elle est utile quand on est en mode liste, mais n'apparaît pas dans les touches.
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_nom,k_prenom,tel,msg_erreur
Tests et code : le code de la zone « tests et code » est le suivant :
Code de la zone « tests et code »
1 ! val.k_nom <> '' : le nom n'est pas rempli
2 ! val.k_prenom <> '' : le prénom n'est pas rempli
3 ! val.tel <> '' : le téléphone n'est pas rempli
4 /**/
5 #prog=ajouter_trait
6 # fonction appelée uniquement en cas d'ajout
7 ! not(prg.annuaire_sql_lister(eq_k_nom=val.k_nom,eq_k_prenom=val.k_prenom)) : la personne est déjà saisie dans
Juste 4 tests : les champs de nom, prénom et téléphone doivent être remplis et la personne ne doit pas exister dans la
table SQL.
Voilà c'est tout ! Vous n'avez plus qu'à :
1. ajouter votre programme dans la base grâce à la touche ajouter ;
2. générer le code avec la touche gen_code ;
3. générer la table SQL avec la touche gen_table ;
4. tester votre programme avec la touche tester ou en tapant l'adresse : .../vitefait2/vitefait_prog/annuaire_prog.
18
Certes ce petit programme n'est pas très utile mais vous pouvez au moins voir la vitesse de réalisation d'une petite application
avec Vitefait2.
Voici la liste des objets créés par Vitefait2 :
1. annuaire.export (export Vitefait2) : code servant à l'export vers un autre zope ;
2. annuaire_html (code HTML) : tout le code HTML de l'image ;
3. annuaire_prog (programme Vitefait2) : le programme principal de traitement de l'image ;
4. annuaire_prog_ajout_modif_tests : le programme contenant les tests en ajout et modif ;
5. annuaire_prog_ajouter (fonction ajout) : le code d'appel de la fonction SQL ajout ;
6. annuaire_prog_lister (fonction lister) : le code d'appel de la fonction SQL ajout ;
7. annuaire_prog_modifier (fonction modifier) : le code d'appel de la fonction SQL ajout ;
8. annuaire_prog_rab (programme de remise à blanc image) : fonction de remise à blanc (non utilisée ici) ;
9. annuaire_prog_supprimer (fonction supprimer) : le code d'appel de la fonction SQL ajout ;
10. annuaire_prog_voir (fonction voir) : le code d'appel de la fonction SQL voir.
Puis tous les ordres SQL :
1. annuaire_sql_ajouter (ajout dans la table) ;
2. annuaire_sql_cretab (création de table) ;
3. annuaire_sql_droptab (suppression de table) ;
4. annuaire_sql_lister (liste de la table) ;
5. annuaire_sql_modifier (mise à jour de la table) ;
6. annuaire_sql_supprimer (suppression dans la table) ;
7. annuaire_sql_voir (vue de la table).
On peut voir le résultat sur la figure 4.1 page suivante.
19
FIG. 4.1 Capture d'écran du résultat
20
4.2 Traitement d'une demande de travaux
Cet exemple est plus complet, il s'agit du traitement d'un formulaire de demande de travaux. Ce traitement a été réalisé
pour un hôpital.
L'application est la reprise d'un formulaire papier tel qu'il existe. Elle comprend 2 modules :
1. le module de demande de travaux aux services techniques ;
2. le module de traitement de la demande par les services.
Le formulaire apparaissant dans les services est identique au formulaire apparaissant aux services techniques. Le service
remplit la première partie, les services techniques la deuxième et ensuite renseignent une fiche « produit » (utilisé) et une
fiche « temps » (passé).
4.2.1 Module de demande
Quelques précisions :
1. les champs nom, service (du demandeur) et date (de demande) seront remplis automatiquement ;
2. l'utilisateur peut changer le service en allant dans un menu déroulant ;
3. la nature des travaux est une case à cocher (pour « autre », il faut préciser) ;
4. le lieu d'intervention est une zone de texte de quatre lignes ;
5. les conditions spécifiques d'intervention apparaissent sous la forme d'un bouton oui /non. Si « oui » est coché, il faut
préciser (zone de texte de quatre lignes) ;
6. tous les champs remplis par les services techniques apparaissent quand on va rechercher la fiche.
Nom du programme : bons_detravaux ;
Dessin : le code de la zone « dessin » est le suivant :
21
Code de la zone « dessin »
1 <center><h1>Demande de travaux</h1></center>
2 Nom du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
3 Service du demandeur ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 Date de demande §§§§§§§§§§§§§§§§
5 Nature des Travaux
6 ^ déplacement de mobilier, déménagement de locaux ou meuble, tv, lit
7 ^ réparation et entretien de biens mobiliers et immobiliers, commode, serrure,
8 barrière de lit
9 ^ plomberie : débouchage de wc et lavabo, fuite de chasse d'eau, fuite de radiateur,
10 installation arrivée d'eau
11 ^ électricité : changement d'ampoule, néon, prises, rallonge de cable d'antenne,
12 réparation sonnette
13 ^ téléphonie : installation de téléphone ou réparation, cablage informatique
14 ^ fixation de cadre, tablette de salle de bain, étagère
15 ^ autre
16 [rows=10 cols=80]
17 Lieu d'intervention
18 [rows=4 cols=80]
19 conditions spécifiques d'intervention
20 ^ oui ^ non
21 [rows=4 cols=80]
22 <div class="nepasimprimer">
23 <hr>
24 <center>Partie réservée aux services techniques</center>
25 Etat de l'intervention §§§§§§§§§§
26 motif si refus
27 rows=4 cols=80]
28 Date prévue §§§§§§§§§§
29 Date réelle §§§§§§§§§§
30 réalisé par §§§§§§§§§§§§§§§§§§§§
31 Si société extérieure
32 Nom §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
33 Date devis §§§§§§§§§§
22
34 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
35 </div>
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 ajouter,modifier,lister,voir#,rab
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_nom,service,k_date,typnature,typnature,typnature,typnature,typnature,typnature,
2 typnature,nature,lieu,cspec,cspec,cspectxt,ear,motrefus,dprev,dreel,stse,nomsoc,
3 ddev,msg_erreur
Tests et code : le code de la zone « tests et code » est le suivant :
Code de la zone « tests et code »
1 !val.k_nom<>"":votre code utilisateur est erroné
2 # vérif si le code utilisateur est rempli
3 !val.service<>"":votre code service est erroné
4 # vérif si le service est rempli
5 !val.has_key('typnature'):le choix nature d'intervention n'a pas été saisi
6 !val.nature<>"":la nature de la demande n'est pas remplie
7 # vérif si la nature de demande est remplie
8 !val.lieu<>"":le lieu d'intervention n'est pas rempli
9 # vérif si le lieu d'intervention est rempli
10 !val.has_key('cspec'):le choix condition d'intervention n'a pas été saisi
11 # vérif si condition d'intervention est coché
12 !val.cspec=="2" or val.cspectxt <> "" :problème sur condition d'intervention - 1
13 # si la réponse est non la zone texte doit être vide
14 !val.cspec=="1" or val.cspectxt == "" :problème sur condition d'intervention - 2
15 # si la condition est oui la zone texte doit être remplie
16 !val.ear=="":fiche non modifiable - en cours
17 # une fois que les services techniques sont intervenus sur la fiche, elle n'est plus modifiable
18 /**/
23
19 #prog=ajouter_trait
20 !val.k_date == "":la fiche a déjà été validée
21 # éviter les doubles ajouts en testant si la date est encore vide
22 date = str(prg.ZopeTime())
23 val.set('k_date',date[0:16])
24 # mettre date et haure dans la zone date
25 /**/
26 #prog=remplit
27 if not(val.has_key('k_nom')) or val.k_nom == "":
28 nom = str(prg.portal_membership.getAuthenticatedMember())
29 val.set('k_nom',nom)
30 service = prg.portal_metadirectories.members.getEntry(nom).get('Service')
31 val.set('service',service)
32 # code permettant d'aller rechercher l'utilisateur loggé et le service de l'utilisateur
33 # l'annuaire se trouve sous CPS
34 val.set('msg_erreur_box','y')
35 # permet d'avoir les erreurs sous forme d'une petite fenêtre en javascript
36 if val.has_key('ear'):
37 if val.ear == "1":
38 val.set('ear','accepté')
39 elif val.ear == "2":
40 val.set('ear','refusé')
41 elif val.ear == "3":
42 val.set('ear','en attente')
43 # Etat de la demande en fonction de ce qui a été coché par les services techniques
44 if val.has_key('stse'):
45 if val.stse == '1':
46 val.set('stse','services techniques')
47 elif val.stse == '2':
48 val.set('stse','société extérieure')
49 # idem pour la zone intervention services techniques ou société extérieure
50 /**/
51 #prog=service_options
52 for service in prg.service_sql_lister():
24
53 if val.service == service['service']:
54 print "<option SELECTED>"
55 else:
56 print "<option>"
57 print service['service']
58
59 print "</option>"
60 return printed
61 # la case service est une zone déroulante, le code de service_options
62 # la remplit avec tous les éléments trouvés dans la table SQL service
Nom table : btravaux
.
Ce module comprend une fiche (autrement dit un programme) « service », toute simple :
Nom du programme : service
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <center><h1>Fichier des service</h1></center>
2 Service $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
3 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 voir,ajouter,modifier,supprimer,lister
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 service, msg_erreur
Tests et code : le code de la zone « tests et code » est le suivant :
Nom table : table_service .
25
4.2.2 Module de traitement
La fiche est la même que la précédente mais les services techniques remplissent la deuxième partie. Ils sont d'o ffice en
mode modification sur la fiche.
Nom du programme : bons_de_travauxST ;
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <center><h1>Traitement de demande de travaux</h1></center>
2 Nom du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ Téléphone et Bip §§§§§§§§§§§§§§§ §§§§
3 Service du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
4 Date de demande §§§§§§§§§§§§§§§§
5 Nature des Travaux
6 ^ déplacement de mobilier, déménagement de locaux ou meuble, tv, lit
7 ^ réparation et entretien de biens mobiliers et immobiliers, commode, serrure,
8 barrière de lit
9 ^ plomberie : débouchage de wc et lavabo, fuite de chasse d'eau, fuite de radiateur,
10 installation arrivée d'eau
11 ^ électricité : changement d'ampoule, néon, prises, rallonge de cable d'antenne,
12 réparation sonnette
13 ^ téléphonie : installation de téléphone ou réparation, cablage informatique
14 ^ fixation de cadre, tablette de salle de bain, étagère
15 ^ autre
16 rows=10 cols=80]
17 Lieu d'intervention
18 rows=4 cols=80]
19 conditions spécifiques d'intervention §§§
20 rows=4 cols=80]
21 <div class="nepasimprimer">
22 <hr>
23 <center>Partie réservée aux services techniques</center>
24 Etat de l'intervention ^ acceptée ^ refusée ^ en attente
25 motif si refus
26 [rows=4 cols=80]
26
27 Date prévue $$$$$$$$$$
28 Date réelle $$$$$$$$$$
29 réalisé par # services techniques # société extérieure
30 Si société extérieure
31 Nom $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
32 Date devis $$$$$$$$$$
33 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 modifier,lister,voir#,fournitures,temps
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_nom,Telephone#,Bip#,service,k_date,typnature,typnature,typnature,typnature,
2 typnature,typnature,typnature,nature,lieu,cspec,cspectxt,ear,ear,ear,motrefus,dprev,
3 dreel,stse,stse,nomsoc,ddev,msg_erreur
Tests et code : le code de la zone « tests et code » est le suivant :
Code de la zone « tests et code »
1 !val.has_key('ear'):l'état d'intervention n'a pas été saisi
2 # vérif si l'état de l'intervention a été coché
3 !val.ear<>"2" or val.motrefus <> "" :demande acceptée avec un motif de refus
4 # si la demande est acceptée le motif de refus doit être vide
5 !val.ear=="2" or val.motrefus == "" :problème refusée sans motif
6 # si la demande est refusée, le motif de refus doit être rempli
7 /**/
8 #prog=remplit
9 if val.has_key('k_nom'):
10 if val.k_nom <> "":
11 tel = prg.portal_metadirectories.members.getEntry(val.k_nom).get('Telephone')
12 bip = prg.portal_metadirectories.members.getEntry(val.k_nom).get('Bip')
13 lsttel = ''
27
14 for t in tel:
15 lsttel = lsttel + t + ' '
16 val.set('Telephone',lsttel)
17 val.set('Bip',bip)
18 # recherche des zones téléphone et bip dans l'annuaire CPS
19 if val.has_key('cspec'):
20 if val.cspec == "1":
21 val.set('cspec','oui')
22 elif val.cspec == "2":
23 val.set('cspec','non')
24 # la case à cocher conditions spécifique d'intervention devient oui ou non
25 val.set("eq_ear","")
26 print prg.vitefait_debut(prg,val)
27 val.set('vitefait_debut_affiche_pas','1')
28 print "<center><b>Demandes en attente de prise en compte</b></center>"
29 print prg.bonsDeTravauxST_prog_lister(prg,val)
30 # affichage des demandes en attente avec un titre
31 return printed
32 # on va lister toutes les demandes qui n'ont pas été traitées
33 /**/
34 #prog=voir_trait_fin
35 val.SESSION.set("typnature",val.typnature)
36 # conservation de typnature pour toute la session ce type de champs ne renvoyant
37 # pas sa valeur
38 /**/
39 #prog=modifier_trait
40 if val.cspec == "oui":
41 val.set('cspec','1')
42 elif val.cspec == "non":
43 val.set('cspec','2')
44 # traitement inverse du précédent sur condition spécifique d'intervention
45 val.set('typnature',val.SESSION['typnature'])
46 # pour rendre la valeur typnature remplie (ce type de champs ne rendant pas sa valeur
47 # quand il est protégé
28
48
49 /**/
50 #prog=fournitures
51 if val.k_nom <> "":
52 val.set("bonsDeTravauxST_affiche_pas","o")
53 print prg.bonsDeTravauxFournitures_prog(prg,val)
54 return printed
55 # si la touche fournitures est cochée, on appelle le programme bonsDeTravauxFournitures
56 /**/
57 #prog=temps
58 if val.k_nom <> "":
59 val.set("bonsDeTravauxST_affiche_pas","o")
60 print prg.bonsDeTravauxTemps_prog(prg,val)
61 return printed
62 # si la touche temps est cochée, on appelle le programme bonsDeTravauxTemps
Nom table : btravaux
.
Ce module comprend plusieurs programmes annexes.
Programme « fournitures »
Nom du programme : bonsDeTravauxFournitures ;
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <center><h1>Traitement de demande de travaux</h1></center>
2 Nom du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
3 Service du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
4 Date de demande §§§§§§§§§§§§§§§§
5 <hr>
6 <table>
7 <tr>
8 <td>Fournitures nécéssaires</td><td>Quantité</td>
29
9 </tr>
10 <tr>
11 <td>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</td><td>$$$$$$$$$$</td>
12 </tr>
13 </table>
14 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 voir#,ajouter,modifier,supprimer,temps,fiche
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_nom,service,k_date,fourniture,qte,msg_erreur
Tests et code : le code de la zone « tests et code » est le suivant :
Code de la zone « tests et code »
1 /**/
2 #prog=remplit
3 val.set("eq_k_nom",val.k_nom)
4 val.set("eq_k_date",val.k_date)
5 print prg.bonsDeTravauxFournitures_prog_lister(prg,val)
6 return printed
7 # liste de toutes les fournitures correspondant à la fiche en cours
8 /**/
9 #prog=fourniture_options
10 for produit in prg.produits_sql_lister():
11 print "<option>"
12 print produit['libprod']
13 print "</option>"
14 return printed
15 # remplissage de la zone déroulante produit à partir de la table produit
16 /**/
30
17 #prog=temps
18 val.set('bonsDeTravauxFournitures_affiche_pas','o')
19 print prg.bonsDeTravauxTemps_prog(prg,val)
20 return printed
21 # si la touche temps est cochée appelle du programme temps
22 /**/
23 #prog=fiche
24 val.set('bonsDeTravauxFournitures_affiche_pas','o')
25 print prg.bonsDeTravauxST_prog(prg,val)
26 return printed
27 # si la touche fiche est cochée retour au programme fiche
Nom table : btravauxfour .
Programme « produits »
Nom du programme : produits ;
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <center><h1>Fichier des produits</h1></center>
2 Code Produit $$$$$$
3 Libellé produit $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
4 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 voir#,ajouter,modifier,supprimer,lister
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_numprod,libprod,msg_erreur
31
Tests et code : le code de la zone « tests et code » est le suivant :
Nom table : table_produits .
Programme « temps »
Nom du programme : bonsDeTravauxTemps ;
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <center><h1>Traitement de demande de travaux</h1></center>
2 Nom du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
3 Service du demandeur §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
4 Date de demande §§§§§§§§§§§§§§§§
5 <hr>
6 <table>
7 < t r>
8 <td>Nom de l'agent</td><td>Temps</td>
9 </tr>
10 < t r>
11 <td>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</td><td>$$$$$$$$$$
12 < / td >
13 </tr>
14 </table>
15 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 voir#,ajouter,modifier,supprimer,fournitures,fiche
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_nom,service,k_date,agent,temps,msg_erreur
32
Tests et code : le code de la zone « tests et code » est le suivant :
Code de la zone « tests et code »
1 /**/
2 #prog=remplit
3 val.set("eq_k_nom",val.k_nom)
4 val.set("eq_k_date",val.k_date)
5 print prg.bonsDeTravauxTemps_prog_lister(prg,val)
6 return printed
7 # liste de toutes les fiches temps du dossier en cours
8 /**/
9 #prog=agent_options
10 for agent in prg.agents_sql_lister():
11 print "<option>"
12 print agent['k_nomagent']+' '+agent['k_prenomagent']
13 print "</option>"
14 return printed
15 # remplissage de la zone déroulante agent à partir de la table sql agent
16 /**/
17 #prog=fournitures
18 val.set('bonsDeTravauxTemps_affiche_pas','o')
19 print prg.bonsDeTravauxFournitures_prog(prg,val)
20 return printed
21 # si la touche fournitures a été cochée, appel du programme fourniture
22 /**/
23 #prog=fiche
24 val.set('bonsDeTravauxTemps_affiche_pas','o')
25 print prg.bonsDeTravauxST_prog(prg,val)
26 return printed
27 # si la touche fiche a été cochée appel du programme correspondant à la fiche
28 # la variable bonsDeTravauxTemps_affiche_pas est positionnée pour ne pas
29 # réafficher la fiche temps derrière
Nom table : btravauxtemps .
33
Programme « agent »
Nom du programme : agents ;
Dessin : le code de la zone « dessin » est le suivant :
Code de la zone « dessin »
1 <center><h1>Fichier des agents</h1></center>
2 nom agent $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
3 prénom agent $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
4 §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
Touches : le code de la zone « touches » est le suivant :
Code de la zone « touches »
1 voir#,ajouter,modifier,supprimer,lister
Champs : le code de la zone « champs » est le suivant :
Code de la zone « champs »
1 k_nomagent,k_prenomagent,msg_erreur
Tests et code : le code de la zone « tests et code » est le suivant :
Nom table : table_agents .
34