Commit 24c9f63f by aa.gusti

Merge branch '5.0.3-oracle' into '5.0.3'

# Conflicts:
#   opensipkd/base/views/base_views.py
2 parents 05cbbc00 4c69bd02
5.0.5 2027-07-11
Penyesuaian ke deform 3.x
5.0.4 2026-06-01 5.0.4 2026-06-01
1. Penambahan parameter 1. Penambahan parameter
- ws_print_url - ws_print_url
......
...@@ -14,7 +14,7 @@ pyramid.debug_notfound = true ...@@ -14,7 +14,7 @@ pyramid.debug_notfound = true
pyramid.debug_routematch = true pyramid.debug_routematch = true
pyramid.debug_templates = true pyramid.debug_templates = true
default_locale_name = id default_locale_name = id
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demos sqlalchemy.url = postgresql://aagusti:a@localhost:5432/webrs
pyramid.includes = pyramid.includes =
pyramid_tm pyramid_tm
pyramid_beaker pyramid_beaker
...@@ -64,13 +64,13 @@ reg_captcha = 1 ...@@ -64,13 +64,13 @@ reg_captcha = 1
reg_verify = 1 reg_verify = 1
# MAIL # MAIL
mail.host = smtp.gmail.com ; mail.host = smtp.gmail.com
mail.port = 465 ; mail.port = 465
mail.ssl = True ; mail.ssl = True
mail.tls = True ; mail.tls = True
mail.username = opensipkd@gmail.com ; mail.username = opensipkd@gmail.com
mail.password = ajmyoksxeiprmtyc ; mail.password = ajmyoksxeiprmtyc
mail.sender_name = "openSIPKD" ; mail.sender_name = "openSIPKD"
;PBB ;PBB
pbb.url = oracle://PBB:A@10.8.50.62/simpbb pbb.url = oracle://PBB:A@10.8.50.62/simpbb
......
...@@ -27,7 +27,7 @@ from .models.handlers import LogDBSession ...@@ -27,7 +27,7 @@ from .models.handlers import LogDBSession
from .models.meta import Base from .models.meta import Base
from .models.users import init_model from .models.users import init_model
from .models import Route from .models import Route
# from .models import TABLE_ARGS
# from deform import ZPTRendererFactory, Form # from deform import ZPTRendererFactory, Form
# from deform.widget import default_resource_registry # from deform.widget import default_resource_registry
...@@ -302,10 +302,25 @@ def get_config(settings): ...@@ -302,10 +302,25 @@ def get_config(settings):
return config return config
# def get_schema_for_dialect(engine_dialect_name: str) -> str | None:
# """Returns 'public' for PostgreSQL or None for Oracle to match native defaults."""
# if "postgresql" in engine_dialect_name.lower():
# return "public"
# return None # Triggers default user-schema fallback on Oracle
def init_db(settings): def init_db(settings):
engine = engine_from_config( engine = engine_from_config(
settings, 'sqlalchemy.', client_encoding='utf8', settings, 'sqlalchemy.',
# client_encoding='utf8',
max_identifier_length=30) # , convert_unicode=True max_identifier_length=30) # , convert_unicode=True
# global TABLE_ARGS
# # Resolve the target schema namespace dynamically based on active engine
# TABLE_ARGS = dict(extend_existing=True,
# schema=get_schema_for_dialect(engine.dialect.name))
DBSession.configure(bind=engine) DBSession.configure(bind=engine)
LogDBSession.configure(bind=engine) LogDBSession.configure(bind=engine)
Base.metadata.bind = engine Base.metadata.bind = engine
...@@ -314,6 +329,13 @@ def init_db(settings): ...@@ -314,6 +329,13 @@ def init_db(settings):
def datetime_output_handler(cursor, name, default_type, size, precision, scale):
"""Intercepts Oracle TSTZ data types and returns them with tzinfo intact."""
# DB_TYPE_TIMESTAMP_TZ handles Oracle's 'TIMESTAMP WITH TIME ZONE'
import oracledb
if default_type == oracledb.DB_TYPE_TIMESTAMP_TZ:
return cursor.var(oracledb.DB_TYPE_TIMESTAMP_TZ, arraysize=cursor.arraysize, outconverter=lambda v: v)
def main(global_config, **settings): def main(global_config, **settings):
""" This function returns a Pyramid WSGI application. """ This function returns a Pyramid WSGI application.
""" """
...@@ -321,6 +343,21 @@ def main(global_config, **settings): ...@@ -321,6 +343,21 @@ def main(global_config, **settings):
# None: {"js": "opensipkd.base:static/jquery/jquery.maskMoney.min.js"}} # None: {"js": "opensipkd.base:static/jquery/jquery.maskMoney.min.js"}}
if not settings.get('localization', ''): if not settings.get('localization', ''):
settings['localization'] = 'id_ID.UTF-8' settings['localization'] = 'id_ID.UTF-8'
if settings.get("lib_dir"):
sqlalchemy_url = settings.get("sqlalchemy.url")
if sqlalchemy_url and sqlalchemy_url.find("oracledb") > -1:
try:
import oracledb
oracledb.init_oracle_client(lib_dir=settings.get("lib_dir"))
# Apply the global configuration handler to your connection pool
oracledb.defaults.outputtypehandler = datetime_output_handler
_logging.debug("oracledb initialized")
except:
pass
locale.setlocale(locale.LC_ALL, settings['localization']) locale.setlocale(locale.LC_ALL, settings['localization'])
if 'timezone' not in settings: if 'timezone' not in settings:
......
import logging
from logging.config import fileConfig from logging.config import fileConfig
from sqlalchemy import engine_from_config from sqlalchemy import engine_from_config
...@@ -11,6 +12,19 @@ from opensipkd.models import Base ...@@ -11,6 +12,19 @@ from opensipkd.models import Base
config = context.config config = context.config
# Interpret the config file for Python logging. # Interpret the config file for Python logging.
# This line sets up loggers basically. # This line sets up loggers basically.
log = logging.getLogger(__name__)
url = config.get_main_option("sqlalchemy.url")
if url.find("oracledb") > -1:
log.error("OracleDB used: %s", url)
try:
import oracledb
lib_dir = config.get_main_option("lib_dir")
if lib_dir:
oracledb.init_oracle_client(lib_dir=lib_dir)
except Exception as e:
log.error(f"An error occurred: {str(e)}")
log.error("Oracle not initialize")
if config.config_file_name is not None: if config.config_file_name is not None:
fileConfig(config.config_file_name) fileConfig(config.config_file_name)
......
...@@ -15,12 +15,15 @@ depends_on = None ...@@ -15,12 +15,15 @@ depends_on = None
from alembic import op from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
schema=None
# schema = 'public'
def upgrade(): def upgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.create_table('groups', try:
op.create_table('groups',
sa.Column('member_count', sa.Integer(), nullable=True), sa.Column('member_count', 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.Column('group_name', sa.Unicode(length=128), nullable=False), sa.Column('group_name', sa.Unicode(length=128), nullable=False),
sa.Column('description', sa.Text(), nullable=True), sa.Column('description', sa.Text(), nullable=True),
sa.PrimaryKeyConstraint('id', name=op.f('pk_groups')), sa.PrimaryKeyConstraint('id', name=op.f('pk_groups')),
...@@ -28,23 +31,34 @@ def upgrade(): ...@@ -28,23 +31,34 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('holiday', except Exception as e:
print(str(e))
try:
op.create_table('holiday',
sa.Column('tanggal', sa.DateTime(), nullable=True), sa.Column('tanggal', 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.PrimaryKeyConstraint('id', name=op.f('pk_holiday')) sa.PrimaryKeyConstraint('id', name=op.f('pk_holiday'))
) )
op.create_table('logs', except Exception as e:
sa.Column('id', sa.Integer(), nullable=False), print(str(e))
try:
op.create_table('logs',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.Column('line_id', sa.String(length=32), nullable=False), sa.Column('line_id', sa.String(length=32), nullable=False),
sa.Column('logger', sa.String(), nullable=True), sa.Column('logger', sa.Text(), nullable=True),
sa.Column('level', sa.String(), nullable=True), sa.Column('level', sa.Text(), nullable=True),
sa.Column('trace', sa.String(), nullable=True), sa.Column('trace', sa.Text(), nullable=True),
sa.Column('msg', sa.String(), nullable=False), sa.Column('msg', sa.Text(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_logs')), sa.PrimaryKeyConstraint('id', name=op.f('pk_logs')),
sa.UniqueConstraint('line_id', name=op.f('uq_logs_line_id')) sa.UniqueConstraint('line_id', name=op.f('uq_logs_line_id'))
) )
op.create_table('parameters', except Exception as e:
print(str(e))
try:
op.create_table('parameters',
sa.Column('value', sa.String(length=256), nullable=False), sa.Column('value', sa.String(length=256), nullable=False),
sa.Column('nama', sa.String(length=128), nullable=False), sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False), sa.Column('kode', sa.String(length=32), nullable=False),
...@@ -53,11 +67,16 @@ def upgrade(): ...@@ -53,11 +67,16 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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_parameters')) sa.PrimaryKeyConstraint('id', name=op.f('pk_parameters'))
) )
op.create_table('departemen', except Exception as e:
sa.Column('id', sa.Integer(), nullable=False), print(str(e))
try:
op.create_table('departemen',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.Column('parent_id', sa.Integer(), nullable=True), sa.Column('parent_id', sa.Integer(), nullable=True),
sa.Column('kategori', sa.String(length=32), nullable=True), sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('alamat', sa.String(length=255), nullable=True), sa.Column('alamat', sa.String(length=255), nullable=True),
...@@ -70,21 +89,28 @@ def upgrade(): ...@@ -70,21 +89,28 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_uid', sa.Integer(), nullable=True), sa.Column('update_uid', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['parent_id'], ['public.departemen.id'], name=op.f('fk_departemen_parent_id_departemen')), sa.ForeignKeyConstraint(['parent_id'], ['departemen.id'], name=op.f('fk_departemen_parent_id_departemen')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_departemen')), sa.PrimaryKeyConstraint('id', name=op.f('pk_departemen')),
schema='public' # schema=schema
) )
op.create_table('permissions', except Exception as e:
sa.Column('id', sa.Integer(), nullable=False), print(str(e))
try:
op.create_table('permissions',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.Column('perm_name', sa.String(length=64), nullable=False), sa.Column('perm_name', sa.String(length=64), nullable=False),
sa.Column('description', sa.String(length=64), nullable=False), sa.Column('description', sa.String(length=64), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_permissions')), sa.PrimaryKeyConstraint('id', name=op.f('pk_permissions')),
sa.UniqueConstraint('description', name=op.f('uq_permissions_description')), sa.UniqueConstraint('description', name=op.f('uq_permissions_description')),
sa.UniqueConstraint('perm_name', name=op.f('uq_permissions_perm_name')), sa.UniqueConstraint('perm_name', name=op.f('uq_permissions_perm_name')),
schema='public' # schema=schema
) )
op.create_table('res_provinsi', except Exception as e:
print(str(e))
try:
op.create_table('res_provinsi',
sa.Column('kategori', sa.String(length=32), nullable=True), sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('ibu_kota', sa.String(length=64), nullable=True), sa.Column('ibu_kota', sa.String(length=64), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False), sa.Column('nama', sa.String(length=128), nullable=False),
...@@ -94,12 +120,17 @@ def upgrade(): ...@@ -94,12 +120,17 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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_res_provinsi')), sa.PrimaryKeyConstraint('id', name=op.f('pk_res_provinsi')),
schema='public' # schema=schema
) )
op.create_table('routes', except Exception as e:
sa.Column('id', sa.Integer(), nullable=False), print(str(e))
try:
op.create_table('routes',
sa.Column('id', sa.Integer(), sa.Identity(always=True),
primary_key=True, nullable=False),
sa.Column('kode', sa.String(length=128), nullable=True), sa.Column('kode', sa.String(length=128), nullable=True),
sa.Column('path', sa.String(length=256), nullable=False), sa.Column('path', sa.String(length=256), nullable=False),
sa.Column('status', sa.Integer(), server_default='1', nullable=False), sa.Column('status', sa.Integer(), server_default='1', nullable=False),
...@@ -124,7 +155,10 @@ def upgrade(): ...@@ -124,7 +155,10 @@ def upgrade():
sa.UniqueConstraint('kode', name=op.f('uq_routes_kode')), sa.UniqueConstraint('kode', name=op.f('uq_routes_kode')),
sa.UniqueConstraint('path', name=op.f('uq_routes_path')) sa.UniqueConstraint('path', name=op.f('uq_routes_path'))
) )
op.create_table('target_jenis', except Exception as e:
print(str(e))
try:
op.create_table('target_jenis',
sa.Column('nama', sa.String(length=128), nullable=False), sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False), sa.Column('kode', sa.String(length=32), nullable=False),
sa.Column('status', sa.SmallInteger(), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False),
...@@ -132,10 +166,14 @@ def upgrade(): ...@@ -132,10 +166,14 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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_target_jenis')) sa.PrimaryKeyConstraint('id', name=op.f('pk_target_jenis'))
) )
op.create_table('targets', except Exception as e:
print(str(e))
try:
op.create_table('targets',
sa.Column('tahun', sa.Integer(), nullable=False), sa.Column('tahun', sa.Integer(), nullable=False),
sa.Column('jenis', sa.Integer(), nullable=False), sa.Column('jenis', sa.Integer(), nullable=False),
sa.Column('m01', sa.BigInteger(), nullable=False), sa.Column('m01', sa.BigInteger(), nullable=False),
...@@ -157,17 +195,27 @@ def upgrade(): ...@@ -157,17 +195,27 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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_targets')) sa.PrimaryKeyConstraint('id', name=op.f('pk_targets'))
) )
op.create_table('users', 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('last_login_date', sa.DateTime(timezone=True), nullable=True),
sa.Column('registered_date', sa.DateTime(timezone=True), nullable=False), sa.Column('registered_date', sa.DateTime(timezone=True), nullable=False),
sa.Column('security_code_date', sa.DateTime(timezone=True), server_default='2000-01-01 01:01+7', nullable=True), # sa.Column('security_code_date', sa.DateTime(timezone=True),
# nullable=True), # server_default='2000-01-01 01:01+7',
# from sqlalchemy.types import TIMESTAMP
sa.Column('security_code_date', sa.types.TIMESTAMP(timezone=True),
nullable=True), # server_default='2000-01-01 01:01+7',
sa.Column('api_key', sa.String(length=256), nullable=True), sa.Column('api_key', sa.String(length=256), nullable=True),
sa.Column('partner_id', sa.Integer(), nullable=True), sa.Column('partner_id', sa.Integer(), nullable=True),
sa.Column('company_id', sa.Integer(), nullable=True), sa.Column('company_id', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('id', sa.Integer(), sa.Identity(always=True), primary_key=True,
autoincrement=True, nullable=False),
sa.Column('user_name', sa.Unicode(length=128), nullable=True), sa.Column('user_name', sa.Unicode(length=128), nullable=True),
sa.Column('user_password', sa.Unicode(length=256), nullable=True), sa.Column('user_password', sa.Unicode(length=256), nullable=True),
sa.Column('email', sa.Unicode(length=100), nullable=False), sa.Column('email', sa.Unicode(length=100), nullable=False),
...@@ -179,7 +227,10 @@ def upgrade(): ...@@ -179,7 +227,10 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('external_identities', 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_id', sa.Unicode(length=255), nullable=False),
sa.Column('external_user_name', sa.Unicode(length=255), nullable=True), sa.Column('external_user_name', sa.Unicode(length=255), nullable=True),
sa.Column('local_user_id', sa.Integer(), nullable=False), sa.Column('local_user_id', sa.Integer(), nullable=False),
...@@ -192,7 +243,10 @@ def upgrade(): ...@@ -192,7 +243,10 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('groups_permissions', except Exception as e:
print(str(e))
try:
op.create_table('groups_permissions',
sa.Column('group_id', sa.Integer(), nullable=False), sa.Column('group_id', sa.Integer(), nullable=False),
sa.Column('perm_name', sa.Unicode(length=64), nullable=False), sa.Column('perm_name', sa.Unicode(length=64), nullable=False),
sa.ForeignKeyConstraint(['group_id'], ['groups.id'], name=op.f('fk_groups_permissions_group_id_groups'), onupdate='CASCADE', ondelete='CASCADE'), sa.ForeignKeyConstraint(['group_id'], ['groups.id'], name=op.f('fk_groups_permissions_group_id_groups'), onupdate='CASCADE', ondelete='CASCADE'),
...@@ -201,7 +255,10 @@ def upgrade(): ...@@ -201,7 +255,10 @@ def upgrade():
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('res_dati2', except Exception as e:
print(str(e))
try:
op.create_table('res_dati2',
sa.Column('kategori', sa.String(length=32), nullable=True), sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('ibu_kota', sa.String(length=64), nullable=True), sa.Column('ibu_kota', sa.String(length=64), nullable=True),
sa.Column('provinsi_id', sa.SmallInteger(), nullable=True), sa.Column('provinsi_id', sa.SmallInteger(), nullable=True),
...@@ -212,13 +269,18 @@ def upgrade(): ...@@ -212,13 +269,18 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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),
sa.ForeignKeyConstraint(['provinsi_id'], ['public.res_provinsi.id'], name=op.f('fk_res_dati2_provinsi_id_res_provinsi')), primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['provinsi_id'], ['res_provinsi.id'], name=op.f('fk_res_dati2_provinsi_id_res_provinsi')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_dati2')), sa.PrimaryKeyConstraint('id', name=op.f('pk_res_dati2')),
schema='public' # schema=schema
) )
op.create_table('resources', except Exception as e:
sa.Column('resource_id', sa.Integer(), autoincrement=True, nullable=False), 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),
sa.Column('parent_id', sa.Integer(), nullable=True), sa.Column('parent_id', sa.Integer(), nullable=True),
sa.Column('ordering', sa.Integer(), nullable=False), sa.Column('ordering', sa.Integer(), nullable=False),
sa.Column('resource_name', sa.Unicode(length=100), nullable=False), sa.Column('resource_name', sa.Unicode(length=100), nullable=False),
...@@ -232,9 +294,18 @@ def upgrade(): ...@@ -232,9 +294,18 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_index(op.f('ix_resources_owner_group_id'), 'resources', ['owner_group_id'], unique=False) except Exception as e:
op.create_index(op.f('ix_resources_owner_user_id'), 'resources', ['owner_user_id'], unique=False) print(str(e))
op.create_table('user_device', 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('user_id', sa.Integer(), nullable=True),
sa.Column('kode', sa.String(length=256), nullable=True), sa.Column('kode', sa.String(length=256), nullable=True),
sa.Column('token', sa.String(length=256), nullable=True), sa.Column('token', sa.String(length=256), nullable=True),
...@@ -246,11 +317,15 @@ def upgrade(): ...@@ -246,11 +317,15 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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(['user_id'], ['users.id'], name=op.f('fk_user_device_user_id_users')), sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_user_device_user_id_users')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_user_device')) sa.PrimaryKeyConstraint('id', name=op.f('pk_user_device'))
) )
op.create_table('users_groups', except Exception as e:
print(str(e))
try:
op.create_table('users_groups',
sa.Column('group_id', sa.Integer(), nullable=False), sa.Column('group_id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['group_id'], ['groups.id'], name=op.f('fk_users_groups_group_id_groups'), onupdate='CASCADE', ondelete='CASCADE'), sa.ForeignKeyConstraint(['group_id'], ['groups.id'], name=op.f('fk_users_groups_group_id_groups'), onupdate='CASCADE', ondelete='CASCADE'),
...@@ -259,7 +334,10 @@ def upgrade(): ...@@ -259,7 +334,10 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('users_permissions', except Exception as e:
print(str(e))
try:
op.create_table('users_permissions',
sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('perm_name', sa.Unicode(length=64), nullable=False), sa.Column('perm_name', sa.Unicode(length=64), nullable=False),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_users_permissions_user_id_users'), onupdate='CASCADE', ondelete='CASCADE'), sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_users_permissions_user_id_users'), onupdate='CASCADE', ondelete='CASCADE'),
...@@ -267,7 +345,10 @@ def upgrade(): ...@@ -267,7 +345,10 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('groups_resources_permissions', except Exception as e:
print(str(e))
try:
op.create_table('groups_resources_permissions',
sa.Column('group_id', sa.Integer(), nullable=False), sa.Column('group_id', sa.Integer(), nullable=False),
sa.Column('resource_id', sa.Integer(), autoincrement=False, nullable=False), sa.Column('resource_id', sa.Integer(), autoincrement=False, nullable=False),
sa.Column('perm_name', sa.Unicode(length=50), nullable=False), sa.Column('perm_name', sa.Unicode(length=50), nullable=False),
...@@ -277,7 +358,10 @@ def upgrade(): ...@@ -277,7 +358,10 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('res_kecamatan', 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('ibu_kota', sa.String(length=64), nullable=True),
sa.Column('dati2_id', sa.SmallInteger(), nullable=True), sa.Column('dati2_id', sa.SmallInteger(), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False), sa.Column('nama', sa.String(length=128), nullable=False),
...@@ -287,12 +371,16 @@ def upgrade(): ...@@ -287,12 +371,16 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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),
sa.ForeignKeyConstraint(['dati2_id'], ['public.res_dati2.id'], name=op.f('fk_res_kecamatan_dati2_id_res_dati2')), primary_key=True, nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_kecamatan')), sa.ForeignKeyConstraint(['dati2_id'], ['res_dati2.id'], name=op.f('fk_res_kecamatan_dati2_id_res_dati2')),
schema='public' sa.PrimaryKeyConstraint('id', name=op.f('pk_res_kecamatan')),
# schema=schema
) )
op.create_table('users_resources_permissions', except Exception as e:
print(str(e))
try:
op.create_table('users_resources_permissions',
sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('resource_id', sa.Integer(), autoincrement=False, nullable=False), sa.Column('resource_id', sa.Integer(), autoincrement=False, nullable=False),
sa.Column('perm_name', sa.Unicode(length=64), nullable=False), sa.Column('perm_name', sa.Unicode(length=64), nullable=False),
...@@ -302,7 +390,10 @@ def upgrade(): ...@@ -302,7 +390,10 @@ def upgrade():
mysql_charset='utf8', mysql_charset='utf8',
mysql_engine='InnoDB' mysql_engine='InnoDB'
) )
op.create_table('res_desa', except Exception as e:
print(str(e))
try:
op.create_table('res_desa',
sa.Column('kategori', sa.String(length=32), nullable=True), sa.Column('kategori', sa.String(length=32), nullable=True),
sa.Column('kecamatan_id', sa.SmallInteger(), nullable=True), sa.Column('kecamatan_id', sa.SmallInteger(), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False), sa.Column('nama', sa.String(length=128), nullable=False),
...@@ -312,12 +403,16 @@ def upgrade(): ...@@ -312,12 +403,16 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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),
sa.ForeignKeyConstraint(['kecamatan_id'], ['public.res_kecamatan.id'], name=op.f('fk_res_desa_kecamatan_id_res_kecamatan')), primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['kecamatan_id'], ['res_kecamatan.id'], name=op.f('fk_res_desa_kecamatan_id_res_kecamatan')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_res_desa')), sa.PrimaryKeyConstraint('id', name=op.f('pk_res_desa')),
schema='public' # schema=schema
) )
op.create_table('partner', except Exception as e:
print(str(e))
try:
op.create_table('partner',
sa.Column('kelurahan', sa.String(length=128), nullable=True), sa.Column('kelurahan', sa.String(length=128), nullable=True),
sa.Column('kecamatan', sa.String(length=128), nullable=True), sa.Column('kecamatan', sa.String(length=128), nullable=True),
sa.Column('kota', sa.String(length=128), nullable=True), sa.Column('kota', sa.String(length=128), nullable=True),
...@@ -355,22 +450,30 @@ def upgrade(): ...@@ -355,22 +450,30 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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),
sa.ForeignKeyConstraint(['dati2_id'], ['public.res_dati2.id'], name=op.f('fk_partner_dati2_id_res_dati2')), primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['desa_id'], ['public.res_desa.id'], name=op.f('fk_partner_desa_id_res_desa')), sa.ForeignKeyConstraint(['dati2_id'], ['res_dati2.id'], name=op.f('fk_partner_dati2_id_res_dati2')),
sa.ForeignKeyConstraint(['kecamatan_id'], ['public.res_kecamatan.id'], name=op.f('fk_partner_kecamatan_id_res_kecamatan')), sa.ForeignKeyConstraint(['desa_id'], ['res_desa.id'], name=op.f('fk_partner_desa_id_res_desa')),
sa.ForeignKeyConstraint(['provinsi_id'], ['public.res_provinsi.id'], name=op.f('fk_partner_provinsi_id_res_provinsi')), sa.ForeignKeyConstraint(['kecamatan_id'], ['res_kecamatan.id'], name=op.f('fk_partner_kecamatan_id_res_kecamatan')),
sa.ForeignKeyConstraint(['provinsi_id'], ['res_provinsi.id'], name=op.f('fk_partner_provinsi_id_res_provinsi')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_partner')) sa.PrimaryKeyConstraint('id', name=op.f('pk_partner'))
) )
op.create_table('user_area', except Exception as e:
print(str(e))
try:
op.create_table('user_area',
sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('desa_id', sa.Integer(), nullable=True), sa.Column('desa_id', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False), sa.Column('id', sa.Integer(), sa.Identity(always=True),
sa.ForeignKeyConstraint(['desa_id'], ['public.res_desa.id'], name=op.f('fk_user_area_desa_id_res_desa')), primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['desa_id'], ['res_desa.id'], name=op.f('fk_user_area_desa_id_res_desa')),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_user_area_user_id_users')), sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_user_area_user_id_users')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_user_area')) sa.PrimaryKeyConstraint('id', name=op.f('pk_user_area'))
) )
op.create_table('partner_files', except Exception as e:
print(str(e))
try:
op.create_table('partner_files',
sa.Column('partner_id', sa.Integer(), nullable=False), sa.Column('partner_id', sa.Integer(), nullable=False),
sa.Column('file_name', sa.String(length=256), nullable=False), sa.Column('file_name', sa.String(length=256), nullable=False),
sa.Column('description', sa.String(length=256), nullable=True), sa.Column('description', sa.String(length=256), nullable=True),
...@@ -379,41 +482,126 @@ def upgrade(): ...@@ -379,41 +482,126 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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(['partner_id'], ['partner.id'], name=op.f('fk_partner_files_partner_id_partner')), sa.ForeignKeyConstraint(['partner_id'], ['partner.id'], name=op.f('fk_partner_files_partner_id_partner')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_partner_files')) sa.PrimaryKeyConstraint('id', name=op.f('pk_partner_files'))
) )
except Exception as e:
print(str(e))
# ### end Alembic commands ### # ### end Alembic commands ###
def downgrade(): def downgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_table('partner_files') try:
op.drop_table('user_area') op.drop_table('partner_files')
op.drop_table('partner') except Exception as e:
op.drop_table('res_desa', schema='public') print(str(e))
op.drop_table('users_resources_permissions') try:
op.drop_table('res_kecamatan', schema='public') op.drop_table('user_area')
op.drop_table('groups_resources_permissions') except Exception as e:
op.drop_table('users_permissions') print(str(e))
op.drop_table('users_groups') try:
op.drop_table('user_device') op.drop_table('partner')
op.drop_index(op.f('ix_resources_owner_user_id'), table_name='resources') except Exception as e:
op.drop_index(op.f('ix_resources_owner_group_id'), table_name='resources') print(str(e))
op.drop_table('resources') try:
op.drop_table('res_dati2', schema='public') op.drop_table('res_desa') #, schema=schema
op.drop_table('groups_permissions') except Exception as e:
op.drop_table('external_identities') print(str(e))
op.drop_table('users') try:
op.drop_table('targets') op.drop_table('users_resources_permissions')
op.drop_table('target_jenis') except Exception as e:
op.drop_table('routes') print(str(e))
op.drop_table('res_provinsi', schema='public') try:
op.drop_table('permissions', schema='public') op.drop_table('res_kecamatan'), # schema = schema
op.drop_table('departemen', schema='public') except Exception as e:
op.drop_table('parameters') print(str(e))
op.drop_table('logs') try:
op.drop_table('holiday') op.drop_table('groups_resources_permissions')
op.drop_table('groups') 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 ### # ### end Alembic commands ###
...@@ -18,7 +18,8 @@ depends_on = None ...@@ -18,7 +18,8 @@ depends_on = None
def upgrade(): def upgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.create_table('eselon', try:
op.create_table('eselon',
sa.Column('pangkat', sa.String(length=32), nullable=True), sa.Column('pangkat', sa.String(length=32), nullable=True),
sa.Column('ruang', sa.String(length=1), nullable=True), sa.Column('ruang', sa.String(length=1), nullable=True),
sa.Column('tunjangan', sa.BigInteger(), nullable=True), sa.Column('tunjangan', sa.BigInteger(), nullable=True),
...@@ -29,11 +30,15 @@ def upgrade(): ...@@ -29,11 +30,15 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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')), sa.PrimaryKeyConstraint('id', name=op.f('pk_eselon')),
schema='public' # schema='public'
) )
op.create_table('pangkat', except Exception as e:
print(str(e))
try:
op.create_table('pangkat',
sa.Column('pangkat', sa.String(length=32), nullable=True), sa.Column('pangkat', sa.String(length=32), nullable=True),
sa.Column('ruang', sa.String(length=1), nullable=True), sa.Column('ruang', sa.String(length=1), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False), sa.Column('nama', sa.String(length=128), nullable=False),
...@@ -43,11 +48,15 @@ def upgrade(): ...@@ -43,11 +48,15 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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')), sa.PrimaryKeyConstraint('id', name=op.f('pk_pangkat')),
schema='public' # schema='public'
) )
op.create_table('jabatan', except Exception as e:
print(str(e))
try:
op.create_table('jabatan',
sa.Column('jenis', sa.SmallInteger(), nullable=True), sa.Column('jenis', sa.SmallInteger(), nullable=True),
sa.Column('nama_lain', sa.String( sa.Column('nama_lain', sa.String(
length=128), nullable=True), length=128), nullable=True),
...@@ -61,22 +70,27 @@ def upgrade(): ...@@ -61,22 +70,27 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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),
sa.ForeignKeyConstraint(['eselon_id'], ['public.eselon.id'], name=op.f( primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['eselon_id'], ['eselon.id'], name=op.f(
'fk_jabatan_eselon_id_eselon')), 'fk_jabatan_eselon_id_eselon')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_jabatan')), sa.PrimaryKeyConstraint('id', name=op.f('pk_jabatan')),
schema='public' # schema='public'
) )
op.create_table('partner_departemen', except Exception as e:
print(str(e))
try:
op.create_table('partner_departemen',
sa.Column('partner_id', sa.Integer(), nullable=True), sa.Column('partner_id', sa.Integer(), nullable=True),
sa.Column('departemen_id', sa.Integer(), nullable=True), sa.Column('departemen_id', sa.Integer(), nullable=True),
sa.Column('jabatan_id', sa.SmallInteger(), nullable=True), sa.Column('jabatan_id', sa.SmallInteger(), nullable=True),
sa.Column('mulai', sa.DateTime(), nullable=True), sa.Column('mulai', sa.DateTime(), nullable=True),
sa.Column('selesai', 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),
sa.ForeignKeyConstraint(['departemen_id'], ['public.departemen.id'], name=op.f( primary_key=True, nullable=False),
sa.ForeignKeyConstraint(['departemen_id'], ['departemen.id'], name=op.f(
'fk_partner_departemen_departemen_id_departemen')), 'fk_partner_departemen_departemen_id_departemen')),
sa.ForeignKeyConstraint(['jabatan_id'], ['public.jabatan.id'], name=op.f( sa.ForeignKeyConstraint(['jabatan_id'], ['jabatan.id'], name=op.f(
'fk_partner_departemen_jabatan_id_jabatan')), 'fk_partner_departemen_jabatan_id_jabatan')),
sa.ForeignKeyConstraint(['partner_id'], ['partner.id'], name=op.f( sa.ForeignKeyConstraint(['partner_id'], ['partner.id'], name=op.f(
'fk_partner_departemen_partner_id_partner')), 'fk_partner_departemen_partner_id_partner')),
...@@ -84,15 +98,18 @@ def upgrade(): ...@@ -84,15 +98,18 @@ def upgrade():
'id', name=op.f('pk_partner_departemen')), 'id', name=op.f('pk_partner_departemen')),
sa.UniqueConstraint('partner_id', 'departemen_id', sa.UniqueConstraint('partner_id', 'departemen_id',
'jabatan_id', 'mulai', name='partner_dept_uq'), 'jabatan_id', 'mulai', name='partner_dept_uq'),
schema='public' # schema='public'
) )
except Exception as e:
print(str(e))
# ### end Alembic commands ### # ### end Alembic commands ###
def downgrade(): def downgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_table('partner_departemen', schema='public') op.drop_table('partner_departemen',)# schema='public')
op.drop_table('jabatan', schema='public') op.drop_table('jabatan', )#schema='public')
op.drop_table('pangkat', schema='public') op.drop_table('pangkat', ) # schema='public')
op.drop_table('eselon', schema='public') op.drop_table('eselon', ) # schema='public')
# ### end Alembic commands ### # ### end Alembic commands ###
...@@ -30,14 +30,15 @@ def upgrade(): ...@@ -30,14 +30,15 @@ def upgrade():
sa.Column('updated', sa.DateTime(), nullable=True), sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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')), sa.PrimaryKeyConstraint('id', name=op.f('pk_text_printers')),
schema='public' # schema='public'
) )
# ### end Alembic commands ### # ### end Alembic commands ###
def downgrade(): def downgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_table('text_printers', schema='public') op.drop_table('text_printers', ) #schema='public')
# ### end Alembic commands ### # ### end Alembic commands ###
...@@ -17,76 +17,78 @@ import sqlalchemy as sa ...@@ -17,76 +17,78 @@ import sqlalchemy as sa
def upgrade(): def upgrade():
pass
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.create_table('test_model', # op.create_table('test_model',
sa.Column('description', sa.String(length=256), nullable=True), # sa.Column('description', sa.String(length=256), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False), # sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False), # sa.Column('kode', sa.String(length=32), nullable=False),
sa.Column('status', sa.SmallInteger(), nullable=False), # sa.Column('status', sa.SmallInteger(), nullable=False),
sa.Column('created', sa.DateTime(), nullable=True), # sa.Column('created', sa.DateTime(), nullable=True),
sa.Column('updated', sa.DateTime(), nullable=True), # sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True), # sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_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(), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_test_model')), # sa.PrimaryKeyConstraint('id', name=op.f('pk_test_model')),
schema='public' # schema='public'
) # )
op.drop_constraint(op.f('fk_departemen_parent_id_departemen'), 'departemen', type_='foreignkey') # op.drop_constraint(op.f('fk_departemen_parent_id_departemen'), 'departemen', type_='foreignkey')
op.create_foreign_key(op.f('fk_departemen_parent_id_departemen'), 'departemen', 'departemen', ['parent_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_departemen_parent_id_departemen'), 'departemen', 'departemen', ['parent_id'], ['id'], source_schema='public', referent_schema='public')
op.drop_constraint(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', type_='foreignkey') # op.drop_constraint(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', type_='foreignkey')
op.create_foreign_key(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', 'eselon', ['eselon_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', 'eselon', ['eselon_id'], ['id'], source_schema='public', referent_schema='public')
op.drop_constraint(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_desa_id_res_desa'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_desa_id_res_desa'), 'partner', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_dati2_id_res_dati2'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_dati2_id_res_dati2'), 'partner', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', type_='foreignkey')
op.create_foreign_key(op.f('fk_partner_desa_id_res_desa'), 'partner', 'res_desa', ['desa_id'], ['id'], referent_schema='public') # op.create_foreign_key(op.f('fk_partner_desa_id_res_desa'), 'partner', 'res_desa', ['desa_id'], ['id'], referent_schema='public')
op.create_foreign_key(op.f('fk_partner_dati2_id_res_dati2'), 'partner', 'res_dati2', ['dati2_id'], ['id'], referent_schema='public') # op.create_foreign_key(op.f('fk_partner_dati2_id_res_dati2'), 'partner', 'res_dati2', ['dati2_id'], ['id'], referent_schema='public')
op.create_foreign_key(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', 'res_kecamatan', ['kecamatan_id'], ['id'], referent_schema='public') # op.create_foreign_key(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', 'res_kecamatan', ['kecamatan_id'], ['id'], referent_schema='public')
op.create_foreign_key(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', 'res_provinsi', ['provinsi_id'], ['id'], referent_schema='public') # op.create_foreign_key(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', 'res_provinsi', ['provinsi_id'], ['id'], referent_schema='public')
op.drop_constraint(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', type_='foreignkey')
op.create_foreign_key(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', 'partner', ['partner_id'], ['id'], source_schema='public') # op.create_foreign_key(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', 'partner', ['partner_id'], ['id'], source_schema='public')
op.create_foreign_key(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', 'jabatan', ['jabatan_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', 'jabatan', ['jabatan_id'], ['id'], source_schema='public', referent_schema='public')
op.create_foreign_key(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', 'departemen', ['departemen_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', 'departemen', ['departemen_id'], ['id'], source_schema='public', referent_schema='public')
op.drop_constraint(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', type_='foreignkey') # op.drop_constraint(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', type_='foreignkey')
op.create_foreign_key(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', 'res_provinsi', ['provinsi_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', 'res_provinsi', ['provinsi_id'], ['id'], source_schema='public', referent_schema='public')
op.drop_constraint(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', type_='foreignkey') # op.drop_constraint(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', type_='foreignkey')
op.create_foreign_key(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', 'res_kecamatan', ['kecamatan_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', 'res_kecamatan', ['kecamatan_id'], ['id'], source_schema='public', referent_schema='public')
op.drop_constraint(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', type_='foreignkey') # op.drop_constraint(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', type_='foreignkey')
op.create_foreign_key(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', 'res_dati2', ['dati2_id'], ['id'], source_schema='public', referent_schema='public') # op.create_foreign_key(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', 'res_dati2', ['dati2_id'], ['id'], source_schema='public', referent_schema='public')
op.drop_constraint(op.f('fk_user_area_desa_id_res_desa'), 'user_area', type_='foreignkey') # op.drop_constraint(op.f('fk_user_area_desa_id_res_desa'), 'user_area', type_='foreignkey')
op.create_foreign_key(op.f('fk_user_area_desa_id_res_desa'), 'user_area', 'res_desa', ['desa_id'], ['id'], referent_schema='public') # op.create_foreign_key(op.f('fk_user_area_desa_id_res_desa'), 'user_area', 'res_desa', ['desa_id'], ['id'], referent_schema='public')
# ### end Alembic commands ### # # ### end Alembic commands ###
def downgrade(): def downgrade():
pass
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(op.f('fk_user_area_desa_id_res_desa'), 'user_area', type_='foreignkey') # op.drop_constraint(op.f('fk_user_area_desa_id_res_desa'), 'user_area', type_='foreignkey')
op.create_foreign_key(op.f('fk_user_area_desa_id_res_desa'), 'user_area', 'res_desa', ['desa_id'], ['id']) # op.create_foreign_key(op.f('fk_user_area_desa_id_res_desa'), 'user_area', 'res_desa', ['desa_id'], ['id'])
op.drop_constraint(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', schema='public', type_='foreignkey')
op.create_foreign_key(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', 'res_dati2', ['dati2_id'], ['id']) # op.create_foreign_key(op.f('fk_res_kecamatan_dati2_id_res_dati2'), 'res_kecamatan', 'res_dati2', ['dati2_id'], ['id'])
op.drop_constraint(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', schema='public', type_='foreignkey')
op.create_foreign_key(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', 'res_kecamatan', ['kecamatan_id'], ['id']) # op.create_foreign_key(op.f('fk_res_desa_kecamatan_id_res_kecamatan'), 'res_desa', 'res_kecamatan', ['kecamatan_id'], ['id'])
op.drop_constraint(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', schema='public', type_='foreignkey')
op.create_foreign_key(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', 'res_provinsi', ['provinsi_id'], ['id']) # op.create_foreign_key(op.f('fk_res_dati2_provinsi_id_res_provinsi'), 'res_dati2', 'res_provinsi', ['provinsi_id'], ['id'])
op.drop_constraint(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', schema='public', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', schema='public', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', schema='public', type_='foreignkey')
op.create_foreign_key(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', 'departemen', ['departemen_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_departemen_departemen_id_departemen'), 'partner_departemen', 'departemen', ['departemen_id'], ['id'])
op.create_foreign_key(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', 'jabatan', ['jabatan_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_departemen_jabatan_id_jabatan'), 'partner_departemen', 'jabatan', ['jabatan_id'], ['id'])
op.create_foreign_key(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', 'partner', ['partner_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_departemen_partner_id_partner'), 'partner_departemen', 'partner', ['partner_id'], ['id'])
op.drop_constraint(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_dati2_id_res_dati2'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_dati2_id_res_dati2'), 'partner', type_='foreignkey')
op.drop_constraint(op.f('fk_partner_desa_id_res_desa'), 'partner', type_='foreignkey') # op.drop_constraint(op.f('fk_partner_desa_id_res_desa'), 'partner', type_='foreignkey')
op.create_foreign_key(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', 'res_kecamatan', ['kecamatan_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_kecamatan_id_res_kecamatan'), 'partner', 'res_kecamatan', ['kecamatan_id'], ['id'])
op.create_foreign_key(op.f('fk_partner_dati2_id_res_dati2'), 'partner', 'res_dati2', ['dati2_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_dati2_id_res_dati2'), 'partner', 'res_dati2', ['dati2_id'], ['id'])
op.create_foreign_key(op.f('fk_partner_desa_id_res_desa'), 'partner', 'res_desa', ['desa_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_desa_id_res_desa'), 'partner', 'res_desa', ['desa_id'], ['id'])
op.create_foreign_key(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', 'res_provinsi', ['provinsi_id'], ['id']) # op.create_foreign_key(op.f('fk_partner_provinsi_id_res_provinsi'), 'partner', 'res_provinsi', ['provinsi_id'], ['id'])
op.drop_constraint(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', schema='public', type_='foreignkey')
op.create_foreign_key(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', 'eselon', ['eselon_id'], ['id']) # op.create_foreign_key(op.f('fk_jabatan_eselon_id_eselon'), 'jabatan', 'eselon', ['eselon_id'], ['id'])
op.drop_constraint(op.f('fk_departemen_parent_id_departemen'), 'departemen', schema='public', type_='foreignkey') # op.drop_constraint(op.f('fk_departemen_parent_id_departemen'), 'departemen', schema='public', type_='foreignkey')
op.create_foreign_key(op.f('fk_departemen_parent_id_departemen'), 'departemen', 'departemen', ['parent_id'], ['id']) # op.create_foreign_key(op.f('fk_departemen_parent_id_departemen'), 'departemen', 'departemen', ['parent_id'], ['id'])
op.drop_table('test_model', schema='public') # op.drop_table('test_model', schema='public')
# ### end Alembic commands ### # ### end Alembic commands ###
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 .meta import *
from .common import * from .common import *
from .base import * from .base import *
......
...@@ -23,7 +23,8 @@ DBSession = scoped_session(session_factory) ...@@ -23,7 +23,8 @@ DBSession = scoped_session(session_factory)
register(DBSession) register(DBSession)
ziggurat_foundations.models.DBSession = DBSession ziggurat_foundations.models.DBSession = DBSession
TABLE_ARGS = dict(extend_existing=True, schema="public") TABLE_ARGS = dict(extend_existing=True,)
#schema="public")
def flush(row, db_session=DBSession): def flush(row, db_session=DBSession):
......
from sqlalchemy import (Column, Integer, ForeignKey, String, SmallInteger, text) from sqlalchemy import (Column, Integer, ForeignKey,
String, SmallInteger, text)
from sqlalchemy.orm import (relationship, backref, declared_attr) from sqlalchemy.orm import (relationship, backref, declared_attr)
from ..models import DBSession, Base from ..models import DBSession, Base
from ..models import (NamaModel, TABLE_ARGS) from ..models import (NamaModel, TABLE_ARGS)
class _Departemen(NamaModel): class _Departemen(NamaModel):
__table_args__ = (TABLE_ARGS,) # __table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('public.departemen.id')) # parent_id = Column(Integer, ForeignKey('public.departemen.id'))
parent_id = Column(Integer, ForeignKey('departemen.id'))
kategori = Column(String(32)) kategori = Column(String(32))
alamat = Column(String(255)) alamat = Column(String(255))
singkat = Column(String(32)) singkat = Column(String(32))
level_id = Column(SmallInteger) level_id = Column(SmallInteger)
__tablename__ = 'departemen' __tablename__ = 'departemen'
@declared_attr @declared_attr
def children(self): def children(self):
return relationship( return relationship(
"Departemen", backref=backref('parent', remote_side=[self.id])) "Departemen", backref=backref('parent', remote_side=[self.id]))
def get_parents(self, start=False): def get_parents(self, start=False):
allparents = [] allparents = []
...@@ -46,7 +48,7 @@ class _Departemen(NamaModel): ...@@ -46,7 +48,7 @@ class _Departemen(NamaModel):
@classmethod @classmethod
def get_list(cls): def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all() return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
@classmethod @classmethod
def cte_get(cls, search=None, **kwargs): def cte_get(cls, search=None, **kwargs):
# tahun = kwargs.get('tahun', self.req.params.get( # tahun = kwargs.get('tahun', self.req.params.get(
...@@ -54,57 +56,72 @@ class _Departemen(NamaModel): ...@@ -54,57 +56,72 @@ class _Departemen(NamaModel):
parent_id = kwargs.get('id', None) parent_id = kwargs.get('id', None)
str_where = parent_id and " parent_id={} ".format( str_where = parent_id and " parent_id={} ".format(
parent_id) or " parent_id IS NULL" parent_id) or " parent_id IS NULL"
sql = """ eng = cls.db_session.get_bind()
WITH RECURSIVE dep_tree AS ( if eng.dialect.name.lower() == "oracle":
SELECT sql = """
id, SELECT
kode, --LPAD(' ', (LEVEL - 1) * 2) || nama AS hierarchy,
nama, SYS_CONNECT_BY_PATH(nama, '/') AS hierarchy,
parent_id, id,
status, kode,
0 AS level, nama,
ARRAY[id] AS path parent_id,
FROM status,
public.departemen (LEVEL - 1) AS lvl,
WHERE SYS_CONNECT_BY_PATH(id, ',') AS path
{str_where} FROM
UNION ALL departemen
START WITH
SELECT parent_id IS NULL
c.id, CONNECT BY
c.kode, PRIOR id = parent_id
c.nama, ORDER SIBLINGS BY
c.parent_id, id """
c.status, else:
ct.level + 1, sql = """
ct.path || c.id WITH RECURSIVE dep_tree AS (
FROM SELECT
public.departemen c id,
kode,
JOIN nama::text AS nama,
dep_tree ct ON c.parent_id = ct.id parent_id,
) status,
SELECT 0 AS lvl,
REPEAT(' ', level) || nama AS hierarchy, -- Indent names based on level ARRAY[id] AS path
id, FROM departemen
kode,
nama, UNION ALL
parent_id,
status, SELECT
level, c.id,
path c.kode,
FROM ct.nama || '/' || c.nama::text AS nama,
dep_tree c.parent_id,
""".format(str_where=str_where) c.status,
ct.lvl + 1,
if search: ct.path || c.id
sql = f"{sql} WHERE nama ILIKE '%{search}%' " FROM departemen c
JOIN dep_tree ct ON c.parent_id = ct.id
sql=sql+"""ORDER BY path;""" )
SELECT DISTINCT ON (kode)
id,
kode,
nama as hierarchy,
parent_id,
status,
lvl,
path
FROM dep_tree
"""
#.format(str_where=str_where)
if search:
sql = f"{sql} WHERE nama ILIKE '%{search}%' "
sql = sql+"""ORDER BY kode, path """
return cls.db_session.execute(text(sql)).fetchall() return cls.db_session.execute(text(sql)).fetchall()
class Departemen(_Departemen, Base): class Departemen(_Departemen, Base):
db_session = DBSession db_session = DBSession
from sqlalchemy import (Column, Integer, String, DateTime, func, ) from sqlalchemy import (Column, Integer, String, DateTime, func, Text)
from sqlalchemy.orm import (scoped_session, sessionmaker, ) from sqlalchemy.orm import (scoped_session, sessionmaker, )
from ..models.base import CommonModel from ..models.base import CommonModel
from ..models.meta import Base from ..models.meta import Base
...@@ -11,9 +11,9 @@ class Log(Base, CommonModel): ...@@ -11,9 +11,9 @@ class Log(Base, CommonModel):
__tablename__ = 'logs' __tablename__ = 'logs'
id = Column(Integer, primary_key=True) # auto incrementing id = Column(Integer, primary_key=True) # auto incrementing
line_id = Column(String(32), nullable=False, unique=True) line_id = Column(String(32), nullable=False, unique=True)
logger = Column(String) # the name of the logger. (e.g. myapp.views) logger = Column(Text) # the name of the logger. (e.g. myapp.views)
level = Column(String) # info, debug, or error? level = Column(Text) # info, debug, or error?
trace = Column(String) # the full traceback printout trace = Column(Text) # the full traceback printout
msg = Column(String, nullable=False) msg = Column(String, nullable=False)
created_at = Column( created_at = Column(
DateTime(timezone=True), DateTime(timezone=True),
......
from datetime import datetime from datetime import datetime
import logging import logging
from math import log
from requests import session
import pytz
import sqlalchemy as sa import sqlalchemy as sa
from pyramid.authorization import (Allow, Authenticated, ALL_PERMISSIONS) from pyramid.authorization import (Allow, Authenticated, ALL_PERMISSIONS)
# from sqlalchemy import TIMESTAMP
from sqlalchemy import ( from sqlalchemy import (
Column, Integer, DateTime, SmallInteger, String) Column, Integer, DateTime, SmallInteger, String)
from sqlalchemy.orm import (relationship, backref) from sqlalchemy.orm import (relationship, backref)
...@@ -28,7 +26,7 @@ from opensipkd.tools import as_timezone ...@@ -28,7 +26,7 @@ from opensipkd.tools import as_timezone
from .base import CommonModel, DBSession, DefaultModel from .base import CommonModel, DBSession, DefaultModel
from .meta import Base from .meta import Base
from .base import TABLE_ARGS from .base import TABLE_ARGS
from . import ForceUTCDatetime
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class _GroupPermission(GroupPermissionMixin): class _GroupPermission(GroupPermissionMixin):
pass pass
...@@ -100,12 +98,14 @@ class _User(UserMixin, BaseModel): ...@@ -100,12 +98,14 @@ class _User(UserMixin, BaseModel):
registered_date = Column(DateTime(timezone=True), registered_date = Column(DateTime(timezone=True),
nullable=False, nullable=False,
default=datetime.utcnow) default=datetime.utcnow)
security_code_date = Column(DateTime(timezone=True), # security_code_date = Column(DateTime(timezone=True),
default=datetime(2000, 1, 1, # default=datetime(2000, 1, 1,
tzinfo=pytz.timezone( # tzinfo=pytz.timezone(
'Asia/Jakarta')), # 'Asia/Jakarta')),
server_default="2000-01-01 01:01+7", # server_default="2000-01-01 01:01+7",
) # )
# security_code_date = Column(TIMESTAMP(timezone=True))
security_code_date = Column(ForceUTCDatetime)
api_key = Column(String(256)) api_key = Column(String(256))
partner_id = Column(Integer) # , ForeignKey(Partner.id)) partner_id = Column(Integer) # , ForeignKey(Partner.id))
company_id = Column(Integer) # , ForeignKey(Partner.id)) company_id = Column(Integer) # , ForeignKey(Partner.id))
......
user_id/users.user_name,group_id/groups.group_name user_id/users.user_name,group_id/groups.group_name
admin,Superuser
\ No newline at end of file \ No newline at end of file
...@@ -5,6 +5,14 @@ import os ...@@ -5,6 +5,14 @@ import os
import subprocess import subprocess
import sys import sys
from getpass import getpass from getpass import getpass
from pyramid.paster import (get_appsettings, setup_logging, )
from sqlalchemy import (engine_from_config, select, Table, inspect)
from sqlalchemy import text
from sqlalchemy.schema import CreateSchema
from sqlalchemy.sql.sqltypes import BOOLEAN
from ziggurat_foundations.models.services.user import UserService
from opensipkd.tools import get_ext
import transaction import transaction
from ..models.users import ( from ..models.users import (
...@@ -18,15 +26,6 @@ from ..models.meta import Base ...@@ -18,15 +26,6 @@ from ..models.meta import Base
# Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa, # Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa,
# Menus, Pangkat # Menus, Pangkat
from pyramid.paster import (get_appsettings, setup_logging, )
from sqlalchemy import (desc, engine_from_config, select, Table, inspect)
from sqlalchemy import text
from sqlalchemy.dialects import oracle
from sqlalchemy.schema import CreateSchema
from sqlalchemy.sql.sqltypes import BOOLEAN
from ziggurat_foundations.models.services.user import UserService
from opensipkd.tools import get_ext
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -115,6 +114,7 @@ def restore_csv(table, filename, get_file_func=get_file, db_session=DBSession): ...@@ -115,6 +114,7 @@ def restore_csv(table, filename, get_file_func=get_file, db_session=DBSession):
eng = db_session.get_bind() eng = db_session.get_bind()
q = db_session.query(table) q = db_session.query(table)
if q.first(): if q.first():
log.error("Restore discarded")
return return
with get_file_func(filename) as f: with get_file_func(filename) as f:
reader = csv.DictReader(f) reader = csv.DictReader(f)
...@@ -135,7 +135,7 @@ def restore_csv(table, filename, get_file_func=get_file, db_session=DBSession): ...@@ -135,7 +135,7 @@ def restore_csv(table, filename, get_file_func=get_file, db_session=DBSession):
raise e raise e
fname_orig = t[0] fname_orig = t[0]
schema = "public" schema = None # "public"
if t[1:]: if t[1:]:
t_array = t[1].split('.') t_array = t[1].split('.')
if len(t_array) == 2: if len(t_array) == 2:
...@@ -218,7 +218,7 @@ def append_csv(table, filename, keys, get_file_func=get_file, ...@@ -218,7 +218,7 @@ def append_csv(table, filename, keys, get_file_func=get_file,
# print(dir(table.__table__)) # print(dir(table.__table__))
# print("____") # print("____")
schema = hasattr( schema = hasattr(
table.__table__, "schema") and table.__table__.schema or "public" table.__table__, "schema") and table.__table__.schema or None # "public"
columns_table = insp.get_columns(table.__tablename__, schema) columns_table = insp.get_columns(table.__tablename__, schema)
fields = {} fields = {}
for c in columns_table: for c in columns_table:
...@@ -245,7 +245,7 @@ def append_csv(table, filename, keys, get_file_func=get_file, ...@@ -245,7 +245,7 @@ def append_csv(table, filename, keys, get_file_func=get_file,
raise e raise e
fname_orig = t[0] fname_orig = t[0]
schema = "public" schema = None # "public"
if t[1:]: if t[1:]:
t_array = t[1].split('.') t_array = t[1].split('.')
if len(t_array) == 2: if len(t_array) == 2:
...@@ -255,7 +255,7 @@ def append_csv(table, filename, keys, get_file_func=get_file, ...@@ -255,7 +255,7 @@ def append_csv(table, filename, keys, get_file_func=get_file,
schema = t_array[0] schema = t_array[0]
foreign_table = t_array[1] foreign_table = t_array[1]
foreign_field = t_array[2] foreign_field = t_array[2]
log.debug("%s.%s", schema, foreign_table)
foreign_table = Table(foreign_table, base.metadata, foreign_table = Table(foreign_table, base.metadata,
# autoload=True, # merubah v1.4 ke v.2 # autoload=True, # merubah v1.4 ke v.2
autoload_with=eng, autoload_with=eng,
...@@ -286,8 +286,8 @@ def append_csv(table, filename, keys, get_file_func=get_file, ...@@ -286,8 +286,8 @@ def append_csv(table, filename, keys, get_file_func=get_file,
with eng.connect() as conn: with eng.connect() as conn:
q = conn.execute(sql) q = conn.execute(sql)
row = q.fetchone() row = q.fetchone()
if not row: # if not row:
raise Exception(f"Foreign key value '{value}' not found in table '{foreign_table.name}' for field '{fname}'") # raise Exception(f"Foreign key value '{value}' not found in table '{foreign_table.name}' for field '{fname}'")
value = row and row.id or None value = row and row.id or None
q.close() q.close()
# connection.close() # connection.close()
...@@ -353,7 +353,7 @@ def append_csv(table, filename, keys, get_file_func=get_file, ...@@ -353,7 +353,7 @@ def append_csv(table, filename, keys, get_file_func=get_file,
db_session.add(row) db_session.add(row)
db_session.flush() db_session.flush()
transaction.commit() # diperlukan commit per record khususnya untuk yang internal link transaction.commit() # diperlukan commit per record khususnya untuk yang internal link
def ask_password(name): def ask_password(name):
...@@ -377,8 +377,9 @@ def reset_sequence_(cls, seq): ...@@ -377,8 +377,9 @@ def reset_sequence_(cls, seq):
def reset_sequences(): def reset_sequences():
reset_sequence_(User, 'users_id_seq') pass
reset_sequence_(Group, 'groups_id_seq') # reset_sequence_(User, 'users_id_seq')
# reset_sequence_(Group, 'groups_id_seq')
def alembic_run(ini_file, name=None): def alembic_run(ini_file, name=None):
...@@ -430,8 +431,9 @@ def main(argv=sys.argv): ...@@ -430,8 +431,9 @@ def main(argv=sys.argv):
q = DBSession.query(User).filter_by(id=1) q = DBSession.query(User).filter_by(id=1)
user = q.first() user = q.first()
init_model() init_model()
password = ask_password(user.user_name) if user:
UserService.set_password(user, password) password = ask_password(user.user_name)
UserService.set_password(user, password)
append_csv(Group, 'groups.csv', ['group_name']) append_csv(Group, 'groups.csv', ['group_name'])
restore_csv(UserGroup, 'users_groups.csv') restore_csv(UserGroup, 'users_groups.csv')
append_csv(Permission, 'permissions.csv', ['perm_name']) append_csv(Permission, 'permissions.csv', ['perm_name'])
......
...@@ -48,6 +48,7 @@ class SearchMethods(enum.Enum): ...@@ -48,6 +48,7 @@ class SearchMethods(enum.Enum):
yadcf_range_number = 10 yadcf_range_number = 10
yadcf_range_number_slider = 11 yadcf_range_number_slider = 11
yadcf_range_date = 12 yadcf_range_date = 12
# SEARCH_METHODS = { # SEARCH_METHODS = {
# 'none': lambda expr, value: None, # 'none': lambda expr, value: None,
# 'string_contains': lambda expr, value: expr.ilike('%' + value + '%'), # 'string_contains': lambda expr, value: expr.ilike('%' + value + '%'),
...@@ -156,7 +157,18 @@ class BaseView(object): ...@@ -156,7 +157,18 @@ class BaseView(object):
self.filter_columns = False self.filter_columns = False
self.action_suffix = "/grid/act" self.action_suffix = "/grid/act"
self.html_buttons = {} self.html_buttons = {}
self.new_buttons = {} self.new_buttons = {}
"""
Additional button for list
{
"name":{
"obj": BtObject,
"js": JavaScript},
"name..."{
}
}
"""
self.list_form = None # List dam Form self.list_form = None # List dam Form
self.form_list = None # Form kemudian detail list self.form_list = None # Form kemudian detail list
...@@ -739,10 +751,10 @@ class BaseView(object): ...@@ -739,10 +751,10 @@ class BaseView(object):
data = resp.get("data", []) data = resp.get("data", [])
if not data: if not data:
raise HTTPNotFound("No data to export") raise HTTPNotFound("No data to export")
selects = {} selects = {}
list_schema = self.list_schema() list_schema = self.list_schema()
# schema = self.list_schema() # schema = self.list_schema()
if "bindings" in kwargs and kwargs["bindings"]: if "bindings" in kwargs and kwargs["bindings"]:
bindings = kwargs["bindings"] bindings = kwargs["bindings"]
elif self.bindings: elif self.bindings:
...@@ -751,31 +763,32 @@ class BaseView(object): ...@@ -751,31 +763,32 @@ class BaseView(object):
bindings = self.get_bindings() bindings = self.get_bindings()
list_schema = list_schema.bind(request=self.req, **bindings) list_schema = list_schema.bind(request=self.req, **bindings)
for d in list_schema: for d in list_schema:
title = hasattr(d, "title") and d.title or d.name title = hasattr(d, "title") and d.title or d.name
values = hasattr(d, "widget") \ values = hasattr(d, "widget") \
and isinstance(d.widget, (widget.SelectWidget, widget.Select2Widget)) \ and isinstance(d.widget , (widget.SelectWidget, widget.Select2Widget)) \
and d.widget.values or None and d.widget.values or None
selects[d.name] = {"title": title, selects[d.name] = {"title": title,
"values": values, "values": values,
"visible": hasattr(d, "visible") and d.visible or None} "visible": hasattr(d, "visible") and d.visible or None}
header = list(data[0].keys()) header = list(data[0].keys())
for i, h in enumerate(header): for i, h in enumerate(header):
header[i] = selects[h]["title"] header[i] = selects[h]["title"]
rows = [] rows = []
for d in data: for d in data:
for k, v in d.items(): for k, v in d.items():
if selects[k]["values"]: if selects[k]["values"]:
select = isinstance(selects[k]["values"], dict) \ select = isinstance(selects[k]["values"], dict) \
and selects[k]["values"].items() or dict(selects[k]["values"]) and selects[k]["values"].items() or dict(selects[k]["values"])
d[k] = select.get(v, v) d[k] = select.get(v,v)
row = list(d.values()) row = list(d.values())
rows.append(row) rows.append(row)
# for i, h in enumerate(header): # for i, h in enumerate(header):
# for d in list_schema: # for d in list_schema:
# if d.name == h and hasattr(d, "title"): # if d.name == h and hasattr(d, "title"):
...@@ -795,6 +808,7 @@ class BaseView(object): ...@@ -795,6 +808,7 @@ class BaseView(object):
# value = value.astimezone().replace(tzinfo=None) # value = value.astimezone().replace(tzinfo=None)
# row[i] = value # row[i] = value
value = { value = {
'header': header, 'header': header,
'rows': rows, 'rows': rows,
...@@ -1604,4 +1618,4 @@ def email_validator(node, value): ...@@ -1604,4 +1618,4 @@ def email_validator(node, value):
# def get_url_captcha(request): # def get_url_captcha(request):
# captcha = get_captcha(request) # captcha = get_captcha(request)
# return os.path.join(get_urls(request.route_url('home')), 'captcha', captcha) # return os.path.join(get_urls(request.route_url('home')), 'captcha', captcha)
""" """
\ No newline at end of file \ No newline at end of file
...@@ -175,14 +175,18 @@ class Views(BaseView): ...@@ -175,14 +175,18 @@ class Views(BaseView):
return row return row
def view_act(self): def view_act(self):
request = self.req request = self.req
params = request.params
url_dict = request.matchdict url_dict = request.matchdict
if url_dict['act'] == 'grid': if url_dict['act'] == 'grid':
query = Departemen.cte_get() query = Departemen.cte_get()
data = [{"id": d.id, "kode": d.kode, "nama": d.nama, "status": d.status, data = [{"id": d.id, "kode": d.kode,
"level_id":d.level, "parent_id": d.parent_id} for d in query] "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 { return {
"draw": "1",
"recordsTotal": len(data),
"recordsFiltered": len(data),
"data": data} "data": data}
else: else:
return self.next_act() return self.next_act()
......
...@@ -759,6 +759,8 @@ def reset_password_validator(form, value): ...@@ -759,6 +759,8 @@ def reset_password_validator(form, value):
def security_code_age(user): def security_code_age(user):
now = create_now() now = create_now()
if user.security_code_date: if user.security_code_date:
if not user.security_code_date.tzinfo:
return now - user.security_code_date.replace(tzinfo=now.tzinfo)
return now - user.security_code_date return now - user.security_code_date
return timedelta(minutes=1) return timedelta(minutes=1)
......
from pyramid.csrf import new_csrf_token, get_csrf_token from pyramid.csrf import new_csrf_token, get_csrf_token
from iso8601.iso8601 import ISO8601_REGEX from iso8601.iso8601 import ISO8601_REGEX
# from deform.widget import string_types # from deform.widget import str
import json import json
import logging import logging
from pyramid.csrf import new_csrf_token, get_csrf_token
from iso8601.iso8601 import ISO8601_REGEX
from colander import SchemaNode, null, Mapping, Invalid # , string_types from colander import SchemaNode, null, Mapping, Invalid # , str
# from colander import compat # tidak ada di colander 2.0 # from colander import compat # tidak ada di colander 2.0
from deform import widget from deform import widget
# from deform.compat import sequence_types, text_type, text_ # from deform.compat import sequence_types, text_type, text_
...@@ -16,7 +19,7 @@ from deform.widget import ( ...@@ -16,7 +19,7 @@ from deform.widget import (
from opensipkd.tools.captcha import img_captcha from opensipkd.tools.captcha import img_captcha
_logging = logging.getLogger(__name__) _logging = logging.getLogger(__name__)
sequence_types = (list, range, tuple)
class DokumenWidget(Widget): class DokumenWidget(Widget):
template = "opensipkd.base:/widgets/templates/dokumen.pt" template = "opensipkd.base:/widgets/templates/dokumen.pt"
readonly_template = "opensipkd.base:/widgets/templates/readonly/dokumen.pt" readonly_template = "opensipkd.base:/widgets/templates/readonly/dokumen.pt"
...@@ -285,7 +288,7 @@ class AutocompleteMsInputWidget(AutocompleteInputWidget): ...@@ -285,7 +288,7 @@ class AutocompleteMsInputWidget(AutocompleteInputWidget):
try: try:
validated = self._pstruct_schema.deserialize(pstruct) validated = self._pstruct_schema.deserialize(pstruct)
except Invalid as exc: except Invalid as exc:
raise Invalid(field.schema, text_("Invalid pstruct: %s" % exc)) raise Invalid(field.schema, "Invalid pstruct: %s" % exc)
auto_id = validated["auto_id"] auto_id = validated["auto_id"]
auto_value = validated["auto_value"] auto_value = validated["auto_value"]
...@@ -893,10 +896,10 @@ class FilterWidget(Widget): ...@@ -893,10 +896,10 @@ class FilterWidget(Widget):
""" """
if self.multiple: if self.multiple:
if value in map(text_type, cstruct): if value in map(str, cstruct): # text_type
return "selected" return "selected"
else: else:
if value == text_type(cstruct): if value == str(cstruct): #text_type
return "selected" return "selected"
return None return None
......
...@@ -223,7 +223,7 @@ class DeTable(field.Field): ...@@ -223,7 +223,7 @@ class DeTable(field.Field):
_scripts = [] _scripts = []
# buttons = Params Buttons # buttons = Params Buttons
for button in buttons: for button in buttons:
if isinstance(button, str): if isinstance(button, str): #compat.string_types
button = Button(button) button = Button(button)
obj_buttons.append(button) obj_buttons.append(button)
header_buttons = [] header_buttons = []
......
...@@ -15,7 +15,7 @@ show_error_codes = true ...@@ -15,7 +15,7 @@ show_error_codes = true
[project] [project]
name = 'opensipkd_base' name = 'opensipkd_base'
version = '5.0.1' version = '5.0.4'
dependencies = [ dependencies = [
'deform', 'deform',
'colander', 'colander',
...@@ -40,6 +40,7 @@ dependencies = [ ...@@ -40,6 +40,7 @@ dependencies = [
'zope.sqlalchemy', 'zope.sqlalchemy',
'websockets', 'websockets',
"asyncio", "asyncio",
"pdfkit",
] ]
requires-python = '>= 3.8' requires-python = '>= 3.8'
authors = [ authors = [
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!