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
env_base/bin/activate
\ No newline at end of file
......@@ -13,7 +13,7 @@ debug_routematch = false
debug_templates = true
default_locale_name = en
sqlalchemy.url = postgresql://user:password@server:port/db
sqlalchemy.url = postgresql://user:password@localhost:5432/db
pyramid.includes =
pyramid_tm
......@@ -27,7 +27,7 @@ session.type = ext:database
session.secret = s0s3cr3t
session.cookie_expires = true
session.key = WhatEver
session.url = postgresql://user:password@server:port/db
session.url = postgresql://user:password@localhost:5432/db
session.timeout = 3000
session.lock_dir = %(here)s/tmp
......@@ -52,9 +52,9 @@ mail.sender_name =
mail.username =
mail.host =
mail.port = 25
mail.password None SMTP password
mail.password =
mail.tls = False
mail.ssl=False
mail.ssl = False
mail.keyfile =
#SSL key file
mail.certfile =
......@@ -173,8 +173,8 @@ format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
[alembic_ziggurat]
script_location=ziggurat_foundations:migrations
sqlalchemy.url = postgresql://user:password@server:port/db
sqlalchemy.url = postgresql://user:password@localhost:5432/db
[alembic_base]
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):
folder = get_params("partner_idcard_folder", '/tmp/idcard')
if ext:
return folder + ext
return folder
return folder
def allow_register(request):
......@@ -291,7 +291,6 @@ def get_menus(request):
result = {}
for menu in menus:
if menu.find(',') > -1:
key, val = menu.strip().split(',')
key = key.strip().strip('/')
......@@ -335,7 +334,7 @@ def get_menus(request):
def format_datetime(v):
if v.time():
if v.time() != datetime.time(0, 0):
return dmyhms(v)
else:
return dmy(v)
......
......@@ -74,6 +74,13 @@ class Home(BaseView):
elif not request.user:
return HTTPFound(location=request.route_url(modules_default))
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)
......@@ -107,7 +114,8 @@ def password_validator(form, value):
@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):
schema = Password(validator=password_validator)
btn_save = Button('save', _('Simpan'))
......
......@@ -32,6 +32,7 @@ class BaseView(object):
def __init__(self, request):
self.req = request
self.ses = self.req.session
self.db_session = DBSession
self.params = self.req.params
self.settings = get_settings()
# if not request.user:
......@@ -126,6 +127,7 @@ class BaseView(object):
self.list_report = (btn_csv, btn_pdf)
# self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
self.list_buttons = (btn_add, btn_close)
self.columns = None
self.form_params = dict(scripts="")
self.list_url = ''
self.list_route = ''
......@@ -217,6 +219,9 @@ class BaseView(object):
def next_view(self, form, **kwargs):
return self.route_list()
def next_edit(self, form, **kwargs):
return self.route_list()
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
......@@ -226,11 +231,15 @@ class BaseView(object):
form = self.get_form(self.edit_schema, buttons=(btn_close,),
bindings=bindings)
if request.POST:
result = self.next_view(form)
result = self.next_view(form, row=row)
if 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)
return dict(form=form.render(readonly=True),
table=table and table.render() or None,
......@@ -261,24 +270,29 @@ class BaseView(object):
url_dict = self.req.matchdict
if url_dict['act'] == 'grid':
url = []
columns = []
for d in self.list_schema():
global_search = hasattr(d, "searchable") and \
hasattr(d, "searchable") == False and False \
or True
if hasattr(d, "field"):
if type(d.field) == str:
columns.append(
ColumnDT(getattr(self.table, d.field), mData=d.name,
global_search=global_search))
if not self.columns:
columns = []
for d in self.list_schema():
global_search = hasattr(d, "searchable") and \
hasattr(d, "searchable") == False and False \
or True
if hasattr(d, "field"):
if type(d.field) == str:
columns.append(
ColumnDT(getattr(self.table, d.field),
mData=d.name,
global_search=global_search))
else:
columns.append(ColumnDT(d.field, mData=d.name))
else:
columns.append(ColumnDT(d.field, mData=d.name))
else:
columns.append(
ColumnDT(getattr(self.table, d.name), mData=d.name))
if hasattr(d, "url"):
url.append(d.name)
query = DBSession.query().select_from(self.table)
columns.append(
ColumnDT(getattr(self.table, d.name), mData=d.name))
if hasattr(d, "url"):
url.append(d.name)
else:
columns = self.columns
query = self.db_session.query().select_from(self.table)
query = self.list_join(query)
if self.req.user and self.req.user.company_id and hasattr(
self.table, "company_id"):
......@@ -340,9 +354,15 @@ class BaseView(object):
row.update_uid = user and user.id or None
row.from_dict(values)
row.status = 'status' in values and values['status'] and 1 or 0
DBSession.add(row)
DBSession.flush()
if hasattr(row, "status"):
status = "status" in values and values["status"] or 0
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
def save_request(self, values, row=None):
......@@ -389,6 +409,8 @@ class BaseView(object):
try:
controls = form.validate(controls)
except ValidationFailure as e:
log.debug(f"Edit Error: {str(e.error)}")
log.debug(f"Edit Data: {e.cstruct}")
form.set_appstruct(e.cstruct)
return dict(form=form.render(),
table=table and table.render() or None,
......@@ -396,6 +418,9 @@ class BaseView(object):
js=resources["js"])
c = dict(controls)
self.save_request(c, row)
else:
return self.next_edit(form, row=row)
return self.route_list()
values = self.get_values(row)
form.set_appstruct(values)
......@@ -420,7 +445,7 @@ class BaseView(object):
msg = self.delete_msg(row)
self.before_delete(row)
q.delete()
DBSession.flush()
self.db_session.flush()
request.session.flash(msg)
return self.route_list()
form = self.get_form(
......@@ -434,7 +459,7 @@ class BaseView(object):
js=resources["js"])
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'])
if hasattr(self.table, 'compnay_id') and self.req.user.company_id:
q = q.filter_by(company_id=self.req.user.company_id)
......
......@@ -88,10 +88,12 @@ class ListSchema(colander.Schema):
colander.Boolean(),
widget=widget.CheckboxWidget(),
oid="status")
def after_bind(self, schema, kw):
request = kw.get("request")
self["idcard"].url = request.static_url(get_id_card_folder("/"))
class ViewPartner(BaseView):
def __init__(self, request):
super().__init__(request)
......@@ -261,7 +263,7 @@ class ViewPartner(BaseView):
filename = d["idcard"]
url = self.req.static_url(get_id_card_folder("/"))
preview_url = "/".join(
[self.req.static_url(url), filename])
[url, filename])
d["idcard"] = {"uid": filename.split(".")[0],
"filename": filename,
"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 (
from .common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from .meta import (Base)
from sqlalchemy.orm import relationship, backref
class PartnerModel(NamaModel):
......@@ -67,6 +68,14 @@ class Partner(Base, PartnerModel):
desa_id = Column(Integer, ForeignKey(ResDesa.id))
company_id = Column(Integer)
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))
# 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!