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
/* dataTables Customize */
table.dataTable thead {
-- background-color: #EAEAEA;
background-color: #EAEAEA;
}
table.table-hover>tbody>tr:hover {
table.table-hover > tbody > tr:hover {
background-color: #9FAFD1;
}
table.dataTable tr.even.selected td {
background-color: #B0BED9;
}
table.dataTable tr.odd.selected td {
background-color: #9FAFD1;
}
@media only screen and (max-width: 980px) {
aside {
padding-bottom:60px;
padding-bottom: 60px;
}
}
aside span.footer-side {
position:absolute;
bottom:10px;
display:block;
text-align:center;
width:100%;
font-size:12px;
color:#c0bbb7;
position: absolute;
bottom: 10px;
display: block;
text-align: center;
width: 100%;
font-size: 12px;
color: #c0bbb7;
}
.minified aside span.footer-side {
display:none;
display: none;
}
.loading {
background:url(../img/loading.gif) left center no-repeat;
padding-left:30px !Important;
background: url(../img/loading.gif) left center no-repeat;
padding-left: 30px !Important;
}
input.tt-hint {
padding-left:30px !Important;
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
}
.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
.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;
}
.dataTables_length {
margin-left:6px;
}
.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 re
from datetime import datetime
from datatables import ColumnDT
from dateutil.relativedelta import relativedelta
from opensipkd.tools.captcha import get_captcha
from pyramid.httpexceptions import HTTPFound
from .common import DataTables
from .. import DBSession, get_params
from opensipkd.tools import dmy, dmy_to_date, get_settings, get_ext
import colander
from deform import (widget, Form, ValidationFailure, )
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 ...detable import DeTable
class BaseView(object):
......@@ -102,11 +107,14 @@ class BaseView(object):
self.list_route = 'home'
self.list_col_defs = ""
self.list_cols = ""
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
# self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
# 'btn_close'
self.list_report = (btn_csv, btn_pdf)
self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
self.form_params = dict(scripts="")
self.list_url = ''
self.list_route = ''
self.list_schema = ""
self.form_scripts = """
$('#parent_nm').bind('typeahead:selected', function(obj, datum) {
$('#parent_id').val(datum.id);
......@@ -121,7 +129,9 @@ class BaseView(object):
self.headers = None
self.bindings = {}
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=""):
if msg:
......@@ -139,8 +149,8 @@ class BaseView(object):
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **bindings):
buttons = self.buttons and self.buttons or buttons
bindings = self.bindings and self.bindings or bindings
schema = class_form(validator=self.form_validator) #
bindings = self.bindings and self.bindings or self.get_bindings()
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req, **bindings)
schema.request = self.req
if row:
......@@ -153,18 +163,28 @@ class BaseView(object):
return r
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,
cols=self.list_cols, buttons=self.list_buttons)
return arg
def get_bindings(self, row=None):
return {}
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
bindings = hasattr(self, "get_bindings") and self.get_bindings() or None
form = self.get_form(self.edit_schema, buttons=(btn_close,), bindings=bindings)
bindings = self.get_bindings(row)
form = self.get_form(self.edit_schema, buttons=(btn_close,), **bindings)
if request.POST:
return self.route_list()
......@@ -174,15 +194,52 @@ class BaseView(object):
scripts=self.form_scripts)
def before_add(self):
return
return {}
def validation_failure(self, value):
return value
def cancel_act(self):
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):
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 'save' in self.req.POST:
controls = self.req.POST.items()
......@@ -192,17 +249,19 @@ class BaseView(object):
value = self.validation_failure(e.cstruct)
value.update(self.before_add())
form.render(appstruct=value)
return dict(form=form.render(), scripts=self.form_scripts)
self.save_request(dict(controls))
return dict(form=form.render(), table=table and table.render() or None,
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:
self.cancel_act()
return self.route_list()
values = self.before_add()
form.set_appstruct(values)
table = self.get_item_table()
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):
return row
......@@ -230,9 +289,9 @@ class BaseView(object):
def save_request(self, values, row=None):
params = self.req.params
for p in params:
values[p] = params[p]
for k, v in params.items():
if v:
values[k] = v
return self.save(values, self.req.user, row)
def id_not_found(self):
......@@ -262,7 +321,11 @@ class BaseView(object):
row = self.query_id().first()
if not row:
return self.id_not_found()
if not self.bindings:
self.bindings = self.get_bindings(row)
form = self.get_form(self.edit_schema)
table = self.get_item_table(row)
resources = form.get_widget_resources()
if request.POST:
if 'save' in request.POST:
controls = request.POST.items()
......@@ -270,15 +333,19 @@ class BaseView(object):
controls = form.validate(controls)
except ValidationFailure as e:
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)
return self.route_list()
values = self.get_values(row)
form.set_appstruct(values)
form = self.before_edit(form)
table = self.get_item_table(row)
return dict(form=form.render(), table=table and table.render() or None, 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"])
def before_delete(self, row):
pass
def view_delete(self):
request = self.req
......@@ -288,15 +355,18 @@ class BaseView(object):
return self.id_not_found()
if 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()
DBSession.flush()
request.session.flash(msg)
return self.route_list()
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)
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):
q = DBSession.query(self.table).filter_by(
......@@ -305,6 +375,11 @@ class BaseView(object):
q = q.filter_by(company_id=self.req.user.company_id)
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
def deferred_status(node, kw):
......@@ -346,6 +421,7 @@ def need_captcha():
is_captcha = get_params("reg_captcha")
return is_captcha == '1' or is_captcha == "True" or is_captcha == "true" or is_captcha == True
def need_verify():
result = get_params("reg_verify")
return result == '1' or result == "True" or result == "true" or result == True
......
......@@ -50,7 +50,7 @@ class ViewCompany(BaseView):
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="")
self.list_url = 'company'
# self.list_url = 'company'
self.list_route = 'company'
self.add_schema = AddSchema
self.edit_schema = EditSchema
......
import json
import colander
from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save, btn_add, btn_edit, btn_delete
from deform import (widget, )
from pyramid.view import (view_config, )
from . import widget_os
from opensipkd.detable import DeTable
from .provinsi import provinsi_widget
from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import ColumnDT, DataTables, BaseView
......@@ -51,7 +47,7 @@ class ListSchema(colander.Schema):
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
provinsi = colander.SchemaNode(colander.String())
status = colander.SchemaNode(colander.Integer(),width="30pt")
status = colander.SchemaNode(colander.Integer(), width="30pt")
class ViewDati2(BaseView):
......@@ -64,6 +60,7 @@ class ViewDati2(BaseView):
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDati2
self.list_schema = ListSchema
########
# List #
......@@ -103,43 +100,20 @@ class ViewDati2(BaseView):
elif found:
err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req,
def get_bindings(self, row=None):
return dict(request=self.req,
provinsi_list=ResProvinsi.get_list())
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
@view_config(route_name='dati2',
renderer='templates/form_input.pt',
renderer='templates/table.pt',
permission='dati2')
def view_list(self):
table = DeTable(ListSchema(title="Kabupaten/Kota"), action=f"{self.home}/dati2",
buttons=(btn_close, btn_add, btn_edit, btn_delete))
return dict(form=table.render(), scripts=self.form_scripts)
return super(ViewDati2, self).view_list()
@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()
request = self.req
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()
return super(ViewDati2, self).view_view()
@view_config(route_name='dati2-act', renderer='json',
permission='view')
......@@ -175,9 +149,6 @@ class ViewDati2(BaseView):
def view_edt(self):
return super(ViewDati2, self).view_edit()
##########
# Delete
##########
@view_config(route_name='dati2-delete',
renderer='templates/form_input.pt', permission='dati2')
def view_delete(self):
......
......@@ -38,6 +38,7 @@ class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), searchable=False, orderable=False, visible=False)
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
......@@ -45,30 +46,18 @@ class ListSchema(colander.Schema):
kecamatan = colander.SchemaNode(colander.String())
status = colander.SchemaNode(colander.Integer(), width="30pt")
class ViewDesa(BaseView):
def __init__(self, request):
super(ViewDesa, 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': "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.list_url = 'desa'
self.list_route = 'desa'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDesa
########
# List #
########
self.list_schema = ListSchema
def form_validator(self, form, value):
def err_kode():
......@@ -104,17 +93,13 @@ class ViewDesa(BaseView):
elif found:
err_nama()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req,
def get_bindings(self, row=None):
return dict(request=self.req,
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',
renderer='templates/form_input.pt', permission='desa')
renderer='templates/form.pt', permission='desa')
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
......@@ -129,12 +114,10 @@ class ViewDesa(BaseView):
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='desa',
renderer='templates/form_input.pt',
renderer='templates/table.pt',
permission='desa')
def view_list(self):
table = DeTable(ListSchema(title="Desa/Kelurahan"), action=f"{self.home}/desa",
buttons=(btn_close, btn_add, btn_edit, btn_delete))
return dict(form=table.render(), scripts=self.form_scripts)
return super(ViewDesa, self).view_list()
@view_config(route_name='desa-act', renderer='json',
permission='view')
......@@ -146,7 +129,7 @@ class ViewDesa(BaseView):
ColumnDT(ResDesa.kode, mData='kode'),
ColumnDT(ResDesa.nama, mData='nama'),
ColumnDT(ResDesa.status, mData='status'),
ColumnDT(ResKecamatan.nama, mData='kecamatan'),]
ColumnDT(ResKecamatan.nama, mData='kecamatan'), ]
query = DBSession.query().select_from(ResDesa) \
.join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id)
row_table = DataTables(request.GET, query, columns)
......@@ -157,24 +140,17 @@ class ViewDesa(BaseView):
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='desa-add',
renderer='templates/form_input.pt', permission='desa')
renderer='templates/form.pt', permission='desa')
def view_add(self):
return super(ViewDesa, self).view_add()
########
# Edit #
########
@view_config(route_name='desa-edit',
renderer='templates/form_input.pt', permission='desa')
renderer='templates/form.pt', permission='desa')
def view_edt(self):
return super(ViewDesa, self).view_edit()
##########
# Delete
##########
@view_config(route_name='desa-delete',
renderer='templates/form_input.pt', permission='desa')
renderer='templates/form.pt', permission='desa')
def view_delete(self):
return super(ViewDesa, self).view_delete()
import os
import uuid
# from ..tools import row2dict, xls_reader
from datetime import datetime
from sqlalchemy import not_, func
from pyramid.view import (
view_config,
)
from pyramid.httpexceptions import (
HTTPFound,
)
import colander
from deform import (
Form,
widget,
ValidationFailure,
)
from ..views import ColumnDT, DataTables, BaseView
from pyramid.httpexceptions import (
HTTPFound,
)
from pyramid.view import (
view_config,
)
from ..models import (
DBSession,
Eselon
)
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah eselon gagal'
SESS_EDIT_FAILED = 'Edit eselon gagal'
......@@ -33,13 +31,6 @@ class AddSchema(colander.Schema):
nama = colander.SchemaNode(
colander.String(),
oid="nama")
# eselon = colander.SchemaNode(
# colander.String(),
# oid = "eselon")
# ruang = colander.SchemaNode(
# colander.String(),
# oid = "ruang")
# edit
status = colander.SchemaNode(
colander.Boolean(),
oid="status")
......@@ -51,10 +42,7 @@ class EditSchema(AddSchema):
widget=widget.HiddenWidget())
class view_eselon(BaseView):
########
# List #
########
class Views(BaseView):
@view_config(route_name='eselon', renderer='templates/eselon/list.pt',
permission='eselon')
def view_list(self):
......
......@@ -50,30 +50,16 @@ class ListSchema(colander.Schema):
status = colander.SchemaNode(colander.Integer(), width="30pt")
class ViewDati2(BaseView):
class Views(BaseView):
def __init__(self, request):
super(ViewDati2, 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'
super(Views, self).__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'kecamatan'
self.list_route = 'kecamatan'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResKecamatan
########
# List #
########
self.list_schema = ListSchema
def form_validator(self, form, value):
def err_kode():
......@@ -119,8 +105,9 @@ class ViewDati2(BaseView):
return Form(schema, buttons=buttons)
@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()
request = self.req
row = self.query_id().first()
if not row:
......@@ -134,12 +121,10 @@ class ViewDati2(BaseView):
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
@view_config(route_name='kecamatan',
renderer='templates/form_input.pt',
renderer='templates/table.pt',
permission='kecamatan')
def view_list(self):
table = DeTable(ListSchema(title="Kecamatan"), action=f"{self.home}/kecamatan",
buttons=(btn_close, btn_add, btn_edit, btn_delete))
return dict(form=table.render(), scripts=self.form_scripts)
return super(Views, self).view_list(self)
@view_config(route_name='kecamatan-act', renderer='json',
permission='view')
......@@ -163,22 +148,19 @@ class ViewDati2(BaseView):
return result
@view_config(route_name='kecamatan-add',
renderer='templates/form_input.pt', permission='kecamatan')
renderer='templates/form.pt', permission='kecamatan')
def view_add(self):
return super(ViewDati2, self).view_add()
return super(Views, self).view_add()
########
# Edit #
########
@view_config(route_name='kecamatan-edit',
renderer='templates/form_input.pt', permission='kecamatan')
renderer='templates/form.pt', permission='kecamatan')
def view_edt(self):
return super(ViewDati2, self).view_edit()
return super(Views, self).view_edit()
##########
# Delete
##########
@view_config(route_name='kecamatan-delete',
renderer='templates/form_input.pt', permission='kecamatan')
renderer='templates/form.pt', permission='kecamatan')
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
from . import widget_os
from ..models import DBSession, ResProvinsi, kategori_provinsi, flush
from ..views import ColumnDT, DataTables, BaseView
from ...detable import DeTable
SESS_ADD_FAILED = 'Tambah provinsi gagal'
SESS_EDIT_FAILED = 'Edit provinsi gagal'
......@@ -59,6 +58,7 @@ class ViewProvinsi(BaseView):
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_route = 'provinsi'
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResProvinsi
......@@ -100,63 +100,31 @@ class ViewProvinsi(BaseView):
err_nama()
@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()
request = self.req
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)
return super(ViewProvinsi, self).view_view()
@view_config(route_name='provinsi',
renderer='templates/list_table.pt',
renderer='templates/table.pt',
permission='provinsi')
def view_list(self):
table = DeTable(ListSchema(), action=f"{self.home}/provinsi",
action_suffix="/grid/act",
buttons=(btn_view, btn_add, btn_edit, btn_delete, btn_close))
return dict(table=table.render(), scripts="")
##########
# Action #
##########
return super(ViewProvinsi, self).view_list()
@view_config(route_name='provinsi-act', renderer='json',
permission='view')
def view_act(self):
request = self.req
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()
return super(ViewProvinsi, self).view_act()
@view_config(route_name='provinsi-add',
renderer='templates/form_input.pt', permission='provinsi')
def view_add(self):
return super(ViewProvinsi, self).view_add()
########
# Edit #
########
@view_config(route_name='provinsi-edit',
renderer='templates/form_input.pt', permission='provinsi')
def view_edt(self):
return super(ViewProvinsi, self).view_edit()
##########
# Delete
##########
@view_config(route_name='provinsi-delete',
renderer='templates/form_input.pt', permission='provinsi')
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">
<script>
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">
<div metal:fill-slot="content">
<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"
href="/static/v3/css/custom-datatable.css">
<div metal:fill-slot="content">
......
<html metal:use-macro="load: ../main.pt">
<html metal:use-macro="load: ../_table.pt">
<!-- 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 class="jarviswidget" style="border-top:1px solid #ccc!important">
......
<html metal:use-macro="load: ../main.pt">
<!-- content -->
<div metal:fill-slot="content">
<div class="panel panel-danger">
<html metal:use-macro="load: ./_table.pt">
<div metal:fill-slot="content">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Hapus data</h3>
<h3 class="panel-title"><i class="fa fa-fw fa-plus"></i>&nbsp;${request.title}</h3>
</div>
<div class="panel-body">
Hapus Group #${row.group_name} ${row.description} ?
<div tal:content="structure form"></div>
</div>
</div>
<div tal:content="structure form"/>
</div>
<!-- end content -->
</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>
\ 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
<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 transaction
from datatables import (ColumnDT, DataTables, )
from deform import (Form, widget, ValidationFailure, Button, )
# from sqlalchemy.exc import IntegrityErrortpl
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 deform import (widget, )
from opensipkd.tools.buttons import btn_close, btn_delete, btn_view
from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config
from sqlalchemy import (func, or_, )
from ziggurat_foundations.models.services.user import UserService
from . import BaseView
from .company import company_widget
from .user_login import (
regenerate_security_code, send_email_security_code, generate_api_key, )
from ..models import (DBSession, User, Group, UserGroup, ResCompany, ExternalIdentity)
from ..models import (DBSession, User, ExternalIdentity)
_ = TranslationStringFactory('user')
########
# List #
########
class AddSchema(colander.Schema):
external_user_name = colander.SchemaNode(
colander.String(), title=_('User Name'))
......@@ -43,7 +25,7 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String())
id = colander.SchemaNode(colander.String(), field="external_id")
external_user_name = colander.SchemaNode(
colander.String(), title=_('User Name'))
provider_name = (colander.SchemaNode(colander.String(), title=_('Provider')))
......@@ -55,13 +37,12 @@ class UserExt(BaseView):
super(UserExt, self).__init__(request)
self.edit_schema = EditSchema
self.list_schema = ListSchema
# self.list_url = "/user/ext"
self.list_route = "user-ext"
self.list_buttons = (btn_view, btn_delete, btn_close)
self.table = ExternalIdentity
@view_config(
route_name='user-ext', renderer='templates/form_input.pt',
route_name='user-ext', renderer='templates/table.pt',
permission='user-view')
def view_list(self):
form = super(UserExt, self).view_list()
......@@ -82,56 +63,10 @@ class UserExt(BaseView):
@view_config(
route_name='user-ext-act', renderer='json', permission='user-view')
def view_act(self):
req = self.req
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()
return super(UserExt, self).view_act()
def delete_msg(self, row):
return f'Data ID {row.external_id} sudah dihapus.'
def query_id(self):
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):
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_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}"
field.Field.__init__(self, schema, **kw)
_buttons = []
......
......@@ -19,7 +19,6 @@ from deform.widget import MappingWidget
from deform.compat import text_
from .i18n import _
_BLANK = text_("")
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!