# -*- coding: utf-8 -*-
"""
Base classes.
:githublink:`%|py|6`
"""
[docs]class Base:
"""
Base class.
:githublink:`%|py|11`
"""
[docs] def __init__(self, eid, name):
"""
:param eid: entity id
:param name: unique name (mostly for logging)
:githublink:`%|py|17`
"""
self._col_eid = eid
self._col_name = name
@property
def Id(self):
"""
Returns the identifier.
:githublink:`%|py|25`
"""
return self._col_eid
@property
def Fields(self):
"""
Returns all the fields.
:githublink:`%|py|32`
"""
return list(sorted(k for k in self.__dict__ if k.startswith("_col")))
[docs] def to_dict(self):
"""
Returns all values as a dictionary.
:githublink:`%|py|38`
"""
return {k: getattr(self, k) for k in self.__dict__ if k.startswith("_col")}
[docs] def __repr__(self):
"""
Usual
:githublink:`%|py|53`
"""
name = self.__class__.__name__
fields = self.Fields
pars = ["{0}={1}".format(k, Base._format_value(
getattr(self, k))) for k in fields]
text = "{0}({1})".format(name, ", ".join(pars))
return text
[docs] def __getitem__(self, field):
"""
Returns the value associated to a field.
:param field: field
:return: value
:githublink:`%|py|67`
"""
key = "_col_" + field
if not hasattr(self, key):
raise ValueError("Unable to find attribute '{0}'.".format(field))
return getattr(self, key)
[docs]class Display(Base):
"""
Defines how an activity should be displayed.
:githublink:`%|py|77`
"""
[docs] def __init__(self, eid, name):
"""
:param eid: unique identifier
:param name: name
:githublink:`%|py|83`
"""
Base.__init__(self, eid, name)
[docs]class LanguageBase(Base):
"""
Base class for language specific content.
:githublink:`%|py|90`
"""
[docs] def __init__(self, eid, name, lang):
"""
:param eid: entity id
:param name: unique name (mostly for logging)
:param lang: language
:githublink:`%|py|97`
"""
Base.__init__(self, eid, name)
self._col_lang = lang
[docs]class Notion(LanguageBase):
"""
Defines what an activity intents to introduce.
:githublink:`%|py|105`
"""
[docs] def __init__(self, eid, name, lang, domain=None, level=None, depends=None,
content=None):
"""
:param eid: identifier
:param name: unique name
:param domain: domain (maths, ...)
:param lang: language
:param level: level, grade...
:param depends: is there any needed notion to know before knowing this one?,
should be a list of :class:`Notion <mathenjeu.activities.base_classes.Notion>`.
:param content: data
:githublink:`%|py|118`
"""
if depends is not None and not isinstance(depends, list):
depends = [depends]
LanguageBase.__init__(self, eid, name, lang)
self._col_domain = domain
self._col_level = level
self._col_depends = depends
self._col_content = content
[docs]class Activity(LanguageBase):
"""
Defines an activity, a question, a game...
:githublink:`%|py|131`
"""
[docs] def __init__(self, eid, name, lang, title, notion=None,
description=None, content=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 content: content
:githublink:`%|py|143`
"""
LanguageBase.__init__(self, eid, name, lang)
self._col_title = title
self._col_notion = notion
self._col_description = description
self._col_content = content
[docs]class ActivityGroup(Base):
"""
Defines a set of activities.
:githublink:`%|py|154`
"""
[docs] def __init__(self, eid, name, acts=None):
"""
:param eid: identifier
:param name: unique name
:param acts: set of activities
:githublink:`%|py|161`
"""
Base.__init__(self, eid, name)
if acts is None:
self._col_acts = []
elif isinstance(acts, list):
self._col_acts = acts
else:
raise TypeError("Activities must be defined as a list.")
[docs] def __len__(self):
"""
Returns the number of activities.
:githublink:`%|py|173`
"""
return len(self._col_acts)
[docs] def __iter__(self):
"""
To iterate on activities.
:githublink:`%|py|179`
"""
return self._col_acts.__iter__()
[docs] def __getitem__(self, item):
"""
Retrieves the question.
:param item: item
:return: :class:`Activity <mathenjeu.activities.base_classes.Activity>`
:githublink:`%|py|188`
"""
if not isinstance(item, int):
try:
ii = int(item)
except ValueError:
raise ValueError( # pylint: disable=W0707
"Unable to retrieve question '{0}'.".format(item))
else:
ii = item
return self._col_acts[ii]
[docs] def get_previous(self, current):
"""
Computes the previous question or returns None
if does not exist.
:param current: previous question
:return: next question or None
:githublink:`%|py|207`
"""
try:
r = int(current)
except ValueError:
r = len(self)
return (r - 1) if r > 0 else None
[docs] def get_next(self, current):
"""
Computes the next question or returns None
if does not exist.
:param current: current question
:return: next question or None
:githublink:`%|py|221`
"""
try:
r = int(current)
except ValueError:
r = len(self)
return (r + 1) if r < len(self) - 1 else None
[docs] def get_display_item(self, item):
"""
Returns a displayable number.
:param item: item number
:return: string
:githublink:`%|py|234`
"""
if isinstance(item, int):
return str(item + 1) # items starts at 0
if isinstance(item, str):
try:
return self.get_display_item(int(item))
except ValueError:
return item
raise TypeError("Unable to interpret '{0}'.".format(item))
[docs] def expected_answers(self):
"""
Returns the expected answers aliases.
:githublink:`%|py|247`
"""
res = []
for i, qu in enumerate(self):
exp = qu.ExpectedAnswers
full = ["%s-%d-%s" % (self._col_name, i, r) for r in exp]
res.append(full)
return res