Skip to content

Commit 63da1f1

Browse files
committed
new columns in task attempt
1 parent f827e44 commit 63da1f1

File tree

4 files changed

+78
-58
lines changed

4 files changed

+78
-58
lines changed

app/api/task_attempts.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from app.utils import check_arguments_are_convertible_to_object_id, check_argument_is_convertible_to_object_id
1010
from app.localisation import t
1111
from app.status import PassBackStatus
12+
from app.api.trainings import get_training
1213

1314
from app.mongo_models import TaskAttempts
1415

@@ -62,19 +63,14 @@ def get_current_task_attempt() -> tuple[dict, int]:
6263

6364
def get_task_attempt_information(task_attempt_db: TaskAttempts) -> dict:
6465
try:
65-
is_passed_back = dict(task_attempt_db.is_passed_back)
66-
67-
for training_id, training_status in is_passed_back.items():
68-
is_passed_back[training_id] = t(PassBackStatus.russian.get(training_status))
69-
66+
training_ids = task_attempt_db.training_scores.keys()
67+
trainings = dict(zip(training_ids, map(get_training, training_ids)))
68+
7069
return {
7170
'message': 'OK',
7271
'task_id': str(task_attempt_db.task_id),
7372
'username': str(task_attempt_db.username),
74-
'training_count': task_attempt_db.training_count,
75-
'training_scores': dict(task_attempt_db.training_scores),
76-
'is_passed_back': is_passed_back,
77-
'params_for_passback': dict(task_attempt_db.params_for_passback)
73+
'trainings': trainings,
7874
}
7975
except Exception as e:
8076
return {'message': '{}: {}'.format(e.__class__, e)}

app/routes/task_attempts.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212
routes_task_attempts = Blueprint('routes_task_attempts', __name__)
1313
logger = get_root_logger()
1414

15-
def ch(tr_id):
16-
print(tr_id)
17-
print(check_access({'_id': ObjectId(tr_id)}), sep=" ")
18-
print()
19-
return check_access({'_id': ObjectId(tr_id)})
2015

2116
@check_arguments_are_convertible_to_object_id
2217
@routes_task_attempts.route('/task_attempts/<task_attempt_id>/', methods=['GET'])
@@ -33,6 +28,8 @@ def view_task_attempt(task_attempt_id: str):
3328

3429
task_attempt, task_attempt_status_code = get_task_attempt(task_attempt_id)
3530

31+
print(task_attempt)
32+
3633
if task_attempt.get('message') != 'OK':
3734
return task_attempt, task_attempt_status_code
3835

@@ -41,6 +38,5 @@ def view_task_attempt(task_attempt_id: str):
4138
task_attempt_id=task_attempt_id,
4239
task_id=task_attempt['task_id'],
4340
username=task_attempt['username'],
44-
training_scores=task_attempt['training_scores'],
45-
is_passed_back=task_attempt['is_passed_back'],
41+
trainings=task_attempt['trainings'],
4642
), 200

app/static/js/task_attempts.js

Lines changed: 69 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,93 @@
1-
function getTrainingsTable(trainingScores, isPassedBack) {
2-
const trainingsTable = {};
3-
4-
Object.keys(trainingScores).forEach(trainingId => {
5-
if (trainingsTable[trainingId] === undefined) {
6-
trainingsTable[trainingId] = {};
7-
}
8-
trainingsTable[trainingId].score = trainingScores[trainingId];
9-
});
10-
11-
Object.keys(isPassedBack).forEach(trainingId => {
12-
if (trainingsTable[trainingId] === undefined) {
13-
trainingsTable[trainingId] = {};
14-
}
15-
trainingsTable[trainingId].passedBackStatus = isPassedBack[trainingId];
16-
});
17-
18-
return trainingsTable;
1+
const tableColomnHeaders = [
2+
"№", "training_id", "start_timestamp", "training_status", "pass_back_status", "score"
3+
];
4+
5+
function get_time_string(timestampStr){
6+
const timestamp = Date.parse(timestampStr);
7+
8+
options = { weekday: 'short', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: '2-digit', second: '2-digit', timeZoneName: 'short' }
9+
if (!isNaN(timestamp)) {
10+
processing_time = new Date(timestamp);
11+
return processing_time.toLocaleString("ru-RU", options);
12+
} else {
13+
return "";
14+
}
1915
}
2016

2117
function createTableHeaderElement() {
22-
const trainingIdHeaderElement = document.createElement("th");
23-
trainingIdHeaderElement.innerHTML = "training_id";
24-
25-
const trainingScoreHeaderElement = document.createElement("th");
26-
trainingScoreHeaderElement.innerHTML = "score";
27-
28-
const trainingStatusHeaderElement = document.createElement("th");
29-
trainingStatusHeaderElement.innerHTML = "pass_back_status";
30-
3118
const tableHeaderElement = document.createElement("tr");
3219

33-
tableHeaderElement.append(trainingIdHeaderElement, trainingScoreHeaderElement, trainingStatusHeaderElement);
20+
tableColomnHeaders.forEach(colomnHeader => {
21+
const tableColomnHeaderElement = document.createElement("th");
22+
tableColomnHeaderElement.innerHTML = colomnHeader;
23+
24+
tableHeaderElement.appendChild(tableColomnHeaderElement);
25+
});
3426

3527
return tableHeaderElement;
3628
}
3729

38-
function createTableRowElement(trainingInfo, trainingId) {
30+
function createTableRowElement() {
3931
const tableRowElement = document.createElement("tr");
4032

41-
const tableRowIdElement = document.createElement("td");
42-
tableRowIdElement.innerHTML = `<a href="/trainings/statistics/${trainingId}/">${trainingId}</a>`;
33+
const tableRow = {};
34+
35+
tableColomnHeaders.forEach(columnHeader => {
36+
const tableCellElement = document.createElement("td");
37+
38+
tableRow[columnHeader] = tableCellElement;
39+
tableRowElement.appendChild(tableCellElement);
40+
});
4341

44-
const tableRowScoreElement = document.createElement("td");
45-
tableRowScoreElement.innerHTML = trainingInfo.score ? trainingInfo.score.toFixed(2) : "none";
42+
return [tableRowElement, tableRow];
43+
}
4644

47-
const tableRowStatusElement = document.createElement("td");
48-
tableRowStatusElement.innerHTML = trainingInfo.passedBackStatus || "none";
45+
function TableRowFiller() {
46+
let pos = 1;
4947

50-
tableRowElement.append(tableRowIdElement, tableRowScoreElement, tableRowStatusElement);
48+
function fillTableRow(tableRow, training) {
49+
tableRow["№"].innerHTML = pos++;
50+
tableRow["training_id"].innerHTML = `<a href="/trainings/statistics/${training.id}/">${training.id}</a>`;
51+
tableRow["start_timestamp"].innerHTML = get_time_string(training.training_start_timestamp);
52+
tableRow["score"].innerHTML = training.score ? training.score.toFixed(2) : "none";
53+
tableRow["training_status"].innerHTML = training.training_status;
54+
tableRow["pass_back_status"].innerHTML = training.passedBackStatus || "none";
55+
}
5156

52-
return tableRowElement;
57+
return fillTableRow;
5358
}
5459

55-
function showRelatedTrainingsTable(trainingScores, isPassedBack) {
56-
const trainingsTable = getTrainingsTable(trainingScores, isPassedBack);
60+
function getSortedTrainingsList(trainings) {
61+
const trainingsList = [];
62+
63+
Object.keys(trainings).forEach(trainingId => {
64+
const training = trainings[trainingId];
65+
training["id"] = trainingId;
66+
67+
trainingsList.push(training);
68+
});
69+
70+
trainingsList.sort((a, b) => {
71+
return Date.parse(a) - Date.parse(b);
72+
});
73+
74+
return trainingsList;
75+
}
5776

77+
function showRelatedTrainingsTable(trainings) {
5878
const tableElement = document.getElementById("related-trainings-table");
5979

6080
tableElement.appendChild(createTableHeaderElement());
6181

62-
Object.keys(trainingsTable).forEach(trainingId => {
63-
tableElement.appendChild(createTableRowElement(trainingsTable[trainingId], trainingId));
82+
const trainingsList = getSortedTrainingsList(trainings);
83+
84+
const fillTableRow = TableRowFiller();
85+
86+
trainingsList.forEach(training => {
87+
const [tableRowElement, tableRow] = createTableRowElement();
88+
89+
fillTableRow(tableRow, training);
90+
91+
tableElement.appendChild(tableRowElement);
6492
});
6593
}

app/templates/task_attempt.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ <h3>Связанные тренировки:</h3>
2121
<script src="{{ url_for('static', filename='js/libraries/jquery.min.js') }}"></script>
2222
<script src="{{ url_for('static', filename='js/task_attempts.js') }}"></script>
2323
<script type="text/javascript">
24-
showRelatedTrainingsTable({{ training_scores|tojson|safe }}, {{ is_passed_back|tojson|safe }});
24+
showRelatedTrainingsTable({{ trainings|tojson|safe }});
2525
</script>
2626
{% endblock %}

0 commit comments

Comments
 (0)