Commit 91124f84 by aagusti

list simple

1 parent 6354fa0b
$(document).ready(function () {
$('#parent_nm').bind('typeahead:selected', function (obj, datum, name) {
$('#parent_id').val(datum.id);
$('#parent_kd').val(datum.kode);
console.log(datum.kode);
});
});
\ No newline at end of file \ No newline at end of file
/* dataTables Customize */ /* dataTables Customize */
table.dataTable thead { table.dataTable thead {
-- background-color: #EAEAEA; background-color: #EAEAEA;
} }
table.table-hover>tbody>tr:hover {
table.table-hover > tbody > tr:hover {
background-color: #9FAFD1; background-color: #9FAFD1;
} }
table.dataTable tr.even.selected td { table.dataTable tr.even.selected td {
background-color: #B0BED9; background-color: #B0BED9;
} }
table.dataTable tr.odd.selected td { table.dataTable tr.odd.selected td {
background-color: #9FAFD1; background-color: #9FAFD1;
} }
@media only screen and (max-width: 980px) { @media only screen and (max-width: 980px) {
aside { aside {
padding-bottom:60px; padding-bottom: 60px;
} }
} }
aside span.footer-side { aside span.footer-side {
position:absolute; position: absolute;
bottom:10px; bottom: 10px;
display:block; display: block;
text-align:center; text-align: center;
width:100%; width: 100%;
font-size:12px; font-size: 12px;
color:#c0bbb7; color: #c0bbb7;
} }
.minified aside span.footer-side { .minified aside span.footer-side {
display:none; display: none;
} }
.loading { .loading {
background:url(../img/loading.gif) left center no-repeat; background: url(../img/loading.gif) left center no-repeat;
padding-left:30px !Important; padding-left: 30px !Important;
}
input.tt-hint {
padding-left: 30px !Important;
}
.tab-content {
padding-top: 20px
}
.help-block {
color: #ff0000;
font-weight: bold;
}
.SmallBox p {
letter-spacing: 0.1px;
}
.SmallBox span {
letter-spacing: 0.1px;
}
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:hover {
color: #555!important
}
#loading {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: fixed;
display: block;
opacity: 0.7;
background-color: #fff;
z-index: 1000;
text-align: center;
}
#loading-image {
display:block;
margin-top: auto;
margin-bottom: auto;
margin-left: auto;
margin-right: auto;
/*width: 10%;*/
z-index: 1000;
}
body {
background: 0 0;
background-image: url(/static/img/background.png);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
background-attachment: fixed
}
.navbar-default .navbar-nav>li>a {
color: #fff
}
.navbar-default .navbar-nav>li>a:hover {
color: #fff
}
.project-context .title-page {
font-size: 16px;
line-height: 40px;
color: #474544
}
.dataTable td {
transition: opacity 1s ease 0s
}
body,
html {
overflow-x: hidden
}
.well {
background-color: #fff
}
#header {
background-image: none!important;
background-color: #57889c!important;
box-shadow: none!important;
border: 0!important;
height:auto !important;
}
.container {
height: 100%
}
.fixed-navigation nav>ul {
height: auto
}
#header #logo-group {
padding: 2px 5px
}
#header #logo-group #logo {
margin: 0
}
#header #logo-group #logo img {
height: 44px;
width: auto;
margin: 0
}
.project-context .title-page {
font-weight: 400;
color: #fff
}
#header .header-dropdown-list a.dropdown-toggle,
.project-context .label,
.project-context .project-selector {
color: #fff
}
.project-context .label {
text-shadow: none
}
#header #fullscreen a,
#header #hide-menu a {
background-image: none;
background-color: #fff;
border: 0;
color:#222;
}
.alert {
border-left-width: 0
}
.btn-primary {
background-color: #57889c!important;
color: #fff!important;
border: 0
}
.btn-default {
background-color: #e6e6e6!important;
color: #676767!important;
border: 0
}
.alert-info,
.btn-info {
background-color: #1956af!important;
color: #fff!important
}
.alert-success,
.btn-success {
background-color: #00a65a!important;
color: #fff!important
}
.alert-warning,
.btn-warning {
background-color: #f39c12!important;
color: #fff!important
}
.alert-danger,
.btn-danger {
background-color: #dd4b39!important;
color: #fff!important
}
.btn {
border: 0!important
}
.help-block {
color: #f30303!important
}
nav ul li a i {
width: 24px!important
}
@media only screen and (max-width:768px) {
#header #fullscreen a,
#header #hide-menu a {
background-image: none;
background-color: rgba(255, 255, 255, 0);
border: 0
}
#hide-menu i {
color: #fff!important
}
}
.btn,
a:link,
button {
-webkit-tap-highlight-color: rgba(87, 136, 156, .5)
}
.panel {
border: 1px solid #ddd!important
}
.panel-danger {
border-color: #dd4b39
}
.panel-success {
border-color: #00a65a
}
.panel-info {
/*border-color: #1956af*/
border-color: #57889c
}
.panel-warning {
border-color: #f39c12
}
.panel-danger>.panel-heading {
color: #fff;
background-color: #dd4b39;
border-color: #dd4b39
}
.panel-success>.panel-heading {
color: #fff;
background-color: #00a65a;
border-color: #00a65a
}
.panel-info>.panel-heading {
color: #fff;
/*background-color: #1956af;*/
background-color: #57889c;
border-color: #57889c
/*border-color: #1956af*/
}
.panel-warning>.panel-heading {
color: #fff;
background-color: #f39c12;
border-color: #f39c12
}
table.dataTable tr.selected td {
background-color: #9fafd1
}
:fullscreen #fullscreen>:first-child>a {
color: #6d6a69
}
.select2-selection__rendered {
padding-left: 0
}
.select2-selection--single {
height: 32px!important;
border-radius: 0!important;
border: 1px solid #ccc!important
}
div.toolbar::after {
content: "\0020";
width:100vw;
display:block;
clear:both;
}
div.dataTables_length select,
div.dataTables_filter input {
display:inline;
}
div.dataTables_filter label {
margin-bottom:0px;
}
div.dataTables_length label {
margin-bottom:0px;
}
.dataTables_wrapper {
overflow-x:scroll !important;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
padding-left:7px;
padding-right:7px;
} }
input.tt-hint { .dataTables_length {
padding-left:30px !Important; margin-left:6px;
} }
.tab-content { padding-top:20px }
.help-block { color: #ff0000; font-weight: bold; }
.SmallBox p { letter-spacing: 0.1px; }
.SmallBox span { letter-spacing: 0.1px; }
\ No newline at end of file \ No newline at end of file
.ui-autocomplete-loading {
padding-right:10px;
background: url("../img/loading.gif") right 10px center no-repeat !important;
}
.ui-autocomplete {
max-height: 200px;
overflow-y: auto;
overflow-x: hidden;
}
.panel-body {
margin: 0 auto !important;
}
.col-md-5 {
padding: 0px 15px !important;
}
form.form-horizontal {
padding: 0 !important;
}
div.col-md-6 {
padding-right: 12px !important;
padding-left: 15px !important;
}
.twitter-typeahead .tt-query,
.twitter-typeahead .tt-hint {
padding: .25rem .5rem !important;
line-height: normal;
font-size: 12px;
border-radius: 0 !important;
}
.form-control{
font-size:10px !important;
height: 26px;
padding: 3px 6px;
margin-bottom: 1px !important;
}
.form-control-static {
border: 1px solid #ccc;
padding: 6px 6px;
height: 26px;
background-color: #ccc;
font-size: 10px;
margin-bottom: 1px;
}
.control-label{
font-size:10px !important;
padding: 3px 6px!important;
margin-top: 1px !important;
margin-bottom: 1px !important;
}
.help-block{
font-size:10px !important;
padding: 1px 1px !important;
}
.input-group-addon {
padding: 3px 3px !important;
font-size: 10px !important;
}
.input-group-addon:first-child {
padding: 3px 3px !important;
font-size: 10px !important;
}
.input-group {
padding: 3px 3px 7px !important;
font-size: 10px !important;
}
.form-group {
text-align: left;
margin-top:5px !important;
margin-bottom:5px !important;
}
.dataTables_filter .input-group-addon{
width: 32px !important;
margin-top: 0 !important;
float: left !important;
height: 26px !important;
padding-top: 4px !important;
}
.fc-border-separate thead tr, .table thead tr {
font-size:10px !important;
}
.twitter-typeahead{
font-size: 10px !important;
margin-bottom: 0;
width: 100%;
height: 26px;
position: absolute;
top: 0;
left: 0;
z-index:2;
}
.twitter-typeahead .tt-query, .twitter-typeahead .tt-hint {
font-size: 10px !important;
margin-bottom: 0;
width: 100%;
height: 26px;
position: absolute;
top: 0;
left: 0;
z-index:2;
}
.table-responsive {
overflow-x: hidden !important;
}
.dataTables_wrapper {
overflow-x: hidden !important;
}
.dataTables_filter{
margin-left: -8px !important;
}
.table tbody tr td {
font-size: 10px;
}
.span-new {
border-left: 0;
margin: -5px;
border: -12px;
padding: 7px !important;
}
.form-horizontal .checkbox, .form-horizontal .radio {
padding: 0px;
}
.checkbox, .radio {
position: relative;
display: block;
margin-top: 3px;
margin-bottom: 3px;
}
.form-tutup {
margin-left: 5px;
}
.footer-me {
padding-top: -16px;
margin-top: 4px;
}
.alert-success {
margin-bottom: 5px;
margin-left: 8px;
margin-right: 8px;
}
.alert-danger {
margin-bottom: 5px;
margin-left: 8px;
margin-right: 8px;
}
.twitter-typeahead .tt-query, .twitter-typeahead .tt-hint {
font-size: 10px !important;
}
.disabled {
color:
#000;
}
.checkbox label, .radio label {
font-size: 10px !important;
}
input[type="checkbox"], input[type="radio"] {
margin-top: 1px !important;
}
.list-group, .list-group-item {
font-size: 10px !important;
padding: 6px 15px !important;
}
function showError(msg) {
$("#success").css('display', 'none', 'important');
$("#errors").css('display', 'box', 'important');
$("#errors").html("<span class='glyphicon glyphicon-remove'></span> " + msg);
console.log(msg);
};
function showSuccess(msg) {
$("#errors").css('display', 'none', 'important');
$("#success").css('display', 'box', 'important');
$("#success").html("<span class='glyphicon glyphicon-ok'></span> " + msg);
};
$(function () {
var current = location.pathname;
$('nav li a').each(function () {
var $this = $(this);
if ($this.attr('href') != '' && $this.attr('href') != '#') {
if ($this.attr('href') == current) {
$this.parent().addClass('active');
var ul_parent = $this.parents('ul');
ul_parent.show();
ul_parent.parents('li').addClass('open');
}
}
})
});
$(document).ready(function () {
// DO NOT REMOVE : GLOBAL FUNCTIONS!
pageSetUp();
/*
* PAGE RELATED SCRIPTS
*/
});
function number_format(number, decimals, dec_point, thousands_sep) {
// Strip all characters but numerical ones.
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function (n, prec) {
var k = Math.pow(10, prec);
return '' + Math.round(n * k) / k;
};
// Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
}
import os import os
import re import re
from datetime import datetime from datetime import datetime
from datatables import ColumnDT
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from opensipkd.tools.captcha import get_captcha from opensipkd.tools.captcha import get_captcha
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from .common import DataTables
from .. import DBSession, get_params from .. import DBSession, get_params
from opensipkd.tools import dmy, dmy_to_date, get_settings, get_ext from opensipkd.tools import dmy, dmy_to_date, get_settings, get_ext
import colander import colander
from deform import (widget, Form, ValidationFailure, ) from deform import (widget, Form, ValidationFailure, )
from email.utils import parseaddr from email.utils import parseaddr
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_view, btn_add, btn_edit, btn_csv, \
btn_pdf
from ..models import User from ..models import User
from ...detable import DeTable
class BaseView(object): class BaseView(object):
...@@ -102,11 +107,14 @@ class BaseView(object): ...@@ -102,11 +107,14 @@ class BaseView(object):
self.list_route = 'home' self.list_route = 'home'
self.list_col_defs = "" self.list_col_defs = ""
self.list_cols = "" self.list_cols = ""
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \ # self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close' # 'btn_close'
self.list_report = (btn_csv, btn_pdf)
self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = '' self.list_url = ''
self.list_route = '' self.list_route = ''
self.list_schema = ""
self.form_scripts = """ self.form_scripts = """
$('#parent_nm').bind('typeahead:selected', function(obj, datum) { $('#parent_nm').bind('typeahead:selected', function(obj, datum) {
$('#parent_id').val(datum.id); $('#parent_id').val(datum.id);
...@@ -121,7 +129,9 @@ class BaseView(object): ...@@ -121,7 +129,9 @@ class BaseView(object):
self.headers = None self.headers = None
self.bindings = {} self.bindings = {}
self.autocomplete = 'on' self.autocomplete = 'on'
# self.captcha = ""
def delete_msg(self, row):
return f'Data ID {row.id} sudah dihapus.'
def route_list(self, msg=None, error=""): def route_list(self, msg=None, error=""):
if msg: if msg:
...@@ -139,8 +149,8 @@ class BaseView(object): ...@@ -139,8 +149,8 @@ class BaseView(object):
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **bindings): def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **bindings):
buttons = self.buttons and self.buttons or buttons buttons = self.buttons and self.buttons or buttons
bindings = self.bindings and self.bindings or bindings bindings = self.bindings and self.bindings or self.get_bindings()
schema = class_form(validator=self.form_validator) # schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req, **bindings) schema = schema.bind(request=self.req, **bindings)
schema.request = self.req schema.request = self.req
if row: if row:
...@@ -153,18 +163,28 @@ class BaseView(object): ...@@ -153,18 +163,28 @@ class BaseView(object):
return r return r
def view_list(self, arg=None): def view_list(self, arg=None):
arg = not arg and {} or arg if self.list_schema:
table = DeTable(self.list_schema(), action=self.req.route_url(self.list_route),
action_suffix="/grid/act",
buttons=self.list_buttons)
resources = table.get_widget_resources()
return dict(form=table.render(), scripts="", css=resources["css"], js=resources["js"])
arg = arg and arg or {}
arg.update(url=self.list_url, col_defs=self.list_col_defs, arg.update(url=self.list_url, col_defs=self.list_col_defs,
cols=self.list_cols, buttons=self.list_buttons) cols=self.list_cols, buttons=self.list_buttons)
return arg return arg
def get_bindings(self, row=None):
return {}
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()
if not row: if not row:
return self.id_not_found() return self.id_not_found()
bindings = hasattr(self, "get_bindings") and self.get_bindings() or None bindings = self.get_bindings(row)
form = self.get_form(self.edit_schema, buttons=(btn_close,), bindings=bindings) form = self.get_form(self.edit_schema, buttons=(btn_close,), **bindings)
if request.POST: if request.POST:
return self.route_list() return self.route_list()
...@@ -174,15 +194,52 @@ class BaseView(object): ...@@ -174,15 +194,52 @@ class BaseView(object):
scripts=self.form_scripts) scripts=self.form_scripts)
def before_add(self): def before_add(self):
return return {}
def validation_failure(self, value): def validation_failure(self, value):
return value return value
def cancel_act(self): def cancel_act(self):
pass pass
def after_add(self, row, values):
return
def next_act(self):
return
def list_join(self, query):
return query
def view_act(self):
url_dict = self.req.matchdict
if url_dict['act'] == 'grid':
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(getattr(self.table, d.name), mData=d.name))
query = DBSession.query().select_from(self.table)
query = self.list_join(query)
if self.req.user.company_id and hasattr(self.table, "company_id"):
query = query.filter(self.table.company_id == self.req.user.company_id)
row_table = DataTables(self.req.GET, query, columns)
return row_table.output_result()
else:
self.next_act()
def view_add(self): def view_add(self):
form = self.get_form(self.add_schema) bindings = self.get_bindings()
form = self.get_form(self.add_schema, **bindings)
table = self.get_item_table()
resources = form.get_widget_resources()
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()
...@@ -192,17 +249,19 @@ class BaseView(object): ...@@ -192,17 +249,19 @@ class BaseView(object):
value = self.validation_failure(e.cstruct) value = self.validation_failure(e.cstruct)
value.update(self.before_add()) value.update(self.before_add())
form.render(appstruct=value) form.render(appstruct=value)
return dict(form=form.render(), scripts=self.form_scripts) return dict(form=form.render(), table=table and table.render() or None,
self.save_request(dict(controls)) scripts=self.form_scripts, css=resources["css"], js=resources["js"])
values = dict(controls)
row = self.save_request(values)
self.after_add(row, values)
if "cancel" in self.req.POST or 'batal' in self.req.POST: if "cancel" in self.req.POST or 'batal' in self.req.POST:
self.cancel_act() self.cancel_act()
return self.route_list() return self.route_list()
values = self.before_add() values = self.before_add()
form.set_appstruct(values) form.set_appstruct(values)
table = self.get_item_table()
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) scripts=self.form_scripts, css=resources["css"], js=resources["js"])
def before_save(self, row, values): def before_save(self, row, values):
return row return row
...@@ -230,9 +289,9 @@ class BaseView(object): ...@@ -230,9 +289,9 @@ class BaseView(object):
def save_request(self, values, row=None): def save_request(self, values, row=None):
params = self.req.params params = self.req.params
for p in params: for k, v in params.items():
values[p] = params[p] if v:
values[k] = v
return self.save(values, self.req.user, row) return self.save(values, self.req.user, row)
def id_not_found(self): def id_not_found(self):
...@@ -262,7 +321,11 @@ class BaseView(object): ...@@ -262,7 +321,11 @@ class BaseView(object):
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()
if not self.bindings:
self.bindings = self.get_bindings(row)
form = self.get_form(self.edit_schema) form = self.get_form(self.edit_schema)
table = self.get_item_table(row)
resources = form.get_widget_resources()
if request.POST: if request.POST:
if 'save' in request.POST: if 'save' in request.POST:
controls = request.POST.items() controls = request.POST.items()
...@@ -270,15 +333,19 @@ class BaseView(object): ...@@ -270,15 +333,19 @@ class BaseView(object):
controls = form.validate(controls) controls = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
form.set_appstruct(e.cstruct) form.set_appstruct(e.cstruct)
return dict(form=form.render(), scripts=self.form_scripts) return dict(form=form.render(), table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], js=resources["js"])
self.save_request(dict(controls), row) self.save_request(dict(controls), 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)
form = self.before_edit(form) form = self.before_edit(form)
table = self.get_item_table(row) 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) scripts=self.form_scripts, css=resources["css"], js=resources["js"])
def before_delete(self, row):
pass
def view_delete(self): def view_delete(self):
request = self.req request = self.req
...@@ -288,15 +355,18 @@ class BaseView(object): ...@@ -288,15 +355,18 @@ class BaseView(object):
return self.id_not_found() return self.id_not_found()
if request.POST: if request.POST:
if 'delete' in request.POST: if 'delete' in request.POST:
msg = f'Data ID {row.id} sudah dihapus.' msg = self.delete_msg(row)
self.before_delete(row)
q.delete() q.delete()
DBSession.flush() DBSession.flush()
request.session.flash(msg) request.session.flash(msg)
return self.route_list() return self.route_list()
form = self.get_form(self.edit_schema, buttons=(btn_delete, btn_cancel)) form = self.get_form(self.edit_schema, buttons=(btn_delete, btn_cancel))
form.set_appstruct(self.get_values(row))
table = self.get_item_table(row) table = self.get_item_table(row)
return dict(form=form.render(), table=table and table.render() or None, scripts=self.form_scripts) resources = form.get_widget_resources()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], js=resources["js"])
def query_id(self): def query_id(self):
q = DBSession.query(self.table).filter_by( q = DBSession.query(self.table).filter_by(
...@@ -305,6 +375,11 @@ class BaseView(object): ...@@ -305,6 +375,11 @@ class BaseView(object):
q = q.filter_by(company_id=self.req.user.company_id) q = q.filter_by(company_id=self.req.user.company_id)
return q return q
def filter_company(self, query):
if self.req.user.company_id:
return query.filter(self.table.company_id == self.req.user.company_id)
return query
@colander.deferred @colander.deferred
def deferred_status(node, kw): def deferred_status(node, kw):
...@@ -346,6 +421,7 @@ def need_captcha(): ...@@ -346,6 +421,7 @@ def need_captcha():
is_captcha = get_params("reg_captcha") is_captcha = get_params("reg_captcha")
return is_captcha == '1' or is_captcha == "True" or is_captcha == "true" or is_captcha == True return is_captcha == '1' or is_captcha == "True" or is_captcha == "true" or is_captcha == True
def need_verify(): def need_verify():
result = get_params("reg_verify") result = get_params("reg_verify")
return result == '1' or result == "True" or result == "true" or result == True return result == '1' or result == "True" or result == "true" or result == True
......
...@@ -50,7 +50,7 @@ class ViewCompany(BaseView): ...@@ -50,7 +50,7 @@ class ViewCompany(BaseView):
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \ self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close' 'btn_close'
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = 'company' # self.list_url = 'company'
self.list_route = 'company' self.list_route = 'company'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
......
import json
import colander import colander
from deform import (widget, Form, ) from deform import (widget, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save, btn_add, btn_edit, btn_delete
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import widget_os from . import widget_os
from opensipkd.detable import DeTable
from .provinsi import provinsi_widget from .provinsi import provinsi_widget
from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
...@@ -51,7 +47,7 @@ class ListSchema(colander.Schema): ...@@ -51,7 +47,7 @@ class ListSchema(colander.Schema):
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode") kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama") nama = colander.SchemaNode(colander.String(), title="Nama")
provinsi = colander.SchemaNode(colander.String()) provinsi = colander.SchemaNode(colander.String())
status = colander.SchemaNode(colander.Integer(),width="30pt") status = colander.SchemaNode(colander.Integer(), width="30pt")
class ViewDati2(BaseView): class ViewDati2(BaseView):
...@@ -64,6 +60,7 @@ class ViewDati2(BaseView): ...@@ -64,6 +60,7 @@ class ViewDati2(BaseView):
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = ResDati2 self.table = ResDati2
self.list_schema = ListSchema
######## ########
# List # # List #
...@@ -103,43 +100,20 @@ class ViewDati2(BaseView): ...@@ -103,43 +100,20 @@ class ViewDati2(BaseView):
elif found: elif found:
err_nama() err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)): def get_bindings(self, row=None):
schema = class_form(validator=self.form_validator) return dict(request=self.req,
schema = schema.bind(request=self.req, provinsi_list=ResProvinsi.get_list())
provinsi_list=ResProvinsi.get_list())
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
@view_config(route_name='dati2', @view_config(route_name='dati2',
renderer='templates/form_input.pt', renderer='templates/table.pt',
permission='dati2') permission='dati2')
def view_list(self): def view_list(self):
table = DeTable(ListSchema(title="Kabupaten/Kota"), action=f"{self.home}/dati2", return super(ViewDati2, self).view_list()
buttons=(btn_close, btn_add, btn_edit, btn_delete))
return dict(form=table.render(), scripts=self.form_scripts)
@view_config(route_name='dati2-view', @view_config(route_name='dati2-view',
renderer='templates/form_input.pt', permission='dati2') renderer='templates/form.pt', permission='dati2')
def view_view(self): # row = query_id(request).first() def view_view(self): # row = query_id(request).first()
request = self.req return super(ViewDati2, self).view_view()
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
# @view_config(route_name='dati2',
# renderer='templates/list.pt',
# permission='dati2')
# def view_list(self):
# return super().viewlist()
@view_config(route_name='dati2-act', renderer='json', @view_config(route_name='dati2-act', renderer='json',
permission='view') permission='view')
...@@ -175,9 +149,6 @@ class ViewDati2(BaseView): ...@@ -175,9 +149,6 @@ class ViewDati2(BaseView):
def view_edt(self): def view_edt(self):
return super(ViewDati2, self).view_edit() return super(ViewDati2, self).view_edit()
##########
# Delete
##########
@view_config(route_name='dati2-delete', @view_config(route_name='dati2-delete',
renderer='templates/form_input.pt', permission='dati2') renderer='templates/form_input.pt', permission='dati2')
def view_delete(self): def view_delete(self):
......
...@@ -23,8 +23,8 @@ def desa_widget(node, kw): ...@@ -23,8 +23,8 @@ def desa_widget(node, kw):
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
kecamatan_id = colander.SchemaNode(colander.String(), kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget, widget=kecamatan_widget,
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32), oid="kode")
kode = colander.SchemaNode(colander.String(), kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(), kategori = colander.SchemaNode(colander.String(),
...@@ -38,6 +38,7 @@ class EditSchema(AddSchema): ...@@ -38,6 +38,7 @@ class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop, id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True)) widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), searchable=False, orderable=False, visible=False) id = colander.SchemaNode(colander.Integer(), searchable=False, orderable=False, visible=False)
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode") kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
...@@ -45,30 +46,18 @@ class ListSchema(colander.Schema): ...@@ -45,30 +46,18 @@ class ListSchema(colander.Schema):
kecamatan = colander.SchemaNode(colander.String()) kecamatan = colander.SchemaNode(colander.String())
status = colander.SchemaNode(colander.Integer(), width="30pt") status = colander.SchemaNode(colander.Integer(), width="30pt")
class ViewDesa(BaseView): class ViewDesa(BaseView):
def __init__(self, request): def __init__(self, request):
super(ViewDesa, self).__init__(request) super(ViewDesa, self).__init__(request)
self.form_scripts = "" self.form_scripts = ""
self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, {
"searchable": True, "orderable": True, "targets": [1, 2],
}])
self.list_cols = [{'title': "ID", 'data': "id"},
{'title': "Kecamatan", 'data': "kecamatan", 'width': '200pt'},
{'title': "Kode", 'data': "kode", 'width': '100pt'},
{'title': "Nama", 'data': "nama"}, ]
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = 'desa' self.list_url = 'desa'
self.list_route = 'desa' self.list_route = 'desa'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = ResDesa self.table = ResDesa
self.list_schema = ListSchema
########
# List #
########
def form_validator(self, form, value): def form_validator(self, form, value):
def err_kode(): def err_kode():
...@@ -104,17 +93,13 @@ class ViewDesa(BaseView): ...@@ -104,17 +93,13 @@ class ViewDesa(BaseView):
elif found: elif found:
err_nama() err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)): def get_bindings(self, row=None):
schema = class_form(validator=self.form_validator) return dict(request=self.req,
schema = schema.bind(request=self.req, kecamatan_list=ResKecamatan.get_list())
kecamatan_list=ResKecamatan.get_list())
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
@view_config(route_name='desa-view', @view_config(route_name='desa-view',
renderer='templates/form_input.pt', permission='desa') renderer='templates/form.pt', permission='desa')
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()
...@@ -129,12 +114,10 @@ class ViewDesa(BaseView): ...@@ -129,12 +114,10 @@ class ViewDesa(BaseView):
return dict(form=form.render(readonly=True), scripts=self.form_scripts) return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='desa', @view_config(route_name='desa',
renderer='templates/form_input.pt', renderer='templates/table.pt',
permission='desa') permission='desa')
def view_list(self): def view_list(self):
table = DeTable(ListSchema(title="Desa/Kelurahan"), action=f"{self.home}/desa", return super(ViewDesa, self).view_list()
buttons=(btn_close, btn_add, btn_edit, btn_delete))
return dict(form=table.render(), scripts=self.form_scripts)
@view_config(route_name='desa-act', renderer='json', @view_config(route_name='desa-act', renderer='json',
permission='view') permission='view')
...@@ -146,7 +129,7 @@ class ViewDesa(BaseView): ...@@ -146,7 +129,7 @@ class ViewDesa(BaseView):
ColumnDT(ResDesa.kode, mData='kode'), ColumnDT(ResDesa.kode, mData='kode'),
ColumnDT(ResDesa.nama, mData='nama'), ColumnDT(ResDesa.nama, mData='nama'),
ColumnDT(ResDesa.status, mData='status'), ColumnDT(ResDesa.status, mData='status'),
ColumnDT(ResKecamatan.nama, mData='kecamatan'),] ColumnDT(ResKecamatan.nama, mData='kecamatan'), ]
query = DBSession.query().select_from(ResDesa) \ query = DBSession.query().select_from(ResDesa) \
.join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id) .join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id)
row_table = DataTables(request.GET, query, columns) row_table = DataTables(request.GET, query, columns)
...@@ -157,24 +140,17 @@ class ViewDesa(BaseView): ...@@ -157,24 +140,17 @@ class ViewDesa(BaseView):
result = {f"{k[0]}": k[1] for k in data} result = {f"{k[0]}": k[1] for k in data}
return result return result
@view_config(route_name='desa-add', @view_config(route_name='desa-add',
renderer='templates/form_input.pt', permission='desa') renderer='templates/form.pt', permission='desa')
def view_add(self): def view_add(self):
return super(ViewDesa, self).view_add() return super(ViewDesa, self).view_add()
########
# Edit #
########
@view_config(route_name='desa-edit', @view_config(route_name='desa-edit',
renderer='templates/form_input.pt', permission='desa') renderer='templates/form.pt', permission='desa')
def view_edt(self): def view_edt(self):
return super(ViewDesa, self).view_edit() return super(ViewDesa, self).view_edit()
##########
# Delete
##########
@view_config(route_name='desa-delete', @view_config(route_name='desa-delete',
renderer='templates/form_input.pt', permission='desa') renderer='templates/form.pt', permission='desa')
def view_delete(self): def view_delete(self):
return super(ViewDesa, self).view_delete() return super(ViewDesa, self).view_delete()
import os
import uuid
# from ..tools import row2dict, xls_reader
from datetime import datetime from datetime import datetime
from sqlalchemy import not_, func
from pyramid.view import (
view_config,
)
from pyramid.httpexceptions import (
HTTPFound,
)
import colander import colander
from deform import ( from deform import (
Form, Form,
widget, widget,
ValidationFailure, ValidationFailure,
) )
from ..views import ColumnDT, DataTables, BaseView from pyramid.httpexceptions import (
HTTPFound,
)
from pyramid.view import (
view_config,
)
from ..models import ( from ..models import (
DBSession, DBSession,
Eselon Eselon
) )
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah eselon gagal' SESS_ADD_FAILED = 'Tambah eselon gagal'
SESS_EDIT_FAILED = 'Edit eselon gagal' SESS_EDIT_FAILED = 'Edit eselon gagal'
...@@ -33,13 +31,6 @@ class AddSchema(colander.Schema): ...@@ -33,13 +31,6 @@ class AddSchema(colander.Schema):
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
oid="nama") oid="nama")
# eselon = colander.SchemaNode(
# colander.String(),
# oid = "eselon")
# ruang = colander.SchemaNode(
# colander.String(),
# oid = "ruang")
# edit
status = colander.SchemaNode( status = colander.SchemaNode(
colander.Boolean(), colander.Boolean(),
oid="status") oid="status")
...@@ -51,10 +42,7 @@ class EditSchema(AddSchema): ...@@ -51,10 +42,7 @@ class EditSchema(AddSchema):
widget=widget.HiddenWidget()) widget=widget.HiddenWidget())
class view_eselon(BaseView): class Views(BaseView):
########
# List #
########
@view_config(route_name='eselon', renderer='templates/eselon/list.pt', @view_config(route_name='eselon', renderer='templates/eselon/list.pt',
permission='eselon') permission='eselon')
def view_list(self): def view_list(self):
......
...@@ -50,30 +50,16 @@ class ListSchema(colander.Schema): ...@@ -50,30 +50,16 @@ class ListSchema(colander.Schema):
status = colander.SchemaNode(colander.Integer(), width="30pt") status = colander.SchemaNode(colander.Integer(), width="30pt")
class ViewDati2(BaseView): class Views(BaseView):
def __init__(self, request): def __init__(self, request):
super(ViewDati2, self).__init__(request) super(Views, self).__init__(request)
self.form_scripts = ""
# self.list_col_defs = json.dumps(
# [{"searchable": False, "visible": False, "targets": [0], }, {
# "searchable": True, "orderable": True, "targets": [1, 2],
# }])
# self.list_cols = [{'title': "ID", 'data': "id"},
# {'title': "Kab/Kota", 'data': "dati2", 'width': '200pt'},
# {'title': "Kode", 'data': "kode", 'width': '100pt'},
# {'title': "Nama", 'data': "nama"}, ]
# self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
# 'btn_close'
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = 'kecamatan' self.list_url = 'kecamatan'
self.list_route = 'kecamatan' self.list_route = 'kecamatan'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = ResKecamatan self.table = ResKecamatan
self.list_schema = ListSchema
########
# List #
########
def form_validator(self, form, value): def form_validator(self, form, value):
def err_kode(): def err_kode():
...@@ -119,8 +105,9 @@ class ViewDati2(BaseView): ...@@ -119,8 +105,9 @@ class ViewDati2(BaseView):
return Form(schema, buttons=buttons) return Form(schema, buttons=buttons)
@view_config(route_name='kecamatan-view', @view_config(route_name='kecamatan-view',
renderer='templates/form_input.pt', permission='kecamatan') renderer='templates/form.pt', permission='kecamatan')
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()
if not row: if not row:
...@@ -134,12 +121,10 @@ class ViewDati2(BaseView): ...@@ -134,12 +121,10 @@ class ViewDati2(BaseView):
return dict(form=form.render(readonly=True), scripts=self.form_scripts) return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='kecamatan', @view_config(route_name='kecamatan',
renderer='templates/form_input.pt', renderer='templates/table.pt',
permission='kecamatan') permission='kecamatan')
def view_list(self): def view_list(self):
table = DeTable(ListSchema(title="Kecamatan"), action=f"{self.home}/kecamatan", return super(Views, self).view_list(self)
buttons=(btn_close, btn_add, btn_edit, btn_delete))
return dict(form=table.render(), scripts=self.form_scripts)
@view_config(route_name='kecamatan-act', renderer='json', @view_config(route_name='kecamatan-act', renderer='json',
permission='view') permission='view')
...@@ -163,22 +148,19 @@ class ViewDati2(BaseView): ...@@ -163,22 +148,19 @@ class ViewDati2(BaseView):
return result return result
@view_config(route_name='kecamatan-add', @view_config(route_name='kecamatan-add',
renderer='templates/form_input.pt', permission='kecamatan') renderer='templates/form.pt', permission='kecamatan')
def view_add(self): def view_add(self):
return super(ViewDati2, self).view_add() return super(Views, self).view_add()
########
# Edit #
########
@view_config(route_name='kecamatan-edit', @view_config(route_name='kecamatan-edit',
renderer='templates/form_input.pt', permission='kecamatan') renderer='templates/form.pt', permission='kecamatan')
def view_edt(self): def view_edt(self):
return super(ViewDati2, self).view_edit() return super(Views, self).view_edit()
########## ##########
# Delete # Delete
########## ##########
@view_config(route_name='kecamatan-delete', @view_config(route_name='kecamatan-delete',
renderer='templates/form_input.pt', permission='kecamatan') renderer='templates/form.pt', permission='kecamatan')
def view_delete(self): def view_delete(self):
return super(ViewDati2, self).view_delete() return super(Views, self).view_delete()
...@@ -11,7 +11,6 @@ from sqlalchemy.orm import aliased ...@@ -11,7 +11,6 @@ from sqlalchemy.orm import aliased
from . import widget_os from . import widget_os
from ..models import DBSession, ResProvinsi, kategori_provinsi, flush from ..models import DBSession, ResProvinsi, kategori_provinsi, flush
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
from ...detable import DeTable
SESS_ADD_FAILED = 'Tambah provinsi gagal' SESS_ADD_FAILED = 'Tambah provinsi gagal'
SESS_EDIT_FAILED = 'Edit provinsi gagal' SESS_EDIT_FAILED = 'Edit provinsi gagal'
...@@ -59,6 +58,7 @@ class ViewProvinsi(BaseView): ...@@ -59,6 +58,7 @@ class ViewProvinsi(BaseView):
self.form_scripts = "" self.form_scripts = ""
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_route = 'provinsi' self.list_route = 'provinsi'
self.list_schema = ListSchema
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = ResProvinsi self.table = ResProvinsi
...@@ -100,63 +100,31 @@ class ViewProvinsi(BaseView): ...@@ -100,63 +100,31 @@ class ViewProvinsi(BaseView):
err_nama() err_nama()
@view_config(route_name='provinsi-view', @view_config(route_name='provinsi-view',
renderer='templates/form_input.pt', permission='provinsi') renderer='templates/form.pt', permission='provinsi')
def view_view(self): # row = query_id(request).first() def view_view(self): # row = query_id(request).first()
request = self.req return super(ViewProvinsi, self).view_view()
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
form.set_appstruct(self.get_values(row))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='provinsi', @view_config(route_name='provinsi',
renderer='templates/list_table.pt', renderer='templates/table.pt',
permission='provinsi') permission='provinsi')
def view_list(self): def view_list(self):
table = DeTable(ListSchema(), action=f"{self.home}/provinsi", return super(ViewProvinsi, self).view_list()
action_suffix="/grid/act",
buttons=(btn_view, btn_add, btn_edit, btn_delete, btn_close))
return dict(table=table.render(), scripts="")
##########
# Action #
##########
@view_config(route_name='provinsi-act', renderer='json', @view_config(route_name='provinsi-act', renderer='json',
permission='view') permission='view')
def view_act(self): def view_act(self):
request = self.req return super(ViewProvinsi, self).view_act()
url_dict = request.matchdict
if url_dict['act'] == 'grid':
columns = [ColumnDT(ResProvinsi.id, mData='id'),
ColumnDT(ResProvinsi.kode, mData='kode'),
ColumnDT(ResProvinsi.nama, mData='nama'),
ColumnDT(ResProvinsi.ibu_kota, mData='ibu_kota'),
ColumnDT(ResProvinsi.status, mData='status'), ]
query = DBSession.query().select_from(ResProvinsi)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
@view_config(route_name='provinsi-add', @view_config(route_name='provinsi-add',
renderer='templates/form_input.pt', permission='provinsi') renderer='templates/form_input.pt', permission='provinsi')
def view_add(self): def view_add(self):
return super(ViewProvinsi, self).view_add() return super(ViewProvinsi, self).view_add()
########
# Edit #
########
@view_config(route_name='provinsi-edit', @view_config(route_name='provinsi-edit',
renderer='templates/form_input.pt', permission='provinsi') renderer='templates/form_input.pt', permission='provinsi')
def view_edt(self): def view_edt(self):
return super(ViewProvinsi, self).view_edit() return super(ViewProvinsi, self).view_edit()
##########
# Delete
##########
@view_config(route_name='provinsi-delete', @view_config(route_name='provinsi-delete',
renderer='templates/form_input.pt', permission='provinsi') renderer='templates/form_input.pt', permission='provinsi')
def view_delete(self): def view_delete(self):
......
<html metal:use-macro="load: ./base3.1.pt">
<js metal:fill-slot="js_files">
<script src="${home}/static/v3/js/plugin/datatables/jquery.dataTables.min.js"></script>
<script src="${home}/static/v3/js/plugin/datatables/dataTables.colVis.min.js"></script>
<script src="${home}/static/v3/js/plugin/datatables/dataTables.tableTools.min.js"></script>
<script src="${home}/static/v3/js/plugin/datatables/dataTables.bootstrap.min.js"></script>
<script src="${home}/static/v3/js/plugin/datatable-responsive/datatables.responsive.min.js"></script>
</js>
</html>
<html metal:use-macro="load: ./base3.1.pt"> <html metal:use-macro="load: ./_table.pt">
<span metal:fill-slot="scripts"> <span metal:fill-slot="scripts">
<script> <script>
var btn_view='<button id="btn_view" class="btn btn btn-general" type="button">'+ var btn_view='<button id="btn_view" class="btn btn btn-general" type="button">'+
......
<html metal:use-macro="load: ../base3.1.pt"> <html metal:use-macro="load: ../_table.pt">
<link metal:fill-slot="css_files" rel="stylesheet" type="text/css" media="screen" href="/static/v3/css/custom-datatable.css"> <link metal:fill-slot="css_files" rel="stylesheet" type="text/css" media="screen" href="/static/v3/css/custom-datatable.css">
<div metal:fill-slot="content"> <div metal:fill-slot="content">
<div class="jarviswidget" style="border-top:1px solid #ccc!important"> <div class="jarviswidget" style="border-top:1px solid #ccc!important">
......
<html metal:use-macro="load: ./base3.1.pt">
<div metal:fill-slot="content">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-fw fa-plus"></i>&nbsp;${request.title}</h3>
</div>
<div class="panel-body">
<div tal:content="structure form"></div>
</div>
</div>
</div>
<div metal:fill-slot="scripts">
<script>
// $(document).ready(function () {
// $(".read-only").attr("readonly", true);
// $(".readonly").attr("readonly", true);
// $(".date").attr("readonly", true);
// $(".date").datepicker({
// format: 'dd-mm-yyyy'
// });
<!--? ${structure:scripts}-->
// });
</script>
<div metal:define-slot="scripts"></div>
</div>
</html>
<div metal:use-macro="load: ../main.pt">
<div metal:fill-slot="content">
<div class="well">
<div tal:content="structure form"/>
</div>
</div>
</div>
<div metal:use-macro="load: ../main.pt">
<div metal:fill-slot="content">
<div class="well">
<div tal:content="structure form"/>
</div>
</div>
</div>
<div metal:use-macro="load: ../main.pt">
<div metal:fill-slot="content">
<div class="jarviswidget" style="border-top:1px solid #ccc!important">
<div role="content">
<table id="table1" class="table table-bordered table-hover table-condensed">
<thead>
<tr>
<th>ID</th>
<th>Nama Group</th>
<th>Deskripsi</th>
<th>Jml. Anggota</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript" metal:fill-slot="scripts">
var mID;
var oTable;
var oTableUri = "${home}/group"
var oTableUrl = oTableUri + "/grid/act";
$(document).ready(function () {
oTable = $('#table1').DataTable({
dom: '<"row"<"col-md-8"<"toolbar">l><"col-md-4"f>>rtip',
processing: true,
serverSide: true,
ajax: oTableUrl,
stateSave: true,
scrollCollapse: true,
sort: true,
info: false,
filter: true,
autoWidth: false,
paginate: true,
paginationType: "full_numbers",
lengthMenu: [
[10, 25, 50, 100],
[10, 25, 50, 100]
],
columnDefs: [{
searchable: false,
visible: false,
targets: [0]
}],
columns: [{
"data": "id"
},
{
"data": "name",
"width": "200px",
"class": "left"
},
{
"data": "desc"
},
{
"data": "member",
"width": "200px",
"class": "center"
},
],
"language": {
"search": "Cari: ",
"paginate": {
"first": "Pertama ",
"last": "Akhir ",
"previous": "",
"next": "",
},
"lengthMenu": "Tampil _MENU_ baris "
},
});
var tb_array = [
'<div class="btn-group pull-left"> ',
' <button id="btn_view" class="btn btn btn-warning" type="button" data-toggle="tooltip" title="View"> ' +
' <i class="fa fa-eye"></i></button>',
' <button id="btn_add" class="btn btn btn-success" type="button" data-toggle="tooltip" title="Tambah">' +
' <i class="fa fa-plus"></i></button>',
' <button id="btn_edit" class="btn btn btn-warning" type="button" data-toggle="tooltip" title="Ubah">' +
' <i class="fa fa-edit"></i></button>',
' <button id="btn_delete" class="btn btn btn-danger" type="button" data-toggle="tooltip" title="Hapus">' +
' <i class="fa fa-trash-o"></i></button>',
' <button id="btn_pdf" class="btn btn btn-primary" type="button" data-toggle="tooltip" title="PDF">' +
' <i class="fa fa-file-pdf-o"></i></button>',
' <button id="btn_csv" class="btn btn btn-primary" type="button" data-toggle="tooltip" title="CSV">' +
' <i class="fa fa-file-excel-o"></i></button>',
' <button id="btn_close" class="btn btn btn-warning" type="button" data-toggle="tooltip" title="Tutup">' +
' <i class="fa fa-arrow-right"></i></button>',
' &nbsp;',
'</div>',
];
var tb = tb_array.join(' ');
$("div.toolbar").html(tb);
$("div.toolbar").attr('style', 'display:block; float: left; margin-bottom:6px; line-height:16px;');
$('#table1 tbody').on('click', 'tr', function () {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
} else {
var aData = oTable.row(this).data();
oTable.$('tr.selected').removeClass('selected');
$(this).addClass('selected');
mID = aData.id;
console.log(mID);
oTable.$('tr.row_selected').removeClass('row_selected');
$(this).addClass('row_selected');
/*oTable2.fnReloadAjax("egaji/grid2?id=" + mID);*/
}
});
$('#btn_add').click(function () {
window.location = oTableUri + '/add';
});
$('#btn_edit').click(function () {
if (mID) window.location = oTableUri + '/' + mID + '/edit';
else
$.SmartMessageBox({
title: "Edit",
content: "Pilih Baris yang akan di edit...",
buttons: '[Oke]'
});
;
});
$('#btn_view').click(function () {
if (mID) window.location = oTableUri + '/' + mID + '/view';
else
$.SmartMessageBox({
title: "View",
content: "Pilih Baris yang akan di lihat...",
buttons: '[Ok]'
});
;
});
$('#btn_delete').click(function () {
if (mID) window.location = oTableUri + '/' + mID + '/delete';
else
$.SmartMessageBox({
title: "Hapus",
content: "Pilih Baris yang akan di hapus...",
buttons: '[Oke]'
});
});
$('#btn_csv').click(function () {
url = oTableUri + "/csv/rpt";
window.open(url);
});
$('#btn_pdf').click(function () {
url = oTableUri + "/pdf/rpt";
window.open(url);
});
$("#btn_close").click(function () {
window.location = '/';
return false;
});
});
</script>
</div>
<html metal:use-macro="load: ../base3.1.pt"> <html metal:use-macro="load: ../_table.pt">
<link metal:fill-slot="css_files" rel="stylesheet" type="text/css" media="screen" <link metal:fill-slot="css_files" rel="stylesheet" type="text/css" media="screen"
href="/static/v3/css/custom-datatable.css"> href="/static/v3/css/custom-datatable.css">
<div metal:fill-slot="content"> <div metal:fill-slot="content">
......
<html metal:use-macro="load: ../main.pt"> <html metal:use-macro="load: ../_table.pt">
<!-- content --> <!-- content -->
<div metal:fill-slot="content"> <div metal:fill-slot="content">
......
<html metal:use-macro="load: ../main.pt"> <html metal:use-macro="load: ../_table.pt">
<div metal:fill-slot="content"> <div metal:fill-slot="content">
<div class="jarviswidget" style="border-top:1px solid #ccc!important"> <div class="jarviswidget" style="border-top:1px solid #ccc!important">
......
<html metal:use-macro="load: ../main.pt"> <html metal:use-macro="load: ./_table.pt">
<div metal:fill-slot="content">
<!-- content --> <div class="panel panel-default">
<div metal:fill-slot="content"> <div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-fw fa-plus"></i>&nbsp;${request.title}</h3>
<div class="panel panel-danger"> </div>
<div class="panel-heading"> <div class="panel-body">
<h3 class="panel-title">Hapus data</h3> <div tal:content="structure form"></div>
</div>
<div class="panel-body">
Hapus Group #${row.group_name} ${row.description} ?
</div>
</div> </div>
<div tal:content="structure form"/>
</div> </div>
<!-- end content --> </div>
</html>
</html>
\ No newline at end of file \ No newline at end of file
<div metal:use-macro="load: ../main.pt">
<div metal:fill-slot="content">
<div class="well">
<div tal:content="structure form"/>
</div>
</div>
</div>
\ No newline at end of file \ No newline at end of file
<div metal:use-macro="load: ../main.pt">
<div metal:fill-slot="content">
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title" i18n:translate="Warning">Warning</h3>
</div>
<div class="panel-body" i18n:translate="warning-delete-user">
Delete <span tal:replace="user.email" i18n:name="email"/>
ID <span tal:replace="user.id" i18n:name="uid"/> ?
</div>
</div>
<div tal:content="structure form"/>
</div>
</div>
<div metal:use-macro="load: ../main.pt">
<div metal:fill-slot="content">
<div class="well">
<div tal:content="structure form"/>
</div>
</div>
</div>
\ No newline at end of file \ No newline at end of file
<div metal:use-macro="load: ../main.pt">
<!-- content -->
<div metal:fill-slot="content">
<div class="jarviswidget" style="border-top:1px solid #ccc!important">
<div role="content">
<table id="table1" class="table table-bordered table-hover table-condensed">
<thead>
<tr>
<th>ID</th>
<th>Email</th>
<th>User Name</th>
<th>Status</th>
<th>Last Login</th>
<th>Registered Date</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<!-- end content -->
<script type="text/javascript" metal:fill-slot="scripts">var mID;
var mID;
var oTable;
var oTableUri = "${home}/user"
var oTableUrl = oTableUri + "/grid/act";
$(document).ready(function () {
oTable = $('#table1').DataTable({
dom: '<"row"<"col-md-8"<"toolbar">l><"col-md-4"f>>rtip',
processing: true,
serverSide: true,
ajax: oTableUrl,
stateSave: true,
scrollCollapse: true,
sort: true,
info: false,
filter: true,
autoWidth: false,
paginate: true,
paginationType: "full_numbers",
lengthMenu: [
[10, 25, 50, 100],
[10, 25, 50, 100]
],
columnDefs: [{
searchable: false,
visible: false,
targets: [0]
}],
columns: [{
"data": "id"
},
{
"data": "email",
"width": "200px",
"className": "text-left"
},
{
"data": "name"
},
{
"data": "status",
"width": "200px",
"className": "text-center",
"render": function (data, type, full, meta) {
if (data == 0) return 'NonAktif';
else if (data == 1) return 'Aktif';
else return "-";
}
},
{
"data": "last_login",
"width": "200px",
"className": "text-center"
},
{
"data": "registered",
"width": "200px",
"className": "text-center"
}
],
"language": {
"search": "Cari : ",
"paginate": {
"first": "Pertama ",
"last": "Akhir ",
"previous": "",
"next": "",
},
"lengthMenu": "Tampil _MENU_ baris "
},
});
var tb_array = [
'<div class="btn-group pull-left">',
' <button id="btn_view" class="btn btn btn-warning" type="button" data-toggle="tooltip" title="View"> <i class="fa fa-eye"></i></button>',
' <button tal:condition="has_permission(request, 'user-edit')" id="btn_add" class="btn btn btn-success" type="button" data-toggle="tooltip" title="Tambah"><i class="fa fa-plus"></i></button>',
' <button tal:condition="has_permission(request, 'user-edit')" id="btn_edit" class="btn btn btn-warning" type="button" data-toggle="tooltip" title="Koreksi"><i class="fa fa-edit"></i></button>',
' <button tal:condition="has_permission(request, 'user-edit')" id="btn_delete" class="btn btn btn-danger" type="button" data-toggle="tooltip" title="Hapus"><i class="fa fa-trash-o"></i></button>',
' <button id="btn_pdf" class="btn btn btn-primary" type="button" data-toggle="tooltip" title="PDF"><i class="fa fa-file-pdf-o"></i></button>',
' <button id="btn_csv" class="btn btn btn-primary" type="button" data-toggle="tooltip" title="CSV"><i class="fa fa-file-excel-o"></i></button>',
' <button id="btn_close" class="btn btn btn-warning" type="button" data-toggle="tooltip" title="Tutup"><i class="fa fa-arrow-right"></i></button>',
' &nbsp;',
'</div>',
];
var tb = tb_array.join(' ');
$("div.toolbar").html(tb);
$("div.toolbar").attr('style', 'display:block; float: left; margin-bottom:6px; line-height:16px;');
$('#table1 tbody').on('click', 'tr', function () {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
} else {
var aData = oTable.row(this).data();
oTable.$('tr.selected').removeClass('selected');
$(this).addClass('selected');
mID = aData.id;
oTable.$('tr.row_selected').removeClass('row_selected');
$(this).addClass('row_selected');
}
});
$('#btn_add').click(function () {
window.location = oTableUri + '/add';
});
$('#btn_view').click(function () {
if (mID) window.location = oTableUri + '/' + mID + '/view';
else
$.SmartMessageBox({
title: "View",
content: "Pilih Baris yang akan di lihat...",
buttons: '[Ok]'
});
;
});
$('#btn_edit').click(function () {
if (mID) window.location = oTableUri + '/' + mID + '/edit';
else
$.SmartMessageBox({
title: "Edit",
content: "Pilih Baris yang akan di edit...",
buttons: '[Ok]'
});
;
});
$('#btn_delete').click(function () {
if (mID) window.location = oTableUri + '/' + mID + '/delete';
else
$.SmartMessageBox({
title: "Hapus",
content: "Pilih Baris yang akan di hapus...",
buttons: '[Ok]'
});
});
$('#btn_csv').click(function () {
url = oTableUri + "/csv/act";
window.open(url);
});
$('#btn_pdf').click(function () {
url = oTableUri + "/pdf/act";
window.open(url);
});
$("#btn_close").click(function () {
window.location = '/';
return false;
});
});
</script>
</div>
import os
import re
import colander import colander
import transaction
from datatables import (ColumnDT, DataTables, ) from datatables import (ColumnDT, DataTables, )
from deform import (Form, widget, ValidationFailure, Button, ) from deform import (widget, )
# from sqlalchemy.exc import IntegrityErrortpl from opensipkd.tools.buttons import btn_close, btn_delete, btn_view
from sqlalchemy.exc import IntegrityError
from opensipkd.tools import create_now
from opensipkd.tools.buttons import btn_cancel, btn_save, btn_close, btn_delete, btn_view
from opensipkd.tools.report import open_rml_row, csv_response, open_rml_pdf, pdf_response
from pyramid.httpexceptions import (HTTPFound, HTTPNotFound, )
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config from pyramid.view import view_config
from sqlalchemy import (func, or_, )
from ziggurat_foundations.models.services.user import UserService
from . import BaseView from . import BaseView
from .company import company_widget from ..models import (DBSession, User, ExternalIdentity)
from .user_login import (
regenerate_security_code, send_email_security_code, generate_api_key, )
from ..models import (DBSession, User, Group, UserGroup, ResCompany, ExternalIdentity)
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
########
# List #
########
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
external_user_name = colander.SchemaNode( external_user_name = colander.SchemaNode(
colander.String(), title=_('User Name')) colander.String(), title=_('User Name'))
...@@ -43,7 +25,7 @@ class EditSchema(AddSchema): ...@@ -43,7 +25,7 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String()) id = colander.SchemaNode(colander.String(), field="external_id")
external_user_name = colander.SchemaNode( external_user_name = colander.SchemaNode(
colander.String(), title=_('User Name')) colander.String(), title=_('User Name'))
provider_name = (colander.SchemaNode(colander.String(), title=_('Provider'))) provider_name = (colander.SchemaNode(colander.String(), title=_('Provider')))
...@@ -55,13 +37,12 @@ class UserExt(BaseView): ...@@ -55,13 +37,12 @@ class UserExt(BaseView):
super(UserExt, self).__init__(request) super(UserExt, self).__init__(request)
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.list_schema = ListSchema self.list_schema = ListSchema
# self.list_url = "/user/ext"
self.list_route = "user-ext" self.list_route = "user-ext"
self.list_buttons = (btn_view, btn_delete, btn_close) self.list_buttons = (btn_view, btn_delete, btn_close)
self.table = ExternalIdentity
@view_config( @view_config(
route_name='user-ext', renderer='templates/form_input.pt', route_name='user-ext', renderer='templates/table.pt',
permission='user-view') permission='user-view')
def view_list(self): def view_list(self):
form = super(UserExt, self).view_list() form = super(UserExt, self).view_list()
...@@ -82,56 +63,10 @@ class UserExt(BaseView): ...@@ -82,56 +63,10 @@ class UserExt(BaseView):
@view_config( @view_config(
route_name='user-ext-act', renderer='json', permission='user-view') route_name='user-ext-act', renderer='json', permission='user-view')
def view_act(self): def view_act(self):
req = self.req return super(UserExt, self).view_act()
url_dict = req.matchdict
if url_dict['act'] == 'grid':
columns = [
ColumnDT(ExternalIdentity.external_id, mData='id'),
ColumnDT(ExternalIdentity.external_user_name, mData='external_user_name'),
ColumnDT(ExternalIdentity.provider_name, mData='provider_name'),
ColumnDT(ExternalIdentity.local_user_id, mData='local_user_id'),
]
query = DBSession.query().select_from(ExternalIdentity). \
outerjoin(User, User.id == ExternalIdentity.local_user_id)
if self.req.user.company_id:
query = query.filter(User.company_id == self.req.user.company_id)
row_table = DataTables(req.GET, query, columns)
return row_table.output_result()
def delete_msg(self, row): def delete_msg(self, row):
return f'Data ID {row.external_id} sudah dihapus.' return f'Data ID {row.external_id} sudah dihapus.'
def query_id(self): def query_id(self):
return DBSession.query(ExternalIdentity).filter_by(external_id=self.req.matchdict["id"]) return DBSession.query(ExternalIdentity).filter_by(external_id=self.req.matchdict["id"])
# elif url_dict['act'] == 'csv':
# query = query_register()
# row = query.first()
# header = row.keys()
# rows = []
# for item in query.all():
# rows.append(list(item))
#
# filename = 'user.csv'
# value = {
# 'header': header,
# 'rows': rows,
# }
# return csv_response(request, value, filename)
# elif url_dict['act'] == 'pdf':
# # todo ganti rml jadi openoffice
# query = query_register()
# _here = os.path.dirname(__file__) # get current folder -> views
# path = os.path.dirname(_here) # mundur 1 level
# path = os.path.join(path, 'reports')
# rml_row = open_rml_row(path + '/user.row.rml')
# rows = []
# for r in query.all():
# s = rml_row.format(user_name=r.user_name, email=r.email,
# registered_date=r.registered_date)
# rows.append(s)
# pdf, filename = open_rml_pdf(path + '/user.rml', rows=rows,
# company=request.company,
# departement=request.departement,
# address=request.address)
# return pdf_response(request, pdf, filename)
...@@ -116,7 +116,7 @@ class DeTable(field.Field): ...@@ -116,7 +116,7 @@ class DeTable(field.Field):
btn_view_js = "{window.location = o%sUri+'/'+m%sID+'/view%s';}" % (tableid, tableid, params) btn_view_js = "{window.location = o%sUri+'/'+m%sID+'/view%s';}" % (tableid, tableid, params)
btn_delete_js = "{window.location = o%sUri+'/'+m%sID+'/delete%s';}" % (tableid, tableid, params) btn_delete_js = "{window.location = o%sUri+'/'+m%sID+'/delete%s';}" % (tableid, tableid, params)
btn_csv_js = "{window.location = o%sUri+'/csv/act%s';}" % (tableid, params) btn_csv_js = "{window.location = o%sUri+'/csv/act%s';}" % (tableid, params)
btn_pdf_js = "{window.location = o%sUri+'/pdf/act%s';}" % (tableid, params) btn_pdf_js = "{window.open(o%sUri+'/pdf/act%s');}" % (tableid, params)
action_suffix=f"{action_suffix}{params}" action_suffix=f"{action_suffix}{params}"
field.Field.__init__(self, schema, **kw) field.Field.__init__(self, schema, **kw)
_buttons = [] _buttons = []
......
...@@ -19,7 +19,6 @@ from deform.widget import MappingWidget ...@@ -19,7 +19,6 @@ from deform.widget import MappingWidget
from deform.compat import text_ from deform.compat import text_
from .i18n import _ from .i18n import _
_BLANK = text_("") _BLANK = text_("")
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!