This commit is contained in:
2026-07-09 16:45:17 +03:00
parent 5c7a9710f3
commit da24ed8ba7
23 changed files with 1542 additions and 358 deletions

View File

@@ -11,6 +11,8 @@ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
from app.config import Settings
from app.db.base import utcnow
from app.db.models import (
BroadcastPoll,
BroadcastPollAnswer,
Guide,
GuidePhoto,
InternalSquad,
@@ -124,6 +126,13 @@ class AdminTelegramUserProfile:
accesses: list[CachedUserView] = field(default_factory=list)
@dataclass(slots=True)
class BroadcastPollAnswerResult:
poll: BroadcastPoll
answer: BroadcastPollAnswer
previous_answer: str | None = None
class SyncService:
def __init__(
self,
@@ -571,6 +580,69 @@ class SyncService:
)
return list(rows.all())
async def create_broadcast_poll(
self,
*,
question_text: str,
created_by_telegram_id: int,
) -> BroadcastPoll:
async with self._session_factory() as session:
poll = BroadcastPoll(
question_text=question_text,
created_by_telegram_id=created_by_telegram_id,
)
session.add(poll)
await session.commit()
return poll
async def record_broadcast_poll_answer(
self,
*,
poll_id: int,
telegram_id: int,
username: str | None,
first_name: str | None,
last_name: str | None,
answer: str,
) -> BroadcastPollAnswerResult | None:
normalized_answer = answer.strip().lower()
if normalized_answer not in {"yes", "no"}:
raise ValueError("Unsupported answer")
async with self._session_factory() as session:
poll = await session.scalar(
select(BroadcastPoll).where(BroadcastPoll.id == poll_id)
)
if poll is None:
return None
record = await session.scalar(
select(BroadcastPollAnswer).where(
BroadcastPollAnswer.poll_id == poll_id,
BroadcastPollAnswer.telegram_id == telegram_id,
)
)
previous_answer = record.answer if record is not None else None
if record is None:
record = BroadcastPollAnswer(
poll_id=poll_id,
telegram_id=telegram_id,
)
session.add(record)
record.username = username
record.first_name = first_name
record.last_name = last_name
record.answer = normalized_answer
record.updated_at = utcnow()
await session.commit()
return BroadcastPollAnswerResult(
poll=poll,
answer=record,
previous_answer=previous_answer,
)
async def get_admin_telegram_users_page(
self,
*,