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

1import contextlib 

2import json 

3import os 

4import traceback 

5 

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 

18 

19 

20@contextlib.contextmanager 

21def chdir(dirname): 

22 currdir = os.getcwd() 

23 os.chdir(dirname) 

24 yield 

25 os.chdir(currdir) 

26 

27 

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 

35 

36 coursedir = CourseDirectory(config=config) 

37 authenticator = Authenticator(config=config) 

38 submit = ExchangeFactory(config=config).Submit( 

39 coursedir=coursedir, authenticator=authenticator, config=config 

40 ) 

41 

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 

47 

48 except Exception: 

49 self.log.error(traceback.format_exc()) 

50 retvalue = {"success": False, "value": traceback.format_exc()} 

51 

52 else: 

53 retvalue = { 

54 "success": True, 

55 "hashcode": hashcode, 

56 "timestamp": timestamp, 

57 } 

58 

59 self.log.info(retvalue) 

60 

61 return retvalue 

62 

63 

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))) 

88 

89 

90class UsernameHandler(BaseAssignmentHandler): 

91 @web.authenticated 

92 def get(self): 

93 self.finish(json.dumps({"username": get_username()})) 

94 

95 

96# ----------------------------------------------------------------------------- 

97# URL to handler mappings 

98# ----------------------------------------------------------------------------- 

99 

100 

101_assignment_action_regex = r"(?P<action>fetch|submit|fetch_feedback)" 

102 

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]