|
3 | 3 | from bson import ObjectId
|
4 | 4 | from flask import session, request, Blueprint
|
5 | 5 |
|
6 |
| -from app.check_access import check_access |
| 6 | +from app.check_access import check_access, check_task_attempt_access |
7 | 7 | from app.lti_session_passback.auth_checkers import check_auth, is_admin
|
8 | 8 | from app.mongo_odm import TaskAttemptsDBManager, TasksDBManager
|
9 | 9 | from app.utils import check_arguments_are_convertible_to_object_id, check_argument_is_convertible_to_object_id
|
| 10 | +from app.localisation import t |
| 11 | +from app.status import PassBackStatus |
| 12 | +from app.api.trainings import get_training |
| 13 | + |
| 14 | +from app.mongo_models import TaskAttempts |
10 | 15 |
|
11 | 16 | api_task_attempts = Blueprint('api_task_attempts', __name__)
|
12 | 17 | logger = get_root_logger()
|
|
15 | 20 |
|
16 | 21 | @check_arguments_are_convertible_to_object_id
|
17 | 22 | @api_task_attempts.route('/api/task-attempts/', methods=['GET'])
|
18 |
| -def get_current_task_attempt() -> (dict, int): |
| 23 | +def get_current_task_attempt() -> tuple[dict, int]: |
19 | 24 | """
|
20 | 25 | Endpoint to get current task attempt information.
|
21 | 26 |
|
@@ -56,10 +61,44 @@ def get_current_task_attempt() -> (dict, int):
|
56 | 61 | 'attempt_count': task_db.attempt_count,
|
57 | 62 | }, 200
|
58 | 63 |
|
| 64 | +def get_task_attempt_information(task_attempt_db: TaskAttempts) -> dict: |
| 65 | + try: |
| 66 | + training_ids = task_attempt_db.training_scores.keys() |
| 67 | + trainings = dict(zip(training_ids, map(get_training, training_ids))) |
| 68 | + |
| 69 | + return { |
| 70 | + 'message': 'OK', |
| 71 | + 'task_id': str(task_attempt_db.task_id), |
| 72 | + 'username': str(task_attempt_db.username), |
| 73 | + 'trainings': trainings, |
| 74 | + } |
| 75 | + except Exception as e: |
| 76 | + return {'message': '{}: {}'.format(e.__class__, e)} |
| 77 | + |
| 78 | + |
| 79 | +@check_arguments_are_convertible_to_object_id |
| 80 | +@api_task_attempts.route('/api/task-attempts/<task_attempt_id>/', methods=['GET']) |
| 81 | +def get_task_attempt(task_attempt_id) -> tuple[dict, int]: |
| 82 | + """ |
| 83 | + Endpoint to get information about a task attempt by its identifier. |
| 84 | +
|
| 85 | + :param task_attempt_id: Task attempt identifier |
| 86 | + :return: Dictionary with task attempt information and 'OK' message, or |
| 87 | + a dictionary with an explanation and 404 HTTP return code if a task attempt was not found, or |
| 88 | + an empty dictionary with 404 HTTP return code if access was denied. |
| 89 | + """ |
| 90 | + if not check_task_attempt_access(task_attempt_id): |
| 91 | + return {}, 404 |
| 92 | + |
| 93 | + task_attempt_db = TaskAttemptsDBManager().get_task_attempt(task_attempt_id) |
| 94 | + |
| 95 | + if task_attempt_db is None: |
| 96 | + return {'message': 'No task attempt with task_attempt_id = {}.'.format(task_attempt_id)}, 404 |
| 97 | + return get_task_attempt_information(task_attempt_db), 200 |
59 | 98 |
|
60 | 99 | @check_arguments_are_convertible_to_object_id
|
61 | 100 | @api_task_attempts.route('/api/task_attempts/<task_attempt_id>/', methods=['DELETE'])
|
62 |
| -def delete_task_attempt_by_task_attempt_id(task_attempt_id: str) -> (dict, int): |
| 101 | +def delete_task_attempt_by_task_attempt_id(task_attempt_id: str) -> tuple[dict, int]: |
63 | 102 | """
|
64 | 103 | Endpoint to delete a task attempt by its identifier.
|
65 | 104 |
|
|
0 commit comments