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 8 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 8 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 8 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)