From 2c6afb349925f105c3702ab3435044c2fb6c86e5 Mon Sep 17 00:00:00 2001 From: "oleg.vodyanov91@gmail.com" Date: Tue, 3 Jun 2025 23:42:41 +0400 Subject: [PATCH] include db python files --- .gitignore | 1 + src/db/__init__.py | 0 src/db/models.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++ src/db/session.py | 7 ++++ 4 files changed, 92 insertions(+) create mode 100644 src/db/__init__.py create mode 100644 src/db/models.py create mode 100644 src/db/session.py diff --git a/.gitignore b/.gitignore index a86e3e1..b65d279 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ alembic.ini alembic/ db/ +!src/db __pycache__ src/docbot/conversations.pkl \ No newline at end of file diff --git a/src/db/__init__.py b/src/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/db/models.py b/src/db/models.py new file mode 100644 index 0000000..b2d36eb --- /dev/null +++ b/src/db/models.py @@ -0,0 +1,84 @@ +from sqlalchemy import Column, String, DateTime, ARRAY, Boolean, ForeignKey, Integer, Table, UniqueConstraint +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship +import uuid + + +Base = declarative_base() + + +class SessionCode(Base): + __tablename__ = "session_codes" + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + code = Column(String(8), unique=True, nullable=False) + telegram_id = Column(Integer, nullable=False) + sent_at = Column(DateTime, nullable=False) + consulted_at = Column(DateTime, nullable=True) + doctor_id = Column(UUID, ForeignKey("doctors.id")) + form_link_response = Column(String, nullable=True) + + +class Admins(Base): + __tablename__ = "admins" + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + telegram_id = Column(Integer, unique=True, nullable=False) + created_at = Column(DateTime, nullable=True) + + +class Doctors(Base): + __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) + 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") + session_codes = relationship("SessionCode") + form_links = relationship("FormLink", back_populates="doctor", cascade="all, delete-orphan") + payment_methods = relationship("PaymentMethod", back_populates="doctor", cascade="all, delete-orphan") + + def __repr__(self): + return f"" + + +class ReferralCode(Base): + __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): + return f"" + + +class FormLink(Base): + __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") + + +class PaymentMethod(Base): + __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") \ No newline at end of file diff --git a/src/db/session.py b/src/db/session.py new file mode 100644 index 0000000..4feafd7 --- /dev/null +++ b/src/db/session.py @@ -0,0 +1,7 @@ +from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker + +from core.config import settings + +engine = create_async_engine(settings.DATABASE_URL, echo=False, future=True) + +AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False)