tobe-test

1 parent 9fa85a52
...@@ -16,13 +16,12 @@ pyramid.debug_templates = true ...@@ -16,13 +16,12 @@ pyramid.debug_templates = true
default_locale_name = id default_locale_name = id
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2 sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
session.url = postgresql://aagusti:a@localhost:5432/demo2 session.url = postgresql://aagusti:a@localhost:5432/demo2
pyramid.includes = pyramid.includes =
pyramid_tm pyramid_tm
pyramid_beaker pyramid_beaker
pyramid_chameleon pyramid_chameleon
pyramid_debugtoolbar
pyramid_rpc.jsonrpc pyramid_rpc.jsonrpc
pyramid_debugtoolbar
session.type = ext:database session.type = ext:database
...@@ -73,7 +72,7 @@ login_captcha = 1 ...@@ -73,7 +72,7 @@ login_captcha = 1
; ;
;modules = ;modules =
menus = login:Login menus = login:Login
; pjdl:PJDL register:PJDL
; bphtb:BPHTB ; bphtb:BPHTB
; five:Five ; five:Five
;app_name = GAJI ASN ;app_name = GAJI ASN
...@@ -117,20 +116,19 @@ port = 6543 ...@@ -117,20 +116,19 @@ port = 6543
keys = root, opensipkd, sqlalchemy keys = root, opensipkd, sqlalchemy
[handlers] [handlers]
keys = console keys = console, filelog
#, filelog, tabel #, tabel
[formatters] [formatters]
keys = generic keys = generic
[logger_root] [logger_root]
level = WARN level = WARN
handlers = console handlers =
#, filelog, tabel #, tabel
[logger_opensipkd] [logger_opensipkd]
level = DEBUG level = DEBUG
handlers = handlers =console, filelog
qualname = opensipkd qualname = opensipkd
[logger_sqlalchemy] [logger_sqlalchemy]
...@@ -143,8 +141,9 @@ qualname = sqlalchemy.engine ...@@ -143,8 +141,9 @@ qualname = sqlalchemy.engine
[handler_filelog] [handler_filelog]
class = FileHandler class = FileHandler
args = ('log_file_location','a') ; args = ('log_file','a')
level = INFO args = ('/tmp/logs/opensipkd.log','a')
level = DEBUG
formatter = generic formatter = generic
......
...@@ -15,16 +15,14 @@ pyramid.debug_routematch = true ...@@ -15,16 +15,14 @@ pyramid.debug_routematch = true
pyramid.debug_templates = true pyramid.debug_templates = true
default_locale_name = id default_locale_name = id
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2 sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
session.url = postgresql://aagusti:a@localhost:5433/demo2 session.url = postgresql://aagusti:a@localhost:5432/demo2
temp_dir = C:\tmp
allow_register = true
pyramid.includes = pyramid.includes =
pyramid_tm pyramid_tm
pyramid_beaker pyramid_beaker
pyramid_chameleon pyramid_chameleon
pyramid_debugtoolbar
pyramid_rpc.jsonrpc pyramid_rpc.jsonrpc
pyramid_debugtoolbar
session.type = ext:database session.type = ext:database
session.secret = s0s3cr3ts session.secret = s0s3cr3ts
...@@ -37,6 +35,20 @@ timezone = Asia/Jakarta ...@@ -37,6 +35,20 @@ timezone = Asia/Jakarta
#localization = Indonesian_indonesia.1252 #localization = Indonesian_indonesia.1252
localization = English_Australia.1252 localization = English_Australia.1252
# Base Configuration
temp_files = C:\tmp
partner_doc = C:\\tmp\\docs\\partner\\
# Registrasi User
allow_register = 1
reg_form =
reg_idcard = 1
reg_captcha = 1
reg_verify = 1
;reg_form =
login_tpl =
login_captcha = 1
;login_tpl = opensipkd.samsat.jabar.views:templates/login.pt ;login_tpl = opensipkd.samsat.jabar.views:templates/login.pt
;static_files = %(here)s/../files ;static_files = %(here)s/../files
...@@ -60,7 +72,7 @@ localization = English_Australia.1252 ...@@ -60,7 +72,7 @@ localization = English_Australia.1252
; ;
;modules = ;modules =
menus = login:Login menus = login:Login
; pjdl:PJDL register:PJDL
; bphtb:BPHTB ; bphtb:BPHTB
; five:Five ; five:Five
;app_name = GAJI ASN ;app_name = GAJI ASN
...@@ -68,13 +80,7 @@ menus = login:Login ...@@ -68,13 +80,7 @@ menus = login:Login
;change_unit = False ;change_unit = False
;departemen_chg_id = 3 ;departemen_chg_id = 3
# Registrasi User
;captcha_files = /tmp/captcha
;reg_captcha = 0
;reg_idcard = 1
;reg_verify = 1
;reg_form =
;login_tpl =
# digunakan jika akan menggunakan form registrasi sendiri # digunakan jika akan menggunakan form registrasi sendiri
...@@ -110,20 +116,19 @@ port = 6543 ...@@ -110,20 +116,19 @@ port = 6543
keys = root, opensipkd, sqlalchemy keys = root, opensipkd, sqlalchemy
[handlers] [handlers]
keys = console keys = console, filelog
#, filelog, tabel #, tabel
[formatters] [formatters]
keys = generic keys = generic
[logger_root] [logger_root]
level = WARN level = WARN
handlers = console handlers =
#, filelog, tabel #, tabel
[logger_opensipkd] [logger_opensipkd]
level = DEBUG level = DEBUG
handlers = handlers =console, filelog
qualname = opensipkd qualname = opensipkd
[logger_sqlalchemy] [logger_sqlalchemy]
...@@ -136,8 +141,9 @@ qualname = sqlalchemy.engine ...@@ -136,8 +141,9 @@ qualname = sqlalchemy.engine
[handler_filelog] [handler_filelog]
class = FileHandler class = FileHandler
args = ('log_file_location','a') ; args = ('log_file','a')
level = INFO args = ('/tmp/logs/opensipkd.log','a')
level = DEBUG
formatter = generic formatter = generic
...@@ -163,7 +169,7 @@ script_location = ziggurat_foundations:migrations ...@@ -163,7 +169,7 @@ script_location = ziggurat_foundations:migrations
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2 sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
[alembic_base] [alembic_base]
script_location = opensipkd.base:alembic script_location = opensipkd.base.scripts:alembic
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2 sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
[pytest] [pytest]
......
...@@ -397,6 +397,7 @@ class BaseApp(): ...@@ -397,6 +397,7 @@ class BaseApp():
self.reg_form = "" self.reg_form = ""
self.reg_captcha = "" self.reg_captcha = ""
self.captcha_files = "" self.captcha_files = ""
self.login_captcha = 0
def static_view(self, config, settings=None): def static_view(self, config, settings=None):
self.partner_doc = get_params( self.partner_doc = get_params(
...@@ -421,10 +422,12 @@ class BaseApp(): ...@@ -421,10 +422,12 @@ class BaseApp():
self.captcha_files = os.path.join(self.temp_files, "captcha")+os.sep self.captcha_files = os.path.join(self.temp_files, "captcha")+os.sep
if not os.path.exists(self.captcha_files): if not os.path.exists(self.captcha_files):
os.makedirs(self.captcha_files) os.makedirs(self.captcha_files)
config.add_static_view( config.add_static_view(
'captcha', self.captcha_files, cache_max_age=0) 'captcha', self.captcha_files, cache_max_age=0)
self.login_tpl = get_params("login_tpl", "", settings=settings)
self.login_captcha = get_params("login_captcha", 0, settings=settings)
def add_menu(self, config, route_menus, parent=None, paket="opensipkd.base.views"): def add_menu(self, config, route_menus, parent=None, paket="opensipkd.base.views"):
route_names = [] route_names = []
...@@ -523,6 +526,7 @@ class BaseApp(): ...@@ -523,6 +526,7 @@ class BaseApp():
self.add_menu(config, new_routes, paket) self.add_menu(config, new_routes, paket)
def get_menus(self): def get_menus(self):
_logging.debug(f"Menus: {self.menus}")
return self.menus return self.menus
...@@ -543,6 +547,8 @@ def has_permission_(request, perm_names, context=None): ...@@ -543,6 +547,8 @@ def has_permission_(request, perm_names, context=None):
@subscriber(BeforeRender) @subscriber(BeforeRender)
def add_global(event): def add_global(event):
event['has_permission'] = has_permission_ event['has_permission'] = has_permission_
event['get_base_menus'] = BASE_CLASS.get_menus
# event['has_modules'] = has_modules_ # event['has_modules'] = has_modules_
# event['urlencode'] = urlencode # event['urlencode'] = urlencode
# event['quote_plus'] = quote_plus # event['quote_plus'] = quote_plus
......
...@@ -110,7 +110,7 @@ class DefaultModel(CommonModel): ...@@ -110,7 +110,7 @@ class DefaultModel(CommonModel):
return query return query
@classmethod @classmethod
def query_from(cls, db_session=DBSession, columns=None, filters=None): def query_from(cls, db_session=DBSession, columns=[], filters=None):
query = db_session.query().select_from(cls) query = db_session.query().select_from(cls)
for c in columns: for c in columns:
query = query.add_columns(c) query = query.add_columns(c)
......
...@@ -97,6 +97,13 @@ class Partner(Base, PartnerModel): ...@@ -97,6 +97,13 @@ class Partner(Base, PartnerModel):
row = cls.query().filter_by(mobile=ident).first() row = cls.query().filter_by(mobile=ident).first()
return row return row
@classmethod
def query_register(cls):
columns= [cls.kode, cls.nama, cls.mobile, cls.email, cls.status]
return cls.query_from(columns=columns)
class PartnerFiles(Base, StandarModel): class PartnerFiles(Base, StandarModel):
__tablename__ = 'partner_files' __tablename__ = 'partner_files'
......
kode,path,module,file_name,class_name,func_name,order_id,permission,parent_id/routes.kode,nama,status,type,app_id,is_menu,template,csrf, kode,path,module,file_name,class_name,func_name,order_id,permission,parent_id/routes.kode,nama,status,type,app_id,is_menu,template,csrf,
base-home,/,base,__init__,Home,view_home,1,,,Home,1,0,,1,home.pt,, base-home,/,base,__init__,Home,view_home,1,,,Home,1,0,,1,home.pt,,
base-login,/login,base,user_login,ViewLogin,view_login,1,,,Login,1,0,,1,,1, base-login,/login,base,user_login,ViewAuth,view_login,1,,,Login,1,0,,0,form6.pt,1,
base-logout,/logout,base,user_login,ViewLogout,view_logout,1,,,Logout,1,0,,1,logout.pt,, base-logout,/logout,base,user_login,ViewAuth,view_logout,1,,,Logout,1,0,,0,logout.pt,,
base-admin,,base,,,,,,,,,,,1,,, base-password-reset,/password/reset,base,user_login,ViewPassword,reset_password,,,,Reset Password,1,0,,0,form6.pt,,
base-password,/password,base,user_login,ViewPassword,change_password,1,view,,Change Password,1,0,,0,form8.pt,,
base-password-request,/password/{code}/request,base,user_login,ViewPassword,change_password_request,1,,,Change Password,1,0,,0,form8.pt,,
base-profile,/profile,base,register,,view_profile,,,,Profile,1,0,,0,form.pt,,
base-register,/register,base,register,,view_register,,,,Register,1,0,,0,form.pt,, base-register,/register,base,register,,view_register,,,,Register,1,0,,0,form.pt,,
base-user,/user,base,user,,view_list,,user-view,,User List,1,0,,1,form.pt,, base-recreate-api-key,/recreate-api-key,base,register,ViewPassword,recreate-api-key,,,,Get Api Key,1,0,,0,recreate-api-key.pt,,
base-user-act,/user/{act}/act,base,user,,,,user-view,,User Action,1,0,,,json,, base-admin,#,,,,,,view,,Administrator,1,0,,1,,,
base-user-add,/user/add,base,user,,,,user-edit,,User Add,1,0,,,form6.pt,, base-user,/user,base,user,,view_list,,user-view,base-admin,User,1,0,,1,form.pt,,
base-user-edit,/user/{id}/edit,base,user,,,,user-edit,,User Edit,1,0,,,form6.pt,, base-user-act,/user/{act}/act,base,user,,,,user-view,base-user,User Action,1,0,,,json,,
base-user-view,/user/{id}/view,base,user,,,,user-view,,User View,1,0,,,form6.pt,, base-user-add,/user/add,base,user,,,,user-edit,base-user,User Add,1,0,,,form6.pt,,
base-user-delete,/user/{id}/delete,base,user,,,,user-edit,,User Delete,1,0,,,form6.pt,, base-user-edit,/user/{id}/edit,base,user,,,,user-edit,base-user,User Edit,1,0,,,form6.pt,,
base-partner,/partner,base,partner,,view_list,,admin,,Partner,1,0,,1,form.pt,, base-user-view,/user/{id}/view,base,user,,,,user-view,base-user,User View,1,0,,,form6.pt,,
base-partner-act,/partner/{act}/act,base,partner,,,,admin,,Partner Action,1,0,,,json,, base-user-delete,/user/{id}/delete,base,user,,,,user-edit,base-user,User Delete,1,0,,,form6.pt,,
base-partner-add,/partner/add,base,partner,,,,admin,,Partner Add,1,0,,,form6.pt,, base-partner,/partner,base,partner,,view_list,,admin,base-admin,Partner,1,0,,1,form.pt,,
base-partner-edit,/partner/{id}/edit,base,partner,,,,admin,,Partner Edit,1,0,,,form6.pt,, base-partner-act,/partner/{act}/act,base,partner,,,,admin,base-partner,Partner Action,1,0,,,json,,
base-partner-view,/partner/{id}/view,base,partner,,,,admin,,Partner View,1,0,,,form6.pt,, base-partner-add,/partner/add,base,partner,,,,admin,base-partner,Partner Add,1,0,,,form6.pt,,
base-partner-delete,/partner/{id}/delete,base,partner,,,,admin,,Partner Delete,1,0,,,form6.pt,, base-partner-edit,/partner/{id}/edit,base,partner,,,,admin,base-partner,Partner Edit,1,0,,,form6.pt,,
base-partner-upload,/partner/upload,base,partner,,,,admin,,Partner Uload,1,0,,,form6.pt,, base-partner-view,/partner/{id}/view,base,partner,,,,admin,base-partner,Partner View,1,0,,,form6.pt,,
base-partner-delete,/partner/{id}/delete,base,partner,,,,admin,base-partner,Partner Delete,1,0,,,form6.pt,,
base-partner-upload,/partner/upload,base,partner,,,,admin,base-partner,Partner Uload,1,0,,,form6.pt,,
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,
......
...@@ -49,7 +49,7 @@ def http_forbidden(request): ...@@ -49,7 +49,7 @@ def http_forbidden(request):
# next_url = get_urls( # next_url = get_urls(
# request.route_url( # request.route_url(
# 'login', _query={'next': request.url})) # 'login', _query={'next': request.url}))
next_url = request.route_url('login', _query={'next': request.url}) next_url = request.route_url('base-login', _query={'next': request.url})
return HTTPSeeOther(location=next_url) return HTTPSeeOther(location=next_url)
request.response.status = 403 request.response.status = 403
......
...@@ -556,16 +556,16 @@ class BaseView(object): ...@@ -556,16 +556,16 @@ class BaseView(object):
def get_bindings(self, row=None): def get_bindings(self, row=None):
return {"row": row} return {"row": row}
# def next_edit(self, form, **kwargs): def next_edit(self, form, **kwargs):
# """Digunakan untuk memproses button post yang lainnya """Digunakan untuk memproses button post yang lainnya
# Args: Args:
# form (_type_): _description_ form (_type_): _description_
# Returns: Returns:
# _type_: _description_ _type_: _description_
# """ """
# return self.route_list(**kwargs) return self.route_list(**kwargs)
def returned_form(self, form, table=None, **kwargs): def returned_form(self, form, table=None, **kwargs):
resources = form.get_widget_resources() resources = form.get_widget_resources()
...@@ -576,8 +576,6 @@ class BaseView(object): ...@@ -576,8 +576,6 @@ class BaseView(object):
resources["js"].extend(set(table["js"]) - set(resources["js"])) resources["js"].extend(set(table["js"]) - set(resources["js"]))
resources["css"].extend(set(table["css"]) - set(resources["css"])) resources["css"].extend(set(table["css"]) - set(resources["css"]))
table = table["form"] table = table["form"]
# resources["js"] = list(resources["js"])
# resources["css"] = list(resources["css"])
if is_object: if is_object:
return dict(form=form, return dict(form=form,
table=table and table.render() or None, table=table and table.render() or None,
...@@ -747,19 +745,19 @@ class BaseView(object): ...@@ -747,19 +745,19 @@ class BaseView(object):
""" """
return self.route_list(**kwargs) return self.route_list(**kwargs)
# def get_captcha_url(self): def get_captcha_url(self):
# return get_urls("/captcha/") + get_captcha(self.req) return self.req.static_url(BASE_CLASS.captcha_files)
# def update_value(self, value, cstruct): def update_value(self, value, cstruct):
# for k in cstruct: for k in cstruct:
# val = cstruct.get(k) val = cstruct.get(k)
# if type(val) is dict: if type(val) is dict:
# if k not in value: if k not in value:
# value[k] = {} value[k] = {}
# value[k] = self.update_value(value[k], val) value[k] = self.update_value(value[k], val)
# elif val: elif val:
# value[k] = cstruct.get(k) value[k] = cstruct.get(k)
# return value return value
def view_add(self, **kwargs): def view_add(self, **kwargs):
# bindings = self.get_bindings() # bindings = self.get_bindings()
...@@ -800,7 +798,7 @@ class BaseView(object): ...@@ -800,7 +798,7 @@ class BaseView(object):
return self.returned_form(form, table, **kwargs) return self.returned_form(form, table, **kwargs)
def save(self, values, user, row=None): def save(self, values, user, row=None):
log.info("Save") log.debug("Save")
log.debug(values) log.debug(values)
values.pop("id", None) values.pop("id", None)
self.ses["old_email"] = user and user.email or None self.ses["old_email"] = user and user.email or None
......
...@@ -134,10 +134,6 @@ class Views(BaseView): ...@@ -134,10 +134,6 @@ class Views(BaseView):
# } # }
# return super().view_list(new_buttons=new_buttons) # return super().view_list(new_buttons=new_buttons)
# # @view_config(route_name='partner-act', renderer='json',
# permission='user-view')
# def view_act(self):
# return super().view_act()
def next_act(self): def next_act(self):
request = self.req request = self.req
...@@ -203,26 +199,6 @@ class Views(BaseView): ...@@ -203,26 +199,6 @@ class Views(BaseView):
r.append(d) r.append(d)
return r return r
# @view_config(route_name='partner-add', renderer='templates/form.pt',
# permission='user-edit')
# def view_add(self):
# return super().view_add()
# @view_config(route_name='partner-edit', renderer='templates/form.pt',
# permission='user-edit')
# def view_edt(self):
# return super().view_edit()
# @view_config(route_name='partner-view', renderer='templates/form.pt',
# permission='user-edit')
# def view_view(self):
# return super().view_view()
# @view_config(route_name='partner-delete', renderer='templates/form.pt',
# permission='user-edit')
# def view_delete(self):
# return super().view_delete()
def form_validator(self, form, value): def form_validator(self, form, value):
def err_kode(): def err_kode():
raise colander.Invalid(form, raise colander.Invalid(form,
...@@ -254,12 +230,6 @@ class Views(BaseView): ...@@ -254,12 +230,6 @@ class Views(BaseView):
else: else:
value.pop("idcard") value.pop("idcard")
# value['is_vendor'] = 'is_vendor' in value and \
# value['is_vendor'] and 1 or 0
# value['is_customer'] = 'is_customer' in value and \
# value['is_customer'] and 1 or 0
# value["status"] = 'status' in value and value['status'] and 1 or 0
def get_bindings(self, row=None): def get_bindings(self, row=None):
result = super().get_bindings(row) result = super().get_bindings(row)
# provinsi_list = ResProvinsi.get_list() # provinsi_list = ResProvinsi.get_list()
...@@ -279,7 +249,7 @@ class Views(BaseView): ...@@ -279,7 +249,7 @@ class Views(BaseView):
return result return result
def save_request(self, values, row=None): # def save_request(self, values, row=None):
# if "idcard" in values and values["idcard"]: # if "idcard" in values and values["idcard"]:
# if str(self.req.POST['upload']) != "": # if str(self.req.POST['upload']) != "":
# folder = self.get_params("idcard_folder", '/tmp/idcard') # folder = self.get_params("idcard_folder", '/tmp/idcard')
...@@ -289,8 +259,8 @@ class Views(BaseView): ...@@ -289,8 +259,8 @@ class Views(BaseView):
# else: # else:
# del values["idcard"] # del values["idcard"]
row = super().save_request(values, row) # row = super().save_request(values, row)
return row # return row
def get_values(self, row, istime=False): def get_values(self, row, istime=False):
d = super().get_values(row, istime) d = super().get_values(row, istime)
...@@ -308,6 +278,8 @@ class Views(BaseView): ...@@ -308,6 +278,8 @@ class Views(BaseView):
def before_delete(self, row): def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete() PartnerFiles.query().filter_by(partner_id=row.id).delete()
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
@colander.deferred @colander.deferred
def partner_widget(node, kw): def partner_widget(node, kw):
......
...@@ -125,12 +125,14 @@ ...@@ -125,12 +125,14 @@
</span> </span>
<i class="fa fa-angle-down"></i> </a> <i class="fa fa-angle-down"></i> </a>
<ul class="dropdown-menu pull-right"> <ul class="dropdown-menu pull-right">
<li><a style="text-transform:capitalize" href="{request.route_url('profile')}">Profile</a></li> <li><a style="text-transform:capitalize" href="${request.route_url('base-profile')}">Profile</a>
</li>
<li tal:condition="not request.user.external"> <li tal:condition="not request.user.external">
<a style="text-transform:capitalize" href="{request.route_url('password')}">Ubah <a style="text-transform:capitalize" href="${request.route_url('base-password')}">Ubah
password</a> password</a>
</li> </li>
<li><a style="text-transform:capitalize" href="${request.route_url('base-logout')}">Logout</a></li> <li><a style="text-transform:capitalize" href="${request.route_url('base-logout')}">Logout</a>
</li>
<li tal:condition="request.user.api_key"><a style="text-transform:capitalize" <li tal:condition="request.user.api_key"><a style="text-transform:capitalize"
href="${home}/recreate-api-key">API Key</a></li> href="${home}/recreate-api-key">API Key</a></li>
<!-- <li talcondition="'core' in request.modules and change_unit(request)"> <!-- <li talcondition="'core' in request.modules and change_unit(request)">
...@@ -150,92 +152,51 @@ ...@@ -150,92 +152,51 @@
<!-- Left panel : Navigation area --> <!-- Left panel : Navigation area -->
<!-- Note: This width of the aside area can be adjusted through LESS variables --> <!-- Note: This width of the aside area can be adjusted through LESS variables -->
<aside id="left-panel" style="padding-bottom:67px"> <aside id="left-panel" style="padding-bottom:67px">
Menu
<!-- NAVIGATION : This navigation is also responsive--> <!-- NAVIGATION : This navigation is also responsive-->
<nav style=""> <nav class="smart-menu" id="menu">
<!-- Modul Menu --> <!-- Modul Menu -->
<ul metal:define-slot="navs"></ul>
<!-- Admin Menu -->
<ul tal:condition="has_permission(request, user_path)" style="margin-top: 0; padding-top: 0;">
<li>
<a href="#"><i class="fa fa-lg fa-fw fa-shield"></i><span class="menu-item-parent">Admin</span></a>
<ul>
<li tal:condition="has_permission(request, ['user-view', 'user-edit'])"
tal:attributes="class route_name in user_path and 'active'">
<a href="${home}/user">User</a>
</li>
<li tal:condition="has_permission(request, ['user-view', 'user-edit'])"
tal:attributes="class route_name in user_area_path and 'active'">
<a href="${home}/user/area">User Area</a>
</li>
<li tal:condition="has_permission(request, ['user-view', 'user-edit'])"
tal:attributes="class route_name in user_dep_path and 'active'">
<a href="${home}/user/departemen">User Departemen</a>
</li>
<li tal:condition="has_permission(request, ['user-view', 'user-edit'])"
tal:attributes="class route_name in user_ext_path and 'active'">
<a href="${home}/user/ext">External User</a>
</li>
<li tal:condition="has_permission(request, ['user-view', 'user-edit'])"
tal:attributes="class route_name in group_path and 'active'">
<a href="${home}/group">Group</a>
</li>
<li tal:condition="has_permission(request, 'upload-logo')"
tal:attributes="class route_name in ['upload-logo'] and 'active'">
<a href="${home}/upload/logo">Upload Logo</a>
</li>
<li tal:condition="has_permission(request, 'parameter')"
tal:attributes="class route_name in param_path and 'active'">
<a href="${home}/parameter">Parameter</a>
</li>
<li tal:condition="has_permission(request, 'company')"
tal:attributes="class route_name in company_path and 'active'">
<a href="${home}/company">Pemerintah</a>
</li>
<li tal:condition="has_permission(request, 'eselon')"
tal:attributes="class route_name in eselon_path and 'active'">
<a href="${home}/eselon">Eselon</a>
</li>
<li tal:condition="has_permission(request, 'jabatan')"
tal:attributes="class route_name in jabatan_path and 'active'">
<a href="${home}/jabatan">Jabatan</a>
</li>
<li tal:condition="has_permission(request, 'departemen')" <ul metal:define-slot="navs"></ul>
tal:attributes="class route_name in dep_path and 'active'"> <ul style="margin-top: 0; padding-top: 0;">
<a href="${home}/departemen">Departemen</a> <li tal:repeat="menu get_base_menus()"
</li> tal:attributes="class route_name in menu['route_name'] and 'active'">
<li tal:condition="has_permission(request, 'partner')" <a tal:condition="python:not menu['children'] and has_permission(request, menu['permission'])"
tal:attributes="class route_name in partner_path and 'active'"> href="${home}${menu['path']}">
<a href="${home}/partner">Partner</a> <i tal:condition="menu['icon']" class="fa fa-lg fa-fw ${menu['icon']}"></i>
</li> <span>${menu['nama']}</span>
<li tal:condition="has_permission(request, 'partner-departemen')" </a>
tal:attributes="class route_name in part_dep_path and 'active'"> <a tal:condition="python:menu['children'] and has_permission(request, menu['permission'])" href="#">
<a href="${home}/partner/departemen">Partner Departemen</a> <i tal:condition="menu['icon']" class="fa fa-lg fa-fw ${menu['icon']}"></i>
</li> <span class="menu-item-parent">${menu['nama']}</span>
<li tal:condition="has_permission(request, 'provinsi')" </a>
tal:attributes="class route_name in provinsi_path and 'active'">
<a href="${home}/provinsi">Provinsi</a> <ul tal:condition="python:menu['children'] and has_permission(request, menu['permission'])">
</li> <li tal:repeat="submenu menu['children']"
<li tal:condition="has_permission(request, 'dati2')" tal:attributes="class route_name in submenu['route_name'] and 'active'">
tal:attributes="class route_name in dati2_path and 'active'"> <a tal:condition="python:not submenu['children'] and has_permission(request, submenu['permission'])"
<a href="${home}/dati2">Kabupaten/Kota</a> href="${home}${submenu['path']}">
</li> <i tal:condition="submenu['icon']" class="fa fa-lg fa-fw ${submenu['icon']}"></i>
<li tal:condition="has_permission(request, 'kecamatan')" <span>${submenu['nama']}</span>
tal:attributes="class route_name in kecamatan_path and 'active'"> </a>
<a href="${home}/kecamatan">Kecamatan</a>
</li> <a tal:condition="submenu['children']" href="#">
<li tal:condition="has_permission(request, 'desa')" <i tal:condition="submenu['icon']" class="fa fa-lg fa-fw ${submenu['icon']}"></i>
tal:attributes="class route_name in desa_path and 'active'"> <span class="menu-item-parent">${submenu['nama']}</span>
<a href="${home}/desa">Desa/Kelurahan</a> </a>
</li>
<li tal:condition="has_permission(request, 'log')" <ul tal:condition="submenu['children']">
tal:attributes="class route_name in ['log'] and 'active'"> <li tal:repeat="submenu2 submenu['children']"
<a href="${home}/log">Log</a> tal:attributes="class route_name in submenu2['route_name'] and 'active'">
<a href="${home}${submenu2['path']}">${submenu2['nama']}</a>
</li>
</ul>
</li> </li>
</ul> </ul>
</li> </li>
</ul> </ul>
</nav> </nav>
<span class="minifyme" data-action="minifyMenu"> <span class="minifyme" data-action="minifyMenu">
<i class="fa fa-arrow-circle-left hit"></i> <i class="fa fa-arrow-circle-left hit"></i>
......
<html metal:use-macro="load: ./base5.pt" <html metal:use-macro="load: ./base5.pt"
tal:define="scripts scripts|scripts" > tal:define="scripts scripts|scripts" >
<div metal:fill-slot="content"> <div metal:fill-slot="content">
<div class="col-md-8 col-md-offset-2"> <div class="col-md-8 col-md-offset-2">
<div class="panel panel-default"> <div class="panel panel-default">
<!-- <div class="panel-heading"> --> <!-- <div class="panel-heading"> -->
<!-- <h3 class="panel-title"><i class="fa fa-fw fa-plus"></i>&nbsp;${request.title}</h3> --> <!-- <h3 class="panel-title"><i class="fa fa-fw fa-plus"></i>&nbsp;${request.title}</h3> -->
<!-- </div> --> <!-- </div> -->
<div class="panel-body"> <div class="panel-body">
<div tal:content="structure form"></div> <div tal:content="structure form"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div metal:fill-slot="scripts"> <div metal:fill-slot="scripts">
<script> <script>
$(document).ready(function () { $(document).ready(function () {
// $(".read-only").attr("readonly", true); // $(".read-only").attr("readonly", true);
$(".readonly").attr("readonly", true); $(".readonly").attr("readonly", true);
$(".date").attr("readonly", true); $(".date").attr("readonly", true);
// $(".date").datepicker({ // $(".date").datepicker({
// format: 'dd-mm-yyyy' // format: 'dd-mm-yyyy'
// }); // });
${structure:scripts} ${structure:scripts}
}); });
</script> </script>
<div metal:define-slot="scripts"></div> <div metal:define-slot="scripts"></div>
</div> </div>
</html> </html>
...@@ -79,6 +79,7 @@ ...@@ -79,6 +79,7 @@
<b class="tooltip tooltip-top-right"><i class="fa fa-lock txt-color-teal"></i> ISI <b class="tooltip tooltip-top-right"><i class="fa fa-lock txt-color-teal"></i> ISI
DENGAN PASSWORD ANDA</b> </label> DENGAN PASSWORD ANDA</b> </label>
</section> </section>
<section> <section>
<div class="form-group"> <div class="form-group">
<label class=" checkbox checkbox-inline"> <label class=" checkbox checkbox-inline">
...@@ -87,15 +88,17 @@ ...@@ -87,15 +88,17 @@
<a href="${home}/reset-password" id="lupa" >Lupa Password?</a> <a href="${home}/reset-password" id="lupa" >Lupa Password?</a>
</div> </div>
</div> </div>
</section> </section>
<section tal:condition="'captcha' in form">
<div tal:define="field form['captcha']">
${structure:field.serialize()}
</div>
</section>
<section> <section tal:condition="'csrf_token' in form">
<div tal:condition="'csrf_token' in form"> <div tal:define="field form['csrf_token']" style="display: none;">
<div tal:define="field form['csrf_token']" style="display: none;"> ${structure:field.serialize()}
${structure:field.serialize()}
</div>
</div> </div>
</section> </section>
......
<form
tal:define="style style|field.widget.style;
css_class css_class|string:${field.widget.css_class or field.css_class or ''};
item_template item_template|field.widget.readonly_item_template;
title title|field.title;
errormsg errormsg|field.errormsg;
description description|field.description;
buttons buttons|field.buttons;
use_ajax use_ajax|field.use_ajax;
ajax_options ajax_options|field.ajax_options;
formid formid|field.formid;
method method|field.method;"
tal:attributes="style style;
class css_class;"
id="${formid}"
method="${method}"
enctype="multipart/form-data"
accept-charset="utf-8"
i18n:domain="deform"
class="deform ${field.bootstrap_form_style | 'form-horizontal'}"
>
<fieldset class="deform-form-fieldset">
<div class="row">
<legend tal:condition="title">${title}</legend>
<p class="section first" tal:condition="description">
${description}
</p>
<div tal:repeat="child field"
tal:replace="structure child.render_template(item_template)"/>
</div>
<div class="row">
<div class="form-group deform-form-buttons">
<tal:loop tal:repeat="button buttons">
<button
tal:define="btn_disposition repeat.button.start and 'btn-primary' or 'btn-default';"
tal:attributes="disabled button.disabled if button.disabled else None;
attributes|button.attributes|{};"
id="${formid+button.name}"
name="${button.name}"
type="${button.type}"
class="btn ${button.css_class or btn_disposition}"
value="${button.value}"
tal:condition="button.type != 'link'">
<span tal:condition="button.icon" class="glyphicon glyphicon-${button.icon}"></span>
${button.title}
</button>
<a
tal:define="btn_disposition repeat.button.start and 'btn-primary' or 'btn-default';
btn_href button.value|''"
class="btn ${button.css_class or btn_disposition}"
id="${field.formid + button.name}"
href="${btn_href}"
tal:condition="button.type == 'link'">
<span tal:condition="button.icon" class="glyphicon glyphicon-${button.icon}"></span>
${button.title}
</a>
</tal:loop>
</div>
</div>
</fieldset>
</form>
...@@ -378,8 +378,6 @@ class CaptchaWidget(Widget): ...@@ -378,8 +378,6 @@ class CaptchaWidget(Widget):
kode_captcha, file_name = img_captcha(self.request) kode_captcha, file_name = img_captcha(self.request)
self.request.session["captcha"] = kode_captcha self.request.session["captcha"] = kode_captcha
cstruct = self.url+file_name cstruct = self.url+file_name
# if cstruct in (null, None):
# cstruct = ""
readonly = kw.get("readonly", self.readonly) readonly = kw.get("readonly", self.readonly)
template = readonly and self.readonly_template or self.template template = readonly and self.readonly_template or self.template
values = self.get_template_values(field, cstruct, kw) values = self.get_template_values(field, cstruct, kw)
...@@ -394,6 +392,8 @@ class CaptchaWidget(Widget): ...@@ -394,6 +392,8 @@ class CaptchaWidget(Widget):
pstruct = pstruct.strip() pstruct = pstruct.strip()
if not pstruct: if not pstruct:
return null return null
if pstruct != self.request.session["captcha"]:
raise Invalid(field.schema, "Captcha tidak sesuai")
return pstruct return pstruct
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!