This commit is contained in:
2025-07-09 01:05:45 -05:00
parent 1bbe6e2743
commit d7a610a83b
113 changed files with 1512 additions and 2348 deletions

View File

@ -2,32 +2,30 @@
import os
import sys
import warnings
import json
import importlib
from logging.config import fileConfig
from sqlalchemy import create_engine, pool
from alembic import context
# ─── Ensure we can load .env and app code ────────────────────────────────────
# ─── Suppress harmless warnings about FK cycles ───────────────────────────────
warnings.filterwarnings(
"ignore",
r"Cannot correctly sort tables; there are unresolvable cycles between tables.*"
)
# ─── Ensure project root is on sys.path ──────────────────────────────────────
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, project_root)
# ─── Load .env (so MYSQL_* and other vars are available) ─────────────────────
# ─── Load environment vars so DB URL is available ────────────────────────────
from dotenv import load_dotenv, find_dotenv
dotenv_path = find_dotenv() # looks in project root or parents
if dotenv_path:
load_dotenv(dotenv_path, override=True)
dotenv = find_dotenv()
if dotenv:
load_dotenv(dotenv, override=True)
# ─── Alembic Config & Logging ────────────────────────────────────────────────
config = context.config
fileConfig(config.config_file_name)
# ─── Import your apps metadata for 'autogenerate' support ─────────────────
from app import db
target_metadata = db.metadata
# ─── Dynamically import all plugin models listed in plugin.json ─────────────
# ─── Dynamically import every plugins models *before* capturing metadata ────
plugins_dir = os.path.join(project_root, "plugins")
for plugin in sorted(os.listdir(plugins_dir)):
manifest = os.path.join(plugins_dir, plugin, "plugin.json")
@ -37,7 +35,6 @@ for plugin in sorted(os.listdir(plugins_dir)):
meta = json.load(open(manifest))
except Exception:
continue
for model_mod in meta.get("models", []):
try:
importlib.import_module(model_mod)
@ -50,59 +47,70 @@ for plugin in sorted(os.listdir(plugins_dir)):
except ImportError:
pass
# ─── Build or retrieve the database URL ──────────────────────────────────────
def get_database_url():
# 1) alembic.ini setting
# ─── Alembic config & logging ────────────────────────────────────────────────
config = context.config
fileConfig(config.config_file_name)
# ─── Now import the applications metadata ───────────────────────────────────
from app import db
target_metadata = db.metadata
# ─── Hook to skip unwanted objects (never drop tables) ───────────────────────
def include_object(obj, name, type_, reflected, compare_to):
# skip tables present in DB but not in models
if type_ == "table" and reflected and compare_to is None:
return False
# skip constraints & indexes
if type_ in ("foreign_key_constraint", "unique_constraint", "index"):
return False
return True
# ─── Helper to build the DB URL ───────────────────────────────────────────────
def get_url():
url = config.get_main_option("sqlalchemy.url")
if url:
return url
# 2) Generic DATABASE_URL env var
return url.strip()
url = os.environ.get("DATABASE_URL")
if url:
return url
u = os.environ.get("MYSQL_USER")
p = os.environ.get("MYSQL_PASSWORD")
h = os.environ.get("MYSQL_HOST", "db")
pt= os.environ.get("MYSQL_PORT", "3306")
dbn= os.environ.get("MYSQL_DATABASE")
if u and p and dbn:
return f"mysql+pymysql://{u}:{p}@{h}:{pt}/{dbn}"
raise RuntimeError("No DB URL configured")
# 3) MySQL env vars (from .env or docker-compose)
user = os.environ.get("MYSQL_USER")
pwd = os.environ.get("MYSQL_PASSWORD")
host = os.environ.get("MYSQL_HOST", "db")
port = os.environ.get("MYSQL_PORT", "3306")
dbn = os.environ.get("MYSQL_DATABASE")
if user and pwd and dbn:
return f"mysql+pymysql://{user}:{pwd}@{host}:{port}/{dbn}"
raise RuntimeError(
"Database URL not configured for Alembic migrations; "
"set 'sqlalchemy.url' in alembic.ini, or DATABASE_URL, "
"or MYSQL_USER/MYSQL_PASSWORD/MYSQL_DATABASE in the environment"
)
# ─── Offline migration ───────────────────────────────────────────────────────
# ─── Offline migrations ──────────────────────────────────────────────────────
def run_migrations_offline():
url = get_database_url()
context.configure(
url=url,
url=get_url(),
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
compare_type=True,
compare_server_default=True,
include_object=include_object,
)
with context.begin_transaction():
context.run_migrations()
# ─── Online migration ───────────────────────────────────────────────────────
# ─── Online migrations ───────────────────────────────────────────────────────
def run_migrations_online():
url = get_database_url()
connectable = create_engine(url, poolclass=pool.NullPool)
with connectable.connect() as connection:
engine = create_engine(get_url(), poolclass=pool.NullPool)
with engine.connect() as conn:
context.configure(
connection=connection,
connection=conn,
target_metadata=target_metadata,
compare_type=True,
compare_server_default=True,
include_object=include_object,
)
with context.begin_transaction():
context.run_migrations()
# ─── Entrypoint ─────────────────────────────────────────────────────────────
if context.is_offline_mode():
run_migrations_offline()
else:

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 01876f89899b
Revises: a69f613f9cd5
Create Date: 2025-06-28 08:15:57.708963
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '01876f89899b'
down_revision = 'a69f613f9cd5'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 03650b9a0f3a
Revises: 85b7ca21ec19
Create Date: 2025-06-28 07:57:56.370633
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '03650b9a0f3a'
down_revision = '85b7ca21ec19'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 0514fb24a61e
Revises: fe0ebdec3255
Create Date: 2025-06-28 09:25:58.833912
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0514fb24a61e'
down_revision = 'fe0ebdec3255'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 06234a515bde
Revises: 87c6df96bef3
Create Date: 2025-06-30 09:44:06.865642
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '06234a515bde'
down_revision = '87c6df96bef3'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 076bfc1a441b
Revises: 7229fe50de09
Create Date: 2025-06-30 08:22:10.087506
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '076bfc1a441b'
down_revision = '7229fe50de09'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 08ebb5577232
Revises: 0efc1a18285f
Create Date: 2025-06-28 09:34:14.207419
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '08ebb5577232'
down_revision = '0efc1a18285f'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 0964777a3294
Revises: 53d0e3d0cd47
Create Date: 2025-06-30 09:37:40.005273
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0964777a3294'
down_revision = '53d0e3d0cd47'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 0efc1a18285f
Revises: 886aa234b3b7
Create Date: 2025-06-28 09:30:43.185721
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0efc1a18285f'
down_revision = '886aa234b3b7'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 10e39b33d4e7
Revises: ee4be515bb55
Create Date: 2025-06-30 10:06:13.159708
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '10e39b33d4e7'
down_revision = 'ee4be515bb55'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 12cc29f97b11
Revises: dcc114909948
Create Date: 2025-06-30 07:59:46.612023
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '12cc29f97b11'
down_revision = 'dcc114909948'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 12ef820b5618
Revises: 228e71f1a33b
Create Date: 2025-06-30 08:45:15.427549
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '12ef820b5618'
down_revision = '228e71f1a33b'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 19e2a1b15b5e
Revises: f00a9585a348
Create Date: 2025-06-27 22:59:54.162560
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '19e2a1b15b5e'
down_revision = 'f00a9585a348'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 209596f02c2a
Revises: 42ce181f4eab
Create Date: 2025-06-27 09:50:03.962692
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '209596f02c2a'
down_revision = '42ce181f4eab'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 228e71f1a33b
Revises: 493fbb46e881
Create Date: 2025-06-30 08:40:05.646744
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '228e71f1a33b'
down_revision = '493fbb46e881'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,36 +0,0 @@
"""auto-migrate
Revision ID: 24de4aa78a43
Revises: 4082065b932b
Create Date: 2025-06-28 23:24:05.909001
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '24de4aa78a43'
down_revision = '4082065b932b'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('zip_jobs',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('filename', sa.String(length=255), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=True),
sa.Column('status', sa.String(length=20), nullable=True),
sa.Column('error', sa.Text(), nullable=True),
sa.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('zip_jobs')
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 27f1b3976f3f
Revises: 10e39b33d4e7
Create Date: 2025-06-30 10:09:47.442196
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '27f1b3976f3f'
down_revision = '10e39b33d4e7'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 2d11e31941d9
Revises: acd3093204e7
Create Date: 2025-06-30 07:45:03.061969
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '2d11e31941d9'
down_revision = 'acd3093204e7'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 30376c514135
Revises: 01876f89899b
Create Date: 2025-06-28 08:20:23.577743
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '30376c514135'
down_revision = '01876f89899b'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 310f500a3d2f
Revises: d49ee8d82364
Create Date: 2025-06-30 10:13:54.468427
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '310f500a3d2f'
down_revision = 'd49ee8d82364'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 390c977fe679
Revises: c23c31ae3a1d
Create Date: 2025-06-28 08:34:18.914877
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '390c977fe679'
down_revision = 'c23c31ae3a1d'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 4082065b932b
Revises: 08ebb5577232
Create Date: 2025-06-28 09:41:11.323777
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '4082065b932b'
down_revision = '08ebb5577232'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 42ce181f4eab
Revises: 93f8a5cbc643
Create Date: 2025-06-27 09:47:28.698481
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '42ce181f4eab'
down_revision = '93f8a5cbc643'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 493fbb46e881
Revises: faeca4f53b04
Create Date: 2025-06-30 08:28:50.667633
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '493fbb46e881'
down_revision = 'faeca4f53b04'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 51640ecd70ee
Revises: 390c977fe679
Create Date: 2025-06-28 08:35:37.016653
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '51640ecd70ee'
down_revision = '390c977fe679'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 53d0e3d0cd47
Revises: c6fad4522e3c
Create Date: 2025-06-30 09:32:22.487970
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '53d0e3d0cd47'
down_revision = 'c6fad4522e3c'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 7229fe50de09
Revises: 12cc29f97b11
Create Date: 2025-06-30 08:20:50.414985
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '7229fe50de09'
down_revision = '12cc29f97b11'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 807ca973d0cf
Revises: 51640ecd70ee
Create Date: 2025-06-28 08:46:56.744709
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '807ca973d0cf'
down_revision = '51640ecd70ee'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 85b7ca21ec19
Revises: 8c1e8db7b3cb
Create Date: 2025-06-27 23:34:04.669553
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '85b7ca21ec19'
down_revision = '8c1e8db7b3cb'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 87c6df96bef3
Revises: f34b5e058563
Create Date: 2025-06-30 09:43:22.353321
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '87c6df96bef3'
down_revision = 'f34b5e058563'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 886aa234b3b7
Revises: 0514fb24a61e
Create Date: 2025-06-28 09:27:59.962665
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '886aa234b3b7'
down_revision = '0514fb24a61e'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 892da654697c
Revises: f7f41136c073
Create Date: 2025-06-28 08:56:06.592485
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '892da654697c'
down_revision = 'f7f41136c073'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 8c1e8db7b3cb
Revises: 19e2a1b15b5e
Create Date: 2025-06-27 23:21:19.031362
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '8c1e8db7b3cb'
down_revision = '19e2a1b15b5e'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 93f8a5cbc643
Revises: 9cc2626a6e79
Create Date: 2025-06-27 09:31:27.528072
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '93f8a5cbc643'
down_revision = '9cc2626a6e79'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: 9cc2626a6e79
Revises: d54a88422a68
Create Date: 2025-06-27 09:28:40.656166
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '9cc2626a6e79'
down_revision = 'd54a88422a68'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: a5cb08298ee4
Revises: 0964777a3294
Create Date: 2025-06-30 09:40:06.234651
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a5cb08298ee4'
down_revision = '0964777a3294'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: a69f613f9cd5
Revises: a87d4c1df4e5
Create Date: 2025-06-28 08:13:00.288626
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a69f613f9cd5'
down_revision = 'a87d4c1df4e5'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,39 +0,0 @@
"""auto-migrate
Revision ID: a79453aefa45
Revises: 892da654697c
Create Date: 2025-06-28 09:18:37.918669
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a79453aefa45'
down_revision = '892da654697c'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('analytics_event',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('timestamp', sa.DateTime(), nullable=False),
sa.Column('method', sa.String(length=10), nullable=False),
sa.Column('path', sa.String(length=200), nullable=False),
sa.Column('status_code', sa.Integer(), nullable=False),
sa.Column('response_time', sa.Float(), nullable=False),
sa.Column('user_agent', sa.String(length=200), nullable=True),
sa.Column('referer', sa.String(length=200), nullable=True),
sa.Column('accept_language', sa.String(length=200), nullable=True),
sa.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('analytics_event')
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: a87d4c1df4e5
Revises: 03650b9a0f3a
Create Date: 2025-06-28 08:04:13.547254
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a87d4c1df4e5'
down_revision = '03650b9a0f3a'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: acd3093204e7
Revises: f741addef1a1
Create Date: 2025-06-30 07:29:07.401797
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'acd3093204e7'
down_revision = 'f741addef1a1'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: b1e37dc718f2
Revises: c92477263320
Create Date: 2025-06-30 09:46:40.791979
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b1e37dc718f2'
down_revision = 'c92477263320'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: b56cd5e57987
Revises: a79453aefa45
Create Date: 2025-06-28 09:20:55.842491
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b56cd5e57987'
down_revision = 'a79453aefa45'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: b57c767ad0d6
Revises: 310f500a3d2f
Create Date: 2025-06-30 10:15:24.093788
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b57c767ad0d6'
down_revision = '310f500a3d2f'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: b684611b27b1
Revises: 12ef820b5618
Create Date: 2025-06-30 08:51:21.461638
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b684611b27b1'
down_revision = '12ef820b5618'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,36 +0,0 @@
"""auto-migrate
Revision ID: c23c31ae3a1d
Revises: 30376c514135
Create Date: 2025-06-28 08:31:46.351949
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c23c31ae3a1d'
down_revision = '30376c514135'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('users', schema=None) as batch_op:
batch_op.add_column(sa.Column('is_deleted', sa.Boolean(), nullable=False))
batch_op.add_column(sa.Column('is_banned', sa.Boolean(), nullable=False))
batch_op.add_column(sa.Column('suspended_until', sa.DateTime(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('users', schema=None) as batch_op:
batch_op.drop_column('suspended_until')
batch_op.drop_column('is_banned')
batch_op.drop_column('is_deleted')
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: c6fad4522e3c
Revises: dd2492e0ede0
Create Date: 2025-06-30 09:30:35.084623
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c6fad4522e3c'
down_revision = 'dd2492e0ede0'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: c92477263320
Revises: fa34eb3f6084
Create Date: 2025-06-30 09:45:35.016682
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c92477263320'
down_revision = 'fa34eb3f6084'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: d49ee8d82364
Revises: 27f1b3976f3f
Create Date: 2025-06-30 10:12:13.065540
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd49ee8d82364'
down_revision = '27f1b3976f3f'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: d54a88422a68
Revises: d7bbffbbc931
Create Date: 2025-06-27 09:24:27.947480
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd54a88422a68'
down_revision = 'd7bbffbbc931'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: d647dd4d3fbd
Revises: b684611b27b1
Create Date: 2025-06-30 08:54:56.276182
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd647dd4d3fbd'
down_revision = 'b684611b27b1'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,32 +0,0 @@
"""auto-migrate
Revision ID: d7bbffbbc931
Revises:
Create Date: 2025-06-27 09:20:35.600333
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'd7bbffbbc931'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('grow_logs', schema=None) as batch_op:
batch_op.add_column(sa.Column('event_type', sa.String(length=50), nullable=False))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('grow_logs', schema=None) as batch_op:
batch_op.drop_column('event_type')
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: dcc114909948
Revises: 2d11e31941d9
Create Date: 2025-06-30 07:49:55.919638
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'dcc114909948'
down_revision = '2d11e31941d9'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: dd2492e0ede0
Revises: d647dd4d3fbd
Create Date: 2025-06-30 09:18:20.337888
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'dd2492e0ede0'
down_revision = 'd647dd4d3fbd'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: ee4be515bb55
Revises: b1e37dc718f2
Create Date: 2025-06-30 09:57:22.706206
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'ee4be515bb55'
down_revision = 'b1e37dc718f2'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: f00a9585a348
Revises: 209596f02c2a
Create Date: 2025-06-27 09:55:08.249023
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f00a9585a348'
down_revision = '209596f02c2a'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: f34b5e058563
Revises: a5cb08298ee4
Create Date: 2025-06-30 09:40:49.692944
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f34b5e058563'
down_revision = 'a5cb08298ee4'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,59 +0,0 @@
"""auto-migrate
Revision ID: f741addef1a1
Revises: 24de4aa78a43
Create Date: 2025-06-29 10:16:35.487343
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
# revision identifiers, used by Alembic.
revision = 'f741addef1a1'
down_revision = '24de4aa78a43'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('update_images')
op.drop_table('plant_updates')
with op.batch_alter_table('grow_logs', schema=None) as batch_op:
batch_op.add_column(sa.Column('media_id', sa.Integer(), nullable=True))
batch_op.create_foreign_key(None, 'media', ['media_id'], ['id'])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('grow_logs', schema=None) as batch_op:
batch_op.drop_constraint(None, type_='foreignkey')
batch_op.drop_column('media_id')
op.create_table('plant_updates',
sa.Column('id', mysql.INTEGER(), autoincrement=True, nullable=False),
sa.Column('growlog_id', mysql.INTEGER(), autoincrement=False, nullable=False),
sa.Column('description', mysql.TEXT(), nullable=True),
sa.Column('created_at', mysql.DATETIME(), nullable=False),
sa.ForeignKeyConstraint(['growlog_id'], ['grow_logs.id'], name=op.f('plant_updates_ibfk_1')),
sa.PrimaryKeyConstraint('id'),
mysql_collate='utf8mb4_0900_ai_ci',
mysql_default_charset='utf8mb4',
mysql_engine='InnoDB'
)
op.create_table('update_images',
sa.Column('id', mysql.INTEGER(), autoincrement=True, nullable=False),
sa.Column('update_id', mysql.INTEGER(), autoincrement=False, nullable=False),
sa.Column('media_id', mysql.INTEGER(), autoincrement=False, nullable=False),
sa.Column('created_at', mysql.DATETIME(), nullable=False),
sa.ForeignKeyConstraint(['media_id'], ['media.id'], name=op.f('update_images_ibfk_2')),
sa.ForeignKeyConstraint(['update_id'], ['plant_updates.id'], name=op.f('update_images_ibfk_1')),
sa.PrimaryKeyConstraint('id'),
mysql_collate='utf8mb4_0900_ai_ci',
mysql_default_charset='utf8mb4',
mysql_engine='InnoDB'
)
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: f7f41136c073
Revises: 807ca973d0cf
Create Date: 2025-06-28 08:50:28.814054
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f7f41136c073'
down_revision = '807ca973d0cf'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: f81a9a44a7fb
Revises: b56cd5e57987
Create Date: 2025-06-28 09:22:10.689435
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'f81a9a44a7fb'
down_revision = 'b56cd5e57987'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: fa34eb3f6084
Revises: 06234a515bde
Create Date: 2025-06-30 09:44:53.445644
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'fa34eb3f6084'
down_revision = '06234a515bde'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: faeca4f53b04
Revises: 076bfc1a441b
Create Date: 2025-06-30 08:27:15.001657
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'faeca4f53b04'
down_revision = '076bfc1a441b'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@ -1,28 +0,0 @@
"""auto-migrate
Revision ID: fe0ebdec3255
Revises: f81a9a44a7fb
Create Date: 2025-06-28 09:23:36.801994
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'fe0ebdec3255'
down_revision = 'f81a9a44a7fb'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###