Il est possible de coder de nouveaux styles de bulletins de notes (web et/ou PDF), pour répondre précisément aux besoins de votre établissement.
Ce n'est pas très difficile, mais il faudra coder en langage Python avec pour le PDF la bibliothèque ReportLab (qui est bien documentée, [voir le guide](http://www.reportlab.com/software/opensource/rl-toolkit/guide/)).
ScoDoc demande la création d'un bulletin pour un étudiant donné dans semestre donné (`formsemestre_id`).
Le bulletin doit être rendu sous forme d'une liste d'objets PLATYPUS (voir le chapitre 5 du "User Guide" de ReportLab cité plus haut).
<imgsrc="/img/alert.png"style="vertical-align: bottom; margin:0 0 0 0;"alt="/!\" /> Attention (août 2011): nouvelle version, changement d'API: les informations ci-dessous s'appliquent à partir de la subversion 1047.
## Organisation
A minima, il vous faut créer un module python (fichier .py) qui se définira une classe chargée de générer vos bulletins.
Ce fichier doit être placé dans le répertoire `/opt/scodoc/instance/Products/ScoDoc`
Il faut aussi l'importer dans `sco_bulletins_generator.py` (voir tout à la fin de ce fichier).
Voici un module minimal commenté (le fichier `sco_bulletins_example.py` est fournit avec ScoDoc):
Si l'on voulait générer aussi du HTML (pour la version web), il suffirait de le déclarer dans la liste `supported_formats` et que la méthode `bul_table()` renvoie une chaîne HTML si le paramètre format vaut `'html'`.
Pour modifier l'en-tête du bulletin PDF (partie au dessus de la table), il faut surcharger la méthode `bul_title_pdf` qui elle aussi renvoie une liste d'objets PLATYPUS:
```
#!python
def bul_title_pdf(self):
...
```
De même, les informations placées sous la table principale sont renvoyées par la méthode `gen_part_below`:
```
#!python
def gen_part_below(self, format=*):
"""Génère les informations placées sous la table de notes
(absences, appréciations, décisions de jury...)
Renvoie:
- en HTML: une chaine
- en PDF: une liste d'objets platypus
"""
...
```
et les signatures (seulement sur le PDF) par `bul_signatures_pdf`. Toutes ces méthodes renvoient des listes d'objets PLATYPUS quelconques.
Vous pouvez partir d'un format de bulletin existant et proche de ce que voulez obtenir et définir une sous-classe modifiant (surchargeant) seulement les méthodes qui génèrent les éléments que vous voulez modifier.
<imgsrc="/img/alert.png"style="vertical-align: bottom; margin:0 0 0 0;"alt="/!\" /> Attention: ne pas modifier après coup le nom des classes de générateurs (ici `BulletinGeneratorExample`), car il va être stocké en base de données par ScoDoc.
## Accès aux informations
La plupart des informations nécessaires sont accessibles via des attributs de votre instance de générateur que ScoDoc aura positionné avant d'appeler vos méthodes. Notamment:
*`self.infos`: un (grand) dictionnaire python avec la plupart des informations préparée pour le bulletin à générer (voir plus loin);
*`self.version`: indique la version de bulletin demandée par l'utilisateur ("long" ou "short", vous pouvez en faire ce que bon vous semble);
*`self.context`: contexte ScoDoc, permettant l'accès à l'API complète.
## Le dictionnaire d'informations
L'attribut `infos` est un dictionnaire qui contient de très nombreuses informations. il doit être utilisé en **lecture seule** (il est possible que des informations soient partagées entre threads différents, aussi les modifier peut avoir des effets indésirables). .
### Paramètres (préférences)
Tous les paramètres du semestre sont accessibles via leur nom. Voir la liste sur la page [NomsPreferences](NomsPreferences.md).
Exemple: `infos['SCOLAR_FONT_SIZE']` est un entier, `infos['UnivName']` est le nom de l'université.
### Informations sur le semestre
Un semestre est représenté par un dictionnaire avec les attributs
suivants:
Type | Nom | Description | Exemple de valeur
----| --- | ---- | ---
int |semestre_id| Indice dans le parcours | 1
string |titre| | 'DUT GEII'
string |titre_num| | 'DUT GEII, semestre 1'
string |titreannee| | 'DUT GEII, semestre 1 FI 2011'
Le champ `notes` dans une évaluation est un dictionnaire dont les clés sont les `etudids`, et les valeurs des dictionnaires donnant les informations sur la note de l'étudiant dans cette évaluation:
Type | Nom | Description | Exemple de valeur
----| --- | ---- | ---
string | comment | commentaire saisie note | *
datetime | date | date de saisie | <mx.DateTime.DateTimeobject>
string | etudid | | 'EID15214'
string | evaluation_id | | 'EVAL15226'
string | uid | utilisateur ayant saisi la note | 'admin'
float | value | valeur de la note (sur 20) | 10.0
### Décisions de jury et autres informations
Type | Nom | Description | Exemple de valeur
----| --- | ---- | ---
| decision_sem | | None ou dict
string | decision_jury | décision du jury en clair (présent seulement si décision saisie) | 'Validé'
list | appreciations | | []
list | appreciations_list | | []
list | appreciations_txt | | []
string | mention | texte de la mention calculée | 'Très bien'
| filigranne | texte en surimpression | 'Provisoire'
## Note: la fonction log
Pour la mise au point, il peut être utile de recourir à la bonne vieille fonction log, qui envoie du texte dans le fichier de log courant, normalement `/opt/scodoc/instance/log/notes.log`. La date et le saut de ligne final sont automatiquement ajoutés.