UploadOwncloudAMC.py

Rémi G., 07/13/2017 06:19 pm

Download (6.2 kB)

 
1
#!/usr/bin/python3
2
3
import csv
4
import os
5
import re
6
import owncloud
7
8
9
### Paramètres à changer
10
11
ParamCSVFile = '/folder/.../fichier.csv'
12
ParamFolder = '/folder/.../pdf/'
13
ParamOwncloudAdress = 'http://ncloud.zaclys.com/'
14
ParamOwncloudLogin = 'MonIdentifiant'
15
ParamOwncloudPass = 'MonMotDePasse'
16
ParamQuizName = 'Interro (2017-07-13)'
17
18
19
### Lecture fichier CSV
20
21
class Student:
22
    """Define a Student and stores all the values
23
    - name
24
    - surname
25
    - class or group
26
    - identification number
27
    - owncloud username"""
28
    
29
    def __init__(self, name='', surname='', group='', idnumber='', idowncloud='', quizname=''):
30
        """Create Student object"""
31
        self.name = name
32
        self.surname = surname
33
        self.group = group
34
        self.idnumber = idnumber
35
        self.idowncloud = idowncloud
36
        self.quizname = quizname
37
38
    def print(self):
39
        """Display Student information (data attributes)"""
40
        print('{0:15} {1:15} {2:10} {3:8} {4:15} {5}'.format(
41
                                                self.name, 
42
                                                self.surname, 
43
                                                self.group, 
44
                                                self.idnumber, 
45
                                                self.idowncloud, 
46
                                                self.quizname))
47
48
def ReadStudents(ParamCSVFile):
49
    """Extrait les informations des étudiants du fichier CSV.
50
    Renvoie un dictionnaire associant à chaque numéro d'étudiant
51
    un étudiant (objet Student)"""
52
    DictOfStudents = {}
53
    with open(ParamCSVFile, newline='') as csvfile:
54
        tableau = csv.DictReader(csvfile, delimiter=':')
55
        for row in tableau: 
56
            StudentObj = Student(  name = row["name"], 
57
                                surname = row["surname"],
58
                                group = row["group"],
59
                                idnumber = row["idnumber"],
60
                                idowncloud = row["idowncloud"])
61
            DictOfStudents[StudentObj.idnumber] = StudentObj
62
    return DictOfStudents
63
64
def recap(DictOfStudents):
65
    """Affiche les informations des étudiants chargés depuis le fichier CSV"""
66
    Student('name', 'surname', 'group', 'idnumber', 'idowncloud', 'quizname').print()
67
    for StudentId, StudentObj in DictOfStudents.items():
68
        StudentObj.print() 
69
70
71
### Lecture fichiers
72
73
def ReadQuiz(ParamFolder):
74
    """Renvoie les noms des quiz sous forme d'une liste"""
75
    ListOfQuiz = []
76
    for File in os.listdir(ParamFolder):
77
        if File.lower().endswith(('.pdf','.jpg')):
78
            ListOfQuiz.append(File)
79
    return ListOfQuiz
80
81
82
### Association fichiers et étudiants
83
84
def AssociateQuizToStudent(ListOfQuiz, DictOfStudents):
85
    """Associe chaque quiz au bon étudiant en recherchant le numéro d'étudiant
86
    Met à jour le champ correspondant pour chaque objet Student du dictionnaire
87
    Renvoie le dictionnaire des étudiants."""
88
    for QuizName in ListOfQuiz:
89
        RegularExpression = re.compile('[0-9]+')
90
        IdNumber = re.search(RegularExpression,QuizName).group()
91
        try:
92
            DictOfStudents[IdNumber].quizname = QuizName
93
        except:
94
            pass
95
#            print("Error: Can't find any student with number {0} extracted from file {1}".format(IdNumber,QuizName))
96
    return DictOfStudents
97
98
99
### Création dossiers owncloud et partages
100
101
def UploadAndShareQuiz(DictOfStudents, ParamOwncloudAdress, ParamOwncloudLogin, ParamOwncloudPass, ParamFolder):
102
    # Se connecte
103
    oc = owncloud.Client(ParamOwncloudAdress)
104
    oc.login(ParamOwncloudLogin,ParamOwncloudPass)
105
    FichiersEnvoyes = ''
106
    folder1 = 'Interros Maths/'
107
    try:
108
        oc.mkdir(folder1)
109
        print('Dossier ' + folder1 + ' créé')
110
    except:
111
        pass
112
    for StudentId, StudentObj in DictOfStudents.items():
113
        if StudentObj.quizname != '':
114
            # Crée les dossiers si nécessaire
115
            folder2 = StudentObj.group + '/'
116
            folder3 = ( StudentObj.surname 
117
                        + ' ' + StudentObj.name 
118
                        + ' (' + StudentObj.idnumber + ')'
119
                        +' - Interros Maths/')
120
            StudentFolder = folder1 + folder2 + folder3
121
            NewQuizName = ( ParamQuizName + ' - '
122
                            + StudentObj.surname 
123
                            + ' ' + StudentObj.name 
124
                            + ' (' + StudentObj.idnumber + ')')
125
            NewFilePath = (StudentFolder 
126
                        + NewQuizName 
127
                        + '.' + StudentObj.quizname.split(".")[-1])
128
            try:
129
                oc.mkdir(folder1 + folder2)
130
                print('Dossier ' + folder2 + ' créé')
131
            except:
132
                pass
133
            try:
134
                oc.mkdir(StudentFolder)  
135
                print('Dossier ' + StudentFolder + ' créé')
136
            except:
137
                pass
138
            # Copie et renomme le fichier
139
            oc.put_file(NewFilePath,
140
                        ParamFolder + StudentObj.quizname)
141
            # Partage les dossiers si nécessaire
142
            IsShared = False
143
            for FileShare in oc.get_shares(StudentFolder):
144
                if FileShare.get_share_with() == StudentObj.idowncloud:
145
                    IsShared = True
146
                    break
147
            if IsShared == False:
148
                if '@' in StudentObj.idowncloud: # remote user
149
                    oc.share_file_with_user(StudentFolder, StudentObj.idowncloud + '/', 
150
                                            remote_user=True)
151
                else: # local user
152
                    oc.share_file_with_user(StudentFolder, StudentObj.idowncloud)
153
            FichiersEnvoyes = FichiersEnvoyes + NewFilePath + '\n'
154
    return FichiersEnvoyes
155
156
157
### Script
158
159
print('1) Lecture du fichier CSV\n')
160
DictOfStudents = ReadStudents(ParamCSVFile)
161
#recap(DictOfStudents)
162
163
print('\n2) Lecture des fichiers des interros\n')
164
ListOfQuiz = ReadQuiz(ParamFolder)
165
#print(ListOfQuiz)
166
167
print('\n3) Association des fichiers à chaque étudiant\n')
168
DictOfStudents = AssociateQuizToStudent(ListOfQuiz, DictOfStudents)
169
#recap(DictOfStudents)
170
171
print('\n4) Création des dossiers et partages\n')
172
FichiersEnvoyes = UploadAndShareQuiz(DictOfStudents, ParamOwncloudAdress, ParamOwncloudLogin, ParamOwncloudPass, ParamFolder)
173
print(FichiersEnvoyes)