| New file |
| | |
| | | from tools.BerkiParse import BerkiParse |
| | | from tools.Problem import ProblemSource, Problem |
| | | from tools.Template import TemplateEngine |
| | | from random import shuffle |
| | | from glob import glob |
| | | |
| | | |
| | | class Paper: |
| | | def __init__( |
| | | self, problem_source_list, paper_id=None, student_id=None, template=None |
| | | ): |
| | | self.problem_source_list = problem_source_list |
| | | self.problem_list = [] |
| | | self.paper_id = paper_id |
| | | self.student_id = student_id |
| | | self.template = template |
| | | self.generate_problems() |
| | | |
| | | def generate_problems(self, reorder=True): |
| | | for problem_source in self.problem_source_list: |
| | | self.problem_list.append(Problem(problem_source)) |
| | | if reorder: |
| | | shuffle(self.problem_list) |
| | | |
| | | def to_template(self): |
| | | if self.student_id is None: |
| | | text = self.template.start_paper() |
| | | else: |
| | | text = self.template.start_paper(self.student_id[0], self.student_id[1]) |
| | | |
| | | for i, problem in enumerate(self.problem_list): |
| | | text += self.template.put_problem_into_template( |
| | | problem.problem, problem_number=i + 1 |
| | | ) |
| | | text += "\\vfill\\break" |
| | | return text |
| | | |
| | | def get_answer_matrix(self): |
| | | retval = [] |
| | | for problem in self.problem_list: |
| | | for solution in problem.problem["solutions"]: |
| | | retval.append([i[1] for i in solution["shuffled"]]) |
| | | return retval |
| | | |
| | | |
| | | class Exam: |
| | | def __init__( |
| | | self, settings, problem_source_list=None, number_of_papers=5, student_list=None |
| | | ): |
| | | self.settings = settings |
| | | self.problem_source_list = problem_source_list |
| | | self.paper_list = [] |
| | | self.student_list = student_list |
| | | self.paper_start = settings["start_number"] |
| | | self.number_of_papers = number_of_papers |
| | | |
| | | if student_list is not None: |
| | | self.student_iterator = iter(self.student_list) |
| | | else: |
| | | self.student_list = None |
| | | self.template = TemplateEngine("tools/textemplates") |
| | | |
| | | def loadProblemsFromDirectory(self, dir, Parser=None): |
| | | if Parser is None: |
| | | Parser = BerkiParse |
| | | self.problem_source_list = [] |
| | | filelist = glob(dir) |
| | | files = [] |
| | | for i, f in enumerate(filelist): |
| | | with open(f) as fd: |
| | | cont = fd.read() |
| | | files.append((i, cont)) |
| | | self.problem_source_list = [] |
| | | for nal in files: |
| | | par = Parser(nal[1]) |
| | | par.parseSections() |
| | | self.problem_source_list.append(ProblemSource(parser=par)) |
| | | |
| | | def generatePapers(self): |
| | | for i in range(self.paper_start, self.paper_start + self.number_of_papers): |
| | | try: |
| | | student_id = next(self.student_iterator) |
| | | except (StopIteration, TypeError): |
| | | student_id = None |
| | | self.paper_list.append( |
| | | Paper( |
| | | self.problem_source_list, |
| | | paper_id=i, |
| | | student_id=student_id, |
| | | template=self.template, |
| | | ) |
| | | ) |
| | | |
| | | def paper_to_template(self): |
| | | text = "" |
| | | for paper in self.paper_list: |
| | | text += paper.to_template() |
| | | text += "\\vfill\\break" |
| | | return text |
| | | |
| | | def head_to_template(self): |
| | | return self.template.head(settings=self.settings) |
| | | |
| | | def tail_to_template(self): |
| | | return self.template.tail() |
| | | |
| | | def exam_to_template(self): |
| | | text = self.head_to_template() |
| | | text += self.paper_to_template() |
| | | text += self.tail_to_template() |
| | | self.text = text |
| | | return text |
| | | |
| | | def get_answers(self): |
| | | retval=[] |
| | | for paper in self.paper_list: |
| | | paper_matrix=paper.get_answer_matrix() |
| | | retval.append(paper_matrix) |
| | | |
| | | return retval |