Commit 418142c3 by aa.gusti

penambahan wilayah

1 parent 24d051da
Showing 84 changed files with 1392 additions and 357 deletions
......@@ -141,3 +141,4 @@ Nginx::
proxy_pass http://127.0.0.1:6543/;
#try_files $uri $uri/ =404;
}
......@@ -56,8 +56,8 @@ log = logging.getLogger(__name__)
# version 2.0.0 digunakan untuk change default template
deform_templates = resource_filename('deform', 'templates')
path = os.path.dirname(__file__)
path = os.path.join(path, 'views', 'templates')
search_path = (path, deform_templates)
path = os.path.join(path, 'views', 'widgets')
search_path = (path, deform_templates) #,
renderer = ZPTRendererFactory(search_path)
Form.set_zpt_renderer(search_path)
main_title = 'openSIPKD'
......@@ -385,12 +385,11 @@ def main(global_config, **settings):
authn_policy = AuthTktAuthenticationPolicy(
'sosecret', callback=group_finder, hashalg='sha512')
# authn_policy = MyAuthenticationPolicy(
# 'sosecret', callback=group_finder, hashalg='sha512')
authz_policy = ACLAuthorizationPolicy()
config.set_authentication_policy(authn_policy)
# config.set_security_policy(authz_policy)
config.set_authorization_policy(authz_policy)
config.add_request_method(get_user, 'user', reify=True)
......@@ -417,10 +416,9 @@ def main(global_config, **settings):
# config.add_notfound_view(RemoveSlashNotFoundViewFactory())
config.add_static_view('static', 'opensipkd.base:static', cache_max_age=3600)
config.add_static_view('deform_static', 'deform:static')
config.add_static_view('files', settings['static_files'])
config.add_static_view('captcha', settings['captcha_files'])
if 'tts_files' in settings and settings['tts_files']:
config.add_static_view(name='tts', path=settings['tts_files'])
# config.add_static_view('files', get_params('static_files'))
# config.add_static_view('captcha', get_params('captcha_files'))
# config.add_static_view('tts', path=get_params('tts_files'))
config.add_renderer('csv', 'opensipkd.tools.CSVRenderer')
......
"""add partner_id to user
Revision ID: 044041bb09ef
Revises: 37ca8f816946
Create Date: 2021-12-14 15:35:58.361667
"""
# revision identifiers, used by Alembic.
revision = '044041bb09ef'
down_revision = '37ca8f816946'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
pass
def downgrade():
pass
from datetime import datetime
from opensipkd.tools import as_timezone
from sqlalchemy.ext.hybrid import hybrid_property
import ziggurat_foundations.models
from sqlalchemy.orm import (scoped_session, sessionmaker)
from zope.sqlalchemy import register
from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, func
from sqlalchemy import inspect as sa_inspect
session_factory = sessionmaker()
DBSession = scoped_session(session_factory)
register(DBSession)
ziggurat_foundations.models.DBSession = DBSession
TABLE_ARGS = dict(extend_existing=True, schema="public")
def flush(row, db_session=DBSession):
db_session.add(row)
db_session.flush()
class CommonModel(object):
def to_dict_hybrid(self):
values = {}
for item in sa_inspect(self.__class__).all_orm_descriptors:
if type(item) == hybrid_property:
value = getattr(self, item.__name__)
print(item.__name__, value)
if value:
values[item.__name__] = value
return values
def to_dict(self, null=False): # Elixir like
values = {}
for column in self.__table__.columns:
value = getattr(self, column.name)
if value or null:
values[column.name] = value
return values
def to_dict_without_none(self):
values = {}
for column in self.__table__.columns:
value = getattr(self, column.name)
if value is not None:
values[column.name] = value
return values
def from_dict(self, values):
for column in self.__table__.columns:
if column.name in values:
setattr(self, column.name, values[column.name])
def as_timezone(self, fieldname):
date_ = getattr(self, fieldname)
return date_ and as_timezone(date_) or None
class DefaultModel(CommonModel):
id = Column(Integer, primary_key=True)
@classmethod
def save(cls, values, row=None, **kwargs):
if not row:
row = cls()
row.from_dict(values)
return row
@classmethod
def count(cls, db_session=DBSession):
return db_session.query(func.count('id')).scalar()
@classmethod
def query(cls, db_session=DBSession):
return db_session.query(cls)
@classmethod
def query_id(cls, row_id, db_session=DBSession):
return cls.query(db_session).filter_by(id=row_id)
@classmethod
def delete(cls, row_id, db_session=DBSession):
cls.query_id(row_id, db_session).delete()
class StandarModel(DefaultModel):
status = Column(SmallInteger, nullable=False, default=0)
created = Column(DateTime, nullable=True, default=datetime.utcnow)
updated = Column(DateTime, nullable=True)
create_uid = Column(Integer, nullable=True, default=1)
update_uid = Column(Integer, nullable=True)
# New Method
@classmethod
def query_status(cls, status=0, db_session=DBSession):
return cls.query(db_session).filter_by(status=status)
@classmethod
def disabled(cls):
return cls.query_status(status=0)
@classmethod
def active(cls):
return cls.query_status(status=1)
@classmethod
def draft(cls):
return cls.disabled()
@classmethod
def processed(cls):
return cls.query_status(status=1)
@classmethod
def canceled(cls):
return cls.query_status(status=9)
@classmethod
def get_active(cls):
return cls.query_status(status=1).all()
@classmethod
def get_disabled(cls):
return cls.query_status(status=0).all()
@classmethod
def get_archived(cls, db_session=DBSession):
return cls.query_status(status=0, db_session=db_session).all()
class KodeModel(StandarModel):
kode = Column(String(32))
@classmethod
def query_kode(cls, kode, db_session=DBSession):
return cls.query(db_session).filter_by(kode=kode)
@classmethod
def get_by_kode(cls, kode, db_session=DBSession):
return cls.query_kode(kode, db_session).first()
class UraianModel(StandarModel):
nama = Column(String(128))
@classmethod
def query_nama(cls, nama, db_session=DBSession):
return cls.query(db_session).filter_by(nama=nama)
@classmethod
def get_by_nama(cls, nama, db_session=DBSession):
return cls.query_nama(nama, db_session).first()
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
class NamaModel(KodeModel):
nama = Column(String(128))
@classmethod
def query_nama(cls, nama, db_session=DBSession):
return cls.query(db_session).filter_by(nama=nama)
@classmethod
def get_by_nama(cls, nama, db_session=DBSession):
return cls.query_nama(nama, db_session).first()
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, ForeignKey
from ziggurat_foundations.tests import User
from .base import NamaModel, DefaultModel, DBSession, KodeModel
from .meta import Base
class Route(Base, NamaModel):
__tablename__ = 'routes'
__table_args__ = {'extend_existing': True}
kode = Column(String(128), unique=True)
path = Column(String(256), nullable=False, unique=True)
status = Column(Integer, nullable=False, server_default='1')
type = Column(SmallInteger, nullable=False, server_default='0')
app_id = Column(SmallInteger, nullable=False, server_default='0')
class Parameter(Base, NamaModel):
__tablename__ = 'parameters'
__table_args__ = {'extend_existing': True}
value = Column(String(256), nullable=False)
class Holiday(Base, DefaultModel):
__tablename__ = 'holiday'
tanggal = Column(DateTime)
@classmethod
def query_tanggal(cls, tanggal, db_session=DBSession):
return db_session.query(cls).filter_by(tanggal=tanggal)
class UserDeviceModel(Base, KodeModel):
__tablename__ = 'user_device'
user_id = Column(Integer, ForeignKey(User.id))
kode = Column(String(256))
token = Column(String(256))
logged_in = Column(Integer)
las_login_date = Column(DateTime)
......@@ -11,31 +11,26 @@ from sqlalchemy.orm import (
)
from ..models import DBSession, Base
from ..models import (DefaultModel,
NamaModel,
from ..models import (NamaModel,
TABLE_ARGS)
from ..models import User
class Departemen(Base, NamaModel):
__tablename__ = 'departemen'
__table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('public.departemen.id'))
kategori = Column(String(32))
alamat = Column(String(255))
singkat = Column(String(32))
level_id = Column(SmallInteger)
# urusan_id = Column(Integer, ForeignKey(Urusan.id))
# urusan = relationship("Urusan", backref="departemens")
__table_args__ = ( # ForeignKeyConstraint(['id'], 'departemen.id', name='parent_fk'),
TABLE_ARGS)
children = relationship("Departemen",
backref=backref('parent', remote_side=[id])
)
children = relationship(
"Departemen", backref=backref('parent', remote_side=[id]))
@property
def parents(self):
def get_parents(self, start=False):
allparents = []
if start:
allparents.append(self.nama)
p = self.parent
while p:
allparents.append(p.nama)
......@@ -43,73 +38,76 @@ class Departemen(Base, NamaModel):
return allparents
@property
def parents(self, start=False):
return self.get_parents()
@property
def name_get(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@property
def uraian_all(self):
allparents = []
allparents.append(self.nama)
p = self.parent
while p:
allparents.append(p.nama)
p = p.parent
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).all()
class DepartemenUser(Base, DefaultModel):
__tablename__ = 'departemen_user'
user_id = Column(Integer, ForeignKey(User.id), unique=True)
departemen_id = Column(Integer, ForeignKey(Departemen.id))
sub_departemen = Column(SmallInteger, nullable=True)
departemen = relationship("Departemen", backref="user_departemen")
user = relationship("User", backref="user_departemen")
__table_args__ = TABLE_ARGS
@classmethod
def query_user_id(cls, user_id):
return DBSession.query(cls).filter_by(user_id=user_id)
@classmethod
def get_kode(cls, user_id):
row = cls.query_user_id(user_id).first()
return row and row.departemen.kode or None
@classmethod
def ids(cls, user_id):
r = ()
departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
).join(Departemen).filter(cls.departemen_id == Departemen.id,
cls.user_id == user_id).all()
for departemen in departemens:
if departemen.sub_departemen:
rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
else:
rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
for i in range(len(rows)):
r = r + (rows[i])
return r
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
@classmethod
def departemen_granted(cls, user_id, departemen_id):
departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
).join(Departemen).filter(cls.departemen_id == Departemen.id,
cls.user_id == user_id).all()
for departemen in departemens:
if departemen.sub_departemen:
rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
else:
rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
for i in range(len(rows)):
if int(rows[i][0]) == int(departemen_id):
return True
return False
@classmethod
def get_filtered(cls, request):
filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd']
q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \
filter(UserDepartemen.user_id == request.user.id,
UserDepartemen.departemen_id == Departemen.id,
text(filter))
return q1.first()
# class DepartemenUser(Base, DefaultModel):
# __tablename__ = 'departemen_user'
# user_id = Column(Integer, ForeignKey(User.id), unique=True)
# departemen_id = Column(Integer, ForeignKey(Departemen.id))
# sub_departemen = Column(SmallInteger, nullable=True)
# departemen = relationship("Departemen", backref="user_departemen")
# user = relationship("User", backref="user_departemen")
# __table_args__ = TABLE_ARGS
#
# @classmethod
# def query_user_id(cls, user_id):
# return DBSession.query(cls).filter_by(user_id=user_id)
#
# @classmethod
# def get_kode(cls, user_id):
# row = cls.query_user_id(user_id).first()
# return row and row.departemen.kode or None
#
# @classmethod
# def ids(cls, user_id):
# r = ()
# departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# ).join(Departemen).filter(cls.departemen_id == Departemen.id,
# cls.user_id == user_id).all()
# for departemen in departemens:
# if departemen.sub_departemen:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
# else:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
# for i in range(len(rows)):
# r = r + (rows[i])
# return r
#
# @classmethod
# def departemen_granted(cls, user_id, departemen_id):
# departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# ).join(Departemen).filter(cls.departemen_id == Departemen.id,
# cls.user_id == user_id).all()
# for departemen in departemens:
# if departemen.sub_departemen:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
# else:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
# for i in range(len(rows)):
# if int(rows[i][0]) == int(departemen_id):
# return True
# return False
#
# @classmethod
# def get_filtered(cls, request):
# filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd']
# q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \
# filter(UserDepartemen.user_id == request.user.id,
# UserDepartemen.departemen_id == Departemen.id,
# text(filter))
# return q1.first()
from sqlalchemy import (
Column,
Integer,
ForeignKey,
UniqueConstraint,
String,
SmallInteger,
DateTime
)
from . import DefaultModel
from sqlalchemy.orm import (
relationship,
backref
)
from ..models import (Base, TABLE_ARGS)
from ..models import (NamaModel, User, Departemen)
from opensipkd.base.models.common import NamaModel
from ..models import (Base)
class PartnerModel(NamaModel):
status = Column(Integer, default=1) # 0 Inaktif - 1 Aktif
# no_urut = Column(Integer)
status = Column(Integer, default=1)
alamat_1 = Column(String(128))
alamat_2 = Column(String(128))
email = Column(String(40))
......@@ -28,10 +19,10 @@ class PartnerModel(NamaModel):
fax = Column(String(16))
mobile = Column(String(16))
website = Column(String(64))
pic = Column(String(16))
pic_mobile = Column(String(16))
pic_email = Column(String(16))
pic_jabatan = Column(String(16))
# pic = Column(String(16))
# pic_mobile = Column(String(16))
# pic_email = Column(String(16))
# pic_jabatan = Column(String(16))
@classmethod
def query_email(cls, email):
......@@ -50,14 +41,15 @@ class Partner(Base, PartnerModel):
provinsi = Column(String(128))
is_vendor = Column(SmallInteger, nullable=False, )
is_customer = Column(SmallInteger, nullable=False, )
bank = Column(String(16))
bank_accnt = Column(String(16))
user_id = Column(Integer, ForeignKey(User.id), nullable=True) # referensi ke login
departemen_id = Column(Integer, ForeignKey(Departemen.id)) # referensi ke default skpd
users = relationship("User", backref=backref('partner'))
departemen = relationship('Departemen', backref=backref('partner'))
# bank = Column(String(16))
# bank_accnt = Column(String(16))
# user_id = Column(Integer, ForeignKey(User.id), nullable=True) # referensi ke login
# departemen_id = Column(Integer, ForeignKey(Departemen.id)) # referensi ke default skpd
# users = relationship("User", backref=backref('partner'))
# departemen = relationship('Departemen', backref=backref('partner'))
rt = Column(String(3))
rw = Column(String(3))
tempat_lahir = Column(String(128))
tgl_lahir = Column(DateTime(timezone=False))
jenis_kelamin = Column(String(1))
......@@ -68,14 +60,14 @@ class Partner(Base, PartnerModel):
kewarganegaraan = Column(String(10))
# npwp = Column(String(16))
# npwpd = Column(String(16))
@classmethod
def query_user_id(cls, user_id):
return cls.query().filter_by(user_id=user_id)
@classmethod
def query_user(cls, user):
return cls.query_user_id(user.id)
#
# @classmethod
# def query_user_id(cls, user_id):
# return cls.query().filter_by(user_id=user_id)
#
# @classmethod
# def query_user(cls, user):
# return cls.query_user_id(user.id)
@classmethod
def query_identity(cls, ident):
......@@ -86,7 +78,7 @@ class Partner(Base, PartnerModel):
row = cls.query().filter_by(mobile=ident).first()
return row
class PartnerUserModel(Base, DefaultModel):
__tablename__ = 'partner_user'
partner_id = Column(Integer, ForeignKey(Partner.id))
user_id = Column(Integer, ForeignKey(User.id))
\ No newline at end of file
# class PartnerUserModel(Base, DefaultModel):
# __tablename__ = 'partner_user'
# partner_id = Column(Integer, ForeignKey(Partner.id))
# user_id = Column(Integer, ForeignKey(User.id))
......@@ -56,15 +56,15 @@ class PartnerDepartemen(Base, DefaultModel):
__tablename__ = 'partner_departemen'
partner_id = Column(Integer, ForeignKey(Partner.id))
departemen_id = Column(Integer, ForeignKey(Departemen.id))
jabatan_id = Column(Integer, ForeignKey(Jabatan.id))
struktural_id = Column(SmallInteger, ForeignKey(Jabatan.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"))
jabatan = relationship(Jabatan, foreign_keys=[jabatan_id], backref=backref("partner_departemen"), )
struktural = relationship(Jabatan, foreign_keys=[struktural_id], backref=backref("partner_struktural", ))
# 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)
......@@ -99,14 +99,14 @@ class PartnerDepartemen(Base, DefaultModel):
# cls.tmt <= tmt)
#
class PartnerLogin(Base):
__tablename__ = 'partner_login'
partner_id = Column(Integer, ForeignKey(Partner.id), unique=True)
user_id = Column(Integer, ForeignKey(User.id), primary_key=True, ) # ,
partner = relationship(Partner, backref=backref('partner_login'))
users = relationship(User, backref=backref('partner_login'))
__table_args__ = TABLE_ARGS
@classmethod
def query_user(cls, user_id):
return DBSession.query(cls).filter_by(user_id=user_id)
# class PartnerLogin(Base):
# __tablename__ = 'partner_login'
# partner_id = Column(Integer, ForeignKey(Partner.id), unique=True)
# user_id = Column(Integer, ForeignKey(User.id), primary_key=True, ) # ,
# partner = relationship(Partner, backref=backref('partner_login'))
# users = relationship(User, backref=backref('partner_login'))
# __table_args__ = TABLE_ARGS
#
# @classmethod
# def query_user(cls, user_id):
# return DBSession.query(cls).filter_by(user_id=user_id)
from datetime import datetime
from ziggurat_foundations import ziggurat_model_init
import sqlalchemy as sa
from pyramid.authorization import (Allow, Authenticated, ALL_PERMISSIONS)
from sqlalchemy import (
Column, Integer, DateTime, ForeignKey, String)
from sqlalchemy.orm import (relationship, backref)
from ziggurat_foundations.models.base import BaseModel
from ziggurat_foundations.models.external_identity import ExternalIdentityMixin
from ziggurat_foundations.models.group import GroupMixin
from ziggurat_foundations.models.group_permission import GroupPermissionMixin
from ziggurat_foundations.models.group_resource_permission import GroupResourcePermissionMixin
from ziggurat_foundations.models.resource import ResourceMixin
from ziggurat_foundations.models.services.user import UserService
from ziggurat_foundations.models.user import UserMixin
from ziggurat_foundations.models.user_group import UserGroupMixin
from ziggurat_foundations.models.user_permission import UserPermissionMixin
from ziggurat_foundations.models.user_resource_permission import UserResourcePermissionMixin
from ziggurat_foundations.models.services.external_identity import ExternalIdentityService
from opensipkd.tools import as_timezone
from .base import CommonModel, DBSession, DefaultModel
from .meta import Base
# from .partner import Partner
class GroupPermission(GroupPermissionMixin, Base):
pass
class UserGroup(UserGroupMixin, Base, CommonModel):
@classmethod
def _get_by_user(cls, user):
return DBSession.query(cls).filter_by(user_id=user.id).all()
@classmethod
def get_by_user(cls, user):
groups = []
for g in cls._get_by_user(user):
groups.append(g.group_id)
return groups
class GroupResourcePermission(GroupResourcePermissionMixin, Base):
__table_args__ = (
sa.PrimaryKeyConstraint(
"group_id",
"resource_id",
"perm_name",
name="pk_group_resources_permissions ",
),
{"mysql_engine": "InnoDB", "mysql_charset": "utf8"},
)
class Resource(ResourceMixin, Base):
pass
class UserPermission(UserPermissionMixin, Base):
pass
class UserResourcePermission(UserResourcePermissionMixin, Base):
pass
class User(UserMixin, BaseModel, CommonModel, Base):
last_login_date = Column(DateTime(timezone=True), nullable=True)
registered_date = Column(DateTime(timezone=True),
nullable=False,
default=datetime.utcnow)
api_key = Column(String(256))
partner_id = Column(Integer) #, ForeignKey(Partner.id))
#partners = relationship(Partner, backref=backref('users'))
def _get_password(self):
return self._password
def _set_password(self, password):
self._password = UserService.set_password(self, password)
password = property(_get_password, _set_password)
def get_groups(self):
return UserGroup.get_by_user(self)
def last_login_date_tz(self):
return as_timezone(self.last_login_date)
def registered_date_tz(self):
return as_timezone(self.registered_date)
def nice_username(self):
return self.user_name or self.email
def kode(self):
pass
@classmethod
def query(cls):
return DBSession.query(cls)
@classmethod
def get_by_email(cls, email):
return DBSession.query(cls).filter_by(email=email).first()
@classmethod
def get_by_name(cls, name):
return DBSession.query(cls).filter_by(user_name=name).first()
@classmethod
def get_by_identity(cls, identity):
if identity.find('@') > -1:
return cls.get_by_email(identity)
return cls.get_by_name(identity)
@classmethod
def get_by_token(cls, token):
return DBSession.query(cls).filter_by(security_code=token)
# @classmethod
# def get_departemen_id(cls, user_id):
# partner = Partner.query_user_id(user_id).first()
# return partner and partner.departemen and partner.departemen.id or None
#
# @classmethod
# def get_departemen_kd(cls, user_id):
# partner = Partner.query_user_id(user_id).first()
# return partner and partner.departemen and partner.departemen.kode or None
#
# @classmethod
# def get_departemen_id(cls, user_id):
# partner = Partner.query_user_id(user_id).first()
# return partner and partner.departemen and partner.departemen.id or None
#
# @classmethod
# def get_departemen_nm(cls, user_id):
# partner = Partner.query_user_id(user_id).first()
# return partner and partner.departemen and partner.departemen.nama or None
# @classmethod
# def get_list_by_departemen(cls, departemen_id):
# rows = DBSession.query(User.id, Partner.nama) \
# .join(Partner, User.id == Partner.user_id) \
# .filter(Partner.departemen_id == departemen_id).all()
# result = list(((row[0], row[1]) for row in rows))
# result.insert(0, (0, "All"))
# return result
class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base):
pass
# class GroupRoutePermission(Base, CommonModel):
# __tablename__ = 'groups_routes_permissions'
# __table_args__ = {'extend_existing': True, }
# route_id = Column(Integer, ForeignKey("routes.id"), nullable=False, primary_key=True)
# group_id = Column(Integer, ForeignKey("groups.id"), nullable=False, primary_key=True)
# routes = relationship("Route", backref=backref('routepermission'))
# groups = relationship("Group", backref=backref('grouppermission'))
class Permission(Base, CommonModel):
__tablename__ = 'permissions'
__table_args__ = {'extend_existing': True, }
id = Column(Integer, primary_key=True)
perm_name = Column(String(64), nullable=False, unique=True)
description = Column(String(64), nullable=False, unique=True)
class Group(GroupMixin, Base, DefaultModel):
@classmethod
def query_group_name(cls, group_name):
return DBSession.query(cls).filter_by(group_name=group_name)
# It is used when there is a web request.
class RootFactory:
def __init__(self, request):
self.__acl__ = [
(Allow, 'group:1', ALL_PERMISSIONS),
(Allow, Authenticated, 'view')]
for gp in DBSession.query(GroupPermission):
acl_name = 'group:{}'.format(gp.group_id)
self.__acl__.append((Allow, acl_name, gp.perm_name))
def init_model():
ziggurat_model_init(User, Group, UserGroup, GroupPermission, UserPermission,
UserResourcePermission, GroupResourcePermission, Resource,
ExternalIdentity, passwordmanager=None)
from sqlalchemy import (
Column,
ForeignKey,
String,
SmallInteger,
)
from ..models import Base
from ..models import (NamaModel,
TABLE_ARGS)
kategori_provinsi = (
("provinsi", "Provinsi"),
("provinsi administratif", "Provinsi Administratif"),
)
class ResProvinsi(Base, NamaModel):
__tablename__ = 'res_provinsi'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
ibu_kota = Column(String(64))
kategori_dati2 = (
("kota", "Kota"),
("kabupaten", "Kabupaten"),
("kota administratif", "Kota Administratif"),
("kabupaten administratif", "Kabupaten Administratif"),
)
class ResDati2(Base, NamaModel):
__tablename__ = 'res_dati2'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
ibu_kota = Column(String(64))
provinsi_id = Column(SmallInteger, ForeignKey(ResProvinsi.id))
class ResKecamatan(Base, NamaModel):
__tablename__ = 'res_kecamatan'
__table_args__ = (TABLE_ARGS,)
ibu_kota = Column(String(64))
dati2_id = Column(SmallInteger, ForeignKey(ResDati2.id))
kategori_desa = (
("desa", "Desa"),
("kelurahan", "Kelurahan")
)
class ResDesa(Base, NamaModel):
__tablename__ = 'res_desa'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
kecamatan_id = Column(SmallInteger, ForeignKey(ResKecamatan.id))
......@@ -131,3 +131,32 @@ partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report
log,/log,Log Aplikasi
log-act,/log/{act}/act,Log Aplikasi Act
log-view,/log/{id}/view,Log Aplikasi View
provinsi,/provinsi,Provinsi,1,0
provinsi-add,/provinsi/add,Provinsi Add,1,0
provinsi-edit,/provinsi/{id}/edit,Provinsi Edit,1,0
provinsi-view,/provinsi/{id}/view,Provinsi View,1,0
provinsi-delete,/provinsi/{id}/delete,Provinsi Hapus,1,0
provinsi-act,/provinsi/{act}/act,Provinsi Act,1,0
provinsi-rpt,/provinsi/{rpt}/rpt,Provinsi Report,1,0
dati2,/dati2,Kabupaten/Kota,1,0
dati2-add,/dati2/add,Kabupaten/Kota Add,1,0
dati2-edit,/dati2/{id}/edit,Kabupaten/Kota Edit,1,0
dati2-view,/dati2/{id}/view,Kabupaten/Kota View,1,0
dati2-delete,/dati2/{id}/delete,Kabupaten/Kota Hapus,1,0
dati2-act,/dati2/{act}/act,Kabupaten/Kota Act,1,0
dati2-rpt,/dati2/{rpt}/rpt,Kabupaten/Kota Report,1,0
kecamatan,/kecamatan,Kecamatan,1,0
kecamatan-add,/kecamatan/add,Kecamatan Add,1,0
kecamatan-edit,/kecamatan/{id}/edit,Kecamatan Edit,1,0
kecamatan-view,/kecamatan/{id}/view,Kecamatan View,1,0
kecamatan-delete,/kecamatan/{id}/delete,Kecamatan Hapus,1,0
kecamatan-act,/kecamatan/{act}/act,Kecamatan Act,1,0
kecamatan-rpt,/kecamatan/{rpt}/rpt,Kecamatan Report,1,0
desa,/desa,Desa/Kelurahan,1,0
desa-add,/desa/add,Desa/Kelurahan Add,1,0
desa-edit,/desa/{id}/edit,Desa/Kelurahan Edit,1,0
desa-view,/desa/{id}/view,Desa/Kelurahan View,1,0
desa-delete,/desa/{id}/delete,Desa/Kelurahan Hapus,1,0
desa-act,/desa/{act}/act,Desa/Kelurahan Act,1,0
desa-rpt,/desa/{rpt}/rpt,Desa/Kelurahan Report,1,0
......@@ -10,8 +10,9 @@ from ziggurat_foundations.models.services.user import UserService
from pyramid.paster import (get_appsettings, setup_logging, )
from ..models.handlers import LogDBSession
from ..models import (init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission, User, Route, Eselon,
Jabatan)
from ..models import (
init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission,
User, Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from sqlalchemy.dialects import oracle
from sqlalchemy import text
......
......@@ -182,7 +182,7 @@ class BaseView(object):
DBSession.flush()
return row
def save_request(self, values, row):
def save_request(self, values, row=None):
return self.save(values, self.req.user, row)
def id_not_found(self):
......
import json
import colander
from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, )
from .provinsi import provinsi_widget
from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah dati2 gagal'
SESS_EDIT_FAILED = 'Edit dati2 gagal'
@colander.deferred
def dati2_widget(node, kw):
values = kw.get('dati2_list', [])
return widget.Select2Widget(values=values)
class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget,
validator=colander.Length(max=32), oid="kode")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_dati2),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ViewDati2(BaseView):
def __init__(self, request):
super(ViewDati2, self).__init__(request)
self.form_scripts = ""
self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, {
"searchable": True, "orderable": True, "targets": [1, 2],
}])
self.list_cols = [{'title': "ID", 'data': "id"},
{'title': "Provinsi", 'data': "provinsi", 'width': '200pt'},
{'title': "Kode", 'data': "kode", 'width': '100pt'},
{'title': "Nama", 'data': "nama"}, ]
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="")
self.list_url = 'dati2'
self.list_route = 'dati2'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDati2
########
# List #
########
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(ResDati2).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResDati2.query_kode(value['kode']) \
.filter(ResDati2.provinsi_id == value["provinsi_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResDati2.query_nama(value['nama']) \
.filter(ResDati2.provinsi_id == value["provinsi_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req,
provinsi_list=ResProvinsi.get_list())
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
@view_config(route_name='dati2-view',
renderer='templates/form_input.pt', permission='dati2')
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='dati2',
renderer='templates/list.pt',
permission='dati2')
def view_list(self):
return super().view_list()
@view_config(route_name='dati2-act', renderer='json',
permission='view')
def view_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'grid':
columns = [ColumnDT(ResDati2.id, mData='id'),
ColumnDT(ResDati2.kode, mData='kode'),
ColumnDT(ResDati2.nama, mData='nama'),
ColumnDT(ResDati2.status, mData='status'),
ColumnDT(ResProvinsi.nama, mData='provinsi'),]
query = DBSession.query().select_from(ResDati2) \
.join(ResProvinsi, ResProvinsi.id == ResDati2.provinsi_id)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='dati2-add',
renderer='templates/form_input.pt', permission='dati2')
def view_add(self):
return super(ViewDati2, self).view_add()
########
# Edit #
########
@view_config(route_name='dati2-edit',
renderer='templates/form_input.pt', permission='dati2')
def view_edt(self):
return super(ViewDati2, self).view_edit()
##########
# Delete
##########
@view_config(route_name='dati2-delete',
renderer='templates/form_input.pt', permission='dati2')
def view_delete(self):
return super(ViewDati2, self).view_delete()
......@@ -7,7 +7,7 @@ from datetime import datetime
import colander
from deform import (Form, widget, ValidationFailure, )
from deform.widget import AutocompleteInputWidget
from opensipkd.base.models import DepartemenUser
# from opensipkd.base.models import DepartemenUser
from pyramid.httpexceptions import (HTTPFound, )
from pyramid.view import (view_config, )
from sqlalchemy import func
......@@ -16,7 +16,8 @@ from opensipkd.tools import (get_ext, get_random_string, get_settings)
from opensipkd.tools.buttons import btn_cancel, btn_save, btn_delete, btn_close
from .upload import AddSchema as UploadSchema
from ..models import DBSession, Departemen
from .. import renderer
from ..models import DBSession, Departemen, Partner, PartnerDepartemen
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah departemen gagal'
......@@ -304,10 +305,10 @@ class ViewDepartemen(BaseView):
return r
elif url_dict['act'] == 'hon_level':
# todo Check ulang untuk hon
term = 'term' in params and params['term'] or ''
settings = get_settings()
level_id = 'departemen_chg_id' in settings and settings[
'departemen_chg_id'] or 0
level_id = self.req.get_params('departemen_chg_id', 0)
q = DBSession.query(Departemen).filter(Departemen.status == 1,
Departemen.nama.ilike(
'%%%s%%' %
......@@ -317,7 +318,10 @@ class ViewDepartemen(BaseView):
q = q.filter(Departemen.level_id == int(level_id))
if request.user.id > 1 and not request.has_permission(
"departemen-all"):
user_dep = DepartemenUser.query_user_id(request.user.id).first()
partner = Partner.query_id(request.user.id).first()
if partner:
PartnerDepartemen.query_jabatan(partner.id, datetime.now())
user_dep = PartnerDepartemen.query_user_id().first()
if not user_dep:
return []
......
import json
import colander
from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, )
from .kecamatan import kecamatan_widget
from ..models import DBSession, ResDesa, kategori_desa, ResKecamatan
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah desa gagal'
SESS_EDIT_FAILED = 'Edit desa gagal'
@colander.deferred
def desa_widget(node, kw):
values = kw.get('desa_list', [])
return widget.Select2Widget(values=values)
class AddSchema(colander.Schema):
kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget,
validator=colander.Length(max=32), oid="kode")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_desa),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ViewDesa(BaseView):
def __init__(self, request):
super(ViewDesa, self).__init__(request)
self.form_scripts = ""
self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, {
"searchable": True, "orderable": True, "targets": [1, 2],
}])
self.list_cols = [{'title': "ID", 'data': "id"},
{'title': "Kecamatan", 'data': "kecamatan", 'width': '200pt'},
{'title': "Kode", 'data': "kode", 'width': '100pt'},
{'title': "Nama", 'data': "nama"}, ]
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="")
self.list_url = 'desa'
self.list_route = 'desa'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDesa
########
# List #
########
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(ResDesa).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResDesa.query_kode(value['kode']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResDesa.query_nama(value['nama']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req,
kecamatan_list=ResKecamatan.get_list())
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
@view_config(route_name='desa-view',
renderer='templates/form_input.pt', permission='desa')
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='desa',
renderer='templates/list.pt',
permission='desa')
def view_list(self):
return super().view_list()
@view_config(route_name='desa-act', renderer='json',
permission='view')
def view_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'grid':
columns = [ColumnDT(ResDesa.id, mData='id'),
ColumnDT(ResDesa.kode, mData='kode'),
ColumnDT(ResDesa.nama, mData='nama'),
ColumnDT(ResDesa.status, mData='status'),
ColumnDT(ResKecamatan.nama, mData='kecamatan'),]
query = DBSession.query().select_from(ResDesa) \
.join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='desa-add',
renderer='templates/form_input.pt', permission='desa')
def view_add(self):
return super(ViewDesa, self).view_add()
########
# Edit #
########
@view_config(route_name='desa-edit',
renderer='templates/form_input.pt', permission='desa')
def view_edt(self):
return super(ViewDesa, self).view_edit()
##########
# Delete
##########
@view_config(route_name='desa-delete',
renderer='templates/form_input.pt', permission='desa')
def view_delete(self):
return super(ViewDesa, self).view_delete()
......@@ -164,10 +164,27 @@ class view_eselon(BaseView):
form.render(appstruct=values)
return dict(form=form)
@view_config(route_name='eselon-view', renderer='templates/form_input.pt',
permission='eselon')
def view_view(self):
request = self.req
q = query_id(request)
row = q.first()
if not row:
return id_not_found(request)
uid = row.id
form = Form(EditSchema(), buttons=('tutup',))
if request.POST:
return route_list(request)
values = row.to_dict()
form = form.render(appstruct=values, readonly=True)
return dict(form=form, scripts="")
##########
# Delete #
##########
@view_config(route_name='eselon-delete', renderer='templates/eselon/del.pt',
@view_config(route_name='eselon-delete', renderer='templates/form_input.pt',
permission='eselon')
def view_del(self):
request = self.req
......@@ -177,7 +194,7 @@ class view_eselon(BaseView):
if not row:
return id_not_found(request)
form = Form(colander.Schema(), buttons=('hapus', 'batal'))
form = Form(EditSchema(), buttons=('hapus', 'batal'))
if request.POST:
if 'hapus' in request.POST:
msg = 'eselon ID %d %s sudah dihapus.' % (row.id, row.nama)
......@@ -185,7 +202,8 @@ class view_eselon(BaseView):
DBSession.flush()
request.session.flash(msg)
return route_list(request)
return dict(row=row, form=form.render())
form.set_appstruct(row.to_dict())
return dict(row=row, form=form.render(readonly=True), scripts='')
#######
......
# #Widget Standard
# #https://docs.pylonsproject.org/projects/deform/en/latest/api.html#module-deform.widget
# widget = widget.HiddenWidget(),
# deform.widget.TextInputWidget(readonly=True),
# deform.widget.SelectWidget(**kw)
#
# #COLANDER DEFFERED
# #base.tools
# STATUS = (
# (1, 'Aktif'),
# (0, 'Pasif')
# )
#
# from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
# from sqlalchemy.orm import relationship, backref
# relationship("Address", backref="user")
#
# #base.views.base_view
# @colander.deferred
# def deferred_status(node, kw): ##initialize deffered_status
# values = kw.get('daftar_status', []) #varible for get value daftar_status
# return widget.SelectWidget(values=values)
#
# #SCHEMA
# class AddSchema(colander.Schema):
# status = colander.SchemaNode(
# colander.Integer(),
# widget=deferred_status, ##getting deffered status
# title="Status")
#
# #BINDING
# def get_form(request, class_form):
# schema = class_form()
# schema = schema.bind(daftar_status=STATUS,) #varianbel daftar_status bind to LIST Value
#
# def tbl_list_value():
# return DBSEssion.query(table.key, table.value).all()
#
# #base.views.base_view
# @colander.deferred
# def deferred_list_value(node, kw): ##initialize deffered_status
# values = kw.get('list_value', []) #varible for get value list_value
# return widget.SelectWidget(values=values)
# #SCHEMA
# class AddSchema(colander.Schema):
# status = colander.SchemaNode(
# colander.Integer(),
# widget=deferred_list_value, ##getting deffered status
# title="Status")
#
# #BINDING
# def get_form(request, class_form):
# schema = class_form()
# schema = schema.bind(list_value = tbl_list_value(),) #varianbel list_value bind to LIST Value
#
# # <script>
# # $('#jabatan_nm').typeahead({"minLength": 1, "remote": "/jabatan/hon/act?term=%QUERY", "limit": 8});
# # $('#jabatan_nm').bind('typeahead:selected', function(obj, datum, name) {
# # $('#jabatan_id').val(datum.id);
# # });
# # </script>
#
# # elif url_dict['act']=='hon':
# # term = 'term' in params and params['term'] or ''
# # prefix = 'prefix' in params and params['prefix'] or ''
# # qry = DBSession.query(Jabatan).\
# # filter(Jabatan.status == 1).\
# # filter(Jabatan.nama.ilike('%%%s%%' % term)).\
# # filter(Jabatan.kode.ilike('%s%%' % prefix)).\
# # order_by(Jabatan.nama)
# # r = []
# # for row in qry.all():
# # d=dict(
# # id = row.id,
# # value = row.nama,
# # kode = row.kode,
# # #nama = row.nama
# # )
# # r.append(d)
# # return r
# # #class
# # <style>
# # .red-border {
# # border-color: rgba(255, 0, 0, 0.2);
# # box-shadow: 0 1px 1px rgba(255, 0, 0, 0.2); inset, 0 0 8px rgba(255, 0, 0, 0.2);
# # outline: 0 none;
# # }
# # </style>
# # <script>
# # $('#source_id').typeahead({"minLength": 1, "remote": "/eis/slide/hon/act?term=%QUERY", "limit": 8});
# # $('#source_id').bind('typeahead:selected', function(obj, datum, name) {
# # if (!datum.id){
# # $('#source_id').addClass("red-border");
# # return;
# # }
# # $('#source_id').removeClass("red-border")
# # $('#source_id').val(datum.id);
# # });
# # </script>
# #
# # [handlers]
# # keys = console, filelog
# #
# # [logger_root]
# # level = INFO
# # handlers = console, filelog
# #
# # [handler_filelog]
# # class = FileHandler
# # args = ('%(here)s/../../tmp/pserve.log','a')
# # level = INFO
# # formatter = generic
......@@ -170,7 +170,8 @@ class ViewJabatan(BaseView):
r.append(d)
return r
@view_config(route_name='jabatan-add', renderer='templates/form_input.pt',
@view_config(route_name='jabatan-add',
renderer='templates/form_input.pt',
permission='jabatan')
def view_add(self):
request = self.req
......@@ -188,7 +189,8 @@ class ViewJabatan(BaseView):
return dict(form=form.render(), scripts="")
# return dict(form=form.render())
@view_config(route_name='jabatan-edit', renderer='templates/form_input.pt',
@view_config(route_name='jabatan-edit',
renderer='templates/form_input.pt',
permission='jabatan')
def view_edt(self):
request = self.req
......
import json
import colander
from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, )
from .dati2 import dati2_widget
from ..models import DBSession, ResKecamatan, ResDati2
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah kecamatan gagal'
SESS_EDIT_FAILED = 'Edit kecamatan gagal'
@colander.deferred
def kecamatan_widget(node, kw):
values = kw.get('kecamatan_list', [])
return widget.Select2Widget(values=values)
class AddSchema(colander.Schema):
dati2_id = colander.SchemaNode(colander.String(),
widget=dati2_widget,
validator=colander.Length(max=32), oid="kode")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ViewDati2(BaseView):
def __init__(self, request):
super(ViewDati2, self).__init__(request)
self.form_scripts = ""
self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, {
"searchable": True, "orderable": True, "targets": [1, 2],
}])
self.list_cols = [{'title': "ID", 'data': "id"},
{'title': "Kab/Kota", 'data': "dati2", 'width': '200pt'},
{'title': "Kode", 'data': "kode", 'width': '100pt'},
{'title': "Nama", 'data': "nama"}, ]
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="")
self.list_url = 'kecamatan'
self.list_route = 'kecamatan'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResKecamatan
########
# List #
########
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(ResKecamatan).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResKecamatan.query_kode(value['kode']) \
.filter(ResKecamatan.dati2_id == value["dati2_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResKecamatan.query_nama(value['nama']) \
.filter(ResKecamatan.dati2_id == value["dati2_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req,
dati2_list=ResDati2.get_list())
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
@view_config(route_name='kecamatan-view',
renderer='templates/form_input.pt', permission='kecamatan')
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='kecamatan',
renderer='templates/list.pt',
permission='kecamatan')
def view_list(self):
return super().view_list()
@view_config(route_name='kecamatan-act', renderer='json',
permission='view')
def view_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'grid':
columns = [ColumnDT(ResKecamatan.id, mData='id'),
ColumnDT(ResKecamatan.kode, mData='kode'),
ColumnDT(ResKecamatan.nama, mData='nama'),
ColumnDT(ResKecamatan.status, mData='status'),
ColumnDT(ResDati2.nama, mData='dati2'),]
query = DBSession.query().select_from(ResKecamatan) \
.join(ResDati2, ResDati2.id == ResKecamatan.dati2_id)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='kecamatan-add',
renderer='templates/form_input.pt', permission='kecamatan')
def view_add(self):
return super(ViewDati2, self).view_add()
########
# Edit #
########
@view_config(route_name='kecamatan-edit',
renderer='templates/form_input.pt', permission='kecamatan')
def view_edt(self):
return super(ViewDati2, self).view_edit()
##########
# Delete
##########
@view_config(route_name='kecamatan-delete',
renderer='templates/form_input.pt', permission='kecamatan')
def view_delete(self):
return super(ViewDati2, self).view_delete()
......@@ -38,6 +38,7 @@ class AddSchema(colander.Schema):
value = colander.SchemaNode(
colander.String(),
widget=widget.TextAreaWidget(rows=5),
oid="value",
title="Nilai")
......
......@@ -7,6 +7,7 @@ from deform import (
widget,
ValidationFailure,
)
from opensipkd.base.models import User
from pyramid.httpexceptions import (
HTTPFound,
)
......@@ -17,7 +18,7 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_delete
from ..models import DBSession
from ..models import Partner
from ..models.partner import PartnerUserModel
# from ..models.partner import PartnerUserModel
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah partner gagal'
......@@ -159,12 +160,17 @@ class ViewPartner(BaseView):
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
row = q.first()
if not row:
return []
keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()]
# for k in q.all():
# d = )
# r.append(d)
return r
elif url_dict['act'] == 'vendor': # vendor only
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
......@@ -267,10 +273,11 @@ class ViewPartner(BaseView):
form = get_form(request, EditSchema, buttons=(btn_delete, btn_cancel,))
if request.POST:
if 'delete' in request.POST:
partner_user = DBSession.query(PartnerUserModel). \
user = User.query(). \
filter_by(partner_id=request.matchdict['id'])
if partner_user.first():
partner_user.delete()
if user.first():
request.session.flash('Partner digunakan oleh User')
return route_list(request)
msg = 'Partner ID %d %s sudah dihapus.' % (row.id, row.nama)
q.delete()
DBSession.flush()
......
......@@ -231,7 +231,7 @@ class ViewPartner(BaseView):
values['selesai'] = None
query_struktural = DBSession.query(Jabatan.jenis). \
filter(Jabatan.id == values['jabatan_id']).scalar()
values['struktural_id'] = query_struktural
values['jabatan_id'] = query_struktural
row = self.save(values, request.user, row)
request.session.flash('Posisi Partner sudah disimpan.')
......@@ -286,7 +286,7 @@ class ViewPartner(BaseView):
.outerjoin(Departemen, PartnerDepartemen.departemen_id == Departemen.id) \
.outerjoin(Partner, Partner.id == PartnerDepartemen.partner_id) \
.outerjoin(Jabatan, (PartnerDepartemen.jabatan_id == Jabatan.id)) \
.outerjoin(struktural, (PartnerDepartemen.struktural_id == struktural.id)) \
.outerjoin(struktural, (PartnerDepartemen.jabatan_id == struktural.id)) \
.order_by(Partner.nama)
row_table = DataTables(request.GET, query, columns)
......@@ -398,10 +398,10 @@ class ViewPartner(BaseView):
values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai)
if not row.struktural_id:
values['struktural_id'] = 0
if not row.jabatan_id:
values['jabatan_id'] = 0
else:
jb = Jabatan.query_id(row.struktural_id).first()
jb = Jabatan.query_id(row.jabatan_id).first()
if jb:
values['struktural_nm'] = jb.nama
......@@ -463,10 +463,10 @@ class ViewPartner(BaseView):
values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai)
if not row.struktural_id:
values['struktural_id'] = 0
if not row.jabatan_id:
values['jabatan_id'] = 0
else:
jb = Jabatan.query_id(row.struktural_id).first()
jb = Jabatan.query_id(row.jabatan_id).first()
if jb:
values['struktural_nm'] = jb.nama
......@@ -508,10 +508,10 @@ class ViewPartner(BaseView):
values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai)
if not row.struktural_id:
values['struktural_id'] = 0
if not row.jabatan_id:
values['jabatan_id'] = 0
else:
jb = Jabatan.query_id(row.struktural_id).first()
jb = Jabatan.query_id(row.jabatan_id).first()
if jb:
values['struktural_nm'] = jb.nama
form.set_appstruct(self.get_values(row, values))
......
import json
from datetime import datetime
import colander
from deform import (Form, widget, )
from opensipkd.tools.buttons import btn_cancel, btn_save, btn_close
from pyramid.httpexceptions import (HTTPFound, )
from pyramid.view import (view_config, )
from sqlalchemy.orm import aliased
from ..models import DBSession, ResProvinsi, kategori_provinsi, flush
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah provinsi gagal'
SESS_EDIT_FAILED = 'Edit provinsi gagal'
@colander.deferred
def provinsi_widget(node, kw):
values = kw.get('provinsi_list', [])
return widget.Select2Widget(values=values)
class AddSchema(colander.Schema):
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_provinsi),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ViewProvinsi(BaseView):
def __init__(self, request):
super(ViewProvinsi, self).__init__(request)
self.form_scripts = ""
self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, {
"searchable": True, "orderable": True, "targets": [1, 2],
}])
self.list_cols = [{'title': "ID", 'data': "id"},
{'title': "Kode", 'data': "kode", 'width': '100pt'},
{'title': "Nama", 'data': "nama"}, ]
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="")
self.list_url = 'provinsi'
self.list_route = 'provinsi'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResProvinsi
########
# List #
########
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(ResProvinsi).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResProvinsi.query_kode(value['kode'])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResProvinsi.query_nama(value['nama']).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
@view_config(route_name='provinsi-view',
renderer='templates/form_input.pt', permission='provinsi')
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='provinsi',
renderer='templates/list.pt',
permission='provinsi')
def view_list(self):
return super().view_list()
##########
# Action #
##########
@view_config(route_name='provinsi-act', renderer='json',
permission='view')
def view_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'grid':
columns = [ColumnDT(ResProvinsi.id, mData='id'),
ColumnDT(ResProvinsi.kode, mData='kode'),
ColumnDT(ResProvinsi.nama, mData='nama'),
ColumnDT(ResProvinsi.status, mData='status'), ]
query = DBSession.query().select_from(ResProvinsi)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='provinsi-add',
renderer='templates/form_input.pt', permission='provinsi')
def view_add(self):
return super(ViewProvinsi, self).view_add()
########
# Edit #
########
@view_config(route_name='provinsi-edit',
renderer='templates/form_input.pt', permission='provinsi')
def view_edt(self):
return super(ViewProvinsi, self).view_edit()
##########
# Delete
##########
@view_config(route_name='provinsi-delete',
renderer='templates/form_input.pt', permission='provinsi')
def view_delete(self):
return super(ViewProvinsi, self).view_delete()
......@@ -6,11 +6,15 @@
group_path ['group', 'group-add', 'group-edit', 'group-view', 'group-delete'];
param_path ['parameter', 'parameter-add', 'parameter-edit', 'parameter-view', 'parameter-delete'];
dep_path ['departemen', 'departemen-add', 'departemen-edit', 'departemen-view', 'departemen-delete'];
partner_path ['partner', 'partner-add', 'partner-edit', 'partner-view', 'partner-delete'];
partner_path ['partner', 'partner-add', 'partner-edt', 'partner-view', 'partner-del'];
part_dep_path ['partner-departemen', 'partner-departemen-add', 'partner-departemen-edit', 'partner-departemen-view',
'partner-departemen-delete'];
jabatan_path ['jabatan', 'jabatan-add', 'jabatan-edit', 'jabatan-view',
'jabatan-delete'];
jabatan_path ['jabatan', 'jabatan-add', 'jabatan-edit', 'jabatan-view', 'jabatan-delete'];
eselon_path ['eselon', 'eselon-add', 'eselon-edit', 'eselon-view', 'eselon-delete'];
provinsi_path ['provinsi', 'provinsi-add', 'provinsi-edit', 'provinsi-view', 'provinsi-delete'];
dati2_path ['dati2', 'dati2-add', 'dati2-edit', 'dati2-view', 'dati2-delete'];
kecamatan_path ['kecamatan', 'kecamatan-add', 'kecamatan-edit', 'kecamatan-view', 'kecamatan-delete'];
desa_path ['desa', 'desa-add', 'desa-edit', 'desa-view', 'desa-delete'];
">
<head>
......@@ -189,23 +193,28 @@
tal:attributes="class request.matched_route.name in group_path and 'active'">
<a href="${home}/group">Group</a>
</li>
<li tal:condition="has_permission(request, 'user-group')"
tal:attributes="class request.matched_route.name in ['user-group'] and 'active'">
<a href="${home}/user/group">User
Group</a></li>
<!-- <li tal:condition="has_permission(request, 'user-group')"-->
<!-- tal:attributes="class request.matched_route.name in ['user-group'] and 'active'">-->
<!-- <a href="${home}/user/group">User Group</a></li>-->
<li tal:condition="has_permission(request, 'upload-logo')"
tal:attributes="class request.matched_route.name in ['upload-logo'] and 'active'">
<a href="${home}/upload/logo">Upload
Logo</a></li>
<a href="${home}/upload/logo">Upload Logo</a></li>
<li tal:condition="has_permission(request, 'parameter')"
tal:attributes="class request.matched_route.name in param_path and 'active'">
<a href="${home}/parameter">Parameter</a></li>
<li tal:condition="has_permission(request, 'eselon')"
tal:attributes="class request.matched_route.name in eselon_path and 'active'">
<a href="${home}/eselon">Eselon</a></li>
<li tal:condition="has_permission(request, 'jabatan')"
tal:attributes="class request.matched_route.name in jabatan_path and 'active'">
<a href="${home}/jabatan">Jabatan</a></li>
<li tal:condition="has_permission(request, 'departemen')"
tal:attributes="class request.matched_route.name in dep_path and 'active'">
<a href="${home}/departemen">Departemen</a></li>
<li tal:condition="has_permission(request, 'departemen-user')"
tal:attributes="class request.matched_route.name in ['departemen-user'] and 'active'">
<a href="${home}/departemen/user">User Departemen</a></li>
<!-- <li tal:condition="has_permission(request, 'departemen-user')"-->
<!-- tal:attributes="class request.matched_route.name in ['departemen-user'] and 'active'">-->
<!-- <a href="${home}/departemen/user">User Departemen</a></li>-->
<li tal:condition="has_permission(request, 'partner')"
tal:attributes="class request.matched_route.name in partner_path and 'active'">
......@@ -213,12 +222,19 @@
<li tal:condition="has_permission(request, 'partner-departemen')"
tal:attributes="class request.matched_route.name in part_dep_path and 'active'">
<a href="${home}/partner/departemen">Partner Departemen</a></li>
<!-- <li tal:condition="has_permission(request, 'eselon')"-->
<!-- tal:attributes="class request.path == '/eselon' and 'active'">-->
<!-- <a href="${home}/eselon">Eselon</a></li>-->
<li tal:condition="has_permission(request, 'jabatan')"
tal:attributes="class request.matched_route.name in jabatan_path and 'active'">
<a href="${home}/jabatan">Jabatan</a></li>
<li tal:condition="has_permission(request, 'provinsi')"
tal:attributes="class request.matched_route.name in provinsi_path and 'active'">
<a href="${home}/provinsi">Provinsi</a></li>
<li tal:condition="has_permission(request, 'dati2')"
tal:attributes="class request.matched_route.name in dati2_path and 'active'">
<a href="${home}/dati2">Kabupaten/Kota</a></li>
<li tal:condition="has_permission(request, 'kecamatan')"
tal:attributes="class request.matched_route.name in kecamatan_path and 'active'">
<a href="${home}/kecamatan">Kecamatan</a></li>
<li tal:condition="has_permission(request, 'desa')"
tal:attributes="class request.matched_route.name in desa_path and 'active'">
<a href="${home}/desa">Desa/Kelurahan</a></li>
<li tal:condition="has_permission(request, 'log')"
tal:attributes="class request.matched_route.name in ['log'] and 'active'">
<a href="${home}/log">Log</a></li>
......
......@@ -103,7 +103,7 @@
else alert('Pilih Baris yang akan di koreksi');
});
$('#btn_view').click(function() {
if (mID) window.location = oTableUri + '/' + mID + '/view';
if (mID) window.location = oTableUrl + '/' + mID + '/view';
else
$.SmartMessageBox({
title : "View",
......
......@@ -7,15 +7,12 @@ from deform import (
FileData,
)
from deform.interfaces import FileUploadTempStore
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from opensipkd.tools import (
get_ext,
get_settings,
dict_to_str,
SaveFile,
)
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
# from unggah import DbUpload
......@@ -73,7 +70,7 @@ def view_file(request):
filename = request.POST['upload'].filename.lower()
ext = get_ext(filename).lower()
if ext.lower() != '.png':
if ext.lower() not in ['.png', '.ico']:
request.session.flash('File harus format png', 'error')
return dict(form=form.render())
......@@ -85,8 +82,8 @@ def view_file(request):
fname = f"background{ext}"
else:
fname = filename
folder = os.path.join(static_path, request.POST['typ'])
folder = os.path.join(static_path, request.POST['typ'])
if not os.path.exists(folder):
os.makedirs(folder)
......
from colander import SchemaNode, null, Mapping, Invalid, text_
from deform.widget import Widget, DatePartsWidget, _StrippedString
from deform.widget import Widget, _StrippedString
class DokumenWidget(Widget):
......
Pillow>=8.3.1
lxml>=4.6.3
beautifulsoup4>=4.9.3
soupsieve>=2.2.1
pip>=18.1
wheel>=0.37.0
rsa>=4.7.2
pyasn1>=0.4.8
Mako>=1.1.5
Babel>=2.9.1
Beaker>=1.11.0
Pygments>=2.10.0
MarkupSafe>=2.0.1
six>=1.16.0
Genshi>=0.7.5
pytz>=2021.1
SQLAlchemy>=1.4.23
transaction>=3.0.1
WebOb>=1.8.7
deform>=2.0.15
colander>=1.8.3
Chameleon>=3.9.1
translationstring>=1.4
peppercorn>=0.6
iso8601>=0.1.16
google>=3.0.0
cachetools>=4.2.2
certifi>=2021.5.30
urllib3>=1.26.6
requests>=2.26.0
google-api-python-client>=2.19.0
python-dateutil>=2.8.2
alembic>=1.6.5
passlib>=1.7.4
pyramid>=2.0
venusian>=3.0.0
plaster>=1.0
hupper>=1.10.3
greenlet>=1.1.1
pyparsing>=2.4.7
httplib2>=0.19.1
icecream>=2.1.1
colorama>=0.4.4
executing>=0.8.0
paginate>=0.5.6
idna>=3.2
waitress>=2.0.0
asttokens>=2.0.5
setuptools>=56.0.0
uritemplate>=3.0.1
zipp>=3.5.0
toml>=0.10.2
\ No newline at end of file
sqlalchemy
zope
pyramid
colander
deform
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!