-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprepare_teachers_with_courses.py
More file actions
106 lines (85 loc) · 2.69 KB
/
prepare_teachers_with_courses.py
File metadata and controls
106 lines (85 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
Takes a file preprocessed by preprocess_teachers_and_courses.py
Outputs a file containing teacher information and their courses,
ready for importing into Moodle : Admin->Utilisateurs->Importation d'utilisateurs
"""
import argparse
import os
import sys
from collections.abc import Callable
import dotenv
import polars as pl
import structlog
from lib.passwords import password_generator
from preprocess_teachers_and_courses import (
COURSE_SHORTNAME,
TEACHER_EMAIL,
TEACHER_FIRSTNAME,
TEACHER_LASTNAME,
TEACHER_TLA,
)
log = structlog.get_logger()
def make_names(name: str, count: int):
return [f"{name}{i + 1}" for i in range(count)]
def to_teachers_with_courses(
src: pl.DataFrame, email_to_password: Callable[[str], str]
) -> pl.DataFrame:
res = src.group_by(TEACHER_TLA).agg(
pl.min(TEACHER_LASTNAME),
pl.min(TEACHER_FIRSTNAME),
pl.min(TEACHER_EMAIL),
pl.col(COURSE_SHORTNAME),
)
course_count = res.select(pl.col(COURSE_SHORTNAME).list.len()).max().item()
# Dynamically build the course columns based on the list iwe collected in the
# shortname column
res = res.with_columns(
pl.col(COURSE_SHORTNAME).list.to_struct(
fields=make_names("course", course_count)
)
).unnest(COURSE_SHORTNAME)
# Type 2 to make users teachers for their courses
type_columns = {name: pl.lit(2) for name in make_names("type", course_count)}
res = res.with_columns(**type_columns)
######
# Generate all required columns
######
res = res.with_columns(
cohort1=pl.lit(1), # Enseignants au gymnase de Beaulieu
username=pl.col(TEACHER_EMAIL),
password=pl.col(TEACHER_EMAIL).map_elements(
email_to_password, return_dtype=pl.String
),
)
#####
# Make the resulting columns look as expected
######
res = res.rename(
{
TEACHER_LASTNAME: "lastname",
TEACHER_FIRSTNAME: "firstname",
TEACHER_EMAIL: "email",
}
)
res = res.drop(TEACHER_TLA)
# For human readability
res = res.sort(["lastname", "firstname"])
log.info(
"done",
num_teachers=len(res),
)
return res
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("preprocessed")
parser.add_argument("output")
args = parser.parse_args()
dotenv.load_dotenv()
salt = os.getenv("SALT")
if not salt:
sys.exit("Missing environment variable 'SALT'")
preprocessed = pl.read_csv(args.preprocessed)
teachers_with_courses = to_teachers_with_courses(
preprocessed, password_generator(salt)
)
teachers_with_courses.write_csv(args.output)