def GET(self, courseid, taskid, path): """ GET request """ if User.is_logged_in(): try: course = FrontendCourse(courseid) if not course.is_open_to_user(User.get_username()): return renderer.course_unavailable() task = course.get_task(taskid) if not task.is_visible_by_user(User.get_username()): return renderer.task_unavailable() path_norm = posixpath.normpath(urllib.unquote(path)) public_folder_path = os.path.normpath(os.path.realpath(os.path.join(INGIniousConfiguration["tasks_directory"], courseid, taskid, "public"))) file_path = os.path.normpath(os.path.realpath(os.path.join(public_folder_path, path_norm))) # Verify that we are still inside the public directory if os.path.normpath(os.path.commonprefix([public_folder_path, file_path])) != public_folder_path: raise web.notfound() if os.path.isfile(file_path): mimetypes.init() mime_type = mimetypes.guess_type(file_path) web.header('Content-Type', mime_type[0]) with open(file_path) as static_file: return static_file.read() else: raise web.notfound() except: if web.config.debug: raise else: raise web.notfound() else: return renderer.index(False)
def GET(self, courseid): """ GET request """ if User.is_logged_in(): try: course = FrontendCourse(courseid) if not course.is_open_to_user(User.get_username()): return renderer.course_unavailable() last_submissions = course.get_user_last_submissions(one_per_task=True) except_free_last_submissions = [] for submission in last_submissions: try: submission["task"] = course.get_task(submission['taskid']) except_free_last_submissions.append(submission) except: pass return renderer.course(course, except_free_last_submissions) except: if web.config.debug: raise else: raise web.notfound() else: return renderer.index(False)
def GET(self, courseid): """ GET request """ if User.is_logged_in(): try: course = FrontendCourse(courseid) registration_uncomplete = not course.is_open_to_user(User.get_username(), course.is_group_course()) if registration_uncomplete and course.can_students_choose_group(): raise web.seeother("/group/"+courseid) elif registration_uncomplete: return renderer.course_unavailable() last_submissions = course.get_user_last_submissions(one_per_task=True) except_free_last_submissions = [] for submission in last_submissions: try: submission["task"] = course.get_task(submission['taskid']) except_free_last_submissions.append(submission) except: pass return renderer.course(course, except_free_last_submissions) except: if web.config.debug: raise else: raise web.notfound() else: return renderer.index(False)
def call_main(self): """ Display main page (only when logged) """ username = User.get_username() # Handle registration to a course user_input = web.input() registration_status = None if "register_courseid" in user_input and user_input["register_courseid"] != "": try: course = FrontendCourse(user_input["register_courseid"]) if not course.is_registration_possible(username): registration_status = False else: registration_status = course.register_user(username, user_input.get("register_password", None)) if course.is_group_course() and course.can_students_choose_group(): raise web.seeother("/group/"+course.get_id()) except: registration_status = False if "unregister_courseid" in user_input: try: course = FrontendCourse(user_input["unregister_courseid"]) course.unregister_user(username) except: pass # Display last_submissions = get_user_last_submissions({}, 5, True) except_free_last_submissions = [] for submission in last_submissions: try: submission["task"] = FrontendCourse(submission['courseid']).get_task(submission['taskid']) except_free_last_submissions.append(submission) except: pass all_courses = FrontendCourse.get_all_courses() open_courses = {courseid: course for courseid, course in all_courses.iteritems() if course.is_open_to_user(username)} open_courses = OrderedDict(sorted(open_courses.iteritems(), key=lambda x: x[1].get_name())) registerable_courses = {courseid: course for courseid, course in all_courses.iteritems() if not course.is_open_to_user(username) and course.is_registration_possible(username)} registerable_courses = OrderedDict(sorted(registerable_courses.iteritems(), key=lambda x: x[1].get_name())) return renderer.main(open_courses, registerable_courses, except_free_last_submissions, registration_status)
def GET(self, courseid, taskid): """ GET request """ if User.is_logged_in(): try: course = FrontendCourse(courseid) if not course.is_open_to_user(User.get_username()): return renderer.course_unavailable() task = course.get_task(taskid) if not task.is_visible_by_user(User.get_username()): return renderer.task_unavailable() User.get_data().view_task(courseid, taskid) userinput = web.input() if "submissionid" in userinput and "questionid" in userinput: # Download a previously submitted file submission = submission_manager.get_submission(userinput["submissionid"], True) if submission is None: raise web.notfound() sinput = submission_manager.get_input_from_submission(submission, True) if userinput["questionid"] not in sinput: raise web.notfound() if isinstance(sinput[userinput["questionid"]], dict): # File uploaded previously mimetypes.init() mime_type = mimetypes.guess_type(urllib.pathname2url(sinput[userinput["questionid"]]['filename'])) web.header('Content-Type', mime_type[0]) return base64.b64decode(sinput[userinput["questionid"]]['value']) else: # Other file, download it as text web.header('Content-Type', 'text/plain') return sinput[userinput["questionid"]] else: # Display the task itself return renderer.task(course, task, submission_manager.get_user_submissions(task)) except: if web.config.debug: raise else: raise web.notfound() else: return renderer.index(False)
def POST(self, courseid, taskid): """ POST a new submission """ if User.is_logged_in(): try: course = FrontendCourse(courseid) if not course.is_open_to_user(User.get_username()): return renderer.course_unavailable() task = course.get_task(taskid) if not task.is_visible_by_user(User.get_username()): return renderer.task_unavailable() User.get_data().view_task(courseid, taskid) userinput = web.input() if "@action" in userinput and userinput["@action"] == "submit": # Verify rights if not task.can_user_submit(User.get_username()): return json.dumps({"status": "error", "text": "The deadline is over"}) # Reparse user input with array for multiple choices init_var = self.list_multiple_multiple_choices_and_files(task) userinput = task.adapt_input_for_backend(web.input(**init_var)) if not task.input_is_consistent(userinput): web.header('Content-Type', 'application/json') return json.dumps({"status": "error", "text": "Please answer to all the questions. Your responses were not tested."}) del userinput['@action'] # Get debug info if the current user is an admin debug = User.get_username() in course.get_admins() # Start the submission submissionid = submission_manager.add_job(task, userinput, debug) web.header('Content-Type', 'application/json') return json.dumps({"status": "ok", "submissionid": str(submissionid)}) elif "@action" in userinput and userinput["@action"] == "check" and "submissionid" in userinput: if submission_manager.is_done(userinput['submissionid']): web.header('Content-Type', 'application/json') result = submission_manager.get_submission(userinput['submissionid']) result = submission_manager.get_input_from_submission(result) return self.submission_to_json(result, User.get_username() in course.get_admins()) else: web.header('Content-Type', 'application/json') return json.dumps({'status': "waiting"}) elif "@action" in userinput and userinput["@action"] == "load_submission_input" and "submissionid" in userinput: submission = submission_manager.get_submission(userinput["submissionid"]) submission = submission_manager.get_input_from_submission(submission) if not submission: raise web.notfound() web.header('Content-Type', 'application/json') return self.submission_to_json(submission, (User.get_username() in course.get_admins()), True) else: raise web.notfound() except: if web.config.debug: raise else: raise web.notfound() else: return renderer.index(False)