Commit 15a40281 by taufikyu

Merge branch 'latest' of https://git.opensipkd.com/aa.gusti/opensipkd-base into latest

2 parents 251e9f13 a541a8f9
{
"python.formatting.provider": "yapf"
}
\ No newline at end of file \ No newline at end of file
env_base/bin/activate
\ No newline at end of file \ No newline at end of file
...@@ -13,7 +13,7 @@ debug_routematch = false ...@@ -13,7 +13,7 @@ debug_routematch = false
debug_templates = true debug_templates = true
default_locale_name = en default_locale_name = en
sqlalchemy.url = postgresql://user:password@server:port/db sqlalchemy.url = postgresql://user:password@localhost:5432/db
pyramid.includes = pyramid.includes =
pyramid_tm pyramid_tm
...@@ -27,7 +27,7 @@ session.type = ext:database ...@@ -27,7 +27,7 @@ session.type = ext:database
session.secret = s0s3cr3t session.secret = s0s3cr3t
session.cookie_expires = true session.cookie_expires = true
session.key = WhatEver session.key = WhatEver
session.url = postgresql://user:password@server:port/db session.url = postgresql://user:password@localhost:5432/db
session.timeout = 3000 session.timeout = 3000
session.lock_dir = %(here)s/tmp session.lock_dir = %(here)s/tmp
...@@ -52,9 +52,9 @@ mail.sender_name = ...@@ -52,9 +52,9 @@ mail.sender_name =
mail.username = mail.username =
mail.host = mail.host =
mail.port = 25 mail.port = 25
mail.password None SMTP password mail.password =
mail.tls = False mail.tls = False
mail.ssl=False mail.ssl = False
mail.keyfile = mail.keyfile =
#SSL key file #SSL key file
mail.certfile = mail.certfile =
...@@ -173,8 +173,8 @@ format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s ...@@ -173,8 +173,8 @@ format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
[alembic_ziggurat] [alembic_ziggurat]
script_location=ziggurat_foundations:migrations script_location=ziggurat_foundations:migrations
sqlalchemy.url = postgresql://user:password@server:port/db sqlalchemy.url = postgresql://user:password@localhost:5432/db
[alembic_base] [alembic_base]
script_location=opensipkd.base:alembic script_location=opensipkd.base:alembic
sqlalchemy.url = postgresql://user:password@server:port/db sqlalchemy.url = postgresql://user:password@localhost:5432/db
...@@ -178,7 +178,7 @@ def get_id_card_folder(ext=None): ...@@ -178,7 +178,7 @@ def get_id_card_folder(ext=None):
folder = get_params("partner_idcard_folder", '/tmp/idcard') folder = get_params("partner_idcard_folder", '/tmp/idcard')
if ext: if ext:
return folder + ext return folder + ext
return folder return folder
def allow_register(request): def allow_register(request):
...@@ -291,7 +291,6 @@ def get_menus(request): ...@@ -291,7 +291,6 @@ def get_menus(request):
result = {} result = {}
for menu in menus: for menu in menus:
if menu.find(',') > -1: if menu.find(',') > -1:
key, val = menu.strip().split(',') key, val = menu.strip().split(',')
key = key.strip().strip('/') key = key.strip().strip('/')
...@@ -335,7 +334,7 @@ def get_menus(request): ...@@ -335,7 +334,7 @@ def get_menus(request):
def format_datetime(v): def format_datetime(v):
if v.time(): if v.time() != datetime.time(0, 0):
return dmyhms(v) return dmyhms(v)
else: else:
return dmy(v) return dmy(v)
......
...@@ -74,6 +74,13 @@ class Home(BaseView): ...@@ -74,6 +74,13 @@ class Home(BaseView):
elif not request.user: elif not request.user:
return HTTPFound(location=request.route_url(modules_default)) return HTTPFound(location=request.route_url(modules_default))
logo = get_params('logo', "static/img/logo.png") logo = get_params('logo', "static/img/logo.png")
home_tpl = get_params("home_tpl")
if home_tpl:
return render_to_response(
home_tpl,
dict(modules=modules, logo=logo),
request=request
)
return dict(modules=modules, logo=logo) return dict(modules=modules, logo=logo)
...@@ -107,7 +114,8 @@ def password_validator(form, value): ...@@ -107,7 +114,8 @@ def password_validator(form, value):
@view_config( @view_config(
route_name='password', renderer='templates/chg_password.pt', permission='view') route_name='password', renderer='templates/chg_password.pt',
permission='view')
def view_password(request): def view_password(request):
schema = Password(validator=password_validator) schema = Password(validator=password_validator)
btn_save = Button('save', _('Simpan')) btn_save = Button('save', _('Simpan'))
......
...@@ -32,6 +32,7 @@ class BaseView(object): ...@@ -32,6 +32,7 @@ class BaseView(object):
def __init__(self, request): def __init__(self, request):
self.req = request self.req = request
self.ses = self.req.session self.ses = self.req.session
self.db_session = DBSession
self.params = self.req.params self.params = self.req.params
self.settings = get_settings() self.settings = get_settings()
# if not request.user: # if not request.user:
...@@ -126,6 +127,7 @@ class BaseView(object): ...@@ -126,6 +127,7 @@ class BaseView(object):
self.list_report = (btn_csv, btn_pdf) self.list_report = (btn_csv, btn_pdf)
# self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close) # self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
self.list_buttons = (btn_add, btn_close) self.list_buttons = (btn_add, btn_close)
self.columns = None
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = '' self.list_url = ''
self.list_route = '' self.list_route = ''
...@@ -217,6 +219,9 @@ class BaseView(object): ...@@ -217,6 +219,9 @@ class BaseView(object):
def next_view(self, form, **kwargs): def next_view(self, form, **kwargs):
return self.route_list() return self.route_list()
def next_edit(self, form, **kwargs):
return self.route_list()
def view_view(self): # row = query_id(request).first() def view_view(self): # row = query_id(request).first()
request = self.req request = self.req
row = self.query_id().first() row = self.query_id().first()
...@@ -226,11 +231,15 @@ class BaseView(object): ...@@ -226,11 +231,15 @@ class BaseView(object):
form = self.get_form(self.edit_schema, buttons=(btn_close,), form = self.get_form(self.edit_schema, buttons=(btn_close,),
bindings=bindings) bindings=bindings)
if request.POST: if request.POST:
result = self.next_view(form) result = self.next_view(form, row=row)
if result: if result:
return result return result
return self.route_list()
form.set_appstruct(self.get_values(row)) values = self.get_values(row)
if not values:
return self.route_list("Nilai Data tidak ditemukan", "error")
form.set_appstruct(values)
table = self.get_item_table(row) table = self.get_item_table(row)
return dict(form=form.render(readonly=True), return dict(form=form.render(readonly=True),
table=table and table.render() or None, table=table and table.render() or None,
...@@ -261,24 +270,29 @@ class BaseView(object): ...@@ -261,24 +270,29 @@ class BaseView(object):
url_dict = self.req.matchdict url_dict = self.req.matchdict
if url_dict['act'] == 'grid': if url_dict['act'] == 'grid':
url = [] url = []
columns = [] if not self.columns:
for d in self.list_schema(): columns = []
global_search = hasattr(d, "searchable") and \ for d in self.list_schema():
hasattr(d, "searchable") == False and False \ global_search = hasattr(d, "searchable") and \
or True hasattr(d, "searchable") == False and False \
if hasattr(d, "field"): or True
if type(d.field) == str: if hasattr(d, "field"):
columns.append( if type(d.field) == str:
ColumnDT(getattr(self.table, d.field), mData=d.name, columns.append(
global_search=global_search)) ColumnDT(getattr(self.table, d.field),
mData=d.name,
global_search=global_search))
else:
columns.append(ColumnDT(d.field, mData=d.name))
else: else:
columns.append(ColumnDT(d.field, mData=d.name)) columns.append(
else: ColumnDT(getattr(self.table, d.name), mData=d.name))
columns.append( if hasattr(d, "url"):
ColumnDT(getattr(self.table, d.name), mData=d.name)) url.append(d.name)
if hasattr(d, "url"): else:
url.append(d.name) columns = self.columns
query = DBSession.query().select_from(self.table)
query = self.db_session.query().select_from(self.table)
query = self.list_join(query) query = self.list_join(query)
if self.req.user and self.req.user.company_id and hasattr( if self.req.user and self.req.user.company_id and hasattr(
self.table, "company_id"): self.table, "company_id"):
...@@ -340,9 +354,15 @@ class BaseView(object): ...@@ -340,9 +354,15 @@ class BaseView(object):
row.update_uid = user and user.id or None row.update_uid = user and user.id or None
row.from_dict(values) row.from_dict(values)
row.status = 'status' in values and values['status'] and 1 or 0 if hasattr(row, "status"):
DBSession.add(row) status = "status" in values and values["status"] or 0
DBSession.flush() try:
status = int(status)
except:
status = status and 1 or 0
row.status = status
self.db_session.add(row)
self.db_session.flush()
return row return row
def save_request(self, values, row=None): def save_request(self, values, row=None):
...@@ -389,6 +409,8 @@ class BaseView(object): ...@@ -389,6 +409,8 @@ class BaseView(object):
try: try:
controls = form.validate(controls) controls = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
log.debug(f"Edit Error: {str(e.error)}")
log.debug(f"Edit Data: {e.cstruct}")
form.set_appstruct(e.cstruct) form.set_appstruct(e.cstruct)
return dict(form=form.render(), return dict(form=form.render(),
table=table and table.render() or None, table=table and table.render() or None,
...@@ -396,6 +418,9 @@ class BaseView(object): ...@@ -396,6 +418,9 @@ class BaseView(object):
js=resources["js"]) js=resources["js"])
c = dict(controls) c = dict(controls)
self.save_request(c, row) self.save_request(c, row)
else:
return self.next_edit(form, row=row)
return self.route_list() return self.route_list()
values = self.get_values(row) values = self.get_values(row)
form.set_appstruct(values) form.set_appstruct(values)
...@@ -420,7 +445,7 @@ class BaseView(object): ...@@ -420,7 +445,7 @@ class BaseView(object):
msg = self.delete_msg(row) msg = self.delete_msg(row)
self.before_delete(row) self.before_delete(row)
q.delete() q.delete()
DBSession.flush() self.db_session.flush()
request.session.flash(msg) request.session.flash(msg)
return self.route_list() return self.route_list()
form = self.get_form( form = self.get_form(
...@@ -434,7 +459,7 @@ class BaseView(object): ...@@ -434,7 +459,7 @@ class BaseView(object):
js=resources["js"]) js=resources["js"])
def query_id(self): def query_id(self):
q = DBSession.query(self.table).filter_by( q = self.db_session.query(self.table).filter_by(
id=self.req.matchdict['id']) id=self.req.matchdict['id'])
if hasattr(self.table, 'compnay_id') and self.req.user.company_id: if hasattr(self.table, 'compnay_id') and self.req.user.company_id:
q = q.filter_by(company_id=self.req.user.company_id) q = q.filter_by(company_id=self.req.user.company_id)
......
...@@ -88,10 +88,12 @@ class ListSchema(colander.Schema): ...@@ -88,10 +88,12 @@ class ListSchema(colander.Schema):
colander.Boolean(), colander.Boolean(),
widget=widget.CheckboxWidget(), widget=widget.CheckboxWidget(),
oid="status") oid="status")
def after_bind(self, schema, kw): def after_bind(self, schema, kw):
request = kw.get("request") request = kw.get("request")
self["idcard"].url = request.static_url(get_id_card_folder("/")) self["idcard"].url = request.static_url(get_id_card_folder("/"))
class ViewPartner(BaseView): class ViewPartner(BaseView):
def __init__(self, request): def __init__(self, request):
super().__init__(request) super().__init__(request)
...@@ -261,7 +263,7 @@ class ViewPartner(BaseView): ...@@ -261,7 +263,7 @@ class ViewPartner(BaseView):
filename = d["idcard"] filename = d["idcard"]
url = self.req.static_url(get_id_card_folder("/")) url = self.req.static_url(get_id_card_folder("/"))
preview_url = "/".join( preview_url = "/".join(
[self.req.static_url(url), filename]) [url, filename])
d["idcard"] = {"uid": filename.split(".")[0], d["idcard"] = {"uid": filename.split(".")[0],
"filename": filename, "filename": filename,
"preview_url": preview_url "preview_url": preview_url
......
<div tal:define="css_class css_class|field.widget.css_class;
oid oid|field.oid;
style style|field.widget.style;
type_name type_name|field.widget.type_name;"
tal:omit-tag="">
${field.start_mapping()}
<input type="text"
name="date"
value="${cstruct}"
tal:attributes="class string: ${css_class or ''} form-control hasDatepicker;
style style;
attributes|field.widget.attributes|{};"
id="${oid}"/>
${field.end_mapping()}
<script type="text/javascript">
deform.addCallback(
'${oid}',
function deform_cb(oid) {
if (!Modernizr.inputtypes['date'] ||"${type_name}" != "date" || window.forceDateTimePolyfill){
$('#' + oid).pickadate(${options_json});
}
}
);
</script>
</div>
...@@ -9,6 +9,7 @@ from sqlalchemy import ( ...@@ -9,6 +9,7 @@ from sqlalchemy import (
from .common import NamaModel from .common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2 from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from .meta import (Base) from .meta import (Base)
from sqlalchemy.orm import relationship, backref
class PartnerModel(NamaModel): class PartnerModel(NamaModel):
...@@ -67,6 +68,14 @@ class Partner(Base, PartnerModel): ...@@ -67,6 +68,14 @@ class Partner(Base, PartnerModel):
desa_id = Column(Integer, ForeignKey(ResDesa.id)) desa_id = Column(Integer, ForeignKey(ResDesa.id))
company_id = Column(Integer) company_id = Column(Integer)
nip = Column(String(32)) nip = Column(String(32))
res_provinsi = relationship(
"ResProvinsi", backref=backref('partner'))
res_dati2 = relationship(
"ResDati2", backref=backref('partner'))
res_kecamatan = relationship(
"ResKecamatan", backref=backref('partner'))
res_desa = relationship(
"ResDesa", backref=backref('partner'))
# npwp = Column(String(16)) # npwp = Column(String(16))
# npwpd = Column(String(16)) # npwpd = Column(String(16))
......
import os
import sys
from setuptools import (
setup,
find_packages,
)
here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.rst')) as f:
README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
line = CHANGES.splitlines()[0]
version = line.split()[0]
requires = [
'pyramid',
'pyramid_tm',
'SQLAlchemy',
'transaction',
'zope.sqlalchemy==1.1',
'waitress',
'ziggurat-foundations',
'colander',
'deform >= 2.0a2',
'pyramid_chameleon',
'psycopg2-binary',
'alembic >= 0.3.4',
'pyramid_beaker',
'pytz',
'paste',
'webhelpers',
'bcrypt',
'pyramid_rpc',
'sqlalchemy-datatables',
'requests',
'z3c.rml',
'py3o.template',
'wheezy.captcha',
# 'pyBarcode',
'unoconv',
'google-api-python-client',
# 'pyramid_xmlrpc',
'pyramid_mailer', 'zope'
]
dev_requires = [
'pyramid_debugtoolbar',
'pytest',
]
setup(
name='opensipkd_base',
version=version,
description='Basis Aplikasi openSIPKD',
long_description=README + '\n\n' + CHANGES,
author='Agus Gustiana',
author_email='aa.gustiana@gmail.com',
classifiers=[
"Programming Language :: Python",
"Framework :: Pylons",
"Topic :: Internet :: WWW/HTTP",
"Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
],
keywords='web pyramid pylons',
# package=find_packages('src'),
# package_dir={'': 'src'},
include_package_data=True,
zip_safe=False,
install_requires=requires,
tests_require=requires,
extras_require={
'dev': dev_requires,
},
# test_suite="opensipkd.base.test",
entry_points="""\
[paste.app_factory]
main = opensipkd.base:main
[console_scripts]
initialize_opensipkd_db = opensipkd.base.scripts.initializedb:main
""",
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!