Coverage for e2xgrader/server_extensions/apps/assignment_list/handlers.py: 33%
66 statements
« prev ^ index » next coverage.py v7.4.2, created at 2024-03-14 13:22 +0100
« prev ^ index » next coverage.py v7.4.2, created at 2024-03-14 13:22 +0100
1import contextlib
2import json
3import os
4import traceback
6from nbgrader.auth import Authenticator
7from nbgrader.coursedir import CourseDirectory
8from nbgrader.exchange import ExchangeFactory
9from nbgrader.server_extensions.assignment_list.handlers import (
10 AssignmentList,
11 AssignmentListHandler,
12 BaseAssignmentHandler,
13 CourseListHandler,
14 NbGraderVersionHandler,
15)
16from nbgrader.utils import get_username
17from tornado import web
20@contextlib.contextmanager
21def chdir(dirname):
22 currdir = os.getcwd()
23 os.chdir(dirname)
24 yield
25 os.chdir(currdir)
28class E2xAssignmentList(AssignmentList):
29 def submit_assignment(self, course_id, assignment_id):
30 with self.get_assignment_dir_config() as config:
31 try:
32 config = self.load_config()
33 config.CourseDirectory.course_id = course_id
34 config.CourseDirectory.assignment_id = assignment_id
36 coursedir = CourseDirectory(config=config)
37 authenticator = Authenticator(config=config)
38 submit = ExchangeFactory(config=config).Submit(
39 coursedir=coursedir, authenticator=authenticator, config=config
40 )
42 retval = submit.start()
43 hashcode = "Exchange not set up for hashcode"
44 timestamp = "Exchange not set up for timestamp"
45 if retval and len(retval) == 2:
46 hashcode, timestamp = retval
48 except Exception:
49 self.log.error(traceback.format_exc())
50 retvalue = {"success": False, "value": traceback.format_exc()}
52 else:
53 retvalue = {
54 "success": True,
55 "hashcode": hashcode,
56 "timestamp": timestamp,
57 }
59 self.log.info(retvalue)
61 return retvalue
64class AssignmentActionHandler(BaseAssignmentHandler):
65 @web.authenticated
66 def post(self, action):
67 if action == "fetch":
68 assignment_id = self.get_argument("assignment_id")
69 course_id = self.get_argument("course_id")
70 self.manager.fetch_assignment(course_id, assignment_id)
71 self.finish(json.dumps(self.manager.list_assignments(course_id=course_id)))
72 elif action == "submit":
73 assignment_id = self.get_argument("assignment_id")
74 course_id = self.get_argument("course_id")
75 output = self.manager.submit_assignment(course_id, assignment_id)
76 if output["success"]:
77 response = self.manager.list_assignments(course_id=course_id)
78 response["hashcode"] = output["hashcode"]
79 response["timestamp"] = output["timestamp"]
80 self.finish(json.dumps(response))
81 else:
82 self.finish(json.dumps(output))
83 elif action == "fetch_feedback":
84 assignment_id = self.get_argument("assignment_id")
85 course_id = self.get_argument("course_id")
86 self.manager.fetch_feedback(course_id, assignment_id)
87 self.finish(json.dumps(self.manager.list_assignments(course_id=course_id)))
90class UsernameHandler(BaseAssignmentHandler):
91 @web.authenticated
92 def get(self):
93 self.finish(json.dumps({"username": get_username()}))
96# -----------------------------------------------------------------------------
97# URL to handler mappings
98# -----------------------------------------------------------------------------
101_assignment_action_regex = r"(?P<action>fetch|submit|fetch_feedback)"
103default_handlers = [
104 (r"/assignments", AssignmentListHandler),
105 (r"/assignments/%s" % _assignment_action_regex, AssignmentActionHandler),
106 (r"/courses", CourseListHandler),
107 (r"/nbgrader_version", NbGraderVersionHandler),
108 (r"/nbgrader_username", UsernameHandler),
109]