Parser of berki style problems and generator of latex file
Samo Penic
2019-02-04 343fd1c41a6bbfdbf38e22895fdb8464502e5f35
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):
da23b3 20         for problem in self.problem_source_list:
SP 21             shuffle(problem['problems'])
22             for i in range(0,problem['amount']):
343fd1 23                 self.problem_list.append((problem['problems'][i]['id'], Problem(problem['problems'][i]['parsed_source'])))
7224af 24         if reorder:
SP 25             shuffle(self.problem_list)
26
27     def to_template(self):
28         if self.student_id is None:
29             text = self.template.start_paper()
30         else:
31             text = self.template.start_paper(self.student_id[0], self.student_id[1])
32
da23b3 33         for i, (problem_id, problem) in enumerate(self.problem_list):
7224af 34             text += self.template.put_problem_into_template(
SP 35                 problem.problem, problem_number=i + 1
36             )
37         text += "\\vfill\\break"
38         return text
39
40     def get_answer_matrix(self):
41         retval = []
da23b3 42         for (problem_id,problem) in self.problem_list:
7224af 43             for solution in problem.problem["solutions"]:
SP 44                 retval.append([i[1] for i in solution["shuffled"]])
45         return retval
46
da23b3 47     def get_problem_ids(self):
SP 48         retval = []
49         for (problem_id,problem) in self.problem_list:
50             retval.append(problem_id)
51         return retval
7224af 52
SP 53 class Exam:
54     def __init__(
1ee608 55         self, settings, problem_source_list=None, number_of_papers=5, student_list=None, template="aoi_gen/textemplates"
7224af 56     ):
SP 57         self.settings = settings
58         self.problem_source_list = problem_source_list
59         self.paper_list = []
60         self.student_list = student_list
61         self.paper_start = settings["start_number"]
62         self.number_of_papers = number_of_papers
63
64         if student_list is not None:
65             self.student_iterator = iter(self.student_list)
66         else:
7eccfe 67             self.student_iterator = None
1ee608 68         self.template = TemplateEngine(template)
7224af 69
SP 70     def loadProblemsFromDirectory(self, dir, Parser=None):
71         if Parser is None:
72             Parser = BerkiParse
73         self.problem_source_list = []
74         filelist = glob(dir)
75         files = []
76         for i, f in enumerate(filelist):
77             with open(f) as fd:
78                 cont = fd.read()
79             files.append((i, cont))
80         self.problem_source_list = []
da23b3 81         for i,nal in enumerate(files):
7224af 82             par = Parser(nal[1])
SP 83             par.parseSections()
da23b3 84             self.problem_source_list.append(
SP 85                 {
86                     'amount': 1,
87                     'problems':
88                         [
89                             {
90                                 'id': i,
343fd1 91                                 'parsed_source': ProblemSource(parser=par)
da23b3 92                             },
SP 93                         ]
94                  })
7224af 95
SP 96     def generatePapers(self):
97         for i in range(self.paper_start, self.paper_start + self.number_of_papers):
98             try:
99                 student_id = next(self.student_iterator)
100             except (StopIteration, TypeError):
101                 student_id = None
102             self.paper_list.append(
103                 Paper(
104                     self.problem_source_list,
105                     paper_id=i,
106                     student_id=student_id,
107                     template=self.template,
108                 )
109             )
110
111     def paper_to_template(self):
112         text = ""
113         for paper in self.paper_list:
114             text += paper.to_template()
115             text += "\\vfill\\break"
116         return text
117
118     def head_to_template(self):
119         return self.template.head(settings=self.settings)
120
121     def tail_to_template(self):
122         return self.template.tail()
123
124     def exam_to_template(self):
125         text = self.head_to_template()
126         text += self.paper_to_template()
127         text += self.tail_to_template()
128         self.text = text
129         return text
130
131     def get_answers(self):
132         retval=[]
133         for paper in self.paper_list:
134             paper_matrix=paper.get_answer_matrix()
135             retval.append(paper_matrix)
136
da23b3 137         return retval
SP 138
139     def get_problem_ids(self):
140         retval=[]
141         for paper in self.paper_list:
142             paper_ids=paper.get_problem_ids()
143             retval.append(paper_ids)
144         return retval