Code source de mathenjeu.activities.act_question
# -*- coding: utf-8 -*-
"""
Base classes.
:githublink:`%|py|6`
"""
from collections import OrderedDict
from .base_classes import Activity
[docs]class QuestionChoice(Activity):
"""
Defines a question with multiple choices.
:githublink:`%|py|13`
"""
[docs] def __init__(self, eid, name, lang, title, notion=None,
description=None, answers=None,
expected_answers=None, show=None):
"""
:param eid: identifier
:param name: unique name
:param lang: language
:param title: display name
:param notion: notion (:class:`Notion <mathenjeu.activities.base_classes.Notion>`)
:param description: description
:param answers: answers (dictionary ``{ code, display }``)
:param expected_answers: expected_answers, list of codes
:param show: one image to show
:githublink:`%|py|28`
"""
if not isinstance(expected_answers, list):
raise TypeError( # pragma: no cover
"expected_answers must be a list")
if isinstance(answers, list):
ans = OrderedDict()
for i, k in enumerate(answers):
ans["a%d" % i] = k
answers = ans
rev = {v: k for k, v in answers.items()}
expe = []
for a in expected_answers:
try:
v = rev[a]
except KeyError: # pragma: no cover
raise KeyError( # pylint: disable=W0707
"Unable to find '{0}' in {1}".format(
a, list(sorted(rev))))
expe.append(v)
expected_answers = expe
elif isinstance(answers, dict):
ans = OrderedDict()
for i, k in enumerate(sorted(answers.items())):
ans["a%d" % i] = k
answers = ans
elif answers is None:
# input, not checkboxes
answers = None
elif not isinstance(answers, OrderedDict):
raise TypeError( # pragma: no cover
"answers must be a of OrderedDict")
if answers is not None:
for exp in expected_answers:
if exp not in answers:
raise ValueError( # pragma: no cover
"One expected answer '{0}' is unknown.".format(exp))
content = dict(answers=answers,
expected_answers=expected_answers)
if show:
content['show'] = show
Activity.__init__(self, eid, name, lang, title, notion=notion,
description=description, content=content)
@property
def Answers(self):
"""
Returns the list of answers.
:githublink:`%|py|75`
"""
return self._col_content['answers']
@property
def ExpectedAnswers(self):
"""
Returns the list of expected answers.
:githublink:`%|py|82`
"""
return self._col_content['expected_answers']