Parser of berki style problems and generator of latex file
Samo Penic
2018-11-03 c9c8d5997209b1f00b25a6bc2b7fa2b3fb186640
commit | author | age
c9c8d5 1 from aoi_gen.BerkiParse import BerkiParse
SP 2 from aoi_gen.Problem import ProblemSource, Problem
3 from aoi_gen.Template import TemplateEngine
7224af 4 from random import shuffle
SP 5 from glob import glob
6
7
8 class Paper:
9     def __init__(
10         self, problem_source_list, paper_id=None, student_id=None, template=None
11     ):
12         self.problem_source_list = problem_source_list
13         self.problem_list = []
14         self.paper_id = paper_id
15         self.student_id = student_id
16         self.template = template
17         self.generate_problems()
18
19     def generate_problems(self, reorder=True):
20         for problem_source in self.problem_source_list:
21             self.problem_list.append(Problem(problem_source))
22         if reorder:
23             shuffle(self.problem_list)
24
25     def to_template(self):
26         if self.student_id is None:
27             text = self.template.start_paper()
28         else:
29             text = self.template.start_paper(self.student_id[0], self.student_id[1])
30
31         for i, problem in enumerate(self.problem_list):
32             text += self.template.put_problem_into_template(
33                 problem.problem, problem_number=i + 1
34             )
35         text += "\\vfill\\break"
36         return text
37
38     def get_answer_matrix(self):
39         retval = []
40         for problem in self.problem_list:
41             for solution in problem.problem["solutions"]:
42                 retval.append([i[1] for i in solution["shuffled"]])
43         return retval
44
45
46 class Exam:
47     def __init__(
48         self, settings, problem_source_list=None, number_of_papers=5, student_list=None
49     ):
50         self.settings = settings
51         self.problem_source_list = problem_source_list
52         self.paper_list = []
53         self.student_list = student_list
54         self.paper_start = settings["start_number"]
55         self.number_of_papers = number_of_papers
56
57         if student_list is not None:
58             self.student_iterator = iter(self.student_list)
59         else:
60             self.student_list = None
c9c8d5 61         self.template = TemplateEngine("aoi_gen/textemplates")
7224af 62
SP 63     def loadProblemsFromDirectory(self, dir, Parser=None):
64         if Parser is None:
65             Parser = BerkiParse
66         self.problem_source_list = []
67         filelist = glob(dir)
68         files = []
69         for i, f in enumerate(filelist):
70             with open(f) as fd:
71                 cont = fd.read()
72             files.append((i, cont))
73         self.problem_source_list = []
74         for nal in files:
75             par = Parser(nal[1])
76             par.parseSections()
77             self.problem_source_list.append(ProblemSource(parser=par))
78
79     def generatePapers(self):
80         for i in range(self.paper_start, self.paper_start + self.number_of_papers):
81             try:
82                 student_id = next(self.student_iterator)
83             except (StopIteration, TypeError):
84                 student_id = None
85             self.paper_list.append(
86                 Paper(
87                     self.problem_source_list,
88                     paper_id=i,
89                     student_id=student_id,
90                     template=self.template,
91                 )
92             )
93
94     def paper_to_template(self):
95         text = ""
96         for paper in self.paper_list:
97             text += paper.to_template()
98             text += "\\vfill\\break"
99         return text
100
101     def head_to_template(self):
102         return self.template.head(settings=self.settings)
103
104     def tail_to_template(self):
105         return self.template.tail()
106
107     def exam_to_template(self):
108         text = self.head_to_template()
109         text += self.paper_to_template()
110         text += self.tail_to_template()
111         self.text = text
112         return text
113
114     def get_answers(self):
115         retval=[]
116         for paper in self.paper_list:
117             paper_matrix=paper.get_answer_matrix()
118             retval.append(paper_matrix)
119
120         return retval