def get_user_grade(self): """ Returns the grade (a floating-point number between 0 and 100) of the student """ import frontend.user as User # insert here to avoid initialisation of session task_cache = User.get_data().get_task_data(self.get_course_id(), self.get_id()) if task_cache is None: return 0.0 return task_cache.get("grade", 0.0)
def get_user_status(self): """ Returns "succeeded" if the current user solved this task, "failed" if he failed, and "notattempted" if he did not try it yet """ import frontend.user as User # insert here to avoid initialisation of session task_cache = User.get_data().get_task_data(self.get_course_id(), self.get_id()) if task_cache is None: return "notviewed" if task_cache["tried"] == 0: return "notattempted" return "succeeded" if task_cache["succeeded"] else "failed"
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)