Add error handling for table creation in Alembic migrations

1 parent 884d29c3
......@@ -19,6 +19,7 @@ schema=None
# schema = 'public'
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
try:
op.create_table('groups',
sa.Column('member_count', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
......@@ -30,12 +31,18 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('holiday',
sa.Column('tanggal', sa.DateTime(), nullable=True),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_holiday'))
)
except Exception as e:
print(str(e))
try:
op.create_table('logs',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
......@@ -48,6 +55,9 @@ def upgrade():
sa.PrimaryKeyConstraint('id', name=op.f('pk_logs')),
sa.UniqueConstraint('line_id', name=op.f('uq_logs_line_id'))
)
except Exception as e:
print(str(e))
try:
op.create_table('parameters',
sa.Column('value', sa.String(length=256), nullable=False),
sa.Column('nama', sa.String(length=128), nullable=False),
......@@ -61,6 +71,9 @@ def upgrade():
primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_parameters'))
)
except Exception as e:
print(str(e))
try:
op.create_table('departemen',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
......@@ -81,6 +94,9 @@ def upgrade():
# schema=schema
)
except Exception as e:
print(str(e))
try:
op.create_table('permissions',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
......@@ -91,6 +107,9 @@ def upgrade():
sa.UniqueConstraint('perm_name', name=op.f('uq_permissions_perm_name')),
# schema=schema
)
except Exception as e:
print(str(e))
try:
op.create_table('res_provinsi',
sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('ibu_kota', sa.String(length=64), nullable=True),
......@@ -106,6 +125,9 @@ def upgrade():
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_provinsi')),
# schema=schema
)
except Exception as e:
print(str(e))
try:
op.create_table('routes',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
......@@ -133,6 +155,9 @@ def upgrade():
sa.UniqueConstraint('kode', name=op.f('uq_routes_kode')),
sa.UniqueConstraint('path', name=op.f('uq_routes_path'))
)
except Exception as e:
print(str(e))
try:
op.create_table('target_jenis',
sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False),
......@@ -145,6 +170,9 @@ def upgrade():
primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_target_jenis'))
)
except Exception as e:
print(str(e))
try:
op.create_table('targets',
sa.Column('tahun', sa.Integer(), nullable=False),
sa.Column('jenis', sa.Integer(), nullable=False),
......@@ -171,6 +199,9 @@ def upgrade():
primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_targets'))
)
except Exception as e:
print(str(e))
try:
op.create_table('users',
sa.Column('last_login_date', sa.DateTime(timezone=True), nullable=True),
sa.Column('registered_date', sa.DateTime(timezone=True), nullable=False),
......@@ -196,6 +227,9 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('external_identities',
sa.Column('external_id', sa.Unicode(length=255), nullable=False),
sa.Column('external_user_name', sa.Unicode(length=255), nullable=True),
......@@ -209,6 +243,9 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('groups_permissions',
sa.Column('group_id', sa.Integer(), nullable=False),
sa.Column('perm_name', sa.Unicode(length=64), nullable=False),
......@@ -218,6 +255,9 @@ def upgrade():
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('res_dati2',
sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('ibu_kota', sa.String(length=64), nullable=True),
......@@ -235,6 +275,9 @@ def upgrade():
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_dati2')),
# schema=schema
)
except Exception as e:
print(str(e))
try:
op.create_table('resources',
sa.Column('resource_id', sa.Integer(), sa.Identity(always=True),
primary_key=True, autoincrement=True, nullable=False),
......@@ -251,8 +294,17 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_index(op.f('ix_resources_owner_group_id'), 'resources', ['owner_group_id'], unique=False)
except Exception as e:
print(str(e))
try:
op.create_index(op.f('ix_resources_owner_user_id'), 'resources', ['owner_user_id'], unique=False)
except Exception as e:
print(str(e))
try:
op.create_table('user_device',
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('kode', sa.String(length=256), nullable=True),
......@@ -270,6 +322,9 @@ def upgrade():
sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_user_device_user_id_users')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_user_device'))
)
except Exception as e:
print(str(e))
try:
op.create_table('users_groups',
sa.Column('group_id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=False),
......@@ -279,6 +334,9 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('users_permissions',
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('perm_name', sa.Unicode(length=64), nullable=False),
......@@ -287,6 +345,9 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('groups_resources_permissions',
sa.Column('group_id', sa.Integer(), nullable=False),
sa.Column('resource_id', sa.Integer(), autoincrement=False, nullable=False),
......@@ -297,6 +358,9 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('res_kecamatan',
sa.Column('ibu_kota', sa.String(length=64), nullable=True),
sa.Column('dati2_id', sa.SmallInteger(), nullable=True),
......@@ -313,6 +377,9 @@ def upgrade():
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_kecamatan')),
# schema=schema
)
except Exception as e:
print(str(e))
try:
op.create_table('users_resources_permissions',
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('resource_id', sa.Integer(), autoincrement=False, nullable=False),
......@@ -323,6 +390,9 @@ def upgrade():
mysql_charset='utf8',
mysql_engine='InnoDB'
)
except Exception as e:
print(str(e))
try:
op.create_table('res_desa',
sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('kecamatan_id', sa.SmallInteger(), nullable=True),
......@@ -339,6 +409,9 @@ def upgrade():
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_desa')),
# schema=schema
)
except Exception as e:
print(str(e))
try:
op.create_table('partner',
sa.Column('kelurahan', sa.String(length=128), nullable=True),
sa.Column('kecamatan', sa.String(length=128), nullable=True),
......@@ -385,6 +458,9 @@ def upgrade():
sa.ForeignKeyConstraint(['provinsi_id'], ['res_provinsi.id'], name=op.f('fk_partner_provinsi_id_res_provinsi')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_partner'))
)
except Exception as e:
print(str(e))
try:
op.create_table('user_area',
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('desa_id', sa.Integer(), nullable=True),
......@@ -394,6 +470,9 @@ def upgrade():
sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_user_area_user_id_users')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_user_area'))
)
except Exception as e:
print(str(e))
try:
op.create_table('partner_files',
sa.Column('partner_id', sa.Integer(), nullable=False),
sa.Column('file_name', sa.String(length=256), nullable=False),
......@@ -408,37 +487,121 @@ def upgrade():
sa.ForeignKeyConstraint(['partner_id'], ['partner.id'], name=op.f('fk_partner_files_partner_id_partner')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_partner_files'))
)
except Exception as e:
print(str(e))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
try:
op.drop_table('partner_files')
except Exception as e:
print(str(e))
try:
op.drop_table('user_area')
except Exception as e:
print(str(e))
try:
op.drop_table('partner')
except Exception as e:
print(str(e))
try:
op.drop_table('res_desa') #, schema=schema
except Exception as e:
print(str(e))
try:
op.drop_table('users_resources_permissions')
except Exception as e:
print(str(e))
try:
op.drop_table('res_kecamatan'), # schema = schema
except Exception as e:
print(str(e))
try:
op.drop_table('groups_resources_permissions')
except Exception as e:
print(str(e))
try:
op.drop_table('users_permissions')
except Exception as e:
print(str(e))
try:
op.drop_table('users_groups')
except Exception as e:
print(str(e))
try:
op.drop_table('user_device')
except Exception as e:
print(str(e))
try:
op.drop_index(op.f('ix_resources_owner_user_id'), table_name='resources')
except Exception as e:
print(str(e))
try:
op.drop_index(op.f('ix_resources_owner_group_id'), table_name='resources')
except Exception as e:
print(str(e))
try:
op.drop_table('resources')
except Exception as e:
print(str(e))
try:
op.drop_table('res_dati2')
except Exception as e:
print(str(e))
try:
op.drop_table('groups_permissions')
except Exception as e:
print(str(e))
try:
op.drop_table('external_identities')
except Exception as e:
print(str(e))
try:
op.drop_table('users')
except Exception as e:
print(str(e))
try:
op.drop_table('targets')
except Exception as e:
print(str(e))
try:
op.drop_table('target_jenis')
except Exception as e:
print(str(e))
try:
op.drop_table('routes')
except Exception as e:
print(str(e))
try:
op.drop_table('res_provinsi')
except Exception as e:
print(str(e))
try:
op.drop_table('permissions')
except Exception as e:
print(str(e))
try:
op.drop_table('departemen')
except Exception as e:
print(str(e))
try:
op.drop_table('parameters')
except Exception as e:
print(str(e))
try:
op.drop_table('logs')
except Exception as e:
print(str(e))
try:
op.drop_table('holiday')
except Exception as e:
print(str(e))
try:
op.drop_table('groups')
except Exception as e:
print(str(e))
# ### end Alembic commands ###
......@@ -18,6 +18,7 @@ depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
try:
op.create_table('eselon',
sa.Column('pangkat', sa.String(length=32), nullable=True),
sa.Column('ruang', sa.String(length=1), nullable=True),
......@@ -29,10 +30,14 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_uid', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_eselon')),
# schema='public'
)
except Exception as e:
print(str(e))
try:
op.create_table('pangkat',
sa.Column('pangkat', sa.String(length=32), nullable=True),
sa.Column('ruang', sa.String(length=1), nullable=True),
......@@ -43,10 +48,14 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_uid', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_pangkat')),
# schema='public'
)
except Exception as e:
print(str(e))
try:
op.create_table('jabatan',
sa.Column('jenis', sa.SmallInteger(), nullable=True),
sa.Column('nama_lain', sa.String(
......@@ -61,19 +70,24 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_uid', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['eselon_id'], ['eselon.id'], name=op.f(
'fk_jabatan_eselon_id_eselon')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_jabatan')),
# schema='public'
)
except Exception as e:
print(str(e))
try:
op.create_table('partner_departemen',
sa.Column('partner_id', sa.Integer(), nullable=True),
sa.Column('departemen_id', sa.Integer(), nullable=True),
sa.Column('jabatan_id', sa.SmallInteger(), nullable=True),
sa.Column('mulai', sa.DateTime(), nullable=True),
sa.Column('selesai', sa.DateTime(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['departemen_id'], ['departemen.id'], name=op.f(
'fk_partner_departemen_departemen_id_departemen')),
sa.ForeignKeyConstraint(['jabatan_id'], ['jabatan.id'], name=op.f(
......@@ -86,6 +100,9 @@ def upgrade():
'jabatan_id', 'mulai', name='partner_dept_uq'),
# schema='public'
)
except Exception as e:
print(str(e))
# ### end Alembic commands ###
......
......@@ -30,7 +30,8 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_uid', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True , nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_text_printers')),
# schema='public'
)
......
from datetime import datetime, timezone
import sqlalchemy as sa
class ForceUTCDatetime(sa.TypeDecorator):
"""Ensures datetimes are timezone-aware UTC objects across both DBs."""
impl = sa.TIMESTAMP(timezone=True)
cache_ok = True
def process_bind_param(self, value, dialect):
if value is not None:
if value.tzinfo is None:
# Interpret naive datetime as UTC or handle according to business logic
value = value.replace(tzinfo=timezone.utc)
else:
# Convert any other timezone directly to UTC
value = value.astimezone(timezone.utc)
return value
def process_result_value(self, value, dialect):
if value is not None and value.tzinfo is None:
# Force the Python object to be aware if Oracle stripped the offset
return value.replace(tzinfo=timezone.utc)
return value
from .meta import *
from .common import *
from .base import *
......
......@@ -59,7 +59,7 @@ class _Departemen(NamaModel):
eng = cls.db_session.get_bind()
if eng.dialect.name.lower() == "oracle":
sql = """
SELECT
SELECT
--LPAD(' ', (LEVEL - 1) * 2) || nama AS hierarchy,
SYS_CONNECT_BY_PATH(nama, '/') AS hierarchy,
id,
......@@ -69,62 +69,56 @@ SELECT
status,
(LEVEL - 1) AS lvl,
SYS_CONNECT_BY_PATH(id, ',') AS path
FROM
FROM
departemen
START WITH
START WITH
parent_id IS NULL
CONNECT BY
CONNECT BY
PRIOR id = parent_id
ORDER SIBLINGS BY
id"""
ORDER SIBLINGS BY
id """
else:
sql = """
WITH RECURSIVE dep_tree AS (
WITH RECURSIVE dep_tree AS (
SELECT
id,
kode,
nama,
nama::text AS nama,
parent_id,
status,
0 AS lvl,
ARRAY[id] AS path
FROM
public.departemen
WHERE
{str_where}
FROM departemen
UNION ALL
SELECT
c.id,
c.kode,
c.nama,
ct.nama || '/' || c.nama::text AS nama,
c.parent_id,
c.status,
ct.level + 1,
ct.lvl + 1,
ct.path || c.id
FROM
public.departemen c
JOIN
dep_tree ct ON c.parent_id = ct.id
FROM departemen c
JOIN dep_tree ct ON c.parent_id = ct.id
)
SELECT
REPEAT(' ', lvl) || nama AS hierarchy, -- Indent names based on level
SELECT DISTINCT ON (kode)
id,
kode,
nama,
nama as hierarchy,
parent_id,
status,
level,
lvl,
path
FROM
dep_tree
""".format(str_where=str_where)
FROM dep_tree
"""
#.format(str_where=str_where)
if search:
sql = f"{sql} WHERE nama ILIKE '%{search}%' "
sql = sql+"""ORDER BY path;"""
sql = sql+"""ORDER BY kode, path """
return cls.db_session.execute(text(sql)).fetchall()
......
from datetime import datetime
import logging
from math import log
from requests import session
import pytz
import sqlalchemy as sa
from pyramid.authorization import (Allow, Authenticated, ALL_PERMISSIONS)
# from sqlalchemy import TIMESTAMP
from sqlalchemy import (
Column, Integer, DateTime, SmallInteger, String)
from sqlalchemy.orm import (relationship, backref)
......@@ -28,7 +26,7 @@ from opensipkd.tools import as_timezone
from .base import CommonModel, DBSession, DefaultModel
from .meta import Base
from .base import TABLE_ARGS
from . import ForceUTCDatetime
log = logging.getLogger(__name__)
class _GroupPermission(GroupPermissionMixin):
pass
......@@ -93,7 +91,7 @@ class _UserResourcePermission(UserResourcePermissionMixin):
class UserResourcePermission(_UserResourcePermission, Base):
pass
from sqlalchemy import TIMESTAMP
class _User(UserMixin, BaseModel):
db_session = DBSession
last_login_date = Column(DateTime(timezone=True), nullable=True)
......@@ -106,7 +104,8 @@ class _User(UserMixin, BaseModel):
# 'Asia/Jakarta')),
# server_default="2000-01-01 01:01+7",
# )
security_code_date = Column(TIMESTAMP(timezone=True))
# security_code_date = Column(TIMESTAMP(timezone=True))
security_code_date = Column(ForceUTCDatetime)
api_key = Column(String(256))
partner_id = Column(Integer) # , ForeignKey(Partner.id))
company_id = Column(Integer) # , ForeignKey(Partner.id))
......
......@@ -179,7 +179,10 @@ class Views(BaseView):
url_dict = request.matchdict
if url_dict['act'] == 'grid':
query = Departemen.cte_get()
data = [{"id": d.id, "kode": d.kode, "nama": d.hierarchy[1:], "status": d.status,
data = [{"id": d.id, "kode": d.kode,
"nama": d.hierarchy.startswith(
'/') and d.hierarchy[1:] or d.hierarchy,
"status": d.status,
"level_id": d.lvl, "parent_id": d.parent_id} for d in query]
return {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!