| 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__( | |
| 1ee608 | 48 | self, settings, problem_source_list=None, number_of_papers=5, student_list=None, template="aoi_gen/textemplates" |
| 7224af | 49 | ): |
| SP | 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 | |
| 1ee608 | 61 | self.template = TemplateEngine(template) |
| 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 | |