52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
from enum import Enum
|
|
from pydantic import BaseModel
|
|
from datetime import datetime
|
|
|
|
class BatonRequestStatus(Enum):
|
|
PENDING = "pending"
|
|
ACCEPTED = "accepted"
|
|
REFUSED = "refused"
|
|
TIMEOUT = "timeout"
|
|
CANCELLED = "cancelled"
|
|
|
|
|
|
class BatonHolderInfo(BaseModel):
|
|
"""Information about the current baton holder."""
|
|
username: str
|
|
session: int
|
|
is_staff: bool
|
|
pgroup: str | None = None
|
|
|
|
|
|
class BatonRequest(BaseModel):
|
|
"""A request from one user to take the baton from another."""
|
|
request_id: str
|
|
requester_username: str
|
|
requester_session: int
|
|
requester_is_staff: bool
|
|
holder_username: str | None = None
|
|
holder_session: int | None = None
|
|
created_at: float # Unix timestamp
|
|
timeout_seconds: int = 30
|
|
status: BatonRequestStatus = BatonRequestStatus.PENDING
|
|
|
|
|
|
class BatonTransferQueue(BaseModel):
|
|
"""Queued baton transfer waiting for beamline to be available."""
|
|
target_session: int
|
|
target_username: str
|
|
target_is_staff: bool
|
|
target_pgroup: str | None = None
|
|
queued_at: float # Unix timestamp
|
|
reason: str = "beamline_busy"
|
|
|
|
|
|
class BatonStatus(BaseModel):
|
|
"""Full baton status for GUI display."""
|
|
holder: BatonHolderInfo | None = None
|
|
pending_request: BatonRequest | None = None
|
|
queued_transfer: BatonTransferQueue | None = None
|
|
you_are_holder: bool = False
|
|
you_have_pending_request: bool = False
|
|
incoming_request: bool = False
|
|
allow_non_staff_request: bool = False |