mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-29 19:35:20 +02:00
feat(automation): wire SQLAlchemy relationships on both sides
This commit is contained in:
parent
7ac99b89a0
commit
7f4c1c25ab
4 changed files with 60 additions and 0 deletions
|
|
@ -14,6 +14,7 @@ from sqlalchemy import (
|
||||||
Text,
|
Text,
|
||||||
)
|
)
|
||||||
from sqlalchemy.dialects.postgresql import JSONB, UUID
|
from sqlalchemy.dialects.postgresql import JSONB, UUID
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from app.db import BaseModel, TimestampMixin
|
from app.db import BaseModel, TimestampMixin
|
||||||
|
|
||||||
|
|
@ -59,3 +60,18 @@ class Automation(BaseModel, TimestampMixin):
|
||||||
onupdate=lambda: datetime.now(UTC),
|
onupdate=lambda: datetime.now(UTC),
|
||||||
index=True,
|
index=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
search_space = relationship("SearchSpace", back_populates="automations")
|
||||||
|
created_by = relationship("User", back_populates="automations")
|
||||||
|
triggers = relationship(
|
||||||
|
"AutomationTrigger",
|
||||||
|
back_populates="automation",
|
||||||
|
cascade="all, delete-orphan",
|
||||||
|
passive_deletes=True,
|
||||||
|
)
|
||||||
|
runs = relationship(
|
||||||
|
"AutomationRun",
|
||||||
|
back_populates="automation",
|
||||||
|
cascade="all, delete-orphan",
|
||||||
|
passive_deletes=True,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ from sqlalchemy import (
|
||||||
Integer,
|
Integer,
|
||||||
)
|
)
|
||||||
from sqlalchemy.dialects.postgresql import JSONB
|
from sqlalchemy.dialects.postgresql import JSONB
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from app.db import BaseModel, TimestampMixin
|
from app.db import BaseModel, TimestampMixin
|
||||||
|
|
||||||
|
|
@ -55,3 +56,6 @@ class AutomationRun(BaseModel, TimestampMixin):
|
||||||
|
|
||||||
started_at = Column(TIMESTAMP(timezone=True), nullable=True)
|
started_at = Column(TIMESTAMP(timezone=True), nullable=True)
|
||||||
finished_at = Column(TIMESTAMP(timezone=True), nullable=True)
|
finished_at = Column(TIMESTAMP(timezone=True), nullable=True)
|
||||||
|
|
||||||
|
automation = relationship("Automation", back_populates="runs")
|
||||||
|
trigger = relationship("AutomationTrigger", back_populates="runs")
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ from sqlalchemy import (
|
||||||
Integer,
|
Integer,
|
||||||
)
|
)
|
||||||
from sqlalchemy.dialects.postgresql import JSONB
|
from sqlalchemy.dialects.postgresql import JSONB
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from app.db import BaseModel, TimestampMixin
|
from app.db import BaseModel, TimestampMixin
|
||||||
|
|
||||||
|
|
@ -44,3 +45,10 @@ class AutomationTrigger(BaseModel, TimestampMixin):
|
||||||
)
|
)
|
||||||
|
|
||||||
last_fired_at = Column(TIMESTAMP(timezone=True), nullable=True)
|
last_fired_at = Column(TIMESTAMP(timezone=True), nullable=True)
|
||||||
|
|
||||||
|
automation = relationship("Automation", back_populates="triggers")
|
||||||
|
runs = relationship(
|
||||||
|
"AutomationRun",
|
||||||
|
back_populates="trigger",
|
||||||
|
passive_deletes=True,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -1533,6 +1533,14 @@ class SearchSpace(BaseModel, TimestampMixin):
|
||||||
cascade="all, delete-orphan",
|
cascade="all, delete-orphan",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
automations = relationship(
|
||||||
|
"Automation",
|
||||||
|
back_populates="search_space",
|
||||||
|
order_by="Automation.id",
|
||||||
|
cascade="all, delete-orphan",
|
||||||
|
passive_deletes=True,
|
||||||
|
)
|
||||||
|
|
||||||
# RBAC relationships
|
# RBAC relationships
|
||||||
roles = relationship(
|
roles = relationship(
|
||||||
"SearchSpaceRole",
|
"SearchSpaceRole",
|
||||||
|
|
@ -2125,6 +2133,13 @@ if config.AUTH_TYPE == "GOOGLE":
|
||||||
passive_deletes=True,
|
passive_deletes=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Automations created by this user
|
||||||
|
automations = relationship(
|
||||||
|
"Automation",
|
||||||
|
back_populates="created_by",
|
||||||
|
passive_deletes=True,
|
||||||
|
)
|
||||||
|
|
||||||
# Incentive tasks completed by this user
|
# Incentive tasks completed by this user
|
||||||
incentive_tasks = relationship(
|
incentive_tasks = relationship(
|
||||||
"UserIncentiveTask",
|
"UserIncentiveTask",
|
||||||
|
|
@ -2257,6 +2272,13 @@ else:
|
||||||
passive_deletes=True,
|
passive_deletes=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Automations created by this user
|
||||||
|
automations = relationship(
|
||||||
|
"Automation",
|
||||||
|
back_populates="created_by",
|
||||||
|
passive_deletes=True,
|
||||||
|
)
|
||||||
|
|
||||||
# Incentive tasks completed by this user
|
# Incentive tasks completed by this user
|
||||||
incentive_tasks = relationship(
|
incentive_tasks = relationship(
|
||||||
"UserIncentiveTask",
|
"UserIncentiveTask",
|
||||||
|
|
@ -2560,6 +2582,16 @@ class RefreshToken(Base, TimestampMixin):
|
||||||
return not self.is_expired and not self.is_revoked
|
return not self.is_expired and not self.is_revoked
|
||||||
|
|
||||||
|
|
||||||
|
# Register model packages that live outside this file so their classes
|
||||||
|
# are present in Base.metadata before configure_mappers() resolves any
|
||||||
|
# string-based relationship() references.
|
||||||
|
from app.automations.persistence import ( # noqa: E402, F401
|
||||||
|
Automation,
|
||||||
|
AutomationRun,
|
||||||
|
AutomationTrigger,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
engine = create_async_engine(
|
engine = create_async_engine(
|
||||||
DATABASE_URL,
|
DATABASE_URL,
|
||||||
pool_size=30,
|
pool_size=30,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue