diff --git a/marketing_api/models/db.py b/marketing_api/models/db.py index 7415c0b..1a835c6 100644 --- a/marketing_api/models/db.py +++ b/marketing_api/models/db.py @@ -1,9 +1,13 @@ import enum from datetime import datetime -import sqlalchemy as sa -from sqlalchemy import Column -from sqlalchemy.orm import relationship +from sqlalchemy import ( + JSON, + DateTime, + Integer, + String, +) +from sqlalchemy.orm import Mapped, mapped_column, relationship from .base import Base @@ -16,12 +20,14 @@ class Actions(str, enum.Enum): class User(Base): - id = Column(sa.Integer, primary_key=True) - union_number = Column(sa.String, nullable=True) - user_agent = Column(sa.String, nullable=True) - auth_user_id = Column(sa.Integer, nullable=True) - modify_ts = Column(sa.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) - create_ts = Column(sa.DateTime, nullable=False, default=datetime.utcnow) + id: Mapped[int] = mapped_column(Integer, primary_key=True) + union_number: Mapped[str | None] = mapped_column(String, nullable=True) + user_agent: Mapped[str | None] = mapped_column(String, nullable=True) + auth_user_id: Mapped[int | None] = mapped_column(Integer, nullable=True) + modify_ts: Mapped[datetime] = mapped_column( + DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow + ) + create_ts: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=datetime.utcnow) actions = relationship( "ActionsInfo", @@ -37,13 +43,13 @@ def __repr__(self): class ActionsInfo(Base): """Actions from user""" - id = Column(sa.Integer, primary_key=True) - user_id = Column(sa.Integer, nullable=True) - action = Column(sa.String, nullable=False) - path_from = Column(sa.String, nullable=True) - path_to = Column(sa.String, nullable=True) - additional_data = Column(sa.String, nullable=True) - create_ts = Column(sa.DateTime, nullable=False, default=datetime.utcnow) + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int | None] = mapped_column(Integer, nullable=True) + action: Mapped[str] = mapped_column(String, nullable=False) + path_from: Mapped[str | None] = mapped_column(String, nullable=True) + path_to: Mapped[str | None] = mapped_column(String, nullable=True) + additional_data: Mapped[dict | None] = mapped_column(JSON, nullable=True) + create_ts: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=datetime.utcnow) user = relationship( User, primaryjoin="foreign(ActionsInfo.user_id)==User.id", uselist=False, back_populates="actions" diff --git a/marketing_api/routes/models.py b/marketing_api/routes/models.py index 4a0123b..18f48b3 100644 --- a/marketing_api/routes/models.py +++ b/marketing_api/routes/models.py @@ -8,7 +8,7 @@ class Base(BaseModel): class ActionInfo(Base): user_id: int | None = None action: str - additional_data: str | None = None + additional_data: dict | list[dict] | None = None path_from: str | None = None path_to: str | None = None diff --git a/migrations/versions/413b6371014e_new_version_sqlachemy_updates.py b/migrations/versions/413b6371014e_new_version_sqlachemy_updates.py new file mode 100644 index 0000000..cdfe749 --- /dev/null +++ b/migrations/versions/413b6371014e_new_version_sqlachemy_updates.py @@ -0,0 +1,39 @@ +"""New version sqlachemy updates + +Revision ID: 413b6371014e +Revises: 0ea7185ac58b +Create Date: 2025-11-27 22:27:15.710601 + +""" + +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision = '413b6371014e' +down_revision = '0ea7185ac58b' +branch_labels = None +depends_on = None + + +def upgrade(): + op.alter_column( + 'actions_info', + 'additional_data', + existing_type=sa.VARCHAR(), + type_=sa.JSON(), + existing_nullable=True, + postgresql_using='additional_data::json', + ) + + +def downgrade(): + op.alter_column( + 'actions_info', + 'additional_data', + existing_type=sa.JSON(), + type_=sa.VARCHAR(), + existing_nullable=True, + postgresql_using='additional_data::text', + )