Commit 9012d0cf authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Merge branch 'release_5.2.7'

parents e427bdbe 1ec5cc34
Loading
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
Journal des modifications
=========================

5.2.7
-----
- Ajout d'une date de fermeture (indicative) pour les sessions de formation
- Dépôts de nouveaux fichiers divers : charte du doctorat et convention de formation doctorale.
- Extraction d'un module Depot (dépôt du manuscrit de thèse).
- Amélioration de l'index doctorant du module formation
- Ajout de la possibilité d'enregistrer et de valider l'enquête de retour de formation
- Doctorant : peut refuser de recevoir sur son adresse électronique de contact les messages des listes de diffusion
- Suppression du menu 'Mes données' : la modif de l'adresse de contact et du consentement associé est désormais sur la fiche Thèse
- Abandon (avant suppression) de la table obsolète doctorant_compl.
- Ajout d'un bloc dans l'écran de proposition de soutenance pour le téléchargement des pré-rapports et du serment
- Nouveau document "Serment du docteur"
- Modification du pv de soutenance
- Ajout d'un nouvel mail intermediare à la clôture des inscriptions + deplacement du mail d'echec d'inscription
- [FIX] Module Formation : Ordonnancement des séances sur les index des formations et des sessions
- [FIX] Module Formation : Correction du bug de comptage d'année si pas de thèse
- [FIX] Module Soutenance : Correction paramètre de route erronée + suppression bouton inactif
- [FIX] Module Soutenance : Ouverture de l'acces aux gestionnaires d'UR sur les popositions de soutenance

5.2.6
-----
- Déclaration des membres du comite de suivi individuel
+115 −0
Original line number Diff line number Diff line
# Fonctionnement du fichier CSV

## Interprétation

- La ligne 1 désigne la classe d'assertion qui sera générée à partir du fichier CSV.
Par exemple, `class;Depot\Assertion\These\GeneratedTheseEntityAssertion` pour la classe `GeneratedTheseEntityAssertion`.

- La ligne 2 liste des prédicats qui peuvent être utilisés et qui doivent être définis dans la 
classe mère `TheseEntityAssertion`.
 
- La colonne A correspond à des références de lignes qui seront inscrites dans le PHP généré sous 
la forme `/* line N */`.
 
- La colonne B correspond aux témoins indiquant si la ligne concernée doit être prise en compte (valeur `1`) 
ou non (valeur `0`).
 
- La colonne C correspond aux privilèges concernés (FQDN de la constante PHP).
 
- Les colonnes suivantes `isXxxxxx` permettent de lister les prédicats (méthodes `isXxxxxx()` de la classe d'assertion
spécifiée en ligne 1) et de spécifier comment chacun est utilisé en fonction du privilège concerné.

- La colonne `return` contient la valeur que retournera l'assertion à l'issue des interrogations des prédicats.
 
- Chaque ligne faisant référence à un privilège générera un `if` dans l'assertion générée.
Si un même privilège figure 3 fois, 3 `if` seront générés.

### Exemple d'interprétation

|line|enabled| privilege                     | isRoleDoctorantSelected | isTheseEnCours | isTheseSoutenue | isUtilisateurEstAuteurDeLaThese |...| return |
|----|-------|-------------------------------|-------------------------|----------------|-----------------|---------------------------------|---|--------| 
|... |       |                               |                         |                |                 |                                 |   |        |
|4   |1      |THESE_DEPOT_VERSION_INITIALE   |                         | 1:0            |                 |                                 |...| 0      |
|5   |1      |THESE_DEPOT_VERSION_INITIALE   |                         |                | 1:1             |                                 |...| 0      |
|6   |1      |THESE_DEPOT_VERSION_INITIALE   |                         |                |                 |                                 |...| 1      |
|... |       |                               |                         |                |                 |                                 |   |        |
|10  |1      |DOCTORANT_AFFICHER_MAIL_CONTACT| 1:1                     |                |                 | 2:1                             |...| 0      |
|11  |1      |DOCTORANT_AFFICHER_MAIL_CONTACT|                         |                |                 |                                 |...| 1      |

#### Privilège `THESE_DEPOT_VERSION_INITIALE`

- Line 4 : 
  - La cellule au croisement du privilège `THESE_DEPOT_VERSION_INITIALE` et du prédicat `isTheseEnCours` vaut `1:0`.
  - La cellule dans la colonne `return` mentionne un `0`.
  - Cela s'interprète : "Si `isTheseEnCours` est faux (`:0`) alors l'assertion retourne faux (`0`)".

- Line 5 : 
  - La cellule au croisement de `THESE_DEPOT_VERSION_INITIALE` et de `isTheseSoutenue` vaut `1:1`.
  - La cellule dans la colonne `return` mentionne un `0`.
  - Cela s'interprète : "Si `isTheseSoutenue` est vrai (`:1`) alors l'assertion retourne faux (`0`)".

- Line 6 : 
  - La ligne ne spécifie aucune valeur en face des prédicats et un `1` dans la colonne `return`.
  - La cellule dans la colonne `return` mentionne un `1`.
  - Cela s'interprète : "Sinon, l'assertion retourne vrai (`1`)".

Voici le PHP que ces 3 lignes généreraient dans la classe d'assertion :

```php
if ($privilege === \Depot\Provider\Privilege\ThesePrivileges::THESE_DEPOT_VERSION_INITIALE) {
        //--------------------------------------------------------------------------------------
            /* line 4 */
            $this->linesTrace[] = '/* line 4 */';
            if (! $this->isTheseEnCours()) {
                $this->failureMessage = "L’état de la thèse ne permet pas cette opération.";
                return false;
            }
            /* line 5 */
            $this->linesTrace[] = '/* line 5 */';
            if ($this->isTheseSoutenue()) {
                $this->failureMessage = "Le dépôt initial n'est plus autorisé car la date de soutenance est passée.";
                return false;
            }
            /* line 6 */
            $this->linesTrace[] = '/* line 6 */';
            return true;
        }
```

#### Privilège `DOCTORANT_AFFICHER_MAIL_CONTACT`

Ici, dans les valeurs `1:1` et `2:1`, le chiffre avant `:` spécifie l'ordre d'utilisation du prédicat
concerné : le prédicat `isRoleDoctorantSelected` est testé en 1er, puis `isUtilisateurEstAuteurDeLaThese` en 2e.

Voici le PHP que ces 2 lignes généreraient dans la classe d'assertion :

 ```php
if ($privilege === \Doctorant\Provider\Privilege\DoctorantPrivileges::DOCTORANT_AFFICHER_EMAIL_CONTACT) {
        //--------------------------------------------------------------------------------------
            /* line 10 */
            $this->linesTrace[] = '/* line 10 */';
            if ($this->isRoleDoctorantSelected() && ! $this->isUtilisateurEstAuteurDeLaThese()) {
                $this->failureMessage = "Vous ne pouvez pas visualiser l’adresse de contact car vous n’êtes pas l’auteur de la thèse";
                return false;
            }
            /* line 11 */
            $this->linesTrace[] = '/* line 11 */';
            return true;
        }
```


## Ajouter une nouvelle assertion

***TODO***
 
## Générer le nouveau ficher assertion

Une fois les modifications effectuées sur le fichier CSV, il faut se positionner dans le repertoire `data/assertions`
et regénérer la classe d'assertion en utilisanr la commande `generate-assertion`.
Exemple : 
 
```bash
cd data/assertions 
./generate-assertion --file ./TheseEntityAssertion.csv
```
 No newline at end of file
+50 −0
Original line number Diff line number Diff line
#!/usr/bin/env php
<?php

use Application\Assertion\Loader\AssertionCsvLoader;
use Application\Assertion\Generator\AssertionGenerator;
use Composer\Autoload\ClassLoader;
use Laminas\Console;

/** @var ClassLoader $autoloader */
$autoloader = require_once __DIR__ . '/../../vendor/autoload.php';

$rules = [
    'help|h'    => 'Get usage message',
    'file|f=s'  => 'CSV file containing assertion rules to parse; required.',
];
try {
    $opts = new Console\Getopt($rules);
    $opts->parse();
} catch (Console\Exception\RuntimeException $e) {
    echo $e->getUsageMessage();
    exit(2);
}
if ($opts->getOption('h')) {
    echo $opts->getUsageMessage();
    exit();
}

if (! ($file = $opts->getOption('f'))) {
    echo $opts->getUsageMessage();
    exit();
}

if (! is_readable($file)) {
    throw new \UnicaenApp\Exception\RuntimeException("This file is not readable: " . $file);
}

// CSV loading
$loader = new AssertionCsvLoader();
$loader->setRuleFilePath($file);
$result = $loader->loadFile();
$class = $result->getAssertionClass();
$classFilePath = $autoloader->findFile($class);

// Class generating
$generator = new AssertionGenerator();
$generator->setAssertionCsvLoader($loader);
$code = $generator->generate();
$content = '<?php' . PHP_EOL . PHP_EOL . $code;
file_put_contents($classFilePath, $content);
echo sprintf("%s ==> %s (%s).", $file, $class, realpath($classFilePath)) . PHP_EOL;
+19 −6
Original line number Diff line number Diff line
@@ -8,8 +8,9 @@
        }
    ],
    "require-dev": {
        "unicaen/test": "^4.0",
        "laminas/laminas-developer-tools": "^1.0"
        "laminas/laminas-developer-tools": "^2.0",
        "unicaen/code": "^7.1",
        "unicaen/test": "^4.0"
    },
    "require": {
        "php": "^7.4.0",
@@ -22,7 +23,6 @@
        "ext-json": "*",
        "ext-libxml": "*",
        "ext-readline": "*",
        "ext-saxonc": "*",
        "ext-simplexml": "*",
        "ext-soap": "*",
        "ext-xmlwriter": "*",
@@ -54,10 +54,23 @@
    "autoload": {
        "psr-0": {
            "Application\\": "module/Application/src",
            "Retraitement\\": "module/Retraitement/src",
            "Notification\\": "module/Notification/src",
            "ComiteSuiviIndividuel\\": "module/ComiteSuiviIndividuel/src",
            "Depot\\": "module/Depot/src",
            "Doctorant\\": "module/Doctorant/src",
            "Fichier\\": "module/Fichier/src",
            "Formation\\": "module/Formation/src",
            "Import\\": "module/Import/src",
            "StepStar\\": "module/StepStar/src"
            "Indicateur\\": "module/Indicateur/src",
            "Individu\\": "module/Individu/src",
            "Information\\": "module/Information/src",
            "Notification\\": "module/Notification/src",
            "RapportActivite\\": "module/RapportActivite/src",
            "Retraitement\\": "module/Retraitement/src",
            "Soutenance\\": "module/Soutenance/src",
            "StepStar\\": "module/StepStar/src",
            "Structure\\": "module/Structure/src",
            "These\\": "module/These/src",
            "UnicaenAvis\\": "module/UnicaenAvis/src"
        }
    },
    "autoload-dev": {
+661 −494

File changed.

Preview size limit exceeded, changes collapsed.

Loading