30 lines
1.4 KiB
Python
30 lines
1.4 KiB
Python
|
|
"""Кто допущен к занятию — одно правило для сокетов и HTTP.
|
|||
|
|
|
|||
|
|
Живое состояние и строка сессии в БД несут одни и те же `owner_login` и
|
|||
|
|
`trainee_id`, поэтому правило принимает любое из них. Владение группами и
|
|||
|
|
сценариями — другое понятие и сюда не входит.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from typing import Protocol
|
|||
|
|
from uuid import UUID
|
|||
|
|
|
|||
|
|
from app.domain.roles import Role
|
|||
|
|
|
|||
|
|
|
|||
|
|
class _Lesson(Protocol):
|
|||
|
|
owner_login: str | None
|
|||
|
|
trainee_id: UUID | None
|
|||
|
|
|
|||
|
|
|
|||
|
|
def can_access(who, lesson: _Lesson) -> bool:
|
|||
|
|
"""Преподаватель — только своё занятие, курсант — только назначенное ему.
|
|||
|
|
|
|||
|
|
Занятие без курсанта не открывается ни одному курсанту: иначе `None == None`
|
|||
|
|
пустил бы учётку без профиля. Роль экрана проверяет вызывающий; администратору
|
|||
|
|
занятие не закрыто — ему доступна диагностика, а не оценки.
|
|||
|
|
"""
|
|||
|
|
if who.role is Role.INSTRUCTOR:
|
|||
|
|
return lesson.owner_login == who.login
|
|||
|
|
if who.role is Role.TRAINEE:
|
|||
|
|
return lesson.trainee_id is not None and lesson.trainee_id == who.trainee_id
|
|||
|
|
return True
|