Forums » Utilisation d'AMC (french) »
Insérer le numéro d'étudiant dans le nom du fichier .pdf de chaque copie corrigée
Added by Rémi G. over 7 years ago
Bonjour,
J'aimerais envoyer les copies corrigées des étudiants sur le serveur ownCloud de l'ENT de mon établissement et les partager ensuite avec les étudiants. Je suis en tout cas en train de réfléchir à un petit script Python pour automatiser cette étape.
Pour faciliter l'association des copies avec chaque étudiant, il serait pratique (et plus fiable) que le nom du fichier contienne le numéro d'étudiant. Pour l'instant les fichiers sont numérotés comme suit :
NuméroCopie-NOM Prénom.pdf
Est-il possible d'insérer le numéro d'étudiant des élèves dans le nom des fichiers ?
Merci d'avance !
Rémi.
Replies (2)
RE: Insérer le numéro d'étudiant dans le nom du fichier .pdf de chaque copie corrigée - Added by Alexis Bienvenüe over 7 years ago
Oui. Si la colonne contenant le numéro d'étudiant dans votre fichier CSV des étudiants s'appelle etu
, utilisez par exemple ceci pour modèle de nom de fichier :
(etu)-(ID)
(vous pouvez enlever -(ID)
si le numéro d'étudiant vous suffit)
RE: Insérer le numéro d'étudiant dans le nom du fichier .pdf de chaque copie corrigée - Added by Rémi G. over 7 years ago
Merci pour le retour ! Je n'avais pas trouvé d'option dans AMC pour changer le nom de fichier mais j'ai regardé sur une ancienne version et rapidement... Dès que j'ai réussi à installer AMC sous Fedora 26, je regarde ça !
Concernant mon projet, je suis arrivé à mettre au point un script Python permettant d'envoyer et de partager les fichiers. J'utilise pour cela le paquet "pyocclient" et j'ai rajouté une colonne "idowncloud" au fichier .csv pour stocker l'identifiant owncloud de chaque élève :
surname:name:idnumber:group:idowncloud MOUSE:Mickey:1807:4emeA:mmouse@aFederatedServer/owncloud DOE:John:1234:4emeA:jdoe@aFederatedServer/owncloud
N'ayant pas codé depuis plusieurs années et ayant "appris" les bases de Python cette semaine, j'ai bien conscience que ce n'est que très imparfait. Ci-dessous un premier jet fonctionnel :
#!/usr/bin/python3 import csv import os import re import owncloud ### Paramètres à changer ParamCSVFile = '/folder/.../fichier.csv' ParamFolder = '/folder/.../pdf/' ParamOwncloudAdress = 'http://ncloud.zaclys.com/' ParamOwncloudLogin = 'MonIdentifiant' ParamOwncloudPass = 'MonMotDePasse' ParamQuizName = 'Interro (2017-07-13)' ### Lecture fichier CSV class Student: """Define a Student and stores all the values - name - surname - class or group - identification number - owncloud username""" def __init__(self, name='', surname='', group='', idnumber='', idowncloud='', quizname=''): """Create Student object""" self.name = name self.surname = surname self.group = group self.idnumber = idnumber self.idowncloud = idowncloud self.quizname = quizname def print(self): """Display Student information (data attributes)""" print('{0:15} {1:15} {2:10} {3:8} {4:15} {5}'.format( self.name, self.surname, self.group, self.idnumber, self.idowncloud, self.quizname)) def ReadStudents(ParamCSVFile): """Extrait les informations des étudiants du fichier CSV. Renvoie un dictionnaire associant à chaque numéro d'étudiant un étudiant (objet Student)""" DictOfStudents = {} with open(ParamCSVFile, newline='') as csvfile: tableau = csv.DictReader(csvfile, delimiter=':') for row in tableau: StudentObj = Student( name = row["name"], surname = row["surname"], group = row["group"], idnumber = row["idnumber"], idowncloud = row["idowncloud"]) DictOfStudents[StudentObj.idnumber] = StudentObj return DictOfStudents def recap(DictOfStudents): """Affiche les informations des étudiants chargés depuis le fichier CSV""" Student('name', 'surname', 'group', 'idnumber', 'idowncloud', 'quizname').print() for StudentId, StudentObj in DictOfStudents.items(): StudentObj.print() ### Lecture fichiers def ReadQuiz(ParamFolder): """Renvoie les noms des quiz sous forme d'une liste""" ListOfQuiz = [] for File in os.listdir(ParamFolder): if File.lower().endswith(('.pdf','.jpg')): ListOfQuiz.append(File) return ListOfQuiz ### Association fichiers et étudiants def AssociateQuizToStudent(ListOfQuiz, DictOfStudents): """Associe chaque quiz au bon étudiant en recherchant le numéro d'étudiant Met à jour le champ correspondant pour chaque objet Student du dictionnaire Renvoie le dictionnaire des étudiants.""" for QuizName in ListOfQuiz: RegularExpression = re.compile('[0-9]+') IdNumber = re.search(RegularExpression,QuizName).group() try: DictOfStudents[IdNumber].quizname = QuizName except: pass # print("Error: Can't find any student with number {0} extracted from file {1}".format(IdNumber,QuizName)) return DictOfStudents ### Création dossiers owncloud et partages def UploadAndShareQuiz(DictOfStudents, ParamOwncloudAdress, ParamOwncloudLogin, ParamOwncloudPass, ParamFolder): # Se connecte oc = owncloud.Client(ParamOwncloudAdress) oc.login(ParamOwncloudLogin,ParamOwncloudPass) FichiersEnvoyes = '' folder1 = 'Interros Maths/' try: oc.mkdir(folder1) print('Dossier ' + folder1 + ' créé') except: pass for StudentId, StudentObj in DictOfStudents.items(): if StudentObj.quizname != '': # Crée les dossiers si nécessaire folder2 = StudentObj.group + '/' folder3 = ( StudentObj.surname + ' ' + StudentObj.name + ' (' + StudentObj.idnumber + ')' +' - Interros Maths/') StudentFolder = folder1 + folder2 + folder3 NewQuizName = ( ParamQuizName + ' - ' + StudentObj.surname + ' ' + StudentObj.name + ' (' + StudentObj.idnumber + ')') NewFilePath = (StudentFolder + NewQuizName + '.' + StudentObj.quizname.split(".")[-1]) try: oc.mkdir(folder1 + folder2) print('Dossier ' + folder2 + ' créé') except: pass try: oc.mkdir(StudentFolder) print('Dossier ' + StudentFolder + ' créé') except: pass # Copie et renomme le fichier oc.put_file(NewFilePath, ParamFolder + StudentObj.quizname) # Partage les dossiers si nécessaire IsShared = False for FileShare in oc.get_shares(StudentFolder): if FileShare.get_share_with() == StudentObj.idowncloud: IsShared = True break if IsShared == False: if '@' in StudentObj.idowncloud: # remote user oc.share_file_with_user(StudentFolder, StudentObj.idowncloud + '/', remote_user=True) else: # local user oc.share_file_with_user(StudentFolder, StudentObj.idowncloud) FichiersEnvoyes = FichiersEnvoyes + NewFilePath + '\n' return FichiersEnvoyes ### Script print('1) Lecture du fichier CSV\n') DictOfStudents = ReadStudents(ParamCSVFile) #recap(DictOfStudents) print('\n2) Lecture des fichiers des interros\n') ListOfQuiz = ReadQuiz(ParamFolder) #print(ListOfQuiz) print('\n3) Association des fichiers à chaque étudiant\n') DictOfStudents = AssociateQuizToStudent(ListOfQuiz, DictOfStudents) #recap(DictOfStudents) print('\n4) Création des dossiers et partages\n') FichiersEnvoyes = UploadAndShareQuiz(DictOfStudents, ParamOwncloudAdress, ParamOwncloudLogin, ParamOwncloudPass, ParamFolder) print(FichiersEnvoyes)
Notez que l'application ownCloud de mon établissement étant située derrière un guichet d'authentification unique, j'envoie les fichiers vers mon cloud perso et je partage vers le cloud de l'ENT. Pour éviter que cela ne nécessite à chaque fois une autorisation des élèves pour accepter le partage, le script créé donc un dossier par élève.
UploadOwncloudAMC.py (6.2 kB)
(1-2/2)