Commit 418142c3 by aa.gusti

penambahan wilayah

1 parent 24d051da
Showing 84 changed files with 1396 additions and 361 deletions
...@@ -140,4 +140,5 @@ Nginx:: ...@@ -140,4 +140,5 @@ Nginx::
proxy_pass http://127.0.0.1:6543/; proxy_pass http://127.0.0.1:6543/;
#try_files $uri $uri/ =404; #try_files $uri $uri/ =404;
}
\ No newline at end of file \ No newline at end of file
}
...@@ -56,8 +56,8 @@ log = logging.getLogger(__name__) ...@@ -56,8 +56,8 @@ log = logging.getLogger(__name__)
# version 2.0.0 digunakan untuk change default template # version 2.0.0 digunakan untuk change default template
deform_templates = resource_filename('deform', 'templates') deform_templates = resource_filename('deform', 'templates')
path = os.path.dirname(__file__) path = os.path.dirname(__file__)
path = os.path.join(path, 'views', 'templates') path = os.path.join(path, 'views', 'widgets')
search_path = (path, deform_templates) search_path = (path, deform_templates) #,
renderer = ZPTRendererFactory(search_path) renderer = ZPTRendererFactory(search_path)
Form.set_zpt_renderer(search_path) Form.set_zpt_renderer(search_path)
main_title = 'openSIPKD' main_title = 'openSIPKD'
...@@ -385,12 +385,11 @@ def main(global_config, **settings): ...@@ -385,12 +385,11 @@ def main(global_config, **settings):
authn_policy = AuthTktAuthenticationPolicy( authn_policy = AuthTktAuthenticationPolicy(
'sosecret', callback=group_finder, hashalg='sha512') 'sosecret', callback=group_finder, hashalg='sha512')
# authn_policy = MyAuthenticationPolicy(
# 'sosecret', callback=group_finder, hashalg='sha512')
authz_policy = ACLAuthorizationPolicy() authz_policy = ACLAuthorizationPolicy()
config.set_authentication_policy(authn_policy) config.set_authentication_policy(authn_policy)
# config.set_security_policy(authz_policy)
config.set_authorization_policy(authz_policy) config.set_authorization_policy(authz_policy)
config.add_request_method(get_user, 'user', reify=True) config.add_request_method(get_user, 'user', reify=True)
...@@ -417,10 +416,9 @@ def main(global_config, **settings): ...@@ -417,10 +416,9 @@ def main(global_config, **settings):
# config.add_notfound_view(RemoveSlashNotFoundViewFactory()) # config.add_notfound_view(RemoveSlashNotFoundViewFactory())
config.add_static_view('static', 'opensipkd.base:static', cache_max_age=3600) config.add_static_view('static', 'opensipkd.base:static', cache_max_age=3600)
config.add_static_view('deform_static', 'deform:static') config.add_static_view('deform_static', 'deform:static')
config.add_static_view('files', settings['static_files']) # config.add_static_view('files', get_params('static_files'))
config.add_static_view('captcha', settings['captcha_files']) # config.add_static_view('captcha', get_params('captcha_files'))
if 'tts_files' in settings and settings['tts_files']: # config.add_static_view('tts', path=get_params('tts_files'))
config.add_static_view(name='tts', path=settings['tts_files'])
config.add_renderer('csv', 'opensipkd.tools.CSVRenderer') config.add_renderer('csv', 'opensipkd.tools.CSVRenderer')
...@@ -477,4 +475,4 @@ def main(global_config, **settings): ...@@ -477,4 +475,4 @@ def main(global_config, **settings):
for m in modules: for m in modules:
config.scan(m) config.scan(m)
return config.make_wsgi_app()
\ No newline at end of file \ No newline at end of file
return config.make_wsgi_app()
"""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 ( ...@@ -11,31 +11,26 @@ from sqlalchemy.orm import (
) )
from ..models import DBSession, Base from ..models import DBSession, Base
from ..models import (DefaultModel, from ..models import (NamaModel,
NamaModel,
TABLE_ARGS) TABLE_ARGS)
from ..models import User
class Departemen(Base, NamaModel): class Departemen(Base, NamaModel):
__tablename__ = 'departemen' __tablename__ = 'departemen'
__table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('public.departemen.id')) parent_id = Column(Integer, ForeignKey('public.departemen.id'))
kategori = Column(String(32)) kategori = Column(String(32))
alamat = Column(String(255)) alamat = Column(String(255))
singkat = Column(String(32)) singkat = Column(String(32))
level_id = Column(SmallInteger) level_id = Column(SmallInteger)
# urusan_id = Column(Integer, ForeignKey(Urusan.id)) children = relationship(
# urusan = relationship("Urusan", backref="departemens") "Departemen", backref=backref('parent', remote_side=[id]))
__table_args__ = ( # ForeignKeyConstraint(['id'], 'departemen.id', name='parent_fk'),
TABLE_ARGS)
children = relationship("Departemen",
backref=backref('parent', remote_side=[id])
)
@property def get_parents(self, start=False):
def parents(self):
allparents = [] allparents = []
if start:
allparents.append(self.nama)
p = self.parent p = self.parent
while p: while p:
allparents.append(p.nama) allparents.append(p.nama)
...@@ -43,73 +38,76 @@ class Departemen(Base, NamaModel): ...@@ -43,73 +38,76 @@ class Departemen(Base, NamaModel):
return allparents return allparents
@property @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): def uraian_all(self):
allparents = [] allparents = self.get_parents(True)
allparents.append(self.nama)
p = self.parent
while p:
allparents.append(p.nama)
p = p.parent
return '/'.join(reversed(allparents)) return '/'.join(reversed(allparents))
@classmethod @classmethod
def get_list(cls): def get_list(cls):
return DBSession.query(cls.id, cls.nama).all() return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
# class DepartemenUser(Base, DefaultModel):
class DepartemenUser(Base, DefaultModel): # __tablename__ = 'departemen_user'
__tablename__ = 'departemen_user' # user_id = Column(Integer, ForeignKey(User.id), unique=True)
user_id = Column(Integer, ForeignKey(User.id), unique=True) # departemen_id = Column(Integer, ForeignKey(Departemen.id))
departemen_id = Column(Integer, ForeignKey(Departemen.id)) # sub_departemen = Column(SmallInteger, nullable=True)
sub_departemen = Column(SmallInteger, nullable=True) # departemen = relationship("Departemen", backref="user_departemen")
departemen = relationship("Departemen", backref="user_departemen") # user = relationship("User", backref="user_departemen")
user = relationship("User", backref="user_departemen") # __table_args__ = TABLE_ARGS
__table_args__ = TABLE_ARGS #
# @classmethod
@classmethod # def query_user_id(cls, user_id):
def query_user_id(cls, user_id): # return DBSession.query(cls).filter_by(user_id=user_id)
return DBSession.query(cls).filter_by(user_id=user_id) #
# @classmethod
@classmethod # def get_kode(cls, user_id):
def get_kode(cls, user_id): # row = cls.query_user_id(user_id).first()
row = cls.query_user_id(user_id).first() # return row and row.departemen.kode or None
return row and row.departemen.kode or None #
# @classmethod
@classmethod # def ids(cls, user_id):
def ids(cls, user_id): # r = ()
r = () # departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode # ).join(Departemen).filter(cls.departemen_id == Departemen.id,
).join(Departemen).filter(cls.departemen_id == Departemen.id, # cls.user_id == user_id).all()
cls.user_id == user_id).all() # for departemen in departemens:
for departemen in departemens: # if departemen.sub_departemen:
if departemen.sub_departemen: # rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all() # else:
else: # rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all() # for i in range(len(rows)):
for i in range(len(rows)): # r = r + (rows[i])
r = r + (rows[i]) # return r
return r #
# @classmethod
@classmethod # def departemen_granted(cls, user_id, departemen_id):
def departemen_granted(cls, user_id, departemen_id): # departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode # ).join(Departemen).filter(cls.departemen_id == Departemen.id,
).join(Departemen).filter(cls.departemen_id == Departemen.id, # cls.user_id == user_id).all()
cls.user_id == user_id).all() # for departemen in departemens:
for departemen in departemens: # if departemen.sub_departemen:
if departemen.sub_departemen: # rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all() # else:
else: # rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all() # for i in range(len(rows)):
for i in range(len(rows)): # if int(rows[i][0]) == int(departemen_id):
if int(rows[i][0]) == int(departemen_id): # return True
return True # return False
return False #
# @classmethod
@classmethod # def get_filtered(cls, request):
def get_filtered(cls, request): # filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd']
filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd'] # q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \
q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \ # filter(UserDepartemen.user_id == request.user.id,
filter(UserDepartemen.user_id == request.user.id, # UserDepartemen.departemen_id == Departemen.id,
UserDepartemen.departemen_id == Departemen.id, # text(filter))
text(filter)) # return q1.first()
return q1.first()
from sqlalchemy import ( from sqlalchemy import (
Column, Column,
Integer, Integer,
ForeignKey,
UniqueConstraint,
String, String,
SmallInteger, SmallInteger,
DateTime DateTime
) )
from . import DefaultModel from opensipkd.base.models.common import NamaModel
from sqlalchemy.orm import ( from ..models import (Base)
relationship,
backref
)
from ..models import (Base, TABLE_ARGS)
from ..models import (NamaModel, User, Departemen)
class PartnerModel(NamaModel): class PartnerModel(NamaModel):
status = Column(Integer, default=1) # 0 Inaktif - 1 Aktif status = Column(Integer, default=1)
# no_urut = Column(Integer)
alamat_1 = Column(String(128)) alamat_1 = Column(String(128))
alamat_2 = Column(String(128)) alamat_2 = Column(String(128))
email = Column(String(40)) email = Column(String(40))
...@@ -28,10 +19,10 @@ class PartnerModel(NamaModel): ...@@ -28,10 +19,10 @@ class PartnerModel(NamaModel):
fax = Column(String(16)) fax = Column(String(16))
mobile = Column(String(16)) mobile = Column(String(16))
website = Column(String(64)) website = Column(String(64))
pic = Column(String(16)) # pic = Column(String(16))
pic_mobile = Column(String(16)) # pic_mobile = Column(String(16))
pic_email = Column(String(16)) # pic_email = Column(String(16))
pic_jabatan = Column(String(16)) # pic_jabatan = Column(String(16))
@classmethod @classmethod
def query_email(cls, email): def query_email(cls, email):
...@@ -50,14 +41,15 @@ class Partner(Base, PartnerModel): ...@@ -50,14 +41,15 @@ class Partner(Base, PartnerModel):
provinsi = Column(String(128)) provinsi = Column(String(128))
is_vendor = Column(SmallInteger, nullable=False, ) is_vendor = Column(SmallInteger, nullable=False, )
is_customer = Column(SmallInteger, nullable=False, ) is_customer = Column(SmallInteger, nullable=False, )
bank = Column(String(16)) # bank = Column(String(16))
bank_accnt = Column(String(16)) # bank_accnt = Column(String(16))
user_id = Column(Integer, ForeignKey(User.id), nullable=True) # referensi ke login # user_id = Column(Integer, ForeignKey(User.id), nullable=True) # referensi ke login
departemen_id = Column(Integer, ForeignKey(Departemen.id)) # referensi ke default skpd # departemen_id = Column(Integer, ForeignKey(Departemen.id)) # referensi ke default skpd
users = relationship("User", backref=backref('partner')) # users = relationship("User", backref=backref('partner'))
departemen = relationship('Departemen', backref=backref('partner')) # departemen = relationship('Departemen', backref=backref('partner'))
rt = Column(String(3)) rt = Column(String(3))
rw = Column(String(3)) rw = Column(String(3))
tempat_lahir = Column(String(128)) tempat_lahir = Column(String(128))
tgl_lahir = Column(DateTime(timezone=False)) tgl_lahir = Column(DateTime(timezone=False))
jenis_kelamin = Column(String(1)) jenis_kelamin = Column(String(1))
...@@ -68,14 +60,14 @@ class Partner(Base, PartnerModel): ...@@ -68,14 +60,14 @@ class Partner(Base, PartnerModel):
kewarganegaraan = Column(String(10)) kewarganegaraan = Column(String(10))
# npwp = Column(String(16)) # npwp = Column(String(16))
# npwpd = Column(String(16)) # npwpd = Column(String(16))
#
@classmethod # @classmethod
def query_user_id(cls, user_id): # def query_user_id(cls, user_id):
return cls.query().filter_by(user_id=user_id) # return cls.query().filter_by(user_id=user_id)
#
@classmethod # @classmethod
def query_user(cls, user): # def query_user(cls, user):
return cls.query_user_id(user.id) # return cls.query_user_id(user.id)
@classmethod @classmethod
def query_identity(cls, ident): def query_identity(cls, ident):
...@@ -86,7 +78,7 @@ class Partner(Base, PartnerModel): ...@@ -86,7 +78,7 @@ class Partner(Base, PartnerModel):
row = cls.query().filter_by(mobile=ident).first() row = cls.query().filter_by(mobile=ident).first()
return row 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 \ 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): ...@@ -56,15 +56,15 @@ class PartnerDepartemen(Base, DefaultModel):
__tablename__ = 'partner_departemen' __tablename__ = 'partner_departemen'
partner_id = Column(Integer, ForeignKey(Partner.id)) partner_id = Column(Integer, ForeignKey(Partner.id))
departemen_id = Column(Integer, ForeignKey(Departemen.id)) departemen_id = Column(Integer, ForeignKey(Departemen.id))
jabatan_id = Column(Integer, ForeignKey(Jabatan.id)) # fungsional_id = Column(Integer, ForeignKey(Jabatan.id))
struktural_id = Column(SmallInteger, ForeignKey(Jabatan.id)) jabatan_id = Column(SmallInteger, ForeignKey(Jabatan.id))
mulai = Column(DateTime(timezone=False)) mulai = Column(DateTime(timezone=False))
selesai = Column(DateTime(timezone=False)) selesai = Column(DateTime(timezone=False))
partner = relationship(Partner, backref=backref("partner_departemen")) partner = relationship(Partner, backref=backref("partner_departemen"))
departemen = relationship(Departemen, foreign_keys=[departemen_id], 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"), ) # fungsional = relationship(Jabatan, foreign_keys=[fungsional_id], backref=backref("partner_funsional"), )
struktural = relationship(Jabatan, foreign_keys=[struktural_id], backref=backref("partner_struktural", )) jabatan = relationship(Jabatan, foreign_keys=[jabatan_id], backref=backref("partner_jabatan", ))
__table_args__ = (UniqueConstraint('partner_id', 'departemen_id', 'jabatan_id', __table_args__ = (UniqueConstraint('partner_id', 'departemen_id', 'jabatan_id',
'mulai', name='partner_dept_uq'), 'mulai', name='partner_dept_uq'),
TABLE_ARGS) TABLE_ARGS)
...@@ -99,14 +99,14 @@ class PartnerDepartemen(Base, DefaultModel): ...@@ -99,14 +99,14 @@ class PartnerDepartemen(Base, DefaultModel):
# cls.tmt <= tmt) # cls.tmt <= tmt)
# #
class PartnerLogin(Base): # class PartnerLogin(Base):
__tablename__ = 'partner_login' # __tablename__ = 'partner_login'
partner_id = Column(Integer, ForeignKey(Partner.id), unique=True) # partner_id = Column(Integer, ForeignKey(Partner.id), unique=True)
user_id = Column(Integer, ForeignKey(User.id), primary_key=True, ) # , # user_id = Column(Integer, ForeignKey(User.id), primary_key=True, ) # ,
partner = relationship(Partner, backref=backref('partner_login')) # partner = relationship(Partner, backref=backref('partner_login'))
users = relationship(User, backref=backref('partner_login')) # users = relationship(User, backref=backref('partner_login'))
__table_args__ = TABLE_ARGS # __table_args__ = TABLE_ARGS
#
@classmethod # @classmethod
def query_user(cls, user_id): # def query_user(cls, user_id):
return DBSession.query(cls).filter_by(user_id=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))
...@@ -130,4 +130,33 @@ partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report ...@@ -130,4 +130,33 @@ partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report
log,/log,Log Aplikasi log,/log,Log Aplikasi
log-act,/log/{act}/act,Log Aplikasi Act log-act,/log/{act}/act,Log Aplikasi Act
log-view,/log/{id}/view,Log Aplikasi View
\ No newline at end of file \ No newline at end of file
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 ...@@ -10,8 +10,9 @@ from ziggurat_foundations.models.services.user import UserService
from pyramid.paster import (get_appsettings, setup_logging, ) from pyramid.paster import (get_appsettings, setup_logging, )
from ..models.handlers import LogDBSession from ..models.handlers import LogDBSession
from ..models import (init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission, User, Route, Eselon, from ..models import (
Jabatan) init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission,
User, Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from sqlalchemy.dialects import oracle from sqlalchemy.dialects import oracle
from sqlalchemy import text from sqlalchemy import text
......
...@@ -182,7 +182,7 @@ class BaseView(object): ...@@ -182,7 +182,7 @@ class BaseView(object):
DBSession.flush() DBSession.flush()
return row return row
def save_request(self, values, row): def save_request(self, values, row=None):
return self.save(values, self.req.user, row) return self.save(values, self.req.user, row)
def id_not_found(self): 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 ...@@ -7,7 +7,7 @@ from datetime import datetime
import colander import colander
from deform import (Form, widget, ValidationFailure, ) from deform import (Form, widget, ValidationFailure, )
from deform.widget import AutocompleteInputWidget from deform.widget import AutocompleteInputWidget
from opensipkd.base.models import DepartemenUser # from opensipkd.base.models import DepartemenUser
from pyramid.httpexceptions import (HTTPFound, ) from pyramid.httpexceptions import (HTTPFound, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from sqlalchemy import func from sqlalchemy import func
...@@ -16,7 +16,8 @@ from opensipkd.tools import (get_ext, get_random_string, get_settings) ...@@ -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 opensipkd.tools.buttons import btn_cancel, btn_save, btn_delete, btn_close
from .upload import AddSchema as UploadSchema 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 from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah departemen gagal' SESS_ADD_FAILED = 'Tambah departemen gagal'
...@@ -304,10 +305,10 @@ class ViewDepartemen(BaseView): ...@@ -304,10 +305,10 @@ class ViewDepartemen(BaseView):
return r return r
elif url_dict['act'] == 'hon_level': elif url_dict['act'] == 'hon_level':
# todo Check ulang untuk hon
term = 'term' in params and params['term'] or '' term = 'term' in params and params['term'] or ''
settings = get_settings() settings = get_settings()
level_id = 'departemen_chg_id' in settings and settings[ level_id = self.req.get_params('departemen_chg_id', 0)
'departemen_chg_id'] or 0
q = DBSession.query(Departemen).filter(Departemen.status == 1, q = DBSession.query(Departemen).filter(Departemen.status == 1,
Departemen.nama.ilike( Departemen.nama.ilike(
'%%%s%%' % '%%%s%%' %
...@@ -317,7 +318,10 @@ class ViewDepartemen(BaseView): ...@@ -317,7 +318,10 @@ class ViewDepartemen(BaseView):
q = q.filter(Departemen.level_id == int(level_id)) q = q.filter(Departemen.level_id == int(level_id))
if request.user.id > 1 and not request.has_permission( if request.user.id > 1 and not request.has_permission(
"departemen-all"): "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: if not user_dep:
return [] 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): ...@@ -164,10 +164,27 @@ class view_eselon(BaseView):
form.render(appstruct=values) form.render(appstruct=values)
return dict(form=form) 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 # # 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') permission='eselon')
def view_del(self): def view_del(self):
request = self.req request = self.req
...@@ -177,7 +194,7 @@ class view_eselon(BaseView): ...@@ -177,7 +194,7 @@ class view_eselon(BaseView):
if not row: if not row:
return id_not_found(request) return id_not_found(request)
form = Form(colander.Schema(), buttons=('hapus', 'batal')) form = Form(EditSchema(), buttons=('hapus', 'batal'))
if request.POST: if request.POST:
if 'hapus' in request.POST: if 'hapus' in request.POST:
msg = 'eselon ID %d %s sudah dihapus.' % (row.id, row.nama) msg = 'eselon ID %d %s sudah dihapus.' % (row.id, row.nama)
...@@ -185,7 +202,8 @@ class view_eselon(BaseView): ...@@ -185,7 +202,8 @@ class view_eselon(BaseView):
DBSession.flush() DBSession.flush()
request.session.flash(msg) request.session.flash(msg)
return route_list(request) 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): ...@@ -170,7 +170,8 @@ class ViewJabatan(BaseView):
r.append(d) r.append(d)
return r 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') permission='jabatan')
def view_add(self): def view_add(self):
request = self.req request = self.req
...@@ -188,7 +189,8 @@ class ViewJabatan(BaseView): ...@@ -188,7 +189,8 @@ class ViewJabatan(BaseView):
return dict(form=form.render(), scripts="") return dict(form=form.render(), scripts="")
# return dict(form=form.render()) # 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') permission='jabatan')
def view_edt(self): def view_edt(self):
request = self.req 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): ...@@ -38,6 +38,7 @@ class AddSchema(colander.Schema):
value = colander.SchemaNode( value = colander.SchemaNode(
colander.String(), colander.String(),
widget=widget.TextAreaWidget(rows=5),
oid="value", oid="value",
title="Nilai") title="Nilai")
......
...@@ -7,6 +7,7 @@ from deform import ( ...@@ -7,6 +7,7 @@ from deform import (
widget, widget,
ValidationFailure, ValidationFailure,
) )
from opensipkd.base.models import User
from pyramid.httpexceptions import ( from pyramid.httpexceptions import (
HTTPFound, HTTPFound,
) )
...@@ -17,7 +18,7 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_delete ...@@ -17,7 +18,7 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_delete
from ..models import DBSession from ..models import DBSession
from ..models import Partner from ..models import Partner
from ..models.partner import PartnerUserModel # from ..models.partner import PartnerUserModel
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah partner gagal' SESS_ADD_FAILED = 'Tambah partner gagal'
...@@ -159,12 +160,17 @@ class ViewPartner(BaseView): ...@@ -159,12 +160,17 @@ class ViewPartner(BaseView):
Partner.kode, Partner.nama). \ Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \ filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama) order_by(Partner.nama)
keys = q.first().keys() row = q.first()
r = [] if not row:
for k in q.all(): return []
d = dict(zip(keys, k))
r.append(d) keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()]
# for k in q.all():
# d = )
# r.append(d)
return r return r
elif url_dict['act'] == 'vendor': # vendor only elif url_dict['act'] == 'vendor': # vendor only
term = 'term' in params and params['term'] or '' term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or '' prefix = 'prefix' in params and params['prefix'] or ''
...@@ -267,10 +273,11 @@ class ViewPartner(BaseView): ...@@ -267,10 +273,11 @@ class ViewPartner(BaseView):
form = get_form(request, EditSchema, buttons=(btn_delete, btn_cancel,)) form = get_form(request, EditSchema, buttons=(btn_delete, btn_cancel,))
if request.POST: if request.POST:
if 'delete' in request.POST: if 'delete' in request.POST:
partner_user = DBSession.query(PartnerUserModel). \ user = User.query(). \
filter_by(partner_id=request.matchdict['id']) filter_by(partner_id=request.matchdict['id'])
if partner_user.first(): if user.first():
partner_user.delete() request.session.flash('Partner digunakan oleh User')
return route_list(request)
msg = 'Partner ID %d %s sudah dihapus.' % (row.id, row.nama) msg = 'Partner ID %d %s sudah dihapus.' % (row.id, row.nama)
q.delete() q.delete()
DBSession.flush() DBSession.flush()
......
...@@ -231,7 +231,7 @@ class ViewPartner(BaseView): ...@@ -231,7 +231,7 @@ class ViewPartner(BaseView):
values['selesai'] = None values['selesai'] = None
query_struktural = DBSession.query(Jabatan.jenis). \ query_struktural = DBSession.query(Jabatan.jenis). \
filter(Jabatan.id == values['jabatan_id']).scalar() filter(Jabatan.id == values['jabatan_id']).scalar()
values['struktural_id'] = query_struktural values['jabatan_id'] = query_struktural
row = self.save(values, request.user, row) row = self.save(values, request.user, row)
request.session.flash('Posisi Partner sudah disimpan.') request.session.flash('Posisi Partner sudah disimpan.')
...@@ -286,7 +286,7 @@ class ViewPartner(BaseView): ...@@ -286,7 +286,7 @@ class ViewPartner(BaseView):
.outerjoin(Departemen, PartnerDepartemen.departemen_id == Departemen.id) \ .outerjoin(Departemen, PartnerDepartemen.departemen_id == Departemen.id) \
.outerjoin(Partner, Partner.id == PartnerDepartemen.partner_id) \ .outerjoin(Partner, Partner.id == PartnerDepartemen.partner_id) \
.outerjoin(Jabatan, (PartnerDepartemen.jabatan_id == Jabatan.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) .order_by(Partner.nama)
row_table = DataTables(request.GET, query, columns) row_table = DataTables(request.GET, query, columns)
...@@ -398,10 +398,10 @@ class ViewPartner(BaseView): ...@@ -398,10 +398,10 @@ class ViewPartner(BaseView):
values['departemen'] = row.departemen.nama values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai) values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai) values['selesai'] = dmy(row.selesai)
if not row.struktural_id: if not row.jabatan_id:
values['struktural_id'] = 0 values['jabatan_id'] = 0
else: else:
jb = Jabatan.query_id(row.struktural_id).first() jb = Jabatan.query_id(row.jabatan_id).first()
if jb: if jb:
values['struktural_nm'] = jb.nama values['struktural_nm'] = jb.nama
...@@ -463,10 +463,10 @@ class ViewPartner(BaseView): ...@@ -463,10 +463,10 @@ class ViewPartner(BaseView):
values['departemen'] = row.departemen.nama values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai) values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai) values['selesai'] = dmy(row.selesai)
if not row.struktural_id: if not row.jabatan_id:
values['struktural_id'] = 0 values['jabatan_id'] = 0
else: else:
jb = Jabatan.query_id(row.struktural_id).first() jb = Jabatan.query_id(row.jabatan_id).first()
if jb: if jb:
values['struktural_nm'] = jb.nama values['struktural_nm'] = jb.nama
...@@ -508,10 +508,10 @@ class ViewPartner(BaseView): ...@@ -508,10 +508,10 @@ class ViewPartner(BaseView):
values['departemen'] = row.departemen.nama values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai) values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai) values['selesai'] = dmy(row.selesai)
if not row.struktural_id: if not row.jabatan_id:
values['struktural_id'] = 0 values['jabatan_id'] = 0
else: else:
jb = Jabatan.query_id(row.struktural_id).first() jb = Jabatan.query_id(row.jabatan_id).first()
if jb: if jb:
values['struktural_nm'] = jb.nama values['struktural_nm'] = jb.nama
form.set_appstruct(self.get_values(row, values)) 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 @@ ...@@ -6,11 +6,15 @@
group_path ['group', 'group-add', 'group-edit', 'group-view', 'group-delete']; group_path ['group', 'group-add', 'group-edit', 'group-view', 'group-delete'];
param_path ['parameter', 'parameter-add', 'parameter-edit', 'parameter-view', 'parameter-delete']; param_path ['parameter', 'parameter-add', 'parameter-edit', 'parameter-view', 'parameter-delete'];
dep_path ['departemen', 'departemen-add', 'departemen-edit', 'departemen-view', 'departemen-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', part_dep_path ['partner-departemen', 'partner-departemen-add', 'partner-departemen-edit', 'partner-departemen-view',
'partner-departemen-delete']; 'partner-departemen-delete'];
jabatan_path ['jabatan', 'jabatan-add', 'jabatan-edit', 'jabatan-view', jabatan_path ['jabatan', 'jabatan-add', 'jabatan-edit', 'jabatan-view', 'jabatan-delete'];
'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> <head>
...@@ -189,23 +193,28 @@ ...@@ -189,23 +193,28 @@
tal:attributes="class request.matched_route.name in group_path and 'active'"> tal:attributes="class request.matched_route.name in group_path and 'active'">
<a href="${home}/group">Group</a> <a href="${home}/group">Group</a>
</li> </li>
<li tal:condition="has_permission(request, 'user-group')" <!-- <li tal:condition="has_permission(request, 'user-group')"-->
tal:attributes="class request.matched_route.name in ['user-group'] and 'active'"> <!-- tal:attributes="class request.matched_route.name in ['user-group'] and 'active'">-->
<a href="${home}/user/group">User <!-- <a href="${home}/user/group">User Group</a></li>-->
Group</a></li>
<li tal:condition="has_permission(request, 'upload-logo')" <li tal:condition="has_permission(request, 'upload-logo')"
tal:attributes="class request.matched_route.name in ['upload-logo'] and 'active'"> tal:attributes="class request.matched_route.name in ['upload-logo'] and 'active'">
<a href="${home}/upload/logo">Upload <a href="${home}/upload/logo">Upload Logo</a></li>
Logo</a></li>
<li tal:condition="has_permission(request, 'parameter')" <li tal:condition="has_permission(request, 'parameter')"
tal:attributes="class request.matched_route.name in param_path and 'active'"> tal:attributes="class request.matched_route.name in param_path and 'active'">
<a href="${home}/parameter">Parameter</a></li> <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')" <li tal:condition="has_permission(request, 'departemen')"
tal:attributes="class request.matched_route.name in dep_path and 'active'"> tal:attributes="class request.matched_route.name in dep_path and 'active'">
<a href="${home}/departemen">Departemen</a></li> <a href="${home}/departemen">Departemen</a></li>
<li tal:condition="has_permission(request, 'departemen-user')" <!-- <li tal:condition="has_permission(request, 'departemen-user')"-->
tal:attributes="class request.matched_route.name in ['departemen-user'] and 'active'"> <!-- tal:attributes="class request.matched_route.name in ['departemen-user'] and 'active'">-->
<a href="${home}/departemen/user">User Departemen</a></li> <!-- <a href="${home}/departemen/user">User Departemen</a></li>-->
<li tal:condition="has_permission(request, 'partner')" <li tal:condition="has_permission(request, 'partner')"
tal:attributes="class request.matched_route.name in partner_path and 'active'"> tal:attributes="class request.matched_route.name in partner_path and 'active'">
...@@ -213,12 +222,19 @@ ...@@ -213,12 +222,19 @@
<li tal:condition="has_permission(request, 'partner-departemen')" <li tal:condition="has_permission(request, 'partner-departemen')"
tal:attributes="class request.matched_route.name in part_dep_path and 'active'"> tal:attributes="class request.matched_route.name in part_dep_path and 'active'">
<a href="${home}/partner/departemen">Partner Departemen</a></li> <a href="${home}/partner/departemen">Partner Departemen</a></li>
<!-- <li tal:condition="has_permission(request, 'eselon')"--> <li tal:condition="has_permission(request, 'provinsi')"
<!-- tal:attributes="class request.path == '/eselon' and 'active'">--> tal:attributes="class request.matched_route.name in provinsi_path and 'active'">
<!-- <a href="${home}/eselon">Eselon</a></li>--> <a href="${home}/provinsi">Provinsi</a></li>
<li tal:condition="has_permission(request, 'jabatan')" <li tal:condition="has_permission(request, 'dati2')"
tal:attributes="class request.matched_route.name in jabatan_path and 'active'"> tal:attributes="class request.matched_route.name in dati2_path and 'active'">
<a href="${home}/jabatan">Jabatan</a></li> <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')" <li tal:condition="has_permission(request, 'log')"
tal:attributes="class request.matched_route.name in ['log'] and 'active'"> tal:attributes="class request.matched_route.name in ['log'] and 'active'">
<a href="${home}/log">Log</a></li> <a href="${home}/log">Log</a></li>
......
...@@ -103,7 +103,7 @@ ...@@ -103,7 +103,7 @@
else alert('Pilih Baris yang akan di koreksi'); else alert('Pilih Baris yang akan di koreksi');
}); });
$('#btn_view').click(function() { $('#btn_view').click(function() {
if (mID) window.location = oTableUri + '/' + mID + '/view'; if (mID) window.location = oTableUrl + '/' + mID + '/view';
else else
$.SmartMessageBox({ $.SmartMessageBox({
title : "View", title : "View",
......
...@@ -7,15 +7,12 @@ from deform import ( ...@@ -7,15 +7,12 @@ from deform import (
FileData, FileData,
) )
from deform.interfaces import FileUploadTempStore from deform.interfaces import FileUploadTempStore
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
from opensipkd.tools import ( from opensipkd.tools import (
get_ext, get_ext,
get_settings,
dict_to_str, dict_to_str,
SaveFile,
) )
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config
# from unggah import DbUpload # from unggah import DbUpload
...@@ -73,7 +70,7 @@ def view_file(request): ...@@ -73,7 +70,7 @@ def view_file(request):
filename = request.POST['upload'].filename.lower() filename = request.POST['upload'].filename.lower()
ext = get_ext(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') request.session.flash('File harus format png', 'error')
return dict(form=form.render()) return dict(form=form.render())
...@@ -85,8 +82,8 @@ def view_file(request): ...@@ -85,8 +82,8 @@ def view_file(request):
fname = f"background{ext}" fname = f"background{ext}"
else: else:
fname = filename 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): if not os.path.exists(folder):
os.makedirs(folder) os.makedirs(folder)
......
from colander import SchemaNode, null, Mapping, Invalid, text_ from colander import SchemaNode, null, Mapping, Invalid, text_
from deform.widget import Widget, DatePartsWidget, _StrippedString from deform.widget import Widget, _StrippedString
class DokumenWidget(Widget): 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 \ No newline at end of file
sqlalchemy
zope
pyramid
colander
deform
\ No newline at end of file \ 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!