in backend/services/validator_service.py [0:0]
def lock_tasks_for_validation(validation_dto: LockForValidationDTO) -> TaskDTOs:
"""
Lock supplied tasks for validation
:raises ValidatorServiceError
"""
# Loop supplied tasks to check they can all be locked for validation
tasks_to_lock = []
for task_id in validation_dto.task_ids:
task = Task.get(task_id, validation_dto.project_id)
if task is None:
raise NotFound(f"Task {task_id} not found")
if TaskStatus(task.task_status) not in [
TaskStatus.MAPPED,
TaskStatus.INVALIDATED,
TaskStatus.BADIMAGERY,
]:
raise ValidatorServiceError(
f"Task {task_id} is not MAPPED, BADIMAGERY or INVALIDATED"
)
user_can_validate = ValidatorService._user_can_validate_task(
validation_dto.user_id, task.mapped_by
)
if not user_can_validate:
raise ValidatorServiceError(
"Tasks cannot be validated by the same user who marked task as mapped or badimagery"
)
tasks_to_lock.append(task)
user_can_validate, error_reason = ProjectService.is_user_permitted_to_validate(
validation_dto.project_id, validation_dto.user_id
)
if not user_can_validate:
if error_reason == ValidatingNotAllowed.USER_NOT_ACCEPTED_LICENSE:
raise UserLicenseError("User must accept license to map this task")
elif error_reason == ValidatingNotAllowed.USER_ALREADY_HAS_TASK_LOCKED:
raise ValidatorServiceError("User already has a task locked")
else:
raise ValidatorServiceError(
f"Validation not allowed because: {error_reason}"
)
# Lock all tasks for validation
dtos = []
for task in tasks_to_lock:
task.lock_task_for_validating(validation_dto.user_id)
dtos.append(task.as_dto_with_instructions(validation_dto.preferred_locale))
task_dtos = TaskDTOs()
task_dtos.tasks = dtos
return task_dtos