Add new models and views for Eselon, Jabatan, Pangkat, and PartnerDepartemen

- Created migration script to add new columns (rpc_url, rpc_user, rpc_callback, rpc_password) to the partner table.
- Implemented new models: Eselon, Jabatan, Pangkat, and PartnerDepartemen with appropriate relationships.
- Developed views for Eselon, Jabatan, Pangkat, and PartnerDepartemen including schemas for listing, adding, and editing.
- Enhanced the environment setup for Alembic migrations.
- Added functionality for handling partner positions with validation and data retrieval methods.
1 parent c7cf6363
"""Pyramid bootstrap environment. """ from logging.config import fileConfig
import logging
import os
import importlib.machinery
from alembic import context
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from sqlalchemy import engine_from_config
from opensipkd.base.models.meta import Base
config = context.config from sqlalchemy import engine_from_config
from sqlalchemy import pool
setup_logging(config.config_file_name) from alembic import context
from opensipkd.models import Base
settings = get_appsettings(config.config_file_name) # this is the Alembic Config object, which provides
logging.info(settings) # access to the values within the .ini file in use.
config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
if config.config_file_name is not None:
fileConfig(config.config_file_name)
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = Base.metadata target_metadata = Base.metadata
current_dir = os.path.split(__file__)[0] # other values from the config, defined by the needs of env.py,
helper_file = os.path.join(current_dir, 'helpers.py') # can be acquired:
loader = importlib.machinery.SourceFileLoader('alembic_helpers', helper_file) # my_important_option = config.get_main_option("my_important_option")
helpers = loader.load_module() # ... etc.
version_table = 'alembic_models'
version_table_schema = 'public'
def run_migrations_offline() -> None:
def run_migrations_offline():
"""Run migrations in 'offline' mode. """Run migrations in 'offline' mode.
This configures the context with just a URL This configures the context with just a URL
...@@ -39,37 +38,44 @@ def run_migrations_offline(): ...@@ -39,37 +38,44 @@ def run_migrations_offline():
script output. script output.
""" """
context.configure(url=settings['sqlalchemy.url'], url = config.get_main_option("sqlalchemy.url")
version_table=version_table) context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
version_table='alembic_models'
)
with context.begin_transaction(): with context.begin_transaction():
context.run_migrations() context.run_migrations()
def run_migrations_online(): def run_migrations_online() -> None:
"""Run migrations in 'online' mode. """Run migrations in 'online' mode.
In this scenario we need to create an Engine In this scenario we need to create an Engine
and associate a connection with the context. and associate a connection with the context.
""" """
engine = engine_from_config(settings, prefix='sqlalchemy.') connectable = engine_from_config(
config.get_section(config.config_ini_section, {}),
connection = engine.connect() prefix="sqlalchemy.",
context.configure( poolclass=pool.NullPool,
connection=connection,
target_metadata=target_metadata,
helpers=helpers,
version_table=version_table,
version_table_schema=version_table_schema
) )
try:
with connectable.connect() as connection:
context.configure(
connection=connection, target_metadata=target_metadata,
version_table='alembic_models'
)
with context.begin_transaction(): with context.begin_transaction():
context.run_migrations() context.run_migrations()
finally:
connection.close()
if context.is_offline_mode(): if context.is_offline_mode():
run_migrations_offline() run_migrations_offline()
else: else:
run_migrations_online()
\ No newline at end of file \ No newline at end of file
run_migrations_online()
"""Pyramid bootstrap environment. """
import logging
import os
import importlib.machinery
from alembic import context
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from sqlalchemy import engine_from_config
from opensipkd.base.models.meta import Base
config = context.config
setup_logging(config.config_file_name)
settings = get_appsettings(config.config_file_name)
logging.info(settings)
target_metadata = Base.metadata
current_dir = os.path.split(__file__)[0]
helper_file = os.path.join(current_dir, 'helpers.py')
loader = importlib.machinery.SourceFileLoader('alembic_helpers', helper_file)
helpers = loader.load_module()
version_table = 'alembic_models'
version_table_schema = 'public'
def run_migrations_offline():
"""Run migrations in 'offline' mode.
This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
"""
context.configure(url=settings['sqlalchemy.url'],
version_table=version_table)
with context.begin_transaction():
context.run_migrations()
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
engine = engine_from_config(settings, prefix='sqlalchemy.')
connection = engine.connect()
context.configure(
connection=connection,
target_metadata=target_metadata,
helpers=helpers,
version_table=version_table,
version_table_schema=version_table_schema
)
try:
with context.begin_transaction():
context.run_migrations()
finally:
connection.close()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
\ No newline at end of file \ No newline at end of file
"""empty message
Revision ID: 10a68b1510a6
Revises:
Create Date: 2026-01-19 18:41:11.619834
"""
# revision identifiers, used by Alembic.
from sqlalchemy.dialects import postgresql
import sqlalchemy as sa
from alembic import op
revision = '10a68b1510a6'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('eselon',
sa.Column('pangkat', sa.String(length=32), nullable=True),
sa.Column('ruang', sa.String(length=1), nullable=True),
sa.Column('tunjangan', sa.BigInteger(), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False),
sa.Column('status', sa.SmallInteger(), nullable=False),
sa.Column('created', sa.DateTime(), nullable=True),
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.PrimaryKeyConstraint('id', name=op.f('pk_eselon')),
schema='public'
)
op.create_table('pangkat',
sa.Column('pangkat', sa.String(length=32), nullable=True),
sa.Column('ruang', sa.String(length=1), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False),
sa.Column('status', sa.SmallInteger(), nullable=False),
sa.Column('created', sa.DateTime(), nullable=True),
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.PrimaryKeyConstraint('id', name=op.f('pk_pangkat')),
schema='public'
)
op.create_table('jabatan',
sa.Column('jenis', sa.SmallInteger(), nullable=True),
sa.Column('nama_lain', sa.String(
length=128), nullable=True),
sa.Column('nama_pendek', sa.String(
length=128), nullable=True),
sa.Column('eselon_id', sa.SmallInteger(), nullable=True),
sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False),
sa.Column('status', sa.SmallInteger(), nullable=False),
sa.Column('created', sa.DateTime(), nullable=True),
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.ForeignKeyConstraint(['eselon_id'], ['public.eselon.id'], name=op.f(
'fk_jabatan_eselon_id_eselon')),
sa.PrimaryKeyConstraint('id', name=op.f('pk_jabatan')),
schema='public'
)
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.ForeignKeyConstraint(['departemen_id'], ['public.departemen.id'], name=op.f(
'fk_partner_departemen_departemen_id_departemen')),
sa.ForeignKeyConstraint(['jabatan_id'], ['public.jabatan.id'], name=op.f(
'fk_partner_departemen_jabatan_id_jabatan')),
sa.ForeignKeyConstraint(['partner_id'], ['partner.id'], name=op.f(
'fk_partner_departemen_partner_id_partner')),
sa.PrimaryKeyConstraint(
'id', name=op.f('pk_partner_departemen')),
sa.UniqueConstraint('partner_id', 'departemen_id',
'jabatan_id', 'mulai', name='partner_dept_uq'),
schema='public'
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('partner_departemen', schema='public')
op.drop_table('jabatan', schema='public')
op.drop_table('pangkat', schema='public')
op.drop_table('eselon', schema='public')
# ### end Alembic commands ###
...@@ -8,3 +8,4 @@ from .partner import * ...@@ -8,3 +8,4 @@ from .partner import *
from .targets import * from .targets import *
from .user_area import * from .user_area import *
from .departmen import _Departemen, Departemen from .departmen import _Departemen, Departemen
from .pegawai import *
\ No newline at end of file \ No newline at end of file
from sqlalchemy import (
Column,
Integer,
BigInteger,
DateTime,
ForeignKey,
UniqueConstraint,
String,
SmallInteger
)
from sqlalchemy.orm import (
relationship,
backref
)
from opensipkd.models import Partner
from ..models import DBSession, Base
from ..models import (DefaultModel, NamaModel, TABLE_ARGS,
Departemen)
class Eselon(Base, NamaModel):
__tablename__ = 'eselon'
pangkat = Column(String(32))
ruang = Column(String(1))
tunjangan = Column(BigInteger)
__table_args__ = TABLE_ARGS
class Jabatan(Base, NamaModel):
__tablename__ = 'jabatan'
jenis = Column(SmallInteger)
nama_lain = Column(String(128))
nama_pendek = Column(String(128))
eselon_id = Column(SmallInteger, ForeignKey(Eselon.id))
__table_args__ = TABLE_ARGS
class Pangkat(Base, NamaModel):
__tablename__ = 'pangkat'
pangkat = Column(String(32))
ruang = Column(String(1))
__table_args__ = TABLE_ARGS
class PartnerDepartemen(Base, DefaultModel):
__tablename__ = 'partner_departemen'
partner_id = Column(Integer, ForeignKey(Partner.id))
departemen_id = Column(Integer, ForeignKey(Departemen.id))
# fungsional_id = Column(Integer, ForeignKey(Jabatan.id))
jabatan_id = Column(SmallInteger, ForeignKey(Jabatan.id))
mulai = Column(DateTime(timezone=False))
selesai = Column(DateTime(timezone=False))
partner = relationship(Partner, backref=backref("partner_departemen"))
departemen = relationship(Departemen, foreign_keys=[
departemen_id], backref=backref("partner_departemen"))
# fungsional = relationship(Jabatan, foreign_keys=[fungsional_id], backref=backref("partner_funsional"), )
jabatan = relationship(Jabatan, foreign_keys=[
jabatan_id], backref=backref("partner_jabatan", ))
__table_args__ = (UniqueConstraint('partner_id', 'departemen_id', 'jabatan_id',
'mulai', name='partner_dept_uq'),
TABLE_ARGS)
@classmethod
def query_jabatan(cls, partner_id, tanggal):
query = DBSession.query(cls). \
filter(cls.partner_id == partner_id,
tanggal >= cls.mulai,
tanggal <= cls.selesai)
return query
...@@ -59,7 +59,7 @@ base-dati2,/dati2,base,dati2,,view_list,,admin,base-admin,Dati2,1,0,,1,form.pt, ...@@ -59,7 +59,7 @@ base-dati2,/dati2,base,dati2,,view_list,,admin,base-admin,Dati2,1,0,,1,form.pt,
base-dati2-act,/dati2/{act}/act,base,dati2,,,,admin,base-dati2,Dati2 Action,1,0,,,json, base-dati2-act,/dati2/{act}/act,base,dati2,,,,admin,base-dati2,Dati2 Action,1,0,,,json,
base-dati2-add,/dati2/add,base,dati2,,,,admin,base-dati2,Dati2 Add,1,0,,,form6.pt, base-dati2-add,/dati2/add,base,dati2,,,,admin,base-dati2,Dati2 Add,1,0,,,form6.pt,
base-dati2-edit,/dati2/{id}/edit,base,dati2,,,,admin,base-dati2,Dati2 Edit,1,0,,,form6.pt, base-dati2-edit,/dati2/{id}/edit,base,dati2,,,,admin,base-dati2,Dati2 Edit,1,0,,,form6.pt,
base-dati2-view,/dati2/{id}/view,base,dati2,,,,admin,base-dati2,Dati2 View,1,0,,,form6.pt, base-dati2-view,/dati2/{id}/view,base,dati2,,,,admin,base-dati2,Da/user/areati2 View,1,0,,,form6.pt,
base-dati2-delete,/dati2/{id}/delete,base,dati2,,,,admin,base-dati2,Dati2 Delete,1,0,,,form6.pt, base-dati2-delete,/dati2/{id}/delete,base,dati2,,,,admin,base-dati2,Dati2 Delete,1,0,,,form6.pt,
base-dati2-upload,/dati2/upload,base,dati2,,,,admin,base-dati2,Dati2 Uload,1,0,,,form6.pt, base-dati2-upload,/dati2/upload,base,dati2,,,,admin,base-dati2,Dati2 Uload,1,0,,,form6.pt,
base-kecamatan,/kecamatan,base,kecamatan,,view_list,,admin,base-admin,Kecamatan,1,0,,1,form.pt, base-kecamatan,/kecamatan,base,kecamatan,,view_list,,admin,base-admin,Kecamatan,1,0,,1,form.pt,
...@@ -83,4 +83,27 @@ base-user-area-edit,/user/area/{id}/edit,base,user_area,,,,admin,base-user-area, ...@@ -83,4 +83,27 @@ base-user-area-edit,/user/area/{id}/edit,base,user_area,,,,admin,base-user-area,
base-user-area-view,/user/area/{id}/view,base,user_area,,,,admin,base-user-area,User-area View,1,0,,,form6.pt, base-user-area-view,/user/area/{id}/view,base,user_area,,,,admin,base-user-area,User-area View,1,0,,,form6.pt,
base-user-area-delete,/user/area/{id}/delete,base,user_area,,,,admin,base-user-area,User-area Delete,1,0,,,form6.pt, base-user-area-delete,/user/area/{id}/delete,base,user_area,,,,admin,base-user-area,User-area Delete,1,0,,,form6.pt,
base-test,/test,base,web_test_http,,view_add,,,,Test HTTP,1,0,,,test.pt base-test,/test,base,web_test_http,,view_add,,,,Test HTTP,1,0,,,test.pt
base-partner-departemen,/partner/departemen,base,posisi,,view_list,,admin,base-admin,Partner-departemen,1,0,,1,form.pt,
base-partner-departemen-act,/partner/departemen/{act}/act,base,posisi,,,,admin,base-partner-departemen,Partner-departemen Action,1,0,,,json,
base-partner-departemen-add,/partner/departemen/add,base,posisi,,,,admin,base-partner-departemen,Partner-departemen Add,1,0,,,form6.pt,
base-partner-departemen-edit,/partner/departemen/{id}/edit,base,posisi,,,,admin,base-partner-departemen,Partner-departemen Edit,1,0,,,form6.pt,
base-partner-departemen-view,/partner/departemen/{id}/view,base,posisi,,,,admin,base-partner-departemen,Partner-departemen View,1,0,,,form6.pt,
base-partner-departemen-delete,/partner/departemen/{id}/delete,base,posisi,,,,admin,base-partner-departemen,Partner-departemen Delete,1,0,,,form6.pt,
base-jabatan,/jabatan,base,jabatan,,view_list,,admin,base-admin,Jabatan,1,0,,1,form.pt,
base-jabatan-act,/jabatan/{act}/act,base,jabatan,,,,admin,base-jabatan,Jabatan Action,1,0,,,json,
base-jabatan-add,/jabatan/add,base,jabatan,,,,admin,base-jabatan,Jabatan Add,1,0,,,form6.pt,
base-jabatan-edit,/jabatan/{id}/edit,base,jabatan,,,,admin,base-jabatan,Jabatan Edit,1,0,,,form6.pt,
base-jabatan-view,/jabatan/{id}/view,base,jabatan,,,,admin,base-jabatan,Jabatan View,1,0,,,form6.pt,
base-jabatan-delete,/jabatan/{id}/delete,base,jabatan,,,,admin,base-jabatan,Jabatan Delete,1,0,,,form6.pt,
base-pangkat,/pangkat,base,pangkat,,view_list,,admin,base-admin,Pangkat,1,0,,1,form.pt,
base-pangkat-act,/pangkat/{act}/act,base,pangkat,,,,admin,base-pangkat,Pangkat Action,1,0,,,json,
base-pangkat-add,/pangkat/add,base,pangkat,,,,admin,base-pangkat,Pangkat Add,1,0,,,form6.pt,
base-pangkat-edit,/pangkat/{id}/edit,base,pangkat,,,,admin,base-pangkat,Pangkat Edit,1,0,,,form6.pt,
base-pangkat-view,/pangkat/{id}/view,base,pangkat,,,,admin,base-pangkat,Pangkat View,1,0,,,form6.pt,
base-pangkat-delete,/pangkat/{id}/delete,base,pangkat,,,,admin,base-pangkat,Pangkat Delete,1,0,,,form6.pt,
base-eselon,/eselon,base,eselon,,view_list,,admin,base-admin,Eselon,1,0,,1,form.pt,
base-eselon-act,/eselon/{act}/act,base,eselon,,,,admin,base-eselon,Eselon Action,1,0,,,json,
base-eselon-add,/eselon/add,base,eselon,,,,admin,base-eselon,Eselon Add,1,0,,,form6.pt,
base-eselon-edit,/eselon/{id}/edit,base,eselon,,,,admin,base-eselon,Eselon Edit,1,0,,,form6.pt,
base-eselon-view,/eselon/{id}/view,base,eselon,,,,admin,base-eselon,Eselon View,1,0,,,form6.pt,
base-eselon-delete,/eselon/{id}/delete,base,eselon,,,,admin,base-eselon,Eselon Delete,1,0,,,form6.pt,
from datetime import datetime
import colander import colander
from deform import (widget, ) from deform import (widget, )
from opensipkd.models import DBSession, Departemen, Partner from opensipkd.models import DBSession, Departemen
# , PartnerDepartemen
# , ResCompany
from opensipkd.tools import (get_settings)
from opensipkd.tools.buttons import btn_upload from opensipkd.tools.buttons import btn_upload
from pyramid.view import (view_config, ) from ..views import BaseView
from sqlalchemy import func
from sqlalchemy.orm import aliased
# from .company import company_widget
from .. import get_params
from ..views import ColumnDT, DataTables, BaseView
# , get_urls # , get_urls
SESS_ADD_FAILED = 'Tambah departemen gagal' SESS_ADD_FAILED = 'Tambah departemen gagal'
SESS_EDIT_FAILED = 'Edit departemen gagal' SESS_EDIT_FAILED = 'Edit departemen gagal'
...@@ -71,7 +62,9 @@ class AddSchema(colander.Schema): ...@@ -71,7 +62,9 @@ class AddSchema(colander.Schema):
# widget=company_widget, # widget=company_widget,
# missing=colander.drop, # missing=colander.drop,
# oid="company_id") # oid="company_id")
status = colander.SchemaNode(colander.Boolean(), oid="status") status = colander.SchemaNode(colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="status")
def after_bind(self, schema, kwargs): def after_bind(self, schema, kwargs):
request = kwargs["request"] request = kwargs["request"]
...@@ -99,9 +92,12 @@ class ListSchema(colander.Schema): ...@@ -99,9 +92,12 @@ class ListSchema(colander.Schema):
widget=widget.CheckboxWidget()) widget=widget.CheckboxWidget())
level_id = colander.SchemaNode( level_id = colander.SchemaNode(
colander.Integer(), title="Level", width='40pt') colander.Integer(), title="Level", width='40pt')
parent = colander.SchemaNode(colander.String(), title="Induk") parent_id = colander.SchemaNode(colander.String(), title="Induk")
# company_nm = colander.SchemaNode(colander.String(), title="Company") # company_nm = colander.SchemaNode(colander.String(), title="Company")
def after_bind(self, schema, kw):
request = kw.get('request')
schema["parent_id"].widget = widget.Select2Widget(
values=get_departemen_list())
class Views(BaseView): class Views(BaseView):
def __init__(self, request): def __init__(self, request):
...@@ -188,11 +184,25 @@ class Views(BaseView): ...@@ -188,11 +184,25 @@ class Views(BaseView):
# @view_config(route_name='departemen-act', renderer='json', # @view_config(route_name='departemen-act', renderer='json',
# permission='view') # permission='view')
# def view_act(self): def next_act(self):
# request = self.req request = self.req
# ses = request.session params = request.params
# params = request.params url_dict = request.matchdict
# url_dict = request.matchdict if url_dict['act'] == 'hon':
term = params.get('term', '')
q = DBSession.query(Departemen). \
filter(Departemen.status == 1,
Departemen.nama.ilike(f'%{term}%')) \
.order_by(Departemen.nama)
rows = q.all()
r = []
for k in rows:
d = dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama,
level_id=k.level_id)
r.append(d)
return r
# dep_alias = aliased(Departemen) # dep_alias = aliased(Departemen)
# if url_dict['act'] == 'grid': # if url_dict['act'] == 'grid':
# columns = [ColumnDT(Departemen.id, mData='id'), # columns = [ColumnDT(Departemen.id, mData='id'),
...@@ -209,22 +219,7 @@ class Views(BaseView): ...@@ -209,22 +219,7 @@ class Views(BaseView):
# query = self.filter_company(query) # query = self.filter_company(query)
# row_table = DataTables(request.GET, query, columns) # row_table = DataTables(request.GET, query, columns)
# return row_table.output_result() # return row_table.output_result()
# elif url_dict['act'] == 'hon': # el
# term = 'term' in params and params['term'] or ''
# q = DBSession.query(Departemen). \
# filter(Departemen.status == 1,
# Departemen.nama.ilike('%%%s%%' % term)) \
# .order_by(
# Departemen.nama)
# if self.req.user.company_id:
# q = q.filter(Departemen.company_id == self.req.user.company_id)
# rows = q.all()
# r = []
# for k in rows:
# d = dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama,
# level_id=k.level_id)
# r.append(d)
# return r
# elif url_dict['act'] == 'honk': # elif url_dict['act'] == 'honk':
# term = 'term' in params and params['term'] or '' # term = 'term' in params and params['term'] or ''
# q = DBSession.query(Departemen) \ # q = DBSession.query(Departemen) \
......
import os
import colander
from deform import (widget, )
from opensipkd.base.models import (
DBSession, Jabatan, Eselon, Departemen)
from opensipkd.tools.report import (
csv_response, open_rml_pdf, open_rml_row, pdf_response)
from pyramid.i18n import TranslationStringFactory
from ..views import BaseView
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah jabatan gagal'
SESS_EDIT_FAILED = 'Edit jabatan gagal'
JENIS = ((1, _('structural', default='Structural')),
(2, _('functional', default='Functional')),
(3, _('finance', default='Finance')),
)
def daftar_eselon():
return DBSession.query(Eselon.id, Eselon.nama).order_by(Eselon.kode).all()
@colander.deferred
def deferred_eselon(node, kw):
values = kw.get('daftar_eselon', [])
return widget.SelectWidget(values=values)
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(
colander.String(),
oid="nama")
nama_pendek = colander.SchemaNode(
colander.String(),
oid="nama_pendek",
missing=colander.drop)
nama_lain = colander.SchemaNode(
colander.String(),
oid="nama_lain",
missing=colander.drop)
jenis = colander.SchemaNode(
colander.Integer(),
oid="jenis",
widget = widget.SelectWidget(values=JENIS),
title=_("type", default="Jenis"))
eselon_id = colander.SchemaNode(
colander.Integer(),
oid="eselon_id",
widget=deferred_eselon,
title=_("eselon", default="Eselon"))
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="status")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget())
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="nama")
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(),
oid="status")
class Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'jabatan'
self.list_route = 'jabatan'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Jabatan
self.list_schema = ListSchema
# self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
def get_bindings(self, row=None):
return dict(daftar_jenis=JENIS,
daftar_eselon=daftar_eselon())
def next_act(self):
request = self.req
params = request.params
url_dict = request.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
qry = DBSession.query(Jabatan). \
filter(Jabatan.status == 1). \
filter(Jabatan.kode.ilike('%%%s%%' % term)). \
order_by(Jabatan.kode)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.nama,
# value = row.nama,
# kode = row.kode,
nama=row.kode
)
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
q = DBSession.query(Jabatan.id, Jabatan.kode, Jabatan.nama,
Jabatan.jenis). \
filter(Jabatan.nama.ilike('%%%s%%' % term)). \
order_by(Jabatan.nama)
rows = q.all()
r = []
for k in rows:
if k[3] == 1:
nama_jenis = 'Struktural'
elif k[3] == 2:
nama_jenis = 'Fungsional'
else:
nama_jenis = 'Keuangan'
d = {}
d['id'] = k[0]
d['value'] = k[2] + ' (' + nama_jenis + ')'
d['kode'] = k[1]
d['nama'] = k[2]
r.append(d)
return r
elif url_dict['act'] == 'headofnama':
term = 'term' in params and params['term'] or ''
q = DBSession.query(Jabatan.id, Jabatan.kode, Jabatan.nama,
Jabatan.jenis). \
filter(Jabatan.nama.ilike('%%%s%%' % term)). \
order_by(Jabatan.nama)
rows = q.all()
r = []
for k in rows:
if k[3] == 1:
nama_jenis = 'Keuangan'
elif k[3] == 2:
nama_jenis = 'Struktural'
else:
nama_jenis = 'Fungsional'
d = {'id': k[0], 'value': k[2] + ' (' + nama_jenis + ')',
'kode': k[1], 'nama': k[2]}
r.append(d)
return r
elif url_dict['act'] == 'csv':
query = query_reg(request)
row = query.first()
header = row.keys()
rows = []
for item in query.all():
rows.append(list(item))
filename = 'jabatan.csv'
value = {
'header': header,
'rows': rows,
}
return csv_response(request, value, filename)
elif url_dict['act'] == 'pdf':
query = query_reg(request)
_here = os.path.dirname(__file__) # get current folder -> views
path = os.path.dirname(_here) # mundur 1 level
path = os.path.join(path, 'reports')
rml_row = open_rml_row(path + '/jabatan.row.rml')
rows = []
for r in query.all():
s = rml_row.format(kode=r.kode, nama=r.nama,
status=r.status and "Aktif" or "Pasif")
rows.append(s)
pdf, filename = open_rml_pdf(path + '/jabatan.rml', rows=rows,
company=request.company,
departement=request.session[
'departemen_nm'],
address=request.address,
alamat=Departemen.query_id(
request.session[
'departemen_id']).first(),
periode='01-01-2017 s.d 31-12-2017')
return pdf_response(request, pdf, filename)
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Jabatan).filter_by(id=uid)
jabatan = q.first()
else:
jabatan = None
q = Jabatan.query_kode(value['kode'])
# DBSession.query(Jabatan).filter_by(kode=value['kode'])
found = q.first()
if jabatan:
if found and found.id != jabatan.id:
err_kode()
elif found:
err_kode()
found = Jabatan.query_nama(value['nama']).first()
if jabatan:
if found and found.id != jabatan.id:
err_nama()
elif found:
err_nama()
def query_reg(request):
return DBSession.query(Jabatan.kode,
Jabatan.nama,
Jabatan.status, ). \
filter(Jabatan.status == 1). \
order_by(Jabatan.id)
import colander
from deform import widget
from opensipkd.base.models import Pangkat
from opensipkd.base.views import base_views
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode(
colander.String(),)
nama = colander.SchemaNode(
colander.String(),)
pangkat = colander.SchemaNode(
colander.String(),)
ruang = colander.SchemaNode(
colander.String(),)
status = colander.SchemaNode(
colander.Integer(), widget=widget.CheckboxWidget(),)
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(
colander.String(),
oid="nama")
pangkat = colander.SchemaNode(
colander.String(),
oid="pangkat")
ruang = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=1),
oid="ruang")
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="status")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget())
class Views(base_views.BaseView):
def __init__(self, request):
super().__init__(request)
self.list_route = 'base-pangkat'
self.table = Pangkat
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!