Verified Commit 08ae94a4 authored by Peter Stanko's avatar Peter Stanko
Browse files

Extensive logging for the REST layer

parent 187a872e
...@@ -14,6 +14,7 @@ def process_submission(new_submission_id: str): ...@@ -14,6 +14,7 @@ def process_submission(new_submission_id: str):
new_submission = rest_service.find.submission(new_submission_id) new_submission = rest_service.find.submission(new_submission_id)
project = new_submission.project project = new_submission.project
course = project.course course = project.course
log.info(f"[SUBMIT] Processing submission: {new_submission.log_name}")
if not project.config.test_files_commit_hash: if not project.config.test_files_commit_hash:
log.warning(f"Project test files not found: {project.log_name}") log.warning(f"Project test files not found: {project.log_name}")
update_project_test_files(course_id=course.id, project_id=project.id) update_project_test_files(course_id=course.id, project_id=project.id)
...@@ -28,6 +29,8 @@ def upload_results_to_storage(new_submission_id: str, path: str): ...@@ -28,6 +29,8 @@ def upload_results_to_storage(new_submission_id: str, path: str):
from portal.service.rest import RestService from portal.service.rest import RestService
rest_service = RestService() rest_service = RestService()
new_submission = rest_service.find.submission(new_submission_id) 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) processor = submission_processor.SubmissionProcessor(new_submission)
file_params = dict(source=dict(url=path, type='zip')) file_params = dict(source=dict(url=path, type='zip'))
processor.upload_result(path=path, file_params=file_params) processor.upload_result(path=path, file_params=file_params)
...@@ -41,6 +44,7 @@ def clone_submission_files(source_id: str, target_id: str): ...@@ -41,6 +44,7 @@ def clone_submission_files(source_id: str, target_id: str):
rest_service = RestService() rest_service = RestService()
source = rest_service.find.submission(source_id) source = rest_service.find.submission(source_id)
target = rest_service.find.submission(target_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 = submission_processor.SubmissionProcessor(source)
processor.clone(target) processor.clone(target)
...@@ -49,8 +53,8 @@ def clone_submission_files(source_id: str, target_id: str): ...@@ -49,8 +53,8 @@ def clone_submission_files(source_id: str, target_id: str):
def start_processing_submission(submission_id: str, submission_params): def start_processing_submission(submission_id: str, submission_params):
from portal.service.rest import RestService from portal.service.rest import RestService
rest_service = RestService() rest_service = RestService()
submission = rest_service.find.submission(submission_id) 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 = submission_processor.SubmissionProcessor(submission, submission_params)
processor.send_to_worker() processor.send_to_worker()
......
...@@ -33,8 +33,8 @@ class CourseList(CustomResource): ...@@ -33,8 +33,8 @@ class CourseList(CustomResource):
@access_log @access_log
def post(self): def post(self):
self.permissions.require.sysadmin() self.permissions.require.sysadmin()
data = rest_helpers.parse_request_data(resource='course', action='create') 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) new_course = self.rest.courses.create(**data)
return SCHEMAS.dump('course', new_course), 201 return SCHEMAS.dump('course', new_course), 201
...@@ -70,6 +70,7 @@ class CourseResource(CustomResource): ...@@ -70,6 +70,7 @@ class CourseResource(CustomResource):
def delete(self, cid: str): def delete(self, cid: str):
self.permissions.require.sysadmin() self.permissions.require.sysadmin()
course = self.rest.find.course(cid) 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() self.rest.courses(course).delete()
return '', 204 return '', 204
...@@ -81,8 +82,8 @@ class CourseResource(CustomResource): ...@@ -81,8 +82,8 @@ class CourseResource(CustomResource):
course = self.rest.find.course(cid) course = self.rest.find.course(cid)
# authorization # authorization
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
data = rest_helpers.parse_request_data(action='update', resource='course', partial=True) 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) self.rest.courses(course).update(**data)
return '', 204 return '', 204
...@@ -112,7 +113,7 @@ class CourseNotesToken(CustomResource): ...@@ -112,7 +113,7 @@ class CourseNotesToken(CustomResource):
self.permissions(course=course).require.course_access_token() self.permissions(course=course).require.course_access_token()
json_data = rest_helpers.require_data(action='update_notes_token', resource='course') 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']) self.rest.courses(course).update_notes_token(json_data['token'])
return '', 204 return '', 204
...@@ -140,6 +141,8 @@ class CourseImport(CustomResource): ...@@ -140,6 +141,8 @@ class CourseImport(CustomResource):
400, f'[IMPORT] Cannot import course to itself. (id: {cid})') 400, f'[IMPORT] Cannot import course to itself. (id: {cid})')
config = data['config'] 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) copied_course = self.rest.courses(course).copy_course(course, config)
return SCHEMAS.dump('course', copied_course) return SCHEMAS.dump('course', copied_course)
......
...@@ -19,3 +19,7 @@ class CustomResource(Resource): ...@@ -19,3 +19,7 @@ class CustomResource(Resource):
@property @property
def permissions(self) -> PermissionsService: def permissions(self) -> PermissionsService:
return self.rest.permissions return self.rest.permissions
@property
def client(self):
return self.rest.auth.client
...@@ -98,7 +98,7 @@ def user_oauth_register(user_info): ...@@ -98,7 +98,7 @@ def user_oauth_register(user_info):
email=user_info['email'], email=user_info['email'],
is_admin=False is_admin=False
) )
log.debug(f"[GITLAB] Created user={new_user}") log.info(f"[GITLAB] Created user={new_user}")
return new_user return new_user
......
...@@ -34,7 +34,7 @@ class GroupsList(CustomResource): ...@@ -34,7 +34,7 @@ class GroupsList(CustomResource):
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
data = rest_helpers.parse_request_data(action='create', resource='group') 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) new_group = self.rest.groups.create(course, **data)
return SCHEMAS.dump('group', new_group), 201 return SCHEMAS.dump('group', new_group), 201
...@@ -64,8 +64,8 @@ class GroupResource(CustomResource): ...@@ -64,8 +64,8 @@ class GroupResource(CustomResource):
course = self.find.course(cid) course = self.find.course(cid)
# authorization # authorization
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
group = self.find.group(course, gid) 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() self.rest.groups(group).delete()
return '', 204 return '', 204
...@@ -77,9 +77,9 @@ class GroupResource(CustomResource): ...@@ -77,9 +77,9 @@ class GroupResource(CustomResource):
course = self.find.course(cid) course = self.find.course(cid)
# authorization # authorization
self.permissions(course=course).require.write_groups() self.permissions(course=course).require.write_groups()
data = rest_helpers.parse_request_data(action='update', resource='group', partial=True) data = rest_helpers.parse_request_data(action='update', resource='group', partial=True)
group = self.find.group(course, gid) 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) self.rest.groups(group).update(**data)
return '', 204 return '', 204
...@@ -116,6 +116,8 @@ class GroupUsersList(CustomResource): ...@@ -116,6 +116,8 @@ class GroupUsersList(CustomResource):
) )
group = self.find.group(course, gid) 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 # everything from users_add is added, THEN everything from users_remove
# is removed # is removed
self.rest.groups(group).update_membership(data) self.rest.groups(group).update_membership(data)
...@@ -144,6 +146,8 @@ class GroupAddOrDeleteSingleUser(CustomResource): ...@@ -144,6 +146,8 @@ class GroupAddOrDeleteSingleUser(CustomResource):
group = self.find.group(course, gid) group = self.find.group(course, gid)
user = self.find.user(uid) user = self.find.user(uid)
self.rest.groups(group).add_user(user) 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 return '', 204
@jwt_required @jwt_required
...@@ -158,6 +162,8 @@ class GroupAddOrDeleteSingleUser(CustomResource): ...@@ -158,6 +162,8 @@ class GroupAddOrDeleteSingleUser(CustomResource):
group = self.find.group(course, gid) group = self.find.group(course, gid)
user = self.find.user(uid) user = self.find.user(uid)
self.rest.groups(group).remove_user(user) 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 return '', 204
...@@ -200,6 +206,8 @@ class GroupAddOrDeleteProject(CustomResource): ...@@ -200,6 +206,8 @@ class GroupAddOrDeleteProject(CustomResource):
group = self.find.group(course, gid) group = self.find.group(course, gid)
project = self.find.project(course, pid) project = self.find.project(course, pid)
self.rest.groups(group).add_project(project) 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 return '', 204
@jwt_required @jwt_required
...@@ -216,6 +224,8 @@ class GroupAddOrDeleteProject(CustomResource): ...@@ -216,6 +224,8 @@ class GroupAddOrDeleteProject(CustomResource):
group = self.find.group(course, gid) group = self.find.group(course, gid)
project = self.find.project(course, pid) project = self.find.project(course, pid)
self.rest.groups(group).remove_project(project) 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 return '', 204
...@@ -235,5 +245,6 @@ class GroupImport(CustomResource): ...@@ -235,5 +245,6 @@ class GroupImport(CustomResource):
data = rest_helpers.parse_request_data( data = rest_helpers.parse_request_data(
schema=SCHEMAS.group_import, action='import', resource='group' 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) new_group = self.rest.groups.import_group(data, target_course)
return SCHEMAS.dump('group', new_group), 201 return SCHEMAS.dump('group', new_group), 201
...@@ -37,7 +37,8 @@ class ProjectsList(CustomResource): ...@@ -37,7 +37,8 @@ class ProjectsList(CustomResource):
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
data = rest_helpers.parse_request_data(action='create', resource='project') data = rest_helpers.parse_request_data(action='create', resource='project')
log.info(f"[REST] Create new project by {self.client.log_name} "
f"in {course.log_name}: {data}")
new_project = self.rest.projects.create(course, **data) new_project = self.rest.projects.create(course, **data)
return SCHEMAS.dump('project', new_project), 201 return SCHEMAS.dump('project', new_project), 201
...@@ -67,8 +68,8 @@ class ProjectResource(CustomResource): ...@@ -67,8 +68,8 @@ class ProjectResource(CustomResource):
course = self.find.course(cid) course = self.find.course(cid)
# authorization # authorization
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
project = self.find.project(course, pid) project = self.find.project(course, pid)
log.info(f"[REST] Delete project by {self.client.log_name}: {project.log_name}")
self.rest.projects(project).delete() self.rest.projects(project).delete()
return '', 204 return '', 204
...@@ -82,8 +83,8 @@ class ProjectResource(CustomResource): ...@@ -82,8 +83,8 @@ class ProjectResource(CustomResource):
self.permissions(course=course).require.write_projects() self.permissions(course=course).require.write_projects()
data = rest_helpers.parse_request_data(action='update', resource='project', partial=True) data = rest_helpers.parse_request_data(action='update', resource='project', partial=True)
project = self.find.project(course, pid) project = self.find.project(course, pid)
log.info(f"[REST] Update project {project.log_name} by {self.client.log_name}: {data}")
self.rest.projects(project).update(**data) self.rest.projects(project).update(**data)
return '', 204 return '', 204
...@@ -123,6 +124,8 @@ class ProjectConfigResource(CustomResource): ...@@ -123,6 +124,8 @@ class ProjectConfigResource(CustomResource):
data = rest_helpers.parse_request_data(action='update', resource='config') data = rest_helpers.parse_request_data(action='update', resource='config')
project = self.find.project(course, pid) project = self.find.project(course, pid)
log.info(f"[REST] Update project config in "
f"{project.log_name} by {self.client.log_name}: {data}")
self.rest.projects(project).update_project_config(data) self.rest.projects(project).update_project_config(data)
return '', 204 return '', 204
...@@ -141,6 +144,8 @@ class ProjectTestFilesRefresh(CustomResource): ...@@ -141,6 +144,8 @@ class ProjectTestFilesRefresh(CustomResource):
project = self.find.project(course, pid) project = self.find.project(course, pid)
# authorization # authorization
self.permissions(course=course).require.write_projects() self.permissions(course=course).require.write_projects()
log.info(f"[REST] Update project test-files for "
f"{project.log_name} by {self.client.log_name}")
self.rest.projects(project).update_project_test_files() self.rest.projects(project).update_project_test_files()
return '', 204 return '', 204
...@@ -186,11 +191,12 @@ class ProjectSubmissions(CustomResource): ...@@ -186,11 +191,12 @@ class ProjectSubmissions(CustomResource):
data = rest_helpers.parse_request_data( data = rest_helpers.parse_request_data(
schema=SCHEMAS.submission_create, action='create', resource='submission' schema=SCHEMAS.submission_create, action='create', resource='submission'
) )
log.debug(f"[REST] Create submission: {data}") log.info(f"[REST] Create submission in {project.log_name} "
f"by {self.client.log_name} for user {user.log_name}: {data}")
# data for Kontr processing # data for Kontr processing
service = self.rest.submissions() service = self.rest.submissions()
new_submission = service.create(user=user,project=project,submission_params=data) new_submission = service.create(user=user, project=project, submission_params=data)
return SCHEMAS.dump('submission', new_submission), 201 return SCHEMAS.dump('submission', new_submission), 201
......
...@@ -33,6 +33,8 @@ class RoleList(CustomResource): ...@@ -33,6 +33,8 @@ class RoleList(CustomResource):
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
data = rest_helpers.parse_request_data(action='create', resource='role') data = rest_helpers.parse_request_data(action='create', resource='role')
log.info(f"[REST] Create new role for {course.log_name} "
f"by {self.client.log_name}: {data}")
new_role = self.rest.roles.create(course, **data) new_role = self.rest.roles.create(course, **data)
return SCHEMAS.dump('role', new_role), 201 return SCHEMAS.dump('role', new_role), 201
...@@ -62,6 +64,7 @@ class RoleResource(CustomResource): ...@@ -62,6 +64,7 @@ class RoleResource(CustomResource):
self.permissions(course=course).require.update_course() self.permissions(course=course).require.update_course()
role = self.find.role(course, rid) role = self.find.role(course, rid)
log.info(f"[REST] Delete role {role.log_name} by {self.client.log_name}")
self.rest.roles(role).delete() self.rest.roles(role).delete()
return '', 204 return '', 204
...@@ -76,6 +79,7 @@ class RoleResource(CustomResource): ...@@ -76,6 +79,7 @@ class RoleResource(CustomResource):
data = rest_helpers.parse_request_data(action='update', resource='role', partial=True) data = rest_helpers.parse_request_data(action='update', resource='role', partial=True)
role = self.find.role(course, rid) role = self.find.role(course, rid)
log.info(f"[REST] Update role {role.log_name} by {self.client.log_name}: {data}")
self.rest.roles(role).update(**data) self.rest.roles(role).update(**data)
return '', 204 return '', 204
...@@ -106,8 +110,9 @@ class RolePermissions(CustomResource): ...@@ -106,8 +110,9 @@ class RolePermissions(CustomResource):
self.permissions(course=course).require.write_roles() self.permissions(course=course).require.write_roles()
data = rest_helpers.parse_request_data(action='update', resource='permissions') data = rest_helpers.parse_request_data(action='update', resource='permissions')
role = self.find.role(course, rid) role = self.find.role(course, rid)
log.info(f"[REST] Update role permissions for"
f" {role.log_name} by {self.client.log_name}: {data}")
self.rest.roles(role).update_permissions(data) self.rest.roles(role).update_permissions(data)
return SCHEMAS.dump('permissions', role.permissions), 200 return SCHEMAS.dump('permissions', role.permissions), 200
...@@ -146,6 +151,8 @@ class RoleUsersList(CustomResource): ...@@ -146,6 +151,8 @@ class RoleUsersList(CustomResource):
# everything from users_add is added, THEN everything from users_remove # everything from users_add is added, THEN everything from users_remove
# is subtracted # is subtracted
role = self.find.role(course, rid) role = self.find.role(course, rid)
log.info(f"[REST] Update role membership for"
f" {role.log_name} by {self.client.log_name}: {data}")
self.rest.roles(role).update_clients_membership(data) self.rest.roles(role).update_clients_membership(data)
return '', 204 return '', 204
...@@ -170,6 +177,8 @@ class RoleClient(CustomResource): ...@@ -170,6 +177,8 @@ class RoleClient(CustomResource):
client_type = request.args.get('type') client_type = request.args.get('type')
client = self.find.client(clid, client_type=client_type) client = self.find.client(clid, client_type=client_type)
self.rest.roles(role).add_client(client) self.rest.roles(role).add_client(client)
log.info(f"[REST] Update role membership for"
f" {role.log_name} by {self.client.log_name} - add client: {client.log_name}")
return '', 204 return '', 204
@jwt_required @jwt_required
...@@ -182,4 +191,6 @@ class RoleClient(CustomResource): ...@@ -182,4 +191,6 @@ class RoleClient(CustomResource):
client_type = request.args.get('type') client_type = request.args.get('type')
client = self.find.client(clid, client_type=client_type) client = self.find.client(clid, client_type=client_type)
self.rest.roles(role).remove_client(client) self.rest.roles(role).remove_client(client)
log.info(f"[REST] Update role membership for"
f" {role.log_name} by {self.client.log_name} - add remove: {client.log_name}")
return '', 204 return '', 204
...@@ -39,6 +39,7 @@ class SubmissionResource(CustomResource): ...@@ -39,6 +39,7 @@ class SubmissionResource(CustomResource):
def delete(self, sid: str): def delete(self, sid: str):
self.permissions.require.sysadmin() self.permissions.require.sysadmin()
submission = self.find.submission(sid) submission = self.find.submission(sid)
log.info(f"[REST] Delete submission by {self.client.log_name}: {submission.log_name}")
self.rest.submissions(submission).delete() self.rest.submissions(submission).delete()
return '', 204 return '', 204
...@@ -65,6 +66,8 @@ class SubmissionState(CustomResource): ...@@ -65,6 +66,8 @@ class SubmissionState(CustomResource):
data = rest_helpers.parse_request_data(action='update_state', resource='submission_state') data = rest_helpers.parse_request_data(action='update_state', resource='submission_state')
service = self.rest.submissions(submission) service = self.rest.submissions(submission)
service.update_submission_state(client=client, data=data) service.update_submission_state(client=client, data=data)
log.info(f"[REST] Update submission state for {submission.log_name} by "
f"{self.client.log_name}: {data}")
return '', 204 return '', 204
...@@ -181,6 +184,8 @@ class SubmissionResultFiles(CustomResource): ...@@ -181,6 +184,8 @@ class SubmissionResultFiles(CustomResource):
# todo: authorize worker # todo: authorize worker
service = self.rest.submissions(submission) service = self.rest.submissions(submission)
task = service.upload_results_to_storage() task = service.upload_results_to_storage()
log.info(f"[REST] Upload submission results for {submission.log_name} by "
f"{self.client.log_name}")
return {'new_task': task.id} return {'new_task': task.id}
...@@ -203,6 +208,8 @@ class SubmissionResubmit(CustomResource): ...@@ -203,6 +208,8 @@ class SubmissionResubmit(CustomResource):
# storage # storage
service = self.rest.submissions(source_submission) service = self.rest.submissions(source_submission)
new_submission = service.copy_submission(note=data['note']) new_submission = service.copy_submission(note=data['note'])
log.info(f"[REST] Resubmit submission {source_submission.log_name} by "
f"{self.client.log_name}: {data}")
return SCHEMAS.dump('submission', new_submission), 201 return SCHEMAS.dump('submission', new_submission), 201
...@@ -224,6 +231,8 @@ class SubmissionCancel(CustomResource): ...@@ -224,6 +231,8 @@ class SubmissionCancel(CustomResource):
# storage # storage
service = self.rest.submissions(submission) service = self.rest.submissions(submission)
service.cancel_submission() service.cancel_submission()
log.info(f"[REST] Cancel submission {submission.log_name} by "
f"{self.client.log_name}")
return '', 204 return '', 204
...@@ -256,5 +265,6 @@ class SubmissionReview(CustomResource): ...@@ -256,5 +265,6 @@ class SubmissionReview(CustomResource):
# also writes to db # also writes to db
review_service.create_review_items(items=data['review_items'], author=client) review_service.create_review_items(items=data['review_items'], author=client)
log.info(f"[REST] Create submission review {submission.log_name} by "
f"{self.client.log_name}: {data}")
return SCHEMAS.dump('review', submission.review), 201 return SCHEMAS.dump('review', submission.review), 201
...@@ -44,6 +44,7 @@ class UserList(CustomResource): ...@@ -44,6 +44,7 @@ class UserList(CustomResource):
self.permissions().require.sysadmin() self.permissions().require.sysadmin()
data = rest_helpers.parse_request_data(action='create', resource='user') data = rest_helpers.parse_request_data(action='create', resource='user')
new_user = self.rest.users.create(**data) new_user = self.rest.users.create(**data)
log.info(f"[REST] Create new user by {self.client.log_name}: {data}")
return SCHEMAS.dump('user', new_user), 201 return SCHEMAS.dump('user', new_user), 201
...@@ -74,6 +75,7 @@ class UserResource(CustomResource): ...@@ -74,6 +75,7 @@ class UserResource(CustomResource):
permissions_service.require.sysadmin_or_self(uid) permissions_service.require.sysadmin_or_self(uid)
data = rest_helpers.parse_request_data(action='update', resource='user', partial=True) data = rest_helpers.parse_request_data(action='update', resource='user', partial=True)
log.info(f"[REST] Update user {user.log_name} by {self.client.log_name}: {data}")
self.rest.users(user).update(**data) self.rest.users(user).update(**data)
return '', 204 return '', 204
...@@ -83,6 +85,7 @@ class UserResource(CustomResource): ...@@ -83,6 +85,7 @@ class UserResource(CustomResource):
def delete(self, uid: str): def delete(self, uid: str):
self.permissions().require.sysadmin() self.permissions().require.sysadmin()
user = self.find.user(uid) user = self.find.user(uid)
log.info(f"[REST] Delete user {user.log_name} by {self.client.log_name}")
self.rest.users(user).delete() self.rest.users(user).delete()
return '', 204 return '', 204
...@@ -98,6 +101,7 @@ class UserPassword(CustomResource): ...@@ -98,6 +101,7 @@ class UserPassword(CustomResource):
user = self.find.user(uid) user = self.find.user(uid)
self.permissions().require.sysadmin_or_self(uid) self.permissions().require.sysadmin_or_self(uid)
data = rest_helpers.parse_request_data(action='update', resource='password_change') data = rest_helpers.parse_request_data(action='update', resource='password_change')
log.info(f"[REST] Update user password {user.log_name} by {self.client.log_name}")
self.rest.users(user).update_password(data)