def submit_assignment(self, course_id, assignment_id): with self.get_assignment_dir_config() as config: try: config = self.load_config() config.CourseDirectory.course_id = course_id config.CourseDirectory.assignment_id = assignment_id coursedir = CourseDirectory(config=config) authenticator = Authenticator(config=config) submit = ExchangeFactory(config=config).Submit( coursedir=coursedir, authenticator=authenticator, config=config) retval = submit.start() hashcode = 'Exchange not set up for hashcode' timestamp = 'Exchange not set up for timestamp' if retval and len(retval) == 2: hashcode, timestamp = retval except: self.log.error(traceback.format_exc()) retvalue = {"success": False, "value": traceback.format_exc()} else: retvalue = { "success": True, "hashcode": hashcode, "timestamp": timestamp } self.log.info(retvalue) return retvalue
def list_released_assignments(self, course_id=None): with self.get_assignment_dir_config() as config: try: if course_id: config.CourseDirectory.course_id = course_id coursedir = CourseDirectory(config=config) authenticator = Authenticator(config=config) lister = ExchangeFactory(config=config).List( coursedir=coursedir, authenticator=authenticator, config=config) assignments = lister.start() except Exception as e: self.log.error(traceback.format_exc()) if isinstance(e, ExchangeError): retvalue = { "success": False, "value": """The exchange directory does not exist and could not be created. The "release" and "collect" functionality will not be available. Please see the documentation on http://nbgrader.readthedocs.io/en/stable/user_guide/managing_assignment_files.html#setting-up-the-exchange for instructions. """ } else: retvalue = { "success": False, "value": traceback.format_exc() } else: for assignment in assignments: if assignment['status'] == 'fetched': assignment['path'] = os.path.relpath( assignment['path'], self.parent.notebook_dir) for notebook in assignment['notebooks']: notebook['path'] = os.path.relpath( notebook['path'], self.parent.notebook_dir) retvalue = { "success": True, "value": sorted(assignments, key=lambda x: (x['course_id'], x['assignment_id'])) } return retvalue
def list_submitted_assignments(self, course_id=None): with self.get_assignment_dir_config() as config: try: config.ExchangeList.cached = True if course_id: config.CourseDirectory.course_id = course_id coursedir = CourseDirectory(config=config) authenticator = Authenticator(config=config) lister = ExchangeFactory(config=config).List( coursedir=coursedir, authenticator=authenticator, config=config) assignments = lister.start() except Exception as e: self.log.error(traceback.format_exc()) if isinstance(e, ExchangeError): retvalue = { "success": False, "value": """The exchange directory does not exist and could not be created. The "release" and "collect" functionality will not be available. Please see the documentation on http://nbgrader.readthedocs.io/en/stable/user_guide/managing_assignment_files.html#setting-up-the-exchange for instructions. """ } else: retvalue = { "success": False, "value": traceback.format_exc() } else: for assignment in assignments: assignment["submissions"] = sorted( assignment["submissions"], key=lambda x: x["timestamp"]) assignments = sorted(assignments, key=lambda x: x["assignment_id"]) retvalue = {"success": True, "value": assignments} return retvalue
def submit_assignment(self, course_id, assignment_id): with self.get_assignment_dir_config() as config: try: config = self.load_config() config.CourseDirectory.course_id = course_id config.CourseDirectory.assignment_id = assignment_id coursedir = CourseDirectory(config=config) authenticator = Authenticator(config=config) submit = ExchangeFactory(config=config).Submit( coursedir=coursedir, authenticator=authenticator, config=config) submit.start() except: self.log.error(traceback.format_exc()) retvalue = {"success": False, "value": traceback.format_exc()} else: retvalue = {"success": True} return retvalue
def get_assignment_dir_config(self): # first get the exchange assignment directory with chdir(self.parent.notebook_dir): config = self.load_config() lister = ExchangeFactory(config=config).List(config=config) assignment_dir = lister.assignment_dir # now cd to the full assignment directory and load the config again with chdir(assignment_dir): app = NbGrader() app.config_file_paths.append(os.getcwd()) app.load_config_file() yield app.config
def start(self) -> None: super(NbGrader, self).start() self.authenticator = Authenticator(parent=self) self.exchange = ExchangeFactory(parent=self)