| 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 | |