include db python files

This commit is contained in:
oleg.vodyanov91@gmail.com 2025-06-03 23:42:41 +04:00
parent 4492c03590
commit 2c6afb3499
4 changed files with 92 additions and 0 deletions

1
.gitignore vendored
View File

@ -5,5 +5,6 @@
alembic.ini alembic.ini
alembic/ alembic/
db/ db/
!src/db
__pycache__ __pycache__
src/docbot/conversations.pkl src/docbot/conversations.pkl

0
src/db/__init__.py Normal file
View File

84
src/db/models.py Normal file
View File

@ -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"<Doctors(telegram_id={self.telegram_id!r})>"
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"<ReferralCode(code={self.code!r}, is_used={self.is_used})>"
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")

7
src/db/session.py Normal file
View File

@ -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)