def expand_tests_from_program(question, tests: IoSpec, language=None): """ Uses source code from source code reference in the provided language to expand tests. """ language = programming_language(language) answer_key = question.answers.get(language=language) if not answer_key.source: raise ValueError('cannot expand from %s: no program set' % language) source = answer_key.source language_ref = language.ejudge_ref() if tests.is_simple: return tests.copy() if tests.is_standard_test_case: tests = tests.copy() tests.expand_inputs() if tests.is_simple: return tests return question.run_code(source, tests, language)
def expand_from_code(self, source, inputs, language=None, timeout=None): """ Wrapped version of expand_from_code() that uses question's own timeout and language as default. """ language = programming_language(language or self.language) timeout = timeout or self.timeout return ejudge.expand_from_code(source, inputs, language, timeout)
def check_with_code(self, source, tests, language=None, timeout=None): """ Wrapped version of check_with_code() that uses question's own timeout and language as default. """ language = programming_language(language or self.language) timeout = timeout or self.timeout ejudge.check_with_code(source, tests, language, timeout)
def submit(self, request, language=None, **kwargs): # Cannot set language if question specifies a required lnaguage if language and self.language and language != self.language: args = language, self.language raise ValueError('cannot set language: %r != %r' % args) language = self.language or language language = programming_language(language) return super().submit(request, language=language, **kwargs)
def update_markio_data(question, data): """ Update question parameters from Markio file. """ md = data if hasattr(data, 'title') else parse_markio(data) # Load simple data from markio question.title = md.title or question.title question.short_description = (md.short_description or question.short_description) question.timeout = md.timeout or question.timeout question.author_name = md.author or question.author_name question.pre_tests_source = md.tests_source or question.pre_tests_source question.post_tests_source = md.hidden_tests_source if md.language is not None: question.language = programming_language(md.language) if md.points is not None: question.points_total = md.points if md.stars is not None: question.starts_total = md.stars # Load main description question.body = markdown_to_blocks(md.description) # Add answer keys answer_keys = OrderedDict() for (lang, answer_key) in md.answer_key.items(): language = programming_language(lang) key = question.answers.create(question=question, language=language, source=answer_key) answer_keys[lang] = key for (lang, placeholder) in md.placeholder.items(): if placeholder is None: question.default_placeholder = placeholder try: answer_keys[lang].placeholder = placeholder except KeyError: language = programming_language(lang) question.answers.create(language=language, placeholder=placeholder) question.__answers = list(answer_keys.values()) question.answers = question.__answers
def get_reference_source(self, language=None): """ Return the reference source code for the given language or None, if no reference is found. """ if language is None: language = self.language qs = self.answers.all().filter( language=programming_language(language)) if qs: return qs.get().source return ''
def serve_ajax_submission(self, client, source=None, language=None, **kwargs): """ Handles student responses via AJAX and a bricks program. """ # User must choose language if not language or language == '-----': if self.language is None: fmt = _('Error'), _('Please select the correct language') client.dialog( '<p class="dialog-text"><h2>%s</h2><p>%s</p></p>' % fmt ) return None language = self.language else: language = programming_language(language) return super().serve_ajax_submission( client=client, language=language, source=source, )
def test_validate_multiple_answer_keys(db): question = example('simple') question.answers.create(language=programming_language('c'), source=source('hello.c')) question.full_clean_all()