Loading portal/async_celery/tasks.py +5 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ def process_submission(new_submission_id: str): new_submission = rest_service.find.submission(new_submission_id) project = new_submission.project course = project.course log.info(f"[SUBMIT] Processing submission: {new_submission.log_name}") if not project.config.test_files_commit_hash: log.warning(f"Project test files not found: {project.log_name}") update_project_test_files(course_id=course.id, project_id=project.id) Loading @@ -28,6 +29,8 @@ def upload_results_to_storage(new_submission_id: str, path: str): from portal.service.rest import RestService rest_service = RestService() new_submission = rest_service.find.submission(new_submission_id) log.info(f"[SUBMIT] Processing results - upload to the storage for " f"{new_submission.log_name}: {path}") processor = submission_processor.SubmissionProcessor(new_submission) file_params = dict(source=dict(url=path, type='zip')) processor.upload_result(path=path, file_params=file_params) Loading @@ -41,6 +44,7 @@ def clone_submission_files(source_id: str, target_id: str): rest_service = RestService() source = rest_service.find.submission(source_id) target = rest_service.find.submission(target_id) log.info(f"[SUBMIT] Copy submission files: {source.log_name} -> {target.log_name}") processor = submission_processor.SubmissionProcessor(source) processor.clone(target) Loading @@ -49,8 +53,8 @@ def clone_submission_files(source_id: str, target_id: str): def start_processing_submission(submission_id: str, submission_params): from portal.service.rest import RestService rest_service = RestService() submission = rest_service.find.submission(submission_id) log.info(f"[SUBMIT] Processing submission - send to worker: {submission.log_name}") processor = submission_processor.SubmissionProcessor(submission, submission_params) processor.send_to_worker() Loading portal/rest/courses.py +6 −3 Original line number Diff line number Diff line Loading @@ -33,8 +33,8 @@ class CourseList(CustomResource): @access_log def post(self): self.permissions.require.sysadmin() data = rest_helpers.parse_request_data(resource='course', action='create') log.info(f"[REST] Create new course by {self.client.log_name}: {data} ") new_course = self.rest.courses.create(**data) return SCHEMAS.dump('course', new_course), 201 Loading Loading @@ -70,6 +70,7 @@ class CourseResource(CustomResource): def delete(self, cid: str): self.permissions.require.sysadmin() course = self.rest.find.course(cid) log.info(f"[REST] Delete course {course.log_name} by {self.client.log_name}") self.rest.courses(course).delete() return '', 204 Loading @@ -81,8 +82,8 @@ class CourseResource(CustomResource): course = self.rest.find.course(cid) # authorization self.permissions(course=course).require.update_course() data = rest_helpers.parse_request_data(action='update', resource='course', partial=True) log.info(f"[REST] Update course by {self.client.log_name}: {data} ") self.rest.courses(course).update(**data) return '', 204 Loading Loading @@ -112,7 +113,7 @@ class CourseNotesToken(CustomResource): self.permissions(course=course).require.course_access_token() json_data = rest_helpers.require_data(action='update_notes_token', resource='course') log.info(f"[REST] Update course access token by {self.client.log_name}: {json_data} ") self.rest.courses(course).update_notes_token(json_data['token']) return '', 204 Loading Loading @@ -140,6 +141,8 @@ class CourseImport(CustomResource): 400, f'[IMPORT] Cannot import course to itself. (id: {cid})') config = data['config'] log.info(f"[REST] Import course by {self.client.log_name} " f"from {source_course}: {config} ") copied_course = self.rest.courses(course).copy_course(course, config) return SCHEMAS.dump('course', copied_course) Loading portal/rest/custom_resource.py +4 −0 Original line number Diff line number Diff line Loading @@ -19,3 +19,7 @@ class CustomResource(Resource): @property def permissions(self) -> PermissionsService: return self.rest.permissions @property def client(self): return self.rest.auth.client portal/rest/gitlab.py +1 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ def user_oauth_register(user_info): email=user_info['email'], is_admin=False ) log.debug(f"[GITLAB] Created user={new_user}") log.info(f"[GITLAB] Created user={new_user}") return new_user Loading portal/rest/groups.py +14 −3 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ class GroupsList(CustomResource): self.permissions(course=course).require.update_course() data = rest_helpers.parse_request_data(action='create', resource='group') log.info(f"[REST] Create new group by {self.client.log_name} in {course.log_name}: {data}") new_group = self.rest.groups.create(course, **data) return SCHEMAS.dump('group', new_group), 201 Loading Loading @@ -64,8 +64,8 @@ class GroupResource(CustomResource): course = self.find.course(cid) # authorization self.permissions(course=course).require.update_course() group = self.find.group(course, gid) log.info(f"[REST] Delete group {group.log_name} by {self.client.log_name}") self.rest.groups(group).delete() return '', 204 Loading @@ -77,9 +77,9 @@ class GroupResource(CustomResource): course = self.find.course(cid) # authorization self.permissions(course=course).require.write_groups() data = rest_helpers.parse_request_data(action='update', resource='group', partial=True) group = self.find.group(course, gid) log.info(f"[REST] Update group {group.log_name} by {self.client.log_name}: {data}") self.rest.groups(group).update(**data) return '', 204 Loading Loading @@ -116,6 +116,8 @@ class GroupUsersList(CustomResource): ) group = self.find.group(course, gid) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}: {data}") # everything from users_add is added, THEN everything from users_remove # is removed self.rest.groups(group).update_membership(data) Loading Loading @@ -144,6 +146,8 @@ class GroupAddOrDeleteSingleUser(CustomResource): group = self.find.group(course, gid) user = self.find.user(uid) self.rest.groups(group).add_user(user) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, add user {user.log_name}") return '', 204 @jwt_required Loading @@ -158,6 +162,8 @@ class GroupAddOrDeleteSingleUser(CustomResource): group = self.find.group(course, gid) user = self.find.user(uid) self.rest.groups(group).remove_user(user) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, remove user {user.log_name}") return '', 204 Loading Loading @@ -200,6 +206,8 @@ class GroupAddOrDeleteProject(CustomResource): group = self.find.group(course, gid) project = self.find.project(course, pid) self.rest.groups(group).add_project(project) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, add project {project.log_name}") return '', 204 @jwt_required Loading @@ -216,6 +224,8 @@ class GroupAddOrDeleteProject(CustomResource): group = self.find.group(course, gid) project = self.find.project(course, pid) self.rest.groups(group).remove_project(project) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, remove project {project.log_name}") return '', 204 Loading @@ -235,5 +245,6 @@ class GroupImport(CustomResource): data = rest_helpers.parse_request_data( schema=SCHEMAS.group_import, action='import', resource='group' ) log.info(f"[REST] Group import by {self.client.log_name}: {data}") new_group = self.rest.groups.import_group(data, target_course) return SCHEMAS.dump('group', new_group), 201 Loading
portal/async_celery/tasks.py +5 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ def process_submission(new_submission_id: str): new_submission = rest_service.find.submission(new_submission_id) project = new_submission.project course = project.course log.info(f"[SUBMIT] Processing submission: {new_submission.log_name}") if not project.config.test_files_commit_hash: log.warning(f"Project test files not found: {project.log_name}") update_project_test_files(course_id=course.id, project_id=project.id) Loading @@ -28,6 +29,8 @@ def upload_results_to_storage(new_submission_id: str, path: str): from portal.service.rest import RestService rest_service = RestService() new_submission = rest_service.find.submission(new_submission_id) log.info(f"[SUBMIT] Processing results - upload to the storage for " f"{new_submission.log_name}: {path}") processor = submission_processor.SubmissionProcessor(new_submission) file_params = dict(source=dict(url=path, type='zip')) processor.upload_result(path=path, file_params=file_params) Loading @@ -41,6 +44,7 @@ def clone_submission_files(source_id: str, target_id: str): rest_service = RestService() source = rest_service.find.submission(source_id) target = rest_service.find.submission(target_id) log.info(f"[SUBMIT] Copy submission files: {source.log_name} -> {target.log_name}") processor = submission_processor.SubmissionProcessor(source) processor.clone(target) Loading @@ -49,8 +53,8 @@ def clone_submission_files(source_id: str, target_id: str): def start_processing_submission(submission_id: str, submission_params): from portal.service.rest import RestService rest_service = RestService() submission = rest_service.find.submission(submission_id) log.info(f"[SUBMIT] Processing submission - send to worker: {submission.log_name}") processor = submission_processor.SubmissionProcessor(submission, submission_params) processor.send_to_worker() Loading
portal/rest/courses.py +6 −3 Original line number Diff line number Diff line Loading @@ -33,8 +33,8 @@ class CourseList(CustomResource): @access_log def post(self): self.permissions.require.sysadmin() data = rest_helpers.parse_request_data(resource='course', action='create') log.info(f"[REST] Create new course by {self.client.log_name}: {data} ") new_course = self.rest.courses.create(**data) return SCHEMAS.dump('course', new_course), 201 Loading Loading @@ -70,6 +70,7 @@ class CourseResource(CustomResource): def delete(self, cid: str): self.permissions.require.sysadmin() course = self.rest.find.course(cid) log.info(f"[REST] Delete course {course.log_name} by {self.client.log_name}") self.rest.courses(course).delete() return '', 204 Loading @@ -81,8 +82,8 @@ class CourseResource(CustomResource): course = self.rest.find.course(cid) # authorization self.permissions(course=course).require.update_course() data = rest_helpers.parse_request_data(action='update', resource='course', partial=True) log.info(f"[REST] Update course by {self.client.log_name}: {data} ") self.rest.courses(course).update(**data) return '', 204 Loading Loading @@ -112,7 +113,7 @@ class CourseNotesToken(CustomResource): self.permissions(course=course).require.course_access_token() json_data = rest_helpers.require_data(action='update_notes_token', resource='course') log.info(f"[REST] Update course access token by {self.client.log_name}: {json_data} ") self.rest.courses(course).update_notes_token(json_data['token']) return '', 204 Loading Loading @@ -140,6 +141,8 @@ class CourseImport(CustomResource): 400, f'[IMPORT] Cannot import course to itself. (id: {cid})') config = data['config'] log.info(f"[REST] Import course by {self.client.log_name} " f"from {source_course}: {config} ") copied_course = self.rest.courses(course).copy_course(course, config) return SCHEMAS.dump('course', copied_course) Loading
portal/rest/custom_resource.py +4 −0 Original line number Diff line number Diff line Loading @@ -19,3 +19,7 @@ class CustomResource(Resource): @property def permissions(self) -> PermissionsService: return self.rest.permissions @property def client(self): return self.rest.auth.client
portal/rest/gitlab.py +1 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ def user_oauth_register(user_info): email=user_info['email'], is_admin=False ) log.debug(f"[GITLAB] Created user={new_user}") log.info(f"[GITLAB] Created user={new_user}") return new_user Loading
portal/rest/groups.py +14 −3 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ class GroupsList(CustomResource): self.permissions(course=course).require.update_course() data = rest_helpers.parse_request_data(action='create', resource='group') log.info(f"[REST] Create new group by {self.client.log_name} in {course.log_name}: {data}") new_group = self.rest.groups.create(course, **data) return SCHEMAS.dump('group', new_group), 201 Loading Loading @@ -64,8 +64,8 @@ class GroupResource(CustomResource): course = self.find.course(cid) # authorization self.permissions(course=course).require.update_course() group = self.find.group(course, gid) log.info(f"[REST] Delete group {group.log_name} by {self.client.log_name}") self.rest.groups(group).delete() return '', 204 Loading @@ -77,9 +77,9 @@ class GroupResource(CustomResource): course = self.find.course(cid) # authorization self.permissions(course=course).require.write_groups() data = rest_helpers.parse_request_data(action='update', resource='group', partial=True) group = self.find.group(course, gid) log.info(f"[REST] Update group {group.log_name} by {self.client.log_name}: {data}") self.rest.groups(group).update(**data) return '', 204 Loading Loading @@ -116,6 +116,8 @@ class GroupUsersList(CustomResource): ) group = self.find.group(course, gid) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}: {data}") # everything from users_add is added, THEN everything from users_remove # is removed self.rest.groups(group).update_membership(data) Loading Loading @@ -144,6 +146,8 @@ class GroupAddOrDeleteSingleUser(CustomResource): group = self.find.group(course, gid) user = self.find.user(uid) self.rest.groups(group).add_user(user) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, add user {user.log_name}") return '', 204 @jwt_required Loading @@ -158,6 +162,8 @@ class GroupAddOrDeleteSingleUser(CustomResource): group = self.find.group(course, gid) user = self.find.user(uid) self.rest.groups(group).remove_user(user) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, remove user {user.log_name}") return '', 204 Loading Loading @@ -200,6 +206,8 @@ class GroupAddOrDeleteProject(CustomResource): group = self.find.group(course, gid) project = self.find.project(course, pid) self.rest.groups(group).add_project(project) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, add project {project.log_name}") return '', 204 @jwt_required Loading @@ -216,6 +224,8 @@ class GroupAddOrDeleteProject(CustomResource): group = self.find.group(course, gid) project = self.find.project(course, pid) self.rest.groups(group).remove_project(project) log.info(f"[REST] Update group membership {group.log_name} by " f"{self.client.log_name}, remove project {project.log_name}") return '', 204 Loading @@ -235,5 +245,6 @@ class GroupImport(CustomResource): data = rest_helpers.parse_request_data( schema=SCHEMAS.group_import, action='import', resource='group' ) log.info(f"[REST] Group import by {self.client.log_name}: {data}") new_group = self.rest.groups.import_group(data, target_course) return SCHEMAS.dump('group', new_group), 201