Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 167 additions & 0 deletions alembic/versions/4df6bfee2c69_overhaul_file_uploads.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
"""Overhaul file uploads

Revision ID: 4df6bfee2c69
Revises: 6902e1cceec6
Create Date: 2026-03-11 20:40:21.564545

"""


# revision identifiers, used by Alembic.
revision = '4df6bfee2c69'
down_revision = '6902e1cceec6'
branch_labels = None
depends_on = None

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql


try:
is_sqlite = op.get_context().dialect.name == 'sqlite'
except Exception:
is_sqlite = False

if is_sqlite:
op.get_context().connection.execute('PRAGMA foreign_keys=ON;')
utcnow_server_default = "(datetime('now', 'utc'))"
else:
utcnow_server_default = "timezone('utc', current_timestamp)"

def sqlite_column_reflect_listener(inspector, table, column_info):
"""Adds parenthesis around SQLite datetime defaults for utcnow."""
if column_info['default'] == "datetime('now', 'utc')":
column_info['default'] = utcnow_server_default

sqlite_reflect_kwargs = {
'listeners': [('column_reflect', sqlite_column_reflect_listener)]
}

# ===========================================================================
# HOWTO: Handle alter statements in SQLite
#
# def upgrade():
# if is_sqlite:
# with op.batch_alter_table('table_name', reflect_kwargs=sqlite_reflect_kwargs) as batch_op:
# batch_op.alter_column('column_name', type_=sa.Unicode(), server_default='', nullable=False)
# else:
# op.alter_column('table_name', 'column_name', type_=sa.Unicode(), server_default='', nullable=False)
#
# ===========================================================================


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('file',
sa.Column('id', sa.Uuid(as_uuid=False), nullable=False),
sa.Column('created', sa.DateTime(timezone=True), nullable=False),
sa.Column('last_updated', sa.DateTime(timezone=True), nullable=False),
sa.Column('external_id', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
sa.Column('last_synced', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
sa.Column('fk_id', sa.Uuid(as_uuid=False), nullable=False),
sa.Column('fk_model', sa.Unicode(), nullable=False),
sa.Column('description', sa.Unicode(), nullable=False),
sa.Column('filename', sa.Unicode(), nullable=False),
sa.Column('content_type', sa.Unicode(), nullable=False),
sa.Column('extension', sa.Unicode(), nullable=False),
sa.Column('filepath', sa.Unicode(), nullable=False),
sa.Column('download_url', sa.Unicode(), nullable=False),
sa.Column('flags', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_file'))
)
op.drop_table('guest_image')
op.drop_table('indie_game_image')
op.drop_table('mits_picture')
op.drop_table('guest_track')
op.drop_table('mits_document')
op.drop_column('guest_stage_plot', 'content_type')
op.drop_column('guest_stage_plot', 'filename')
op.drop_index(op.f('uq_promo_code_word_normalized_word_part_of_speech'), table_name='promo_code_word')
op.create_index('uq_promo_code_word_normalized_word_part_of_speech', 'promo_code_word', [sa.literal_column('lower(trim(word))'), 'part_of_speech'], unique=True)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('uq_promo_code_word_normalized_word_part_of_speech', table_name='promo_code_word')
op.create_index(op.f('uq_promo_code_word_normalized_word_part_of_speech'), 'promo_code_word', [sa.literal_column('lower(TRIM(BOTH FROM word))'), 'part_of_speech'], unique=True)
op.add_column('guest_stage_plot', sa.Column('filename', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False))
op.add_column('guest_stage_plot', sa.Column('content_type', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False))
op.create_table('mits_document',
sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('filename', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('description', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('game_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('created', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('last_updated', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('external_id', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('last_synced', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['game_id'], ['mits_game.id'], name=op.f('fk_mits_document_game_id_mits_game'), ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name=op.f('pk_mits_document'))
)
op.create_table('guest_track',
sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('created', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('last_updated', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('external_id', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('last_synced', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('guest_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('filename', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('content_type', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('extension', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['guest_id'], ['guest_group.id'], name=op.f('fk_guest_track_guest_id_guest_group'), ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name=op.f('pk_guest_track')),
sa.UniqueConstraint('guest_id', name=op.f('uq_guest_track_guest_id'), postgresql_include=[], postgresql_nulls_not_distinct=False)
)
op.create_table('mits_picture',
sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('filename', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('content_type', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('extension', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('description', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('game_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('created', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('last_updated', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('external_id', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('last_synced', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('is_header', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.Column('is_thumbnail', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['game_id'], ['mits_game.id'], name=op.f('fk_mits_picture_game_id_mits_game'), ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name=op.f('pk_mits_picture'))
)
op.create_table('indie_game_image',
sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('game_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('filename', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('content_type', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('extension', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('description', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('is_screenshot', sa.BOOLEAN(), server_default=sa.text('true'), autoincrement=False, nullable=False),
sa.Column('use_in_promo', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.Column('created', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('last_updated', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('external_id', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('last_synced', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('is_header', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.Column('is_thumbnail', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['game_id'], ['indie_game.id'], name=op.f('fk_indie_game_image_game_id_indie_game'), ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name=op.f('pk_indie_game_image'))
)
op.create_table('guest_image',
sa.Column('filename', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('content_type', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('extension', sa.VARCHAR(), server_default=sa.text("''::character varying"), autoincrement=False, nullable=False),
sa.Column('is_header', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.Column('is_thumbnail', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False),
sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('created', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('last_updated', postgresql.TIMESTAMP(timezone=True), server_default=sa.text("timezone('utc'::text, CURRENT_TIMESTAMP)"), autoincrement=False, nullable=False),
sa.Column('external_id', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('last_synced', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False),
sa.Column('guest_id', sa.UUID(), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['guest_id'], ['guest_group.id'], name=op.f('fk_guest_image_guest_id_guest_group'), ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name=op.f('pk_guest_image'))
)
op.drop_table('file')
# ### end Alembic commands ###
1 change: 1 addition & 0 deletions uber/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from uber import server # noqa: F401
from uber import tasks # noqa: F401
from uber import validations # noqa: F401
from uber import files # noqa: F401
from uber.serializer import serializer # noqa: F401

# NOTE: this will decrease the precision of some serialized decimal.Decimals
Expand Down
7 changes: 0 additions & 7 deletions uber/configspec.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1051,14 +1051,7 @@ privateKey = string(default="")
[[terminal_ids]]

[data_dirs]
# Directories on the server filesystem where uploaded files are saved
uploaded_files_dir = string(default="%(root)s/uploaded_files")
guests_bio_pics_dir = string(default="%(uploaded_files_dir)s/guests_bio_pics")
guests_w9_forms_dir = string(default="%(uploaded_files_dir)s/guests_w9_forms")
guests_stage_plots_dir = string(default="%(uploaded_files_dir)s/guests_stage_plots")
guests_inventory_dir = string(default="%(uploaded_files_dir)s/guests_inventory")
mivs_game_image_dir = string(default="%(uploaded_files_dir)s/mivs_game_images")
mits_picture_dir = string(default="%(uploaded_files_dir)s/mits_game_images")


[dates]
Expand Down
1 change: 1 addition & 0 deletions uber/custom_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import sys
from datetime import datetime, timedelta
from urllib.parse import quote_plus
from pytz import UTC

import cherrypy
import jinja2
Expand Down
Loading
Loading