def GET(self): """ GET request """ if User.is_logged_in(): user_input = web.input() if "logoff" in user_input: User.disconnect() return renderer.index(False) else: return self.call_main() else: return renderer.index(False)
def POST(self): """ POST request: login """ user_input = web.input() if "@authid" in user_input: # connect if User.connect(int(user_input["@authid"]), user_input): return self.call_main() else: return renderer.index(True) elif User.is_logged_in(): # register for a course return self.call_main() else: return renderer.index(False)
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 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)