Commit 0ea7ef58 by Tatang S

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

2 parents 7e0f33f3 3005a754
venv/bin/activate
\ No newline at end of file \ No newline at end of file
...@@ -150,6 +150,11 @@ def add_global(event): ...@@ -150,6 +150,11 @@ def add_global(event):
event['get_params'] = get_params event['get_params'] = get_params
event['get_urls'] = get_urls event['get_urls'] = get_urls
event['get_csrf_token'] = get_csrf_token event['get_csrf_token'] = get_csrf_token
event['get_params'] = get_params
def get_params(request, params, alternate=None, settings=None):
return get_params(params, alternate, settings)
def get_params(params, alternate=None, settings=None): def get_params(params, alternate=None, settings=None):
...@@ -162,7 +167,6 @@ def get_params(params, alternate=None, settings=None): ...@@ -162,7 +167,6 @@ def get_params(params, alternate=None, settings=None):
contoh penggunaan: contoh penggunaan:
get_params('devel', False) get_params('devel', False)
""" """
if not settings: if not settings:
settings = get_settings() settings = get_settings()
result = settings and params in settings and \ result = settings and params in settings and \
...@@ -175,6 +179,10 @@ def get_params(params, alternate=None, settings=None): ...@@ -175,6 +179,10 @@ def get_params(params, alternate=None, settings=None):
def get_ini(request, var): def get_ini(request, var):
return get_ini(var)
def get_ini(var):
settings = get_settings() settings = get_settings()
if var in settings and settings[var]: if var in settings and settings[var]:
return settings[var] return settings[var]
...@@ -497,6 +505,7 @@ def main(global_config, **settings): ...@@ -497,6 +505,7 @@ def main(global_config, **settings):
config.add_request_method(disable_responsive, 'disable_responsive', config.add_request_method(disable_responsive, 'disable_responsive',
reify=True) reify=True)
config.add_request_method(get_ini, 'get_ini', reify=True) config.add_request_method(get_ini, 'get_ini', reify=True)
config.add_request_method(get_params, 'get_params', reify=True)
config.add_request_method(get_csrf_token, 'get_csrf_token', reify=True) config.add_request_method(get_csrf_token, 'get_csrf_token', reify=True)
# config.add_translation_dirs('opensipkd.base:locale/') # config.add_translation_dirs('opensipkd.base:locale/')
......
$(document).ready(function () {
$('#departemen_nm').bind('typeahead:selected', function (obj, datum, name) {
$('#departemen_id').val(datum.id);
$('#departemen_kd').val(datum.kode);
console.log(datum.kode);
});
$('#departemen_nm').on('input',
function (e) {
let val = $('#departemen_nm').val();
if (val === null || val === "") {
$('#departemen_id').val("");
$('#departemen_kd').val("");
}
});
});
\ No newline at end of file \ No newline at end of file
...@@ -15,7 +15,7 @@ from opensipkd.tools import dmy, get_settings, get_ext, \ ...@@ -15,7 +15,7 @@ from opensipkd.tools import dmy, get_settings, get_ext, \
date_from_str, get_random_string date_from_str, get_random_string
from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, \ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, \
btn_add, btn_csv, \ btn_add, btn_csv, \
btn_pdf btn_pdf, btn_unpost, btn_post
from opensipkd.tools.captcha import get_captcha from opensipkd.tools.captcha import get_captcha
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from .common import DataTables from .common import DataTables
...@@ -156,7 +156,9 @@ class BaseView(object): ...@@ -156,7 +156,9 @@ class BaseView(object):
self.action_suffix = "/grid/act" self.action_suffix = "/grid/act"
self.upload_keys = ["kode"] self.upload_keys = ["kode"]
self.report_file = "" self.report_file = ""
self.query_register = ""
def query_register(self, **kwargs):
pass
def delete_msg(self, row): def delete_msg(self, row):
return f'Data ID {row.id} sudah dihapus.' return f'Data ID {row.id} sudah dihapus.'
...@@ -209,6 +211,7 @@ class BaseView(object): ...@@ -209,6 +211,7 @@ class BaseView(object):
schema.request = self.req schema.request = self.req
if row: if row:
schema.deserialize(row) schema.deserialize(row)
return Form(schema, buttons=buttons, autocomplete=self.autocomplete) return Form(schema, buttons=buttons, autocomplete=self.autocomplete)
def session_failed(self, session_name): def session_failed(self, session_name):
...@@ -220,6 +223,8 @@ class BaseView(object): ...@@ -220,6 +223,8 @@ class BaseView(object):
if self.list_schema: if self.list_schema:
allow_edit = kwargs.get("allow_edit", True) allow_edit = kwargs.get("allow_edit", True)
allow_delete = kwargs.get("allow_delete", True) allow_delete = kwargs.get("allow_delete", True)
allow_post = kwargs.get("allow_post", False)
allow_unpost = kwargs.get("allow_unpost", False)
state_save = kwargs.get("state_save", False) state_save = kwargs.get("state_save", False)
schema = self.list_schema() schema = self.list_schema()
schema = schema.bind(request=self.req) schema = schema.bind(request=self.req)
...@@ -233,7 +238,10 @@ class BaseView(object): ...@@ -233,7 +238,10 @@ class BaseView(object):
request=self.req, request=self.req,
allow_edit=allow_edit, allow_edit=allow_edit,
allow_delete=allow_delete, allow_delete=allow_delete,
state_save=state_save) allow_post=allow_post,
allow_unpost=allow_unpost,
state_save=state_save,
)
resources = table.get_widget_resources() resources = table.get_widget_resources()
# resources=dict(css="", js="") # resources=dict(css="", js="")
return dict(form=table.render(), scripts="", css=resources["css"], return dict(form=table.render(), scripts="", css=resources["css"],
...@@ -251,15 +259,16 @@ class BaseView(object): ...@@ -251,15 +259,16 @@ class BaseView(object):
return self.route_list() return self.route_list()
def next_edit(self, form, **kwargs): def next_edit(self, form, **kwargs):
return self.route_list() return self.route_list(**kwargs)
def view_view(self): # row = query_id(request).first() def view_view(self, **kwargs): # row = query_id(request).first()
request = self.req request = self.req
row = self.query_id().first() row = self.query_id().first()
if not row: if not row:
return self.id_not_found() return self.id_not_found()
bindings = self.get_bindings(row) bindings = self.get_bindings(row)
form = self.get_form(self.edit_schema, buttons=(btn_close,), buttons = kwargs.get("buttons", (btn_close,))
form = self.get_form(self.edit_schema, buttons=buttons,
bindings=bindings) bindings=bindings)
if request.POST: if request.POST:
result = self.next_view(form, row=row) result = self.next_view(form, row=row)
...@@ -273,13 +282,40 @@ class BaseView(object): ...@@ -273,13 +282,40 @@ class BaseView(object):
form.set_appstruct(values) form.set_appstruct(values)
table = self.get_item_table(row) table = self.get_item_table(row)
resources = form.get_widget_resources() resources = form.get_widget_resources()
is_object = kwargs.get("is_object", False)
if is_object:
return dict(form=form,
readonly=True,
table=table and table.render() or None,
scripts=self.form_scripts,
css=resources["css"],
js=resources["js"],
**kwargs
)
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,
scripts=self.form_scripts, scripts=self.form_scripts,
css=resources["css"], css=resources["css"],
js=resources["js"] js=resources["js"],
**kwargs
) )
def set_post(self, **kwargs):
pass
def set_unpost(self, **kwargs):
pass
def view_post(self, post_field="status", **kwargs):
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
if getattr(row, post_field):
buttons = (btn_unpost, btn_close)
else:
buttons = (btn_post, btn_close)
return self.view_view(buttons=buttons)
def view_upload(self, exts=('.png', '.ico')): def view_upload(self, exts=('.png', '.ico')):
bindings = self.get_bindings() bindings = self.get_bindings()
form = self.get_form(self.upload_schema, bindings=bindings) form = self.get_form(self.upload_schema, bindings=bindings)
...@@ -349,10 +385,9 @@ class BaseView(object): ...@@ -349,10 +385,9 @@ class BaseView(object):
def next_act(self): def next_act(self):
url_dict = self.req.matchdict url_dict = self.req.matchdict
raise HTTPNotFound raise HTTPNotFound
def jasper_response(self, **kwargs): def pdf_response(self, **kwargs):
from opensipkd.base.tools.report import jasper_export from opensipkd.base.tools.report import jasper_export
filename = jasper_export(self.report_file) filename = jasper_export(self.report_file)
return file_response(self.req, filename=filename[0]) return file_response(self.req, filename=filename[0])
...@@ -375,59 +410,61 @@ class BaseView(object): ...@@ -375,59 +410,61 @@ class BaseView(object):
def list_filter(self, query): def list_filter(self, query):
return query return query
def get_list(self):
url = []
if not self.columns:
columns = []
for d in self.list_schema():
global_search = True
if hasattr(d, "searchable"):
if d.searchable == False:
global_search = False
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,
global_search=global_search
))
else:
columns.append(
ColumnDT(getattr(self.table, d.name), mData=d.name,
global_search=global_search))
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"):
query = query.filter(
self.table.company_id == self.req.user.company_id)
query = self.list_filter(query)
row_table = DataTables(self.req.GET, query, columns)
result = row_table.output_result()
# for k, v in d.items():
# if k in url and v:
# link = "/".join([self.home, nik_url, v])
# d[k] =f'<a href="{link}" target="_blank">View</a>'
return result
def view_act(self, **kwargs): def view_act(self, **kwargs):
url_dict = self.req.matchdict url_dict = self.req.matchdict
if url_dict['act'] == 'grid': if url_dict['act'] == 'grid':
url = [] return self.get_list()
if not self.columns:
columns = []
for d in self.list_schema():
global_search = True
if hasattr(d, "searchable"):
if d.searchable == False:
global_search = False
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,
global_search=global_search
))
else:
columns.append(
ColumnDT(getattr(self.table, d.name), mData=d.name,
global_search=global_search))
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"):
query = query.filter(
self.table.company_id == self.req.user.company_id)
query = self.list_filter(query)
row_table = DataTables(self.req.GET, query, columns)
result = row_table.output_result()
# for d in result["data"]:
# for k, v in d.items():
# if k in url and v:
# link = "/".join([self.home, nik_url, v])
# d[k] =f'<a href="{link}" target="_blank">View</a>'
return result
elif url_dict['act'] == 'csv': elif url_dict['act'] == 'csv':
return self.csv_response() return self.csv_response()
elif url_dict['act'] == 'pdf': elif url_dict['act'] == 'pdf':
return self.jasper_response() return self.pdf_response()
else: else:
return self.next_act() return self.next_act()
...@@ -437,6 +474,7 @@ class BaseView(object): ...@@ -437,6 +474,7 @@ class BaseView(object):
form = self.get_form(self.add_schema, **kwargs) form = self.get_form(self.add_schema, **kwargs)
table = self.get_item_table(**kwargs) table = self.get_item_table(**kwargs)
resources = form.get_widget_resources() resources = form.get_widget_resources()
is_object = kwargs.get("is_object", False)
if self.req.POST: if self.req.POST:
if 'save' in self.req.POST: if 'save' in self.req.POST:
controls = self.req.POST.items() controls = self.req.POST.items()
...@@ -458,11 +496,21 @@ class BaseView(object): ...@@ -458,11 +496,21 @@ class BaseView(object):
# log.debug(hasattr(e.field, k)) # log.debug(hasattr(e.field, k))
# if isinstance(f, colander.Date): # if isinstance(f, colander.Date):
# e.cstruct[f] = date_from_str(e.cstruct[f]) # e.cstruct[f] = date_from_str(e.cstruct[f])
if is_object:
return dict(form=form,
table=table and table.render() or None,
scripts=self.form_scripts,
css=resources["css"],
js=resources["js"],
**kwargs
)
return dict(form=form.render(e.cstruct), return dict(form=form.render(e.cstruct),
table=table and table.render() or None, table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], scripts=self.form_scripts, css=resources["css"],
js=resources["js"]) js=resources["js"],
**kwargs
)
values = dict(c) values = dict(c)
row = self.save_request(values) row = self.save_request(values)
return self.after_add(row=row, **kwargs) return self.after_add(row=row, **kwargs)
...@@ -474,12 +522,21 @@ class BaseView(object): ...@@ -474,12 +522,21 @@ class BaseView(object):
return self.route_list(**kwargs) return self.route_list(**kwargs)
values = self.before_add() values = self.before_add()
form.set_appstruct(values) form.set_appstruct(values)
if is_object:
return dict(form=form,
table=table and table.render() or None,
scripts=self.form_scripts,
css=resources["css"],
js=resources["js"],
**kwargs
)
return dict(form=form.render(), table=table and table.render() or None, return dict(form=form.render(), table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], scripts=self.form_scripts, css=resources["css"],
js=resources["js"]) js=resources["js"])
def save(self, values, user, row=None): def save(self, values, user, row=None):
log.debug("Save") log.info("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
...@@ -534,6 +591,8 @@ class BaseView(object): ...@@ -534,6 +591,8 @@ class BaseView(object):
def view_edit(self, **kwargs): def view_edit(self, **kwargs):
request = self.req request = self.req
row = self.query_id().first() row = self.query_id().first()
is_object = kwargs.get("is_object", False)
if not row: if not row:
return self.id_not_found(**kwargs) return self.id_not_found(**kwargs)
if not self.bindings: if not self.bindings:
...@@ -553,9 +612,17 @@ class BaseView(object): ...@@ -553,9 +612,17 @@ 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.error(f"Edit Error: {str(e.error)}")
# log.debug(f"Edit Data: {e.cstruct}") # log.debug(f"Edit Data: {e.cstruct}")
form.set_appstruct(e.cstruct) form.set_appstruct(e.cstruct)
if is_object:
return dict(form=form,
table=table and table.render() or None,
scripts=self.form_scripts,
css=resources["css"],
js=resources["js"],
**kwargs
)
return dict(form=form.render(), return dict(form=form.render(),
table=table and table.render() or None, table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], scripts=self.form_scripts, css=resources["css"],
...@@ -569,6 +636,14 @@ class BaseView(object): ...@@ -569,6 +636,14 @@ class BaseView(object):
values = self.get_values(row) values = self.get_values(row)
form.set_appstruct(values) form.set_appstruct(values)
form = self.before_edit(form) form = self.before_edit(form)
if is_object:
return dict(form=form,
table=table and table.render() or None,
scripts=self.form_scripts,
css=resources["css"],
js=resources["js"],
**kwargs
)
return dict(form=form.render(), table=table and table.render() or None, return dict(form=form.render(), table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], scripts=self.form_scripts, css=resources["css"],
js=resources["js"]) js=resources["js"])
...@@ -576,10 +651,12 @@ class BaseView(object): ...@@ -576,10 +651,12 @@ class BaseView(object):
def before_delete(self, row): def before_delete(self, row):
pass pass
def view_delete(self): def view_delete(self, **kwargs):
request = self.req request = self.req
q = self.query_id() q = self.query_id()
row = q.first() row = q.first()
is_object = kwargs.get("is_object", False)
if not row: if not row:
return self.id_not_found() return self.id_not_found()
if not self.bindings: if not self.bindings:
...@@ -587,7 +664,12 @@ class BaseView(object): ...@@ -587,7 +664,12 @@ class BaseView(object):
if request.POST: if request.POST:
if 'delete' in request.POST: if 'delete' in request.POST:
msg = self.delete_msg(row) msg = self.delete_msg(row)
self.before_delete(row) try:
self.before_delete(row)
except Exception as e:
self.ses.flash(e, "error")
return self.route_list()
q.delete() q.delete()
self.db_session.flush() self.db_session.flush()
request.session.flash(msg) request.session.flash(msg)
...@@ -597,6 +679,15 @@ class BaseView(object): ...@@ -597,6 +679,15 @@ class BaseView(object):
table = self.get_item_table(row) table = self.get_item_table(row)
resources = form.get_widget_resources() resources = form.get_widget_resources()
form.set_appstruct(self.get_values(row)) form.set_appstruct(self.get_values(row))
if is_object:
return dict(form=form,
readonly=True,
table=table and table.render() or None,
scripts=self.form_scripts,
css=resources["css"],
js=resources["js"],
**kwargs
)
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,
scripts=self.form_scripts, css=resources["css"], scripts=self.form_scripts, css=resources["css"],
......
...@@ -35,6 +35,14 @@ def departemen_widget(node, kw): ...@@ -35,6 +35,14 @@ def departemen_widget(node, kw):
return widget.Select2Widget(values=values) return widget.Select2Widget(values=values)
def departemen_widget_form():
return widget.AutocompleteInputWidget(
size=60, min_length=3,
requirements=(("typeahead", None), ("deform", None),
{"js": "opensipkd.base:static/js/form/departemen_form.js"}),
)
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
parent_id = colander.SchemaNode( parent_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
......
...@@ -114,6 +114,8 @@ class DeTable(field.Field): ...@@ -114,6 +114,8 @@ class DeTable(field.Field):
allow_edit=True, allow_edit=True,
allow_delete=True, allow_delete=True,
allow_view=True, allow_view=True,
allow_post=False,
allow_unpost=False,
**kw **kw
): ):
# field.Field.__init__(self, schema, **kw) # field.Field.__init__(self, schema, **kw)
...@@ -165,6 +167,8 @@ class DeTable(field.Field): ...@@ -165,6 +167,8 @@ class DeTable(field.Field):
self.allow_edit = json.dumps(allow_edit) self.allow_edit = json.dumps(allow_edit)
self.allow_delete = json.dumps(allow_delete) self.allow_delete = json.dumps(allow_delete)
self.allow_view = json.dumps(allow_view) self.allow_view = json.dumps(allow_view)
self.allow_post = json.dumps(allow_post)
self.allow_unpost = json.dumps(allow_unpost)
table_widget = getattr(schema, "widget", None) table_widget = getattr(schema, "widget", None)
if table_widget is None: if table_widget is None:
table_widget = widget.TableWidget() table_widget = widget.TableWidget()
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
allow_edit allow_edit|field.allow_edit; allow_edit allow_edit|field.allow_edit;
allow_delete allow_delete|field.allow_delete; allow_delete allow_delete|field.allow_delete;
allow_view allow_view|field.allow_view; allow_view allow_view|field.allow_view;
allow_post allow_post|field.allow_post;
allow_unpost allow_unpost|field.allow_unpost;
state_save state_save|field.state_save; state_save state_save|field.state_save;
" "
tal:attributes="style style; class css_class; attributes|field.widget.attributes|{};" tal:attributes="style style; class css_class; attributes|field.widget.attributes|{};"
...@@ -66,54 +68,66 @@ ...@@ -66,54 +68,66 @@
if (value === true) { if (value === true) {
return '<i class="fas fa-check-square" aria-hidden="true">'; return '<i class="fas fa-check-square" aria-hidden="true">';
} }
return 'Archived'; if (value === false) {
return 'Archived';
}
return value;
} }
function render_checklist(value) { function render_checklist(value) {
return '<input type="checkbox" checked="'+{value}+'"></input>'; return '<input type="checkbox" checked="' + {value} + '"></input>';
} }
for (let co in ${tableid}Columns) { for (let co in ${tableid}Columns) {
if (${tableid}Columns[co].checkbox === true) { if (${tableid}Columns[co].checkbox === true) {
${tableid}Columns[co].className = "text-center"; ${tableid}Columns[co].className = "text-center";
${tableid}Columns[co].width = "30pt"; ${tableid}Columns[co].width = "30pt";
${tableid}Columns[co].render = function (val) { ${tableid}Columns[co].render = function (value) {
if (["", false, 0].indexOf(val) === -1) { if (typeof value === "string" && value.length>0) {
return render_checkbox(true); return render_checkbox(value)
} else return render_checkbox(false); }
if (["", false, 0].indexOf(value) === -1) {
return render_checkbox(true);
} }
return render_checkbox(false);
} }
else if (${tableid}Columns[co].hasOwnProperty("url")) { } else if (${tableid}Columns[co].hasOwnProperty("url")) {
let url = ${tableid}Columns[co].url; let url = ${tableid}Columns[co].url;
${tableid}Columns[co].render = function (data) { ${tableid}Columns[co].render = function (data) {
let result = "No Data" let result = "No Data"
if (data != null) { if (data != null) {
result = '<a href="' + url + data + '" target="_blank">Link</a>&nbsp;'; result = '<a href="' + url + data + '" target="_blank">Link</a>&nbsp;';
}
return result;
} }
return result;
} }
else if (${tableid}Columns[co].data === "id" && ${tableid}Columns[co].action === true) { } else if (${tableid}Columns[co].data === "id" && ${tableid}Columns[co].action === true) {
${tableid}Columns[co].render = function (id) { ${tableid}Columns[co].render = function (id) {
let result = "" let result = ""
if (${allow_view}) { if (${allow_view}) {
result = '<a href="${url}/' + id + '/view"><i class="fas fa-eye" aria-hidden="true"></i></a>&nbsp;'; result = '<a href="${url}/' + id + '/view"><i class="fas fa-eye" aria-hidden="true" title="View"></i></a>&nbsp;';
}
if (${allow_edit}) {
result += '<a href="${url}/' + id + '/edit"><i class="fas fa-edit" aria-hidden="true"></i></a>&nbsp;'
}
if (${allow_delete}) {
result += '<a href="${url}/' + id + '/delete"><i class="fas fa-trash" aria-hidden="true"></i></a>';
}
return result;
} }
${tableid}Columns[co].width = "30pt"; if (${allow_edit}) {
${tableid}Columns[co].orderable = false; result += '<a href="${url}/' + id + '/edit"><i class="fas fa-edit" aria-hidden="true" title="Edit"></i></a>&nbsp;'
${tableid}Columns[co].className = "text-center"; }
${tableid}Columns[co].visible = true; if (${allow_delete}) {
//columns[1].order = "order_asc"; result += '<a href="${url}/' + id + '/delete"><i class="fas fa-trash" aria-hidden="true" title="Delete"></i></a>';
}
if (${allow_post}) {
result += '<a href="${url}/' + id + '/post"><i class="fas fa-signs-post" aria-hidden="true" title="Post"></i></a>';
}
if (${allow_unpost}) {
result += '<a href="${url}/' + id + '/unpost"><i class="fas fa-delete-left" aria-hidden="true" title="Unpost"></i></a>';
}
return result;
} }
${tableid}Columns[co].width = "30pt";
${tableid}Columns[co].orderable = false;
${tableid}Columns[co].className = "text-center";
${tableid}Columns[co].visible = true;
//columns[1].order = "order_asc";
}
} }
let ${tableid}Language = { let ${tableid}Language = {
...@@ -149,8 +163,7 @@ ...@@ -149,8 +163,7 @@
} }
if (!${server_side}) { if (!${server_side}) {
${tableid}Params.data = ${data}; ${tableid}Params.data = ${data};
} } else {
else {
${tableid}Params.ajax = o${tableid}Url; ${tableid}Params.ajax = o${tableid}Url;
} }
o${tableid} = $('#${tableid}').DataTable(${tableid}Params); o${tableid} = $('#${tableid}').DataTable(${tableid}Params);
......
from datetime import datetime from datetime import datetime
from opensipkd.tools import as_timezone
from sqlalchemy.ext.hybrid import hybrid_property
import ziggurat_foundations.models import ziggurat_foundations.models
from sqlalchemy.orm import (scoped_session, sessionmaker, Session)
from zope.sqlalchemy import register
from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, func from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, func
from sqlalchemy import inspect as sa_inspect from sqlalchemy import inspect as sa_inspect
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import (scoped_session, sessionmaker, Session)
from zope.sqlalchemy import register
from opensipkd.tools import as_timezone
class MySession(Session): class MySession(Session):
def execute(self, clause, params=None, mapper=None, **kw): def execute(self, clause, params=None, mapper=None, **kw):
# Your magic with clause here # Your magic with clause here
print("Session:", clause, params, mapper, kw) # print("Session:", clause, params, mapper, kw)
return Session.execute(self, clause, params) #, mapper return Session.execute(self, clause, params) # , mapper
session_factory = sessionmaker(class_=MySession) session_factory = sessionmaker(class_=MySession)
...@@ -60,10 +61,14 @@ class CommonModel(object): ...@@ -60,10 +61,14 @@ class CommonModel(object):
values[column.name] = value values[column.name] = value
return values return values
def from_dict(self, values): def from_dict(self, values, date_format="%d-%m-%Y"):
for column in self.__table__.columns: for column in self.__table__.columns:
if column.name in values: if column.name in values:
setattr(self, column.name, values[column.name]) if type(column.type) == DateTime and date_format:
if values[column.name]:
setattr(self, column.name, datetime.strptime(values[column.name], date_format))
else:
setattr(self, column.name, values[column.name])
def as_timezone(self, fieldname): def as_timezone(self, fieldname):
date_ = getattr(self, fieldname) date_ = getattr(self, fieldname)
...@@ -104,7 +109,7 @@ class DefaultModel(CommonModel): ...@@ -104,7 +109,7 @@ class DefaultModel(CommonModel):
for c in columns: for c in columns:
query = query.add_columns(c) query = query.add_columns(c)
return query return query
@classmethod @classmethod
def query_id(cls, row_id, db_session=DBSession): def query_id(cls, row_id, db_session=DBSession):
return cls.query(db_session).filter_by(id=row_id) return cls.query(db_session).filter_by(id=row_id)
...@@ -117,7 +122,7 @@ class DefaultModel(CommonModel): ...@@ -117,7 +122,7 @@ class DefaultModel(CommonModel):
def flush(cls, row, db_session=DBSession): def flush(cls, row, db_session=DBSession):
db_session.add(row) db_session.add(row)
db_session.flush() db_session.flush()
class StandarModel(DefaultModel): class StandarModel(DefaultModel):
status = Column(SmallInteger, nullable=False, default=0) status = Column(SmallInteger, nullable=False, default=0)
......
...@@ -51,5 +51,6 @@ class ResCompany(Base, NamaModel): ...@@ -51,5 +51,6 @@ class ResCompany(Base, NamaModel):
parent_id = Column(Integer, ForeignKey("company.id")) parent_id = Column(Integer, ForeignKey("company.id"))
children = relationship("ResCompany") children = relationship("ResCompany")
parent = relationship( parent = relationship(
"ResCompany", remote_side=[id], primaryjoin="ResCompany.parent_id==ResCompany.id" "ResCompany", remote_side=[id], primaryjoin="ResCompany.parent_id==ResCompany.id",
overlaps="children"
) )
...@@ -10,10 +10,11 @@ from sqlalchemy.orm import ( ...@@ -10,10 +10,11 @@ from sqlalchemy.orm import (
backref backref
) )
from . import ResCompany from . import ResCompany, DefaultModel, User
from ..models import DBSession, Base from ..models import DBSession, Base
from ..models import (NamaModel, from ..models import (
TABLE_ARGS) NamaModel,
TABLE_ARGS)
class Departemen(Base, NamaModel): class Departemen(Base, NamaModel):
...@@ -57,59 +58,64 @@ class Departemen(Base, NamaModel): ...@@ -57,59 +58,64 @@ class Departemen(Base, NamaModel):
def get_list(cls): def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all() return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
# class DepartemenUser(Base, DefaultModel):
# __tablename__ = 'departemen_user' class DepartemenUser(Base, DefaultModel):
# user_id = Column(Integer, ForeignKey(User.id), unique=True) __tablename__ = 'departemen_user'
# departemen_id = Column(Integer, ForeignKey(Departemen.id)) user_id = Column(Integer, ForeignKey(User.id), unique=True)
# sub_departemen = Column(SmallInteger, nullable=True) departemen_id = Column(Integer, ForeignKey(Departemen.id))
# departemen = relationship("Departemen", backref="user_departemen") sub_departemen = Column(SmallInteger, nullable=True)
# user = relationship("User", backref="user_departemen") departemen = relationship("Departemen", backref="user_departemen")
# __table_args__ = TABLE_ARGS user = relationship("User", backref="user_departemen")
# __table_args__ = TABLE_ARGS
# @classmethod
# def query_user_id(cls, user_id): @classmethod
# return DBSession.query(cls).filter_by(user_id=user_id) def query_user_id(cls, user_id):
# return DBSession.query(cls).filter_by(user_id=user_id)
# @classmethod
# def get_kode(cls, user_id): @classmethod
# row = cls.query_user_id(user_id).first() def get_kode(cls, user_id):
# return row and row.departemen.kode or None row = cls.query_user_id(user_id).first()
# return row and row.departemen.kode or None
# @classmethod
# def ids(cls, user_id): @classmethod
# r = () def ids(cls, user_id):
# departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode r = ()
# ).join(Departemen).filter(cls.departemen_id == Departemen.id, departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# cls.user_id == user_id).all() ).join(Departemen).filter(cls.departemen_id == Departemen.id,
# for departemen in departemens: cls.user_id == user_id).all()
# if departemen.sub_departemen: for departemen in departemens:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all() if departemen.sub_departemen:
# else: rows = DBSession.query(Departemen.id).filter(
# rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all() Departemen.kode.ilike('%s%%' % departemen.kode)).all()
# for i in range(len(rows)): else:
# r = r + (rows[i]) rows = DBSession.query(Departemen.id).filter(
# return r Departemen.kode == departemen.kode).all()
# for i in range(len(rows)):
# @classmethod r = r + (rows[i])
# def departemen_granted(cls, user_id, departemen_id): return r
# departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# ).join(Departemen).filter(cls.departemen_id == Departemen.id, @classmethod
# cls.user_id == user_id).all() def departemen_granted(cls, user_id, departemen_id):
# for departemen in departemens: departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# if departemen.sub_departemen: ).join(Departemen).filter(cls.departemen_id == Departemen.id,
# rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all() cls.user_id == user_id).all()
# else: for departemen in departemens:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all() if departemen.sub_departemen:
# for i in range(len(rows)): rows = DBSession.query(Departemen.id).filter(
# if int(rows[i][0]) == int(departemen_id): Departemen.kode.ilike('%s%%' % departemen.kode)).all()
# return True else:
# return False rows = DBSession.query(Departemen.id).filter(
# Departemen.kode == departemen.kode).all()
# @classmethod for i in range(len(rows)):
# def get_filtered(cls, request): if int(rows[i][0]) == int(departemen_id):
# filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd'] return True
# q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \ return False
# filter(UserDepartemen.user_id == request.user.id,
# UserDepartemen.departemen_id == Departemen.id, # @classmethod
# text(filter)) # def get_filtered(cls, request):
# return q1.first() # filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd']
# q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \
# filter(UserDepartemen.user_id == request.user.id,
# UserDepartemen.departemen_id == Departemen.id,
# text(filter))
# return q1.first()
...@@ -166,7 +166,8 @@ class User(UserMixin, BaseModel, DefaultModel, Base): ...@@ -166,7 +166,8 @@ class User(UserMixin, BaseModel, DefaultModel, Base):
class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base): class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base):
user = relationship(User, backref=backref("external")) user = relationship(User, backref=backref("external"),
overlaps="external_identities,owner")
@classmethod @classmethod
def query(cls): def query(cls):
......
import os import os
from setuptools import setup, find_packages from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__)) here = os.path.abspath(os.path.dirname(__file__))
...@@ -15,6 +16,8 @@ requires = [ ...@@ -15,6 +16,8 @@ requires = [
'colander==1.8.3', 'colander==1.8.3',
'pyramid', 'pyramid',
'pyramid_tm', 'pyramid_tm',
"pyramid_beaker",
"pyramid_mailer",
'SQLAlchemy', 'SQLAlchemy',
'transaction', 'transaction',
'waitress', 'waitress',
...@@ -74,7 +77,7 @@ setup( ...@@ -74,7 +77,7 @@ setup(
'base/alembic/versions/*.*', 'base/alembic/versions/*.*',
'base/views/*.tpl', 'base/views/*.tpl',
'base/locale/*.*', 'base/locale/*.*',
], }, ], },
data_files=[('etc', ['etc/live_opensipkd.tpl', data_files=[('etc', ['etc/live_opensipkd.tpl',
'etc/test_opensipkd.tpl', ])], 'etc/test_opensipkd.tpl', ])],
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!