diff --git a/05_saisie_note_test.py b/05_saisie_note_test.py index c2c8584..e99760f 100644 --- a/05_saisie_note_test.py +++ b/05_saisie_note_test.py @@ -24,33 +24,40 @@ from selenium.webdriver.support.ui import Select, WebDriverWait from selenium.webdriver.support.select import Select URL_MATIERE = "" - +URL_SEMESTRE = "" +URL = BASE_URL + NOM_DPT + "/Scolarite" # Prérequis class PythonOrgSearch(unittest.TestCase): # Permet de se connecter et se remettre sur la page d'accueil avant chaque test - def setUp(self): - if NAVIGATEUR == "firefox": self.driver = webdriver.Firefox() else: self.driver = webdriver.Chrome() - self.url = BASE_URL + NOM_DPT + "/Scolarite" self.wait = WebDriverWait(self.driver, 10) - self.driver.get(BASE_URL) - self.driver.find_element_by_id("utilisateur_Vue").click() - self.driver.find_element_by_id("name").send_keys(SCODOC_ENS_ID) - self.driver.find_element_by_id("password").send_keys(SCODOC_ENS_PASS) - self.driver.find_element_by_id("submit").click() + self.driver.get( + "https://" + + SCODOC_ADMIN_ID + + ":" + + SCODOC_ADMIN_PASS + + "@" + + BASE_NOT_SECURED_URL + + "force_admin_authentication" + ) + self.wait = WebDriverWait(self.driver, 10) + #self.driver.get(self.url) + #self.driver.find_element_by_id("name").send_keys(SCODOC_ENS_ID) + #self.driver.find_element_by_id("password").send_keys(SCODOC_ENS_PASS) + #self.driver.find_element_by_id("submit").click() # Test : Vérifie s'il y a un semestre en cours # @expected : La class listesems n'est pas vide et contient "Session en cours" def test_010_semestre_en_cours(self): driver = self.driver - url = self.url - driver.get(url) - time.sleep(1) + global URL + driver.get(URL) + #time.sleep(1) self.assertTrue( "Sessions en cours" in driver.find_element_by_class_name("listesems").text ) @@ -59,12 +66,14 @@ class PythonOrgSearch(unittest.TestCase): # @expected : Le nom de la matière est présent dans le semestre préalablement testé def test_020_matiere_existante(self): driver = self.driver - url = self.url - driver.get(url) - driver.find_element_by_link_text("DUT Informatique semestre 4").click() - time.sleep(1) + global URL + driver.get(URL) + driver.find_element_by_link_text("semestre 4").click() + self.wait.until(EC.url_changes(URL)) try: driver.find_element_by_class_name("formsemestre_status_ue") + global URL_SEMESTRE + URL_SEMESTRE = driver.current_url self.assertTrue(True) except NoSuchElementException: self.assertFalse(False) @@ -73,19 +82,18 @@ class PythonOrgSearch(unittest.TestCase): # @expected : Le nom de l'enseignant apparait désormais sur la page d'information du module def test_030_ajout_enseignant_sur_module(self): driver = self.driver - url = self.url - driver.get(BASE_URL) - driver.find_element_by_link_text("déconnecter").click() - driver.get(BASE_URL) - driver.find_element_by_id("name").send_keys(SCODOC_CHEF_ID) - driver.find_element_by_id("password").send_keys(SCODOC_CHEF_PASS) - driver.find_element_by_id("submit").click() - driver.get(url) - driver.find_element_by_link_text("DUT Informatique semestre 4").click() + #driver.get(BASE_URL) + #driver.find_element_by_link_text("déconnecter").click() + #driver.get(BASE_URL) + #driver.find_element_by_id("name").send_keys(SCODOC_CHEF_ID) + #driver.find_element_by_id("password").send_keys(SCODOC_CHEF_PASS) + #driver.find_element_by_id("submit").click() + #global URL_SEMESTRE + driver.get(URL_SEMESTRE) driver.find_element_by_link_text("M4101C").click() time.sleep(1) - global urlMatiere - urlMatiere = driver.current_url + global URL_MATIERE + URL_MATIERE = driver.current_url driver.find_element_by_partial_link_text("modifier les enseignants").click() time.sleep(1) driver.find_element_by_id("ens_id").send_keys("ENSEIGNANT Test (enseignantUS)") @@ -112,10 +120,11 @@ class PythonOrgSearch(unittest.TestCase): # driver.find_element_by_id("name").send_keys(SCODOC_CHEF_ID) # driver.find_element_by_id("password").send_keys(SCODOC_CHEF_PASS) # driver.find_element_by_id("submit").click() - driver.get(urlMatiere) + driver.get(URL_MATIERE) time.sleep(1) driver.find_element_by_link_text("Créer nouvelle évaluation").click() time.sleep(1) + driver.find_element_by_name("jour").send_keys("31/05/2021") driver.find_element_by_id("tf_description").send_keys(descriptionInterrogation) driver.find_element_by_id("tf_coefficient").send_keys("2") driver.find_element_by_id("tf_submit").click() @@ -126,7 +135,8 @@ class PythonOrgSearch(unittest.TestCase): # @expected "Module" est présent dans le "formsemetre" def test_050_interro_existante(self): driver = self.driver - driver.get(urlMatiere) + global URL_MATIERE + driver.get(URL_MATIERE) time.sleep(1) self.assertTrue( "Module" in driver.find_element_by_class_name("formsemestre").text @@ -136,7 +146,8 @@ class PythonOrgSearch(unittest.TestCase): # @expected : "saisir note" est remplacé par "afficher" sur la page d'information de l'interrogation concernée def test_060_entree_note(self): driver = self.driver - driver.get(urlMatiere) + global URL_MATIERE + driver.get(URL_MATIERE) time.sleep(1) driver.find_element_by_class_name("notes_img").click() time.sleep(1) @@ -152,7 +163,8 @@ class PythonOrgSearch(unittest.TestCase): # @expected : Tout les étudiants on une note def test_070_ajout_note_incomplete(self): driver = self.driver - driver.get(urlMatiere) + global URL_MATIERE + driver.get(URL_MATIERE) time.sleep(1) driver.find_element_by_class_name("notes_img").click() elements = driver.find_elements_by_class_name("note") @@ -173,7 +185,8 @@ class PythonOrgSearch(unittest.TestCase): # @expected : La moyenne ne s'affiche plus, "afficher" disparait de la page d'information de l'interrogation def test_080_suppression_note(self): driver = self.driver - driver.get(urlMatiere) + global URL_MATIERE + driver.get(URL_MATIERE) time.sleep(1) driver.find_element_by_class_name("notes_img").click() time.sleep(1) @@ -200,7 +213,8 @@ class PythonOrgSearch(unittest.TestCase): driver.find_element_by_id("name").send_keys(SCODOC_CHEF_ID) driver.find_element_by_id("password").send_keys(SCODOC_CHEF_PASS) driver.find_element_by_id("submit").click() - driver.get(urlMatiere) + global URL_MATIERE + driver.get(URL_MATIERE) time.sleep(1) driver.find_element_by_link_text("Créer nouvelle évaluation").click() time.sleep(1) @@ -225,7 +239,7 @@ class PythonOrgSearch(unittest.TestCase): + SCODOC_ADMIN_PASS + "@scodoc-dev-iutinfo.univ-lille.fr/force_admin_authentication" ) - driver.get(urlMatiere) + driver.get(URL_MATIERE) time.sleep(1) driver.find_element_by_partial_link_text("modifier les enseignants").click() time.sleep(1) @@ -248,7 +262,7 @@ class PythonOrgSearch(unittest.TestCase): + "@scodoc-dev-iutinfo.univ-lille.fr/force_admin_authentication" ) - driver.get(urlMatiere) + driver.get(URL_MATIERE) time.sleep(1) elements = driver.find_elements_by_class_name("delete_img") while elements: @@ -256,7 +270,7 @@ class PythonOrgSearch(unittest.TestCase): time.sleep(1) driver.find_element_by_id("tf_submit").click() time.sleep(1) - driver.get(urlMatiere) + driver.get(URL_MATIERE) time.sleep(1) elements = driver.find_elements_by_class_name("delete_img") @@ -294,7 +308,16 @@ if __name__ == "__main__": driver.get(BASE_URL + NOM_DPT + "/Scolarite") driver.find_element_by_id("utilisateurs_Vue").click() time.sleep(5) - if SCODOC_CHEF_ID not in driver.page_source: + noms = driver.find_elements_by_class_name("nom_fmt") + chefCree = False + ensCree = False + for nom in noms: + if(nom.text.lower() == SCODOC_CHEF_ID.lower()): + chefCree = True + if(nom.text.lower() == SCODOC_ENS_ID.lower()): + ensCree = True + if not chefCree: + time.sleep(5) constructValue = "Ens" + NOM_DPT driver.find_element_by_id("creer_Utilisateur").click() driver.find_element_by_id("tf_nom").send_keys(SCODOC_CHEF_ID) @@ -306,16 +329,18 @@ if __name__ == "__main__": driver.find_element_by_xpath("//input[@value='force:list']").click() driver.find_element_by_id("tf_submit").click() driver.find_element_by_id("utilisateurs_Vue").click() - if SCODOC_ENS_ID not in driver.page_source: + if not ensCree: + time.sleep(5) constructValue = "Ens" + NOM_DPT driver.find_element_by_id("creer_Utilisateur").click() - driver.find_element_by_id("tf_nom").send_keys(SCODOC_CHEF_ID) - driver.find_element_by_id("tf_user_name").send_keys(SCODOC_CHEF_ID) + driver.find_element_by_id("tf_nom").send_keys(SCODOC_ENS_ID) + driver.find_element_by_id("tf_user_name").send_keys(SCODOC_ENS_ID) driver.find_element_by_id("tf_prenom").send_keys("ens") - driver.find_element_by_id("tf_passwd").send_keys(SCODOC_CHEF_PASS) - driver.find_element_by_id("tf_passwd2").send_keys(SCODOC_CHEF_PASS) + driver.find_element_by_id("tf_passwd").send_keys(SCODOC_ENS_PASS) + driver.find_element_by_id("tf_passwd2").send_keys(SCODOC_ENS_PASS) driver.find_element_by_xpath("//input[@value='" + constructValue + "']").click() driver.find_element_by_xpath("//input[@name='force:list']").click() driver.find_element_by_id("tf_submit").click() driver.find_element_by_id("utilisateurs_Vue").click() - unittest.main() + driver.close() + unittest.main(warnings='ignore') diff --git a/UserStoryNew.yaml b/UserStoryNew.yaml new file mode 100644 index 0000000..9ee94f4 --- /dev/null +++ b/UserStoryNew.yaml @@ -0,0 +1,426 @@ +aliases: + EtatInitial1: &DeptCreated Le département est créé + EtatInitial2: &ProgramCreated Le programme est créé + EtatInitial3: &MatiereCreated Les matières sont créées + EtatInitial4: &EtudiantCreated Un etudiant dans chaque semestre est créé + Role1: &Admin Admin + Role2: &Secretaire Secretaire + Role3: &Prof Professeur + Role4: &AdminDPT AdminDepartement + Page1: &Accueil Accueil + Champs: [&champTest test] + Page2: &Absence Absence + Page3: &Departement Departement + Page4: &Notes Notes + Page5: &Connexion Connexion + Page6: &ConnexionAdmin ConnexionAdmin + Page7: &Scolarite Scolarite +test1: + intitulé: "Connexion en admin" + operation: Acceder à la page scodoc_admin avec les identifiants admin; + resultat: Connexion établie (h3 = page Administration de scodoc) + etat: *DeptCreated + page: *Connexion + champsModifie: null + champsInteractions: null + role: *Admin + createur: Aurélien +test2: + intitulé: Création d'un département + operation: + Accès à la page scodoc_admin, + séléctionner un département dans création département, + clicker sur créer département, + valider sur la page suivante + resultat: Apparition du lien du département sur la page d'accueil + etat: *DeptCreated + page: *ConnexionAdmin + champs: + role: *Admin + createur: Aurélien +test3: + intitulé: Suppression d'un département + operation: + Accès à la page scodoc_admin, + séléctionner un département dans suppresion département, + clicker sur supprimer et valider + resultat: Disparition du lien du département sur la page d'accueil + etat: *DeptCreated + page: *ConnexionAdmin + champs: + role: *Admin + createur: Aurélien +test4: + intitulé: Création d'une formation + operation: + Accès à la page ScoDoc/[nom_dpt]/Scolarite/Notes/formation_create, + Remplir et soumettre le formulaire + resultat: la page sur laquelle on est dirigée contient un tableau avec la formation crée, dont un id avec titre_nom_formation + etat: *DeptCreated + page: *Notes + champs: "titre_" + acronyme + role: *AdminDPT + createur: Aurélien +test5: + intitulé: Changer le nom d'une formation + operation: + Accès à la page /ScoDoc/[nom_dpt]/Scolarite/Notes + Selectionner la formation à modifier en clickant sur son titre + Remplir et soumettre le formulaire + resultat: la page sur laquelle on est dirigée contient une class formation_descr + etat: *DeptCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +test6: + intitulé: Création d'une formation avec le même nom qu'une autre + operation: + Accès à la page ScoDoc/[nom_dpt]/Scolarite/Notes/formation_create, + Remplir et soumettre le formulaire + resultat: la page sur laquelle on est dirigée contient un message d'erreur indiquant que le nom est dupliqué, la formation n'est pas créée + etat: *DeptCreated + page: *Notes + champs: errorMessage + role: *AdminDPT + createur: Aurélien +test7: + intitulé: Ajout d'une UE à la formation créée + operation: + Accès à la page de création d'UE dans la formation précédemment créée + Remplir et soumettre le formulaire + Soumettre le formulaire; + resultat: La page sur laquelle on est dirigée contient "Info Informatique" + etat: *DeptCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +test8: + intitulé: Suppresion d'une formation + operation: + Accès à la page ScoDoc/[nom_dpt]/Scolarite/Notes/, + Supprimer chaque semestre qui compose cette formation, + Supprimer la formation + resultat: La formation disparait du tableau des formations + etat: *DeptCreated + page: *Notes + champs: errorMessage + role: *AdminDPT + createur: Aurélien +test9: + intitulé: Creer un étudiant + operation: + Scolarite/etudident_create_form + Remplir les champs et soumettre le formulaire + resultat: La page contient ficheEtud avec un h2 contenant M. Normal UnEtudiant + etat: *ProgramCreated + page: *Scolarite + champs: + role: *AdminDPT + createur: Aurélien +test10: + intitulé: Creer un étudiant avec le même nip qu'un autre + operation: + Scolarite/etudident_create_form + Remplir les champs et utiliser le même NIP qu'un autre étudiant et soumettre le formulaire + resultat: Redirection vers une page contenant COde étudiant dupliqué, l'étudiant n'est pas créé + etat: *ProgramCreated + page: *Scolarite + champs: titleError + role: [*AdminDPT,*Secretaire] + createur: Aurélien +test11: + intitulé: Modifier l'adresse d'un étudiant + operation: + Se rendre sur la fiche étudiante d'un étudiant avec l'aide de la recherche à l'id in-expnom(sidebar) + Clicker sur changer de coordonnées + Remplir le formulaire et le soumestre + resultat: L'élèment à l'id adresse_etudiant contient désormais les informations mise à jour. + etat: *ProgramCreated + page: *Scolarite + champs: adresse_etudiant + role: [*AdminDPT,*Secretaire] + createur: Aurélien +test12: + intitulé: Inscrire un étudiant à un semestre + operation: Rechercher l'étudiant et l'inscrire au semestre courant + resultat: La fiche etu de l'étudiant contient maintenant le semstre courant + etat: *ProgramCreated + page: *Scolarite + champs: + role: *Secretaire + createur: Aurélien +test14: + intitulé: Supprimer un étudiant + operation: Chercher l'étudiant, et utiliser le formulaire etudident_delete?etudid= en ajoutant l'euid de cette étudfiant + resultat: Cette étudiant est supprimé, aucun résultat n'apparait avec une recherche sur son nom + etat: *EtudiantCreated + page: *ficheEtud + champs: + role: [*AdminDPT,*Secretaire] + createur: Aurélien +test15: + intitulé: Trouver un étudiant + operation: Utiliser la barre latéral pour entrer le nom de l'étudiant + resultat: Redirection vers la fiche de l'étudiant en question + etat: *EtudiantCreated + page: *Absence + champs: in-expnom + role: [*AdminDPT,*Secretaire] + createur: Aurélien +test16: + intitulé: Creer une absence non justifiée + operation: Affecter une absence à un étudiant depuis sa fiche étudiant, et utiliser 'Ajouter' dans la barre latérale + resultat: La page absence de cet étudiant contient l'absence créée + etat: *EtudiantCreated + page: *Absence + champs: + role: *Secretaire + createur: Aurélien +test17: + intitulé: Creer une absence justifiée + operation: Affecter une absence à un étudiant depuis sa fiche étudiant, et utiliser 'Ajouter' dans la barre latérale, cocher est justifiée + resultat: La page absence de cet étudiant contient l'absence créée + etat: *EtudiantCreated + page: *Absence + champs: + role: *Secretaire + createur: Aurélien +test18: + intitulé: Justifier une absence + operation: Justifier une absence et la confirmer + resultat: Ces absences apparaissent comme justifiée sur la page des absences de cet étudiant + etat: *EtudiantCreated + page: *Absence + champs: + role: *Secretaire + createur: Aurélien +test19: + intitulé: Supprimer une absence + operation: Supprimer une absence d'un étudiant depuis sa fiche étudiant, et utiliser 'Supprimer' dans la barre latérale, remplir le formulaire avec les dates des absences à justifier + resultat: Ces absences apparaissent comme justifiée sur la page des absences de cet étudiant + etat: *EtudiantCreated + page: *Absence + champs: + role: *Secretaire + createur: Aurélien +test20: + intitulé: Vérifier qu'une matière existe + operation: Se rendre sur le semestre en cours correspondant depuis /Scolarité , controler si la matière en question est presente dans la liste des matières + resultat: La matière est présente + etat: *MatiereCreated + page: *Scolarite + champs: formsemestre_status_ue + role: *Testeur + createur: Aurélien +test21: + intitulé: Créer une interrogation + operation: Se rendre sur la matière de notre choix, ajouter une interogation, remplir le formulaire et le soumettre + resultat: L'interrogation apparait désormais dans le tableau récapitulatif de cette matière + etat: *MatiereCreated + page: Notes + champs: + role: *AdminDPT + createur: Aurélien +test22: + intitulé: Ajouter un enseignant sur un module + operation: Se rendre sur la matière de notre choix, clicker sur ajouter un enseignant, remplir le formulaire en recherchant l'enseignant voulu + resultat: Le nom de l'enseignant apparait désormais lorsqu'on se rends sur cette matière à coté d'"enseignants" + etat: *MatiereCreated + page: Notes + champs: + role: *AdminDPT + createur: Aurélien +test23: + intitulé: Entrer des notes pour une partie des élèves + operation: Se rendre sur la matière de notre choix, selectionner une interogation et entrer les notes pour une partie des élèves + resultat: ATT apparait désormais à coté de l'interrogation en question sur la page de la matières concernée + etat: *MatiereCreated + page: Notes + champs: + role: *Prof + createur: Aurélien +test24: + intitulé: Entrer des notes pour tout les élèves + operation: Se rendre sur la matière de notre choix, selectionner une interogation et entrer les notes pour chaque élève + resultat: La moyenne apparait désormais directement à côté de l'interrogation en question, les notes apparaissent dans le bulletin des élèves concernés + etat: *MatiereCreated + page: + champs: + role: *Prof + createur: Aurélien +test25: + intitulé: Signaler un élève excusé pour une intérogation + operation: Se rendre sur la matière de notre choix, selectionner une interogation et entrer "EXC" pour l'élève voulu + resultat: La moyenne apparait désormais directement à côté de l'interogation en question, un compteur montre le nombre d'élève excusé + etat: *MatiereCreated + page: + champs: + role: *Prof + createur: Aurélien +test26: + intitulé: Compléter les notes manquantes + operation: Se rendre sur la matière de notre choix, selectionner une interogation et entrer les notes manquantes + resultat: La moyenne apparait désormais directement à côté de l'interogation en question, celle ci n'est plus remplacée par "ATT" + etat: *MatiereCreated + page: + champs: + role: *Prof + createur: Aurélien +test27: + intitulé: Supprimer la note d'un étudiant + operation: Se rendre sur la matière de notre choix, selectionner une interogation et entrer "SUPPR" pour l'étudiant voulu + resultat: La moyenne n'apparait plus sur la page des matières, la note est supprimée de la fiche de l'étudiant concerné + etat: *MatiereCreated + page: + champs: + role: *Prof + createur: Aurélien +testX: + intitulé: Ajout d'une matière à l'UE créée + operation: Soumettre le formulaire d'ajout de matière + resultat: La page sur laquelle on est dirigée contient la classe notes_matiere_list et un de ses enfants contient Systeme + etat: *MatiereCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +testX: + intitulé: Ajouter une session + operation: Verifier que la liste de formation est présente + Se rendre sur la page correspondante "Mise en place d'un semestre de formation" à la formation + Vérifier que grtcontent h2 existe et qu'il contient "Mise en place d'un semestre de formation"" + Soumettre le formulaire après l'avoir rempli + resultat: La page sur laquelle on est dirigée contient une classe head_message avec nouveau semestre créé + etat: *ProgramCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +testX: + intitulé: Générer les absences pour une journée + operation: Généner le récapitulatif des absences + resultat: La page générée contient les absences préalablement créée + etat: *EtudiantCreated + page: *Absence + champs: + role: *Secretaire + createur: Aurélien +testX: + intitulé: Export XML de la formation + operation: Génération de l'export XML, vérifier s'il contient les informations de la formations + resultat: Le xml généré contient les informations demandées + etat: *ProgramCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +testX: + intitulé: Export JSON de la formation + operation: Génération de l'export JSON, vérifier s'il contient les informations de la formations + resultat: Le JSON généré contient les informations demandées + etat: *ProgramCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +testX: + intitulé: Verifier la génération du récapitulatif + operation: Se rendre sur la page table récapitulative de la formation + resultat: La page contient toutes les UE et matière précédemment créées + etat: *ProgramCreated + page: *Notes + champs: + role: *AdminDPT + createur: Aurélien +testX: + intitulé: Décision recommandé de validation de semestre pour un etudiant assidu + operation: Selectionner la validation de semestre dans les opérations scolarité, séléctionner étudiant assidu et valider + resultat: L'état ATT apparait sur la fiche de l'étudiant concerné + etat: *ProgramCreated + page: *Notes + champs: + role: *Secretaire + createur: Aurélien +testX: + intitulé: Décision recommandé de validation de semestre pour un etudiant non assidu + operation: Selectionner la validation de semestre dans les opérations scolarité, séléctionner problème d'assiduité et valider + resultat: L'état ATT apparait sur la fiche de l'étudiant concerné et la mention (non ass.) apparait sur la page de parcours de l'étudiant + etat: *ProgramCreated + page: *Notes + champs: + role: *Secretaire + createur: Aurélien +testX: + intitulé: Effectuer la démission d'un étudiant + operation: Selectionner la demission dans les opérations scolarité, entrer une date et confirmer + resultat: La mention "Démission le xx" apparait sur la fiche de l'étudiant concerné + etat: *EtudiantCreated + page: *Scolarite + champs: + role: *Secretaire + createur: Aurélien +testX: + intitulé: Affecter des absences à un étudiant depuis la gestion des absences + operation: Selectionner la semaine concernée et cocher les cases correspondantes pour un étudiant + resultat: Le compteur d'absence de l'étudiant à été mis à jour + etat: *EtudiantCreated + page: *Scolarite + champs: + role: [*Secretaire, *Prof] + createur: Aurélien +testX: + intitulé: Créer une répartition + operation: Dans le menu modifier créer des groupes, rentrer le nom de la partition et clicker sur nouvelle partition + resultat: Le tableau contient une nouvelle ligne avec le nom de la partition préalablement rempli + etat: *ProgramCreated + page: *Notes + champs: + role: [*Secretaire, *AdminDPT] + createur: Aurélien +testX: + intitulé: Créer un groupe + operation: Dans le menu modifier/créer des groupes, clicker sur répartir à coté de la partition concernée, remplir groupName et appuyer sur créer groupe + resultat: Le groupe apprait dans la div groups + etat: *EtudiantCreated + page: *Notes + champs: + role: [*Secretaire, *AdminDPT] + createur: Aurélien +testX: + intitulé: Affecter des étudiants à un groupe + operation: Dans une répartition, déplacer des étudiants de étudiants sans groupe au groupe souhaité, enregister ces groupes + resultat: Le groupe (discretelink) apparait maintenant sur la fiche des étudiants correspondant + etat: *EtudiantCreated + page: *Notes + champs: + role: *Secretaire + createur: Aurélien +test25: + intitulé: Verifier le calcul des notes + operation: + resultat: + etat: + page: + champs: + role: + createur: Aurélien +test26: + intitulé: Ajouter un module optionnel + operation: + resultat: + etat: + page: + champs: + role: + createur: Aurélien +test27: + intitulé: Ajouter une note optionnelle + operation: + resultat: + etat: + page: + champs: + role: + createur: Aurélien diff --git a/__pycache__/setting.cpython-37.pyc b/__pycache__/setting.cpython-37.pyc index 9ff96bd..c79d961 100644 Binary files a/__pycache__/setting.cpython-37.pyc and b/__pycache__/setting.cpython-37.pyc differ diff --git a/__pycache__/setup.cpython-38.pyc b/__pycache__/setup.cpython-38.pyc new file mode 100644 index 0000000..ed10f11 Binary files /dev/null and b/__pycache__/setup.cpython-38.pyc differ