# Importações de bibliotecas padrão from __future__ import annotations import enum from datetime import datetime from typing import List, Annotated from uuid import UUID as UuidType # from fastapi_users.db import SQLAlchemyBaseUserTable from fastapi_users_db_sqlalchemy import SQLAlchemyBaseUserTableUUID # Importações de bibliotecas de terceiros from sqlalchemy import Column, String, Boolean, ForeignKey, Table, Integer, Date, Text, Numeric, Enum from sqlalchemy import DateTime, FetchedValue, func from sqlalchemy.dialects.postgresql import UUID as UuidColumn from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.ext.compiler import compiles from sqlalchemy.orm import relationship, Mapped, mapped_column, with_polymorphic from sqlalchemy.sql.expression import FunctionElement from sqlalchemy.sql import expression from uuid6 import uuid7 # from sqlalchemy.ext.asyncio import AsyncAttrs # Importações do seu próprio projeto from .session import Base # EXTENSIONS = ["uuid-ossp", "postgis", "postgis_topology"] # # naming_convention = { # "ix": "ix_ct_%(table_name)s_%(column_0_N_name)s", # "uq": "uq_ct_%(table_name)s_%(column_0_N_name)s", # "ck": "ck_ct_%(table_name)s_%(constraint_name)s", # "fk": "fk_ct_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", # "pk": "pk_ct_%(table_name)s", # } # # # class Base(DeclarativeBase, AsyncAttrs): # metadata = MetaData(naming_convention=naming_convention, # # Multi Tennat # schema="tenant" # ) uuid = Annotated[UuidType, mapped_column(primary_key=True)] str1 = Annotated[str, mapped_column(String(1), nullable=True)] str2 = Annotated[str, mapped_column(String(2), nullable=True)] str8 = Annotated[str, mapped_column(String(8), nullable=True)] str10 = Annotated[str, mapped_column(String(10), nullable=True)] str10_not_null = Annotated[str, mapped_column(String(10), nullable=False)] str11 = Annotated[str, mapped_column(String(11), nullable=True)] str14 = Annotated[str, mapped_column(String(14), nullable=True)] str20 = Annotated[str, mapped_column(String(20), nullable=True)] str30_not_null = Annotated[str, mapped_column(String(30), nullable=False)] str39_uid = Annotated[str, mapped_column(String(39), nullable=True)] str36_uuid = Annotated[str, mapped_column(String(36), nullable=False)] str36_uuid_null = Annotated[str, mapped_column(String(36), nullable=True)] str50 = Annotated[str, mapped_column(String(50), nullable=True)] str50_null = Annotated[str, mapped_column(String(50), nullable=False)] str100 = Annotated[str, mapped_column(String(100), nullable=True)] str150 = Annotated[str, mapped_column(String(150), nullable=True)] str200 = Annotated[str, mapped_column(String(200), nullable=True)] url = Annotated[str, mapped_column(String(2083), nullable=True)] intpk = Annotated[int, mapped_column(primary_key=True, index=True)] valor_monetario = Annotated[float, mapped_column(Numeric(precision=10, scale=2), nullable=True)] valor_monetario_not_null = Annotated[float, mapped_column(Numeric(precision=10, scale=2), nullable=False)] data = Annotated[Date, mapped_column(Date, nullable=True)] data_null = Annotated[Date, mapped_column(Date, nullable=True)] data_idx = Annotated[Date, mapped_column(Date, index=True)] text = Annotated[Text, mapped_column(Text)] text_null = Annotated[Text, mapped_column(Text, nullable=True)] boleano = Annotated[Boolean, mapped_column(Boolean, default=True)] boleano_false = Annotated[Boolean, mapped_column(Boolean, server_default=expression.false())] # ------------------------------------------------------INICIO MIXIN---------------------------------------------------- class utcnow(FunctionElement): type = DateTime() inherit_cache = True @compiles(utcnow, "postgresql") def pg_utcnow(element, compiler, **kw): return "TIMEZONE('utc', CURRENT_TIMESTAMP)" class UuidMixin: uuid: Mapped[UuidType] = mapped_column( "uuid", UuidColumn(as_uuid=True), primary_key=True, default=uuid7, nullable=False, ) class IdMixin: id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, nullable=False) class AtivoMixin: ativo = Column(Boolean, nullable=False, server_default=expression.true(), index=True) data_ativacao: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=utcnow(), ) data_desativacao: Mapped[datetime] = mapped_column( DateTime, nullable=True, index=True, onupdate=func.now(), server_default=utcnow(), server_onupdate=FetchedValue(), ) class TimestampMixin: created_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=utcnow(), ) updated_at: Mapped[datetime] = mapped_column( DateTime, nullable=True, index=True, onupdate=func.now(), server_default=utcnow(), server_onupdate=FetchedValue(), ) # ------------------------------------------------------FIM MIXIN---------------------------------------------------- # ------------------------------------------------------MULTI TENNAT---------------------------------------------------- class Inquilino(UuidMixin, Base): __tablename__ = "inquilinos" __table_args__ = ({"schema": "shared"}) nome = Column(String(100), nullable=False, unique=False) cpf_cnpj = Column(String(14), nullable=False, unique=True) pessoa_celular = Column(String(20), nullable=True, unique=False) # Relacionamento com a tabela de usuários usuario: Mapped[List["RbacUser"]] = relationship(back_populates="inquilino", passive_deletes=True, lazy="selectin", join_depth=2) # ---------------------------------------------------FIM MULTI TENNAT--------------------------------------------------- comercial_relacionamento_pessoa_empresa = Table('comercial_relacionamento_pessoa_empresa', Base.metadata, Column('relacao_comercial_uuid', UUID(as_uuid=True), ForeignKey('comercial_relacoes_comercial.uuid', ondelete="CASCADE")), Column('pessoa_uuid', UUID(as_uuid=True), ForeignKey('comercial_pessoas.uuid', ondelete="CASCADE")), ) class ComercialTransacaoComercialEnum(enum.Enum): PAGAMENTO = "PAGAMENTO" RECEBIMENTO = "RECEBIMENTO" AMBOS = "AMBOS" class ComercialRelacaoComercial(Base, TimestampMixin, UuidMixin, AtivoMixin): __tablename__ = "comercial_relacoes_comercial" log_auditoria_habilitado = False descricao_relacao_comercial: str = Column(String(30), nullable=False) transacao_comercial: Mapped[ComercialTransacaoComercialEnum] = mapped_column(Enum( ComercialTransacaoComercialEnum, inherit_schema=True ), nullable=False) pessoa_relacao: Mapped[List["ComercialPessoa"]] = relationship(secondary=comercial_relacionamento_pessoa_empresa, back_populates='rc', passive_deletes=True, lazy="selectin", join_depth=1, ) class ComercialTipoEndereco(Base, TimestampMixin, UuidMixin, AtivoMixin): __tablename__ = "comercial_tipos_endereco" log_auditoria_habilitado = False tipo_endereco_descricao: str = Column(String(30), nullable=False) relacao_endereco_tp: Mapped[List["ComercialEndereco"]] = relationship(back_populates="relacao_tipo_endereco", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class ComercialPessoa(UuidMixin, Base, TimestampMixin, AtivoMixin): __tablename__ = "comercial_pessoas" log_auditoria_habilitado = False pessoa_status: bool = Column(Boolean, unique=False, default=True) pessoa_telefone: Mapped[str20] pessoa_celular: Mapped[str20] pessoa_tipo: Mapped[str1] pessoa_email: Mapped[str150] pessoa_local_evento: bool = Column(Boolean, unique=False, default=False) rc: Mapped[List["ComercialRelacaoComercial"]] = relationship(secondary=comercial_relacionamento_pessoa_empresa, back_populates='pessoa_relacao', passive_deletes=True, lazy="selectin", join_depth=1) enderecos: Mapped[List["ComercialEndereco"]] = relationship(back_populates="pessoa", passive_deletes=True, lazy="selectin", join_depth=2) # usuario: Mapped[List["RbacUser"]] = relationship(back_populates="pessoa", passive_deletes=True, # lazy="selectin", # join_depth=2) relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_pessoa", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) __mapper_args__ = {"polymorphic_identity": "comercial_pessoas", "polymorphic_on": "pessoa_tipo", } class ComercialJuridica(ComercialPessoa): __tablename__ = "comercial_juridicas" log_auditoria_habilitado = False uuid: Mapped[uuid] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"), primary_key=True) juridica_cnpj: Mapped[str14] juridica_email_fiscal: Mapped[str100] juridica_insc_est: Mapped[str50] juridica_ins_mun: Mapped[str50] juridica_razao_social: Mapped[str200] juridica_representante: Mapped[str100] __mapper_args__ = { "polymorphic_identity": "0", "polymorphic_load": "selectin" } class ComercialFisica(ComercialPessoa): __tablename__ = "comercial_fisicas" log_auditoria_habilitado = False uuid: Mapped[uuid] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"), primary_key=True) fisica_cpf: Mapped[str11] fisica_rg: Mapped[str20] fisica_genero: Mapped[str2] fisica_nome: Mapped[str100] __mapper_args__ = { "polymorphic_identity": "1", "polymorphic_load": "selectin" } class ComercialEndereco(Base, TimestampMixin, UuidMixin): __tablename__ = "comercial_enderecos" log_auditoria_habilitado = False endereco_pessoa_status: bool = Column(Boolean, unique=False, default=True) endereco_pessoa_descricao: Mapped[str50] endereco_pessoa_numero: Mapped[str8] endereco_pessoa_complemento: Mapped[str50] endereco_pessoa_cep: Mapped[str8] fk_pessoa_uuid: Mapped[UuidType] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"), nullable=False) pessoa: Mapped["ComercialPessoa"] = relationship(back_populates="enderecos", lazy="selectin", join_depth=1) fk_tipo_endereco_uuid: Mapped[UuidType] = mapped_column(ForeignKey("comercial_tipos_endereco.uuid", ondelete="CASCADE"), nullable=False) relacao_tipo_endereco: Mapped["ComercialTipoEndereco"] = relationship(back_populates="relacao_endereco_tp", lazy="selectin", join_depth=2) # __________________________________________USUÁRIOS E PERMISSÃO DE ACESSO______________________________________________ rbac_papeis_usuario = Table( 'rbac_papeis_usuario', Base.metadata, Column('user_uuid', UUID(as_uuid=True), ForeignKey('shared.rbac_usuarios.id'), primary_key=True), Column('papel_uuid', UUID(as_uuid=True), ForeignKey('shared.rbac_papeis.uuid'), primary_key=True), # Multi Tennat schema='shared' ) rbac_papel_permissoes = Table( 'rbac_papel_permissoes', Base.metadata, Column('papel_uuid', UUID(as_uuid=True), ForeignKey('shared.rbac_papeis.uuid'), primary_key=True), Column('permissao_id', Integer, ForeignKey('shared.rbac_permissoes.id'), primary_key=True), # Multi Tennat schema='shared' ) class RbacPermissao(Base): __tablename__ = "rbac_permissoes" log_auditoria_habilitado = False id = Column(Integer, primary_key=True, index=True) nome: Mapped[str50] = mapped_column(nullable=False, unique=True) papeis: Mapped[List["RbacPapel"]] = relationship(secondary=rbac_papel_permissoes, back_populates='permissoes', passive_deletes=True, lazy="selectin", join_depth=1, ) # Multi Tennat __table_args__ = ({"schema": "shared"},) class RbacPapel(UuidMixin, Base): __tablename__ = "rbac_papeis" log_auditoria_habilitado = False # id = Column(Integer, primary_key=True, index=True, autoincrement=True) nome: Mapped[str50] = mapped_column(nullable=False, unique=True) permissoes: Mapped[List["RbacPermissao"]] = relationship(secondary=rbac_papel_permissoes, back_populates='papeis', passive_deletes=True, lazy="selectin", join_depth=2, ) usuarios: Mapped[List["RbacUser"]] = relationship(secondary=rbac_papeis_usuario, back_populates='papeis', passive_deletes=True, lazy="selectin", join_depth=1, ) # Multi Tennat __table_args__ = ({"schema": "shared"},) class RbacUser(SQLAlchemyBaseUserTableUUID, Base): __tablename__ = "rbac_usuarios" log_auditoria_habilitado = False def __init__(self, **kwargs): super().__init__(**kwargs) papeis: Mapped[List[RbacPapel]] = relationship(secondary=rbac_papeis_usuario, back_populates='usuarios', passive_deletes=True, lazy="selectin", join_depth=1) # Multi Tennat fk_inquilino_uuid: Mapped[UuidType] = mapped_column(ForeignKey("shared.inquilinos.uuid", ondelete="CASCADE"), nullable=False) inquilino: Mapped["Inquilino"] = relationship(back_populates="usuario", lazy="selectin", passive_deletes=True, join_depth=1) nome_completo: Mapped[str100] __table_args__ = ({"schema": "shared"},) # __________________________________________FINAL USUÁRIOS E PERMISSÃO DE ACESSO________________________________________ # ________________________________________________CONTAS A PAGAR E RECEBER______________________________________________ class FinanceiroTipoContaEnum(enum.Enum): PAGAR = "PAGAR" RECEBER = "RECEBER" class FinanceiroTipoMovimentacaoEnum(enum.Enum): CREDITO = "CREDITO" DEBITO = "DEBITO" class FinanceiroStatus(Base, IdMixin): __tablename__ = "financeiro_status" log_auditoria_habilitado = False status_nome_status: Mapped[str20] status_descricao: Mapped[str200] relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_status", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) relacao_parcelas: Mapped[List["FinanceiroParcela"]] = relationship(back_populates="relacao_status", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroForma_Pagamento(Base, IdMixin): __tablename__ = "financeiro_formas_pagamento" log_auditoria_habilitado = False formas_pagamento_descricao: Mapped[str20] relacao_pagamentos: Mapped[List["FinanceiroPagamento"]] = relationship(back_populates="relacao_formas_pagamento", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroCategoria(Base, IdMixin): __tablename__ = "financeiro_categorias" log_auditoria_habilitado = False categorias_nome: Mapped[str20] relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_categorias", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroCentro_Custo(Base, IdMixin): __tablename__ = "financeiro_centros_custo" log_auditoria_habilitado = False centros_custo_nome: Mapped[str20] centros_custo_descricao: Mapped[str100] relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_centros_custo", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroParcela(Base, IdMixin): __tablename__ = "financeiro_parcelas" log_auditoria_habilitado = True parcelas_numero_parcela: Mapped[int] = mapped_column(Integer, nullable=False) parcelas_valor_parcela: Mapped[valor_monetario] parcelas_valor_juros: Mapped[valor_monetario] parcelas_valor_multa: Mapped[valor_monetario] parcelas_valor_desconto: Mapped[valor_monetario] parcelas_data_vencimento: Mapped[data_idx] fk_contas_id: Mapped[int] = mapped_column(ForeignKey("financeiro_contas.id", ondelete="CASCADE"), nullable=False) relacao_conta: Mapped["FinanceiroConta"] = relationship(back_populates="relacao_parcelas", lazy="selectin", join_depth=2) fk_status_id: Mapped[int] = mapped_column(ForeignKey("financeiro_status.id", ondelete="CASCADE"), nullable=False) relacao_status: Mapped["FinanceiroStatus"] = relationship(back_populates="relacao_parcelas", lazy="selectin", join_depth=2) relacao_pagamentos: Mapped[List["FinanceiroPagamento"]] = relationship(back_populates="relacao_parcela", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroPagamento(Base, IdMixin): __tablename__ = "financeiro_pagamentos" log_auditoria_habilitado = True data_pagamento: Mapped[data_idx] valor_pago: Mapped[valor_monetario] observacao: Mapped[text] fk_parcelas_id: Mapped[int] = mapped_column(ForeignKey("financeiro_parcelas.id", ondelete="CASCADE"), nullable=False) relacao_parcela: Mapped["FinanceiroParcela"] = relationship(back_populates="relacao_pagamentos", lazy="selectin", join_depth=2) fk_contas_corrente_id: Mapped[int] = mapped_column(ForeignKey("financeiro_contas_corrente.id", ondelete="CASCADE"), nullable=False) relacao_contas_corrente: Mapped["FinanceiroConta_Corrente"] = relationship(back_populates="relacao_pagamentos", lazy="selectin", join_depth=2) fk_formas_pagamento_id: Mapped[int] = mapped_column(ForeignKey("financeiro_formas_pagamento.id", ondelete="CASCADE"), nullable=False) relacao_formas_pagamento: Mapped["FinanceiroForma_Pagamento"] = relationship(back_populates="relacao_pagamentos", lazy="selectin", join_depth=2) relacao_movimentacoes_conta: Mapped[List[ "FinanceiroMovimentacao_Conta"]] = relationship(back_populates="relacao_pagamentos", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroConta(Base, IdMixin): __tablename__ = "financeiro_contas" log_auditoria_habilitado = True contas_tipo_conta: Mapped[FinanceiroTipoContaEnum] = mapped_column(Enum(FinanceiroTipoContaEnum, inherit_schema=True ), nullable=False) contas_data_emissao: Mapped[data] contas_data_vencimento: Mapped[data] contas_valor_total: Mapped[valor_monetario] contas_valor_juros: Mapped[valor_monetario] contas_valor_multa: Mapped[valor_monetario] contas_valor_desconto: Mapped[valor_monetario] contas_descricao: Mapped[str200] fk_pessoas_uuid: Mapped[int] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"), nullable=False) relacao_pessoa: Mapped["ComercialPessoa"] = relationship(back_populates="relacao_conta", lazy="selectin", join_depth=2) fk_status_id: Mapped[int] = mapped_column(ForeignKey("financeiro_status.id", ondelete="CASCADE"), nullable=False) relacao_status: Mapped["FinanceiroStatus"] = relationship(back_populates="relacao_conta", lazy="selectin", join_depth=2) fk_categorias_id: Mapped[int] = mapped_column(ForeignKey("financeiro_categorias.id", ondelete="CASCADE"), nullable=False) relacao_categorias: Mapped["FinanceiroCategoria"] = relationship(back_populates="relacao_conta", lazy="selectin", join_depth=2) fk_centros_custo_id: Mapped[int] = mapped_column(ForeignKey("financeiro_centros_custo.id", ondelete="CASCADE"), nullable=False) relacao_centros_custo: Mapped["FinanceiroCentro_Custo"] = relationship(back_populates="relacao_conta", lazy="selectin", join_depth=2) relacao_parcelas: Mapped[List["FinanceiroParcela"]] = relationship(back_populates="relacao_conta", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroConta_Corrente(Base, IdMixin): __tablename__ = "financeiro_contas_corrente" log_auditoria_habilitado = True contas_corrente_nome_conta: Mapped[str50] contas_corrente_saldo_inicial: Mapped[valor_monetario] contas_corrente_data_criacao: Mapped[data_idx] contas_corrente_descricao: Mapped[str100] relacao_movimentacoes_conta: Mapped[List["FinanceiroMovimentacao_Conta"]] = relationship( back_populates="relacao_contas_corrente", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) relacao_pagamentos: Mapped[List["FinanceiroPagamento"]] = relationship(back_populates="relacao_contas_corrente", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class FinanceiroMovimentacao_Conta(Base, IdMixin): __tablename__ = "financeiro_movimentacoes_conta" log_auditoria_habilitado = True movimentacoes_conta_tipo_movimentacao: Mapped[FinanceiroTipoMovimentacaoEnum] = mapped_column( Enum(FinanceiroTipoMovimentacaoEnum, # Multi Tennat inherit_schema=True # /Multi Tennat ), nullable=False, ) movimentacoes_conta_valor_movimentacao: Mapped[valor_monetario] movimentacoes_conta_data_movimentacao: Mapped[data_idx] movimentacoes_conta_descricao: Mapped[str200] fk_contas_corrente_id: Mapped[int] = mapped_column(ForeignKey("financeiro_contas_corrente.id", ondelete="CASCADE"), nullable=False) relacao_contas_corrente: Mapped[ "FinanceiroConta_Corrente"] = relationship(back_populates="relacao_movimentacoes_conta", lazy="selectin", join_depth=2) fk_pagamentos_id: Mapped[int] = mapped_column(ForeignKey("financeiro_pagamentos.id", ondelete="CASCADE"), nullable=False) relacao_pagamentos: Mapped["FinanceiroPagamento"] = relationship(back_populates="relacao_movimentacoes_conta", lazy="selectin", join_depth=2) financeiro_conta_manutencao_equipamentos = Table('financeiro_conta_manutencao_equipamentos', Base.metadata, Column('manutencao_uuid', UUID(as_uuid=True), ForeignKey('estoque_manutencoes_equipamentos.uuid'), primary_key=True), Column('conta_id', Integer, ForeignKey('financeiro_contas.id'), primary_key=True) ) # ______________________________________________FIM CONTAS A PAGAR E RECEBER____________________________________________ # _____________________________________________________TABLEAS DE LOG___________________________________________________ class HistoricoAlteracoes(Base, UuidMixin): __tablename__ = 'historico_alteracoes' tabela: Mapped[str100] data_modificacao: Mapped[datetime] = mapped_column(DateTime, nullable=False) action: Mapped[str10] # 'update', 'delete' usuario_id: Mapped[str36_uuid_null] # Assumindo que o "ID" do usuário é uma "string" registro_id: Mapped[str36_uuid] # "ID" do registro que está sendo alterado # Relacionamentos updates: Mapped[List["HistoricoUpdate"]] = relationship(back_populates="alteracao", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) deletes: Mapped["HistoricoDelete"] = relationship(back_populates="alteracao", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class HistoricoUpdate(Base, UuidMixin): __tablename__ = 'historico_update' fk_historico_alteracoes_uuid: Mapped[UuidType] = mapped_column(ForeignKey("historico_alteracoes.uuid", ondelete="CASCADE"), nullable=False) coluna: Mapped[str100] valor_antigo: Mapped[str200] valor_novo: Mapped[str200] # Relacionamento com a tabela principal alteracao: Mapped["HistoricoAlteracoes"] = relationship(back_populates="updates", lazy="selectin", join_depth=2) class HistoricoDelete(Base, UuidMixin): __tablename__ = 'historico_delete' fk_historico_alteracoes_uuid: Mapped[UuidType] = mapped_column(ForeignKey("historico_alteracoes.uuid", ondelete="CASCADE"), nullable=False) registro_deletado: Mapped[text] # Aqui armazenamos o estado completo da linha deletada como JSON # Relacionamento com a tabela principal alteracao: Mapped["HistoricoAlteracoes"] = relationship(back_populates="deletes", lazy="selectin", join_depth=2) # ___________________________________________________FIM TABLEAS DE LOG_________________________________________________ # ______________________________________________LOCALIZAÇÃO ARQUIVOS S3_________________________________________________ class S3Arquivo(Base, UuidMixin, TimestampMixin): __tablename__ = "s3_arquivos" arquivos_nome_original: Mapped[str200] arquivos_nome_armazenado: Mapped[str200] associacoes: Mapped["S3ArquivoAssociacao"] = relationship(back_populates="arquivos", passive_deletes=True, lazy="selectin", cascade="all, delete-orphan", join_depth=1) class S3ArquivoAssociacao(Base, UuidMixin, TimestampMixin): __tablename__ = "s3_arquivo_associacoes" fk_arquivo_uuid: Mapped[UuidType] = mapped_column(ForeignKey("s3_arquivos.uuid", ondelete="CASCADE"), nullable=False) arquivo_associacoes_tabela_relacionada: Mapped[str100] # Nome da tabela associada arquivo_associacoes_linha_uuid: Mapped[UuidType] # Uuid da linha na tabela associada arquivos: Mapped["S3Arquivo"] = relationship(back_populates="associacoes", lazy="selectin", join_depth=2) # ____________________________________________FIM LOCALIZAÇÃO ARQUIVOS S3_______________________________________________ # __________________________________________________CONFIGURAÇÃO HERANÇA________________________________________________ # ____________________________________________NECESSÁRIO FICA NO FIM DO CÓDIGO__________________________________________ # Definindo a consulta polimórfica PESSOA_POLY = with_polymorphic( ComercialPessoa, # Modelo base [ComercialFisica, ComercialJuridica] # Subclasses ) # ________________________________________________FIM CONFIGURAÇÃO HERANÇA______________________________________________