Константин Лебединский 1 week ago
parent
commit
2b429f0b08
  1. 17
      flask_app/app/services/test_access.py
  2. 1
      flask_app/app/static/css/app.css
  3. 11
      flask_app/app/templates/tests/list.html

17
flask_app/app/services/test_access.py

@ -6,7 +6,7 @@ from dataclasses import dataclass
from sqlalchemy import exists, select from sqlalchemy import exists, select
from ..db import get_session from ..db import get_session
from ..models import Test, TestAssignment, TestAssignmentTarget, TestVersion, User from ..models import Test, TestAssignment, TestAssignmentTarget, TestAttempt, TestVersion, User
def is_test_author(created_by, user_id) -> bool: def is_test_author(created_by, user_id) -> bool:
@ -57,7 +57,12 @@ def user_has_test_access(user_id: str, test_id: str) -> AccessResult:
def list_visible_tests(user_id: str) -> list[dict]: def list_visible_tests(user_id: str) -> list[dict]:
"""В dev-режиме возвращает все активные тесты независимо от назначения.""" """В dev-режиме возвращает все активные тесты независимо от назначения."""
import uuid as _uuid
session = get_session() session = get_session()
try:
uid = _uuid.UUID(user_id)
except (ValueError, AttributeError):
uid = None
rows = ( rows = (
session.query(Test, TestVersion, User) session.query(Test, TestVersion, User)
@ -80,6 +85,16 @@ def list_visible_tests(user_id: str) -> list[dict]:
'version': tv.version, 'version': tv.version,
'created_by': str(t.created_by) if t.created_by else None, 'created_by': str(t.created_by) if t.created_by else None,
'author_full_name': u.full_name if u else '', 'author_full_name': u.full_name if u else '',
'has_in_progress_attempt': bool(
uid and session.query(
exists().where(
TestAttempt.user_id == uid,
TestAttempt.status == 'in_progress',
TestAttempt.test_version_id == TestVersion.id,
TestVersion.test_id == t.id,
)
).scalar()
),
} }
for t, tv, u in rows for t, tv, u in rows
] ]

1
flask_app/app/static/css/app.css

@ -348,7 +348,6 @@ body.ui-legacy .list-row__side {
align-items: center; align-items: center;
padding: 0.5rem 0.9rem 0.5rem 0; padding: 0.5rem 0.9rem 0.5rem 0;
flex-shrink: 0; flex-shrink: 0;
border-left: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent);
} }
body.ui-legacy .list-row--hidden { body.ui-legacy .list-row--hidden {

11
flask_app/app/templates/tests/list.html

@ -25,7 +25,9 @@
</a> </a>
</div> </div>
<div class="list-row__side"> <div class="list-row__side">
<button type="button" class="btn btn-ghost btn-start-pass" data-test-id="{{ t.id }}">Продолжить</button> <button type="button" class="btn btn-ghost btn-start-pass" data-test-id="{{ t.id }}">
{{ 'Продолжить' if t.has_in_progress_attempt else 'Пройти' }}
</button>
</div> </div>
</li> </li>
{% endfor %} {% endfor %}
@ -49,7 +51,9 @@
</a> </a>
</div> </div>
<div class="list-row__side"> <div class="list-row__side">
<button type="button" class="btn btn-ghost btn-start-pass" data-test-id="{{ t.id }}">Продолжить</button> <button type="button" class="btn btn-ghost btn-start-pass" data-test-id="{{ t.id }}">
{{ 'Продолжить' if t.has_in_progress_attempt else 'Пройти' }}
</button>
</div> </div>
</li> </li>
{% endfor %} {% endfor %}
@ -199,7 +203,8 @@
const testId = btn.dataset.testId; const testId = btn.dataset.testId;
if (!testId) return; if (!testId) return;
btn.disabled = true; btn.disabled = true;
btn.textContent = 'Продолжить…'; const oldText = (btn.textContent || '').trim() || 'Пройти';
btn.textContent = `${oldText}…`;
try { try {
const r = await fetch(`/api/tests/${testId}/attempts/start`, { const r = await fetch(`/api/tests/${testId}/attempts/start`, {
method: 'POST', method: 'POST',

Loading…
Cancel
Save