mirror of
https://github.com/olegvodyanov/docbot.git
synced 2025-12-20 08:07:04 +03:00
change code
This commit is contained in:
parent
e13c19a53f
commit
2379e6e2a9
127
src/db/models.py
127
src/db/models.py
@ -1,86 +1,109 @@
|
|||||||
from sqlalchemy import Column, String, DateTime, ARRAY, Boolean, ForeignKey, Integer, Table, UniqueConstraint
|
from __future__ import annotations
|
||||||
from sqlalchemy.dialects.postgresql import UUID
|
from datetime import datetime
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy import String, DateTime, Boolean, ForeignKey, Integer, UniqueConstraint
|
||||||
|
from sqlalchemy.dialects.postgresql import UUID, ARRAY
|
||||||
import uuid
|
import uuid
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
|
||||||
Base = declarative_base()
|
class Base(DeclarativeBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SessionCode(Base):
|
class SessionCode(Base):
|
||||||
__tablename__ = "session_codes"
|
__tablename__ = "session_codes"
|
||||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
||||||
code = Column(String(8), unique=True, nullable=False)
|
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||||
telegram_id = Column(Integer, nullable=False)
|
code: Mapped[str] = mapped_column(String(8), unique=True, nullable=False)
|
||||||
sent_at = Column(DateTime, nullable=False)
|
patient_telegram_id: Mapped[int] = mapped_column(nullable=False)
|
||||||
consulted_at = Column(DateTime, nullable=True)
|
sent_at: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
doctor_id = Column(UUID, ForeignKey("doctors.id"))
|
consulted_at: Mapped[Optional[datetime]] = mapped_column(nullable=True)
|
||||||
form_link_response = Column(String, nullable=True)
|
doctor_id: Mapped[Optional[uuid.UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("doctors.id"))
|
||||||
|
|
||||||
|
|
||||||
class Admins(Base):
|
class Admins(Base):
|
||||||
__tablename__ = "admins"
|
__tablename__ = "admins"
|
||||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
||||||
telegram_id = Column(Integer, unique=True, nullable=False)
|
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||||
created_at = Column(DateTime, nullable=True)
|
telegram_id: Mapped[int] = mapped_column(unique=True, nullable=False)
|
||||||
available_payment_methods = Column(ARRAY(String), nullable=True)
|
created_at: Mapped[Optional[datetime]] = mapped_column(nullable=True)
|
||||||
|
available_payment_methods: Mapped[Optional[List[str]]] = mapped_column(ARRAY(String), nullable=True)
|
||||||
|
|
||||||
|
|
||||||
class Doctors(Base):
|
class Doctors(Base):
|
||||||
__tablename__ = "doctors"
|
__tablename__ = "doctors"
|
||||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
||||||
telegram_id = Column(Integer, unique=True, nullable=False)
|
|
||||||
code = Column(String(8), unique=True, nullable=False)
|
|
||||||
name = Column(String, nullable=False)
|
|
||||||
available_formats = Column(ARRAY(String), nullable=True)
|
|
||||||
is_active = Column(Boolean, default=False, nullable=False)
|
|
||||||
is_verified = Column(Boolean, default=False, nullable=False)
|
|
||||||
created_at = Column(DateTime, nullable=False)
|
|
||||||
referral_code_id = Column(Integer, ForeignKey("referral_codes.id"), nullable=False)
|
|
||||||
specialties = Column(ARRAY(String), nullable=False, default=list)
|
|
||||||
|
|
||||||
referral = relationship("ReferralCode", back_populates="doctor")
|
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||||
session_codes = relationship("SessionCode")
|
telegram_id: Mapped[int] = mapped_column(unique=True, nullable=False)
|
||||||
form_links = relationship("FormLink", back_populates="doctor", cascade="all, delete-orphan")
|
code: Mapped[str] = mapped_column(String(8), unique=True, nullable=False)
|
||||||
payment_methods = relationship("PaymentMethod", back_populates="doctor", cascade="all, delete-orphan")
|
name: Mapped[str] = mapped_column(nullable=False)
|
||||||
|
available_formats: Mapped[Optional[List[str]]] = mapped_column(ARRAY(String), nullable=True)
|
||||||
|
is_active: Mapped[bool] = mapped_column(default=False, nullable=False)
|
||||||
|
is_verified: Mapped[bool] = mapped_column(default=False, nullable=False)
|
||||||
|
created_at: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
referral_code_id: Mapped[int] = mapped_column(ForeignKey("referral_codes.id"), nullable=False)
|
||||||
|
specialties: Mapped[List[str]] = mapped_column(ARRAY(String), nullable=False, default=list)
|
||||||
|
|
||||||
def __repr__(self):
|
referral: Mapped["ReferralCode"] = relationship(back_populates="doctor", uselist=False)
|
||||||
|
session_codes: Mapped[List["SessionCode"]] = relationship()
|
||||||
|
form_links: Mapped[List["FormLink"]] = relationship(back_populates="doctor", cascade="all, delete-orphan")
|
||||||
|
payment_methods: Mapped[List["PaymentMethod"]] = relationship(back_populates="doctor", cascade="all, delete-orphan")
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
return f"<Doctors(telegram_id={self.telegram_id!r})>"
|
return f"<Doctors(telegram_id={self.telegram_id!r})>"
|
||||||
|
|
||||||
|
|
||||||
class ReferralCode(Base):
|
class ReferralCode(Base):
|
||||||
__tablename__ = "referral_codes"
|
__tablename__ = "referral_codes"
|
||||||
id = Column(Integer, primary_key=True)
|
|
||||||
code = Column(String, unique=True, nullable=False)
|
|
||||||
is_used = Column(Boolean, default=False)
|
|
||||||
created_at = Column(DateTime, nullable=False)
|
|
||||||
used_at = Column(DateTime, nullable=True)
|
|
||||||
doctor = relationship("Doctors", back_populates="referral", uselist=False)
|
|
||||||
|
|
||||||
def __repr__(self):
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
code: Mapped[str] = mapped_column(unique=True, nullable=False)
|
||||||
|
is_used: Mapped[bool] = mapped_column(default=False, nullable=False)
|
||||||
|
created_at: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
used_at: Mapped[Optional[datetime]] = mapped_column(nullable=True)
|
||||||
|
doctor: Mapped[Optional["Doctors"]] = relationship(back_populates="referral", uselist=False)
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
return f"<ReferralCode(code={self.code!r}, is_used={self.is_used})>"
|
return f"<ReferralCode(code={self.code!r}, is_used={self.is_used})>"
|
||||||
|
|
||||||
|
|
||||||
|
class VerificationRequests(Base):
|
||||||
|
__tablename__ = "verification_requests"
|
||||||
|
|
||||||
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
doctor_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("doctors.id", ondelete="CASCADE"), nullable=False)
|
||||||
|
code: Mapped[str] = mapped_column(unique=True, nullable=False)
|
||||||
|
sent_at: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
reviewed_at: Mapped[Optional[datetime]] = mapped_column(nullable=True)
|
||||||
|
# Связь поправлена — связь с doctor через doctor_id
|
||||||
|
doctor: Mapped["Doctors"] = relationship()
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"<VerificationRequests(code={self.code!r})>"
|
||||||
|
|
||||||
|
|
||||||
class FormLink(Base):
|
class FormLink(Base):
|
||||||
__tablename__ = "form_links"
|
__tablename__ = "form_links"
|
||||||
id = Column(Integer, primary_key=True)
|
|
||||||
doctor_id = Column(UUID(as_uuid=True), ForeignKey("doctors.id", ondelete="CASCADE"), nullable=False)
|
|
||||||
url = Column(String, nullable=False)
|
|
||||||
label = Column(String, nullable=True)
|
|
||||||
is_active = Column(Boolean, default=True, nullable=False)
|
|
||||||
created_at = Column(DateTime, nullable=False)
|
|
||||||
|
|
||||||
doctor = relationship("Doctors", back_populates="form_links")
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
doctor_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("doctors.id", ondelete="CASCADE"), nullable=False)
|
||||||
|
url: Mapped[str] = mapped_column(nullable=False)
|
||||||
|
label: Mapped[Optional[str]] = mapped_column(nullable=True)
|
||||||
|
is_active: Mapped[bool] = mapped_column(default=True, nullable=False)
|
||||||
|
created_at: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
|
||||||
|
doctor: Mapped["Doctors"] = relationship(back_populates="form_links")
|
||||||
|
|
||||||
|
|
||||||
class PaymentMethod(Base):
|
class PaymentMethod(Base):
|
||||||
__tablename__ = "payment_methods"
|
__tablename__ = "payment_methods"
|
||||||
id = Column(Integer, primary_key=True)
|
|
||||||
doctor_id = Column(UUID(as_uuid=True), ForeignKey("doctors.id", ondelete="CASCADE"), nullable=False)
|
|
||||||
method = Column(String, nullable=False)
|
|
||||||
details = Column(String, nullable=True)
|
|
||||||
is_active = Column(Boolean, default=True, nullable=False)
|
|
||||||
created_at = Column(DateTime, nullable=False)
|
|
||||||
|
|
||||||
doctor = relationship("Doctor", back_populates="payment_methods")
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
doctor_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("doctors.id", ondelete="CASCADE"), nullable=False)
|
||||||
|
method: Mapped[str] = mapped_column(nullable=False)
|
||||||
|
details: Mapped[Optional[str]] = mapped_column(nullable=True)
|
||||||
|
is_active: Mapped[bool] = mapped_column(default=True, nullable=False)
|
||||||
|
created_at: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
|
||||||
|
doctor: Mapped["Doctors"] = relationship(back_populates="payment_methods")
|
||||||
@ -9,7 +9,6 @@ from telegram.ext import (
|
|||||||
|
|
||||||
from docbot.handlers.utils.cancel_handler import get_cancel_handler
|
from docbot.handlers.utils.cancel_handler import get_cancel_handler
|
||||||
from docbot.services.referral_service import validate_referral_code, mark_referral_code_as_used
|
from docbot.services.referral_service import validate_referral_code, mark_referral_code_as_used
|
||||||
from core.enums.consultation_types import Consultation
|
|
||||||
from core.enums.dialog_helpers import ConfirmationMessage, Acknowledgement
|
from core.enums.dialog_helpers import ConfirmationMessage, Acknowledgement
|
||||||
|
|
||||||
ASK_REFERRAL_CODE = 1
|
ASK_REFERRAL_CODE = 1
|
||||||
@ -20,7 +19,7 @@ SEND_DIPLOMA_ACK_INFO = 5
|
|||||||
SEND_CONSULTATION_TYPE_ACK_INFO = 6
|
SEND_CONSULTATION_TYPE_ACK_INFO = 6
|
||||||
|
|
||||||
SEND_ME_REFERRAL_CODE_TEXT = (
|
SEND_ME_REFERRAL_CODE_TEXT = (
|
||||||
"📝 Пожалуйста, пришлите реферальный код, чтобы начать процесс регистрации."
|
"✌️ Пожалуйста, пришлите реферальный код, чтобы начать процесс регистрации."
|
||||||
)
|
)
|
||||||
ACCEPT_OFFER_TEXT = (
|
ACCEPT_OFFER_TEXT = (
|
||||||
"📝 Продолжая работу с ботом, вы соглашаетесь с условиями оферты и на обработку персональных данных! \n"
|
"📝 Продолжая работу с ботом, вы соглашаетесь с условиями оферты и на обработку персональных данных! \n"
|
||||||
@ -161,8 +160,11 @@ async def receive_doctor_consultation_packages_acknowledgement_status(update: Up
|
|||||||
parse_mode="Markdown"
|
parse_mode="Markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
await mark_referral_code_as_used(context.user_data["ref_obj"], context.user_data["doctor_telegram_id"],
|
await mark_referral_code_as_used(
|
||||||
context.user_data["doctor_name"])
|
context.user_data["ref_obj"],
|
||||||
|
context.user_data["doctor_telegram_id"],
|
||||||
|
context.user_data["doctor_name"]
|
||||||
|
)
|
||||||
return ConversationHandler.END
|
return ConversationHandler.END
|
||||||
|
|
||||||
|
|
||||||
@ -191,7 +193,8 @@ def get_register_doctor_first_stage_handler() -> ConversationHandler:
|
|||||||
MessageHandler(filters.TEXT & ~filters.COMMAND, receive_doctor_diploma_acknowledgement_status)
|
MessageHandler(filters.TEXT & ~filters.COMMAND, receive_doctor_diploma_acknowledgement_status)
|
||||||
],
|
],
|
||||||
SEND_CONSULTATION_TYPE_ACK_INFO: [
|
SEND_CONSULTATION_TYPE_ACK_INFO: [
|
||||||
MessageHandler(filters.TEXT & ~filters.COMMAND, receive_doctor_consultation_packages_acknowledgement_status)
|
MessageHandler(filters.TEXT & ~filters.COMMAND,
|
||||||
|
receive_doctor_consultation_packages_acknowledgement_status)
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
fallbacks=[get_cancel_handler()],
|
fallbacks=[get_cancel_handler()],
|
||||||
|
|||||||
@ -19,8 +19,7 @@ async def create_session_code(telegram_id: int, form_link: str) -> str:
|
|||||||
async with session.begin():
|
async with session.begin():
|
||||||
session.add(SessionCode(
|
session.add(SessionCode(
|
||||||
code=code,
|
code=code,
|
||||||
telegram_id=telegram_id, # храним как строку
|
patient_telegram_id=telegram_id,
|
||||||
form_link=form_link,
|
|
||||||
sent_at=datetime.utcnow()
|
sent_at=datetime.utcnow()
|
||||||
))
|
))
|
||||||
return code
|
return code
|
||||||
@ -51,7 +50,7 @@ async def get_pending_session(telegram_id: int) -> SessionCode | None:
|
|||||||
async with AsyncSessionLocal() as session:
|
async with AsyncSessionLocal() as session:
|
||||||
result = await session.execute(
|
result = await session.execute(
|
||||||
select(SessionCode)
|
select(SessionCode)
|
||||||
.where(SessionCode.telegram_id.match(telegram_id))
|
.where(SessionCode.patient_telegram_id.match(telegram_id))
|
||||||
.where(SessionCode.consulted_at.is_(None))
|
.where(SessionCode.consulted_at.is_(None))
|
||||||
.order_by(SessionCode.sent_at.desc())
|
.order_by(SessionCode.sent_at.desc())
|
||||||
.limit(1)
|
.limit(1)
|
||||||
@ -72,7 +71,7 @@ async def get_session_info(code: str) -> dict | None:
|
|||||||
if not sc:
|
if not sc:
|
||||||
return None
|
return None
|
||||||
return {
|
return {
|
||||||
"telegram_id": sc.telegram_id,
|
"telegram_id": sc.patient_telegram_id,
|
||||||
"form_link": sc.form_link,
|
"form_link": sc.form_link,
|
||||||
"sent_at": sc.sent_at,
|
"sent_at": sc.sent_at,
|
||||||
"consulted_at": sc.consulted_at,
|
"consulted_at": sc.consulted_at,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user