Source code for inginious.frontend.pages.course

# -*- 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.

""" Course page """
import flask
from flask import session, redirect, render_template, url_for
from werkzeug.exceptions import NotFound

from inginious.frontend.courses import Course
from inginious.frontend.pages.utils import INGIniousAuthPage
from inginious.frontend.models import UserTask


[docs] def handle_course_unavailable(user_manager, course): """ Displays the course_unavailable page or the course registration page """ reason = user_manager.course_is_open_to_user(course, lti=False, return_reason=True) if reason == "unregistered_not_previewable": user_info = user_manager.get_user_info(session.username) if course.is_registration_possible(user_info): return redirect(url_for("courseregisterpage", courseid=course.get_id())) return render_template("course_unavailable.html", reason=reason)
[docs] class CoursePage(INGIniousAuthPage): """ Course page """
[docs] def preview_allowed(self, courseid): course = self.get_course(courseid) return course.get_accessibility().is_open() and course.allow_preview()
[docs] def get_course(self, courseid): """ Return the course """ try: course = Course.get(courseid) except: raise NotFound(description=_("Course not found.")) return course
[docs] def POST_AUTH(self, courseid): # pylint: disable=arguments-differ """ POST request """ course = self.get_course(courseid) user_input = flask.request.form if "unregister" in user_input and course.allow_unregister(): self.user_manager.course_unregister_user(courseid, session.username) return redirect(url_for('mycoursespage')) return self.show_page(course)
[docs] def GET_AUTH(self, courseid): # pylint: disable=arguments-differ """ GET request """ course = self.get_course(courseid) return self.show_page(course)
[docs] def show_page(self, course): """ Prepares and shows the course page """ username = session.username if not self.user_manager.course_is_open_to_user(course, lti=False): return handle_course_unavailable(self.user_manager, course) else: tasks = course.get_tasks() user_task_list = course.get_task_dispenser().get_user_task_list([username])[username] # Get 5 last submissions last_submissions = [] for submission in self.submission_manager.get_user_last_submissions(5, {"courseid": course.get_id(), "taskid__in": user_task_list}): submission["taskname"] = tasks[submission['taskid']].get_name(session.language) last_submissions.append(submission) # Compute course/tasks scores tasks_data = {taskid: {"succeeded": False, "grade": 0.0} for taskid in user_task_list} user_tasks = UserTask.objects(username=username, courseid=course.get_id(), taskid__in=user_task_list) for user_task in user_tasks: tasks_data[user_task["taskid"]]["succeeded"] = user_task["succeeded"] tasks_data[user_task["taskid"]]["grade"] = user_task["grade"] course_grade = course.get_task_dispenser().get_course_grade(user_tasks, username) # Get tag list categories = course.get_task_dispenser().get_all_categories() # Get user info user_info = self.user_manager.get_user_info(username) return render_template("course.html", user_info=user_info, course=course, submissions=last_submissions, tasks_data=tasks_data, grade=course_grade, category_filter_list=categories)