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.

(1-2/2)