# -*- coding: utf-8 -*-
#
# This file is part of INGInious. See the LICENSE and the COPYRIGHTS files for
# more information about the licensing of this file.
""" Classes modifying basic tasks, problems and boxes classes """
import gettext
from inginious.frontend.parsable_text import ParsableText
from inginious.common.base import id_checker
from inginious.common.tasks import Task
from inginious.frontend.accessible_time import AccessibleTime
from inginious.common.tags import Tag
[docs]class WebAppTask(Task):
""" A task that stores additional context information, specific to the web app """
def __init__(self, course, taskid, content, task_fs, hook_manager, task_problem_types):
# We load the descriptor of the task here to allow plugins to modify settings of the task before it is read by the Task constructor
if not id_checker(taskid):
raise Exception("Task with invalid id: " + course.get_id() + "/" + taskid)
super(WebAppTask, self).__init__(course, taskid, content, task_fs, hook_manager, task_problem_types)
self._name = self._data.get('name', 'Task {}'.format(self.get_id()))
self._context = self._data.get('context', "")
# Authors
if isinstance(self._data.get('author'), str): # verify if author is a string
self._author = self._data['author']
else:
self._author = ""
# Submission storage
self._stored_submissions = int(self._data.get("stored_submissions", 0))
# Default download
self._evaluate = self._data.get("evaluate", "best")
# Grade weight
self._weight = float(self._data.get("weight", 1.0))
# _accessible
self._accessible = AccessibleTime(self._data.get("accessible", None))
# Group task
self._groups = bool(self._data.get("groups", False))
# Submission limits
self._submission_limit = self._data.get("submission_limit", {"amount": -1, "period": -1})
# Input random
self._input_random = int(self._data.get("input_random", 0))
# Regenerate input random
self._regenerate_input_random = bool(self._data.get("regenerate_input_random", False))
# Tags
self._tags = Tag.create_tags_from_dict(self._data.get("tags", {}))
[docs] def get_grading_weight(self):
""" Get the relative weight of this task in the grading """
return self._weight
[docs] def get_accessible_time(self, plugin_override=True):
""" Get the accessible time of this task """
vals = self._hook_manager.call_hook('task_accessibility', course=self.get_course(), task=self, default=self._accessible)
return vals[0] if len(vals) and plugin_override else self._accessible
[docs] def is_visible_by_students(self):
""" Returns true if the task is accessible by all students that are not administrator of the course """
return self.get_course().is_open_to_non_staff() and self.get_accessible_time().after_start()
[docs] def get_deadline(self):
""" Returns a string containing the deadline for this task """
if self.get_accessible_time().is_always_accessible():
return _("No deadline")
elif self.get_accessible_time().is_never_accessible():
return _("It's too late")
else:
return self.get_accessible_time().get_end_date().strftime("%d/%m/%Y %H:%M:%S")
[docs] def is_group_task(self):
""" Indicates if the task submission mode is per groups """
return self._groups
[docs] def get_submission_limit(self):
""" Returns the submission limits et for the task"""
return self._submission_limit
[docs] def get_name(self, language):
""" Returns the name of this task """
return self.gettext(language, self._name) if self._name else ""
[docs] def get_context(self, language):
""" Get the context(description) of this task """
context = self.gettext(language, self._context) if self._context else ""
vals = self._hook_manager.call_hook('task_context', course=self.get_course(), task=self, default=context)
return ParsableText(vals[0], "rst", self._translations.get(language, gettext.NullTranslations())) if len(vals) else \
ParsableText(context, "rst", self._translations.get(language, gettext.NullTranslations()))
[docs] def get_authors(self, language):
""" Return the list of this task's authors """
return self.gettext(language, self._author) if self._author else ""
[docs] def get_stored_submissions(self):
""" Indicates if only the last submission must be stored for the task """
return self._stored_submissions
[docs] def get_evaluate(self):
""" Indicates the default download for the task """
return self._evaluate