Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
aa.gusti
/
opensipkd-base
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 82226365
authored
Dec 08, 2024
by
aa.gusti
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
perubahan detable column filtering
1 parent
1200c8be
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
527 additions
and
178 deletions
opensipkd/base/__init__.py
opensipkd/base/views/base_views.py
opensipkd/base/views/common.py
opensipkd/base/views/routes.py
opensipkd/base/views/templates/login.pt
opensipkd/base/views/user_login.py
opensipkd/detable/detable.py
opensipkd/detable/templates/detable.pt
opensipkd/base/__init__.py
View file @
8222636
...
@@ -488,15 +488,19 @@ def add_view_config(config, module, view_name):
...
@@ -488,15 +488,19 @@ def add_view_config(config, module, view_name):
class_name
=
f
"{view_name}{class_view}"
class_name
=
f
"{view_name}{class_view}"
attr
=
f
"view_{row.def_func}"
attr
=
f
"view_{row.def_func}"
log
.
debug
(
f
"Class: {class_name} Attr: {attr}"
)
log
.
debug
(
f
"Class: {class_name} Attr: {attr}"
)
_views
=
importlib
.
import_module
(
class_name
)
try
:
views
=
_views
_views
=
importlib
.
import_module
(
class_name
)
if
row
.
template
==
"json"
:
views
=
_views
renderer
=
row
.
template
if
row
.
template
==
"json"
:
else
:
renderers
=
row
.
template
renderer
=
"views/templates/"
+
row
.
template
else
:
config
.
add_view
(
views
.
Views
,
attr
=
f
"{attr}"
,
renderers
=
"views/templates/"
+
row
.
template
route_name
=
row
.
kode
,
permission
=
row
.
permission
,
config
.
add_view
(
views
.
Views
,
attr
=
f
"{attr}"
,
renderer
=
renderer
)
route_name
=
row
.
kode
,
permission
=
row
.
permission
,
renderer
=
renderers
)
except
Exception
as
e
:
log
.
error
(
str
(
e
))
config
.
scan
(
'.'
)
config
.
scan
(
'.'
)
...
...
opensipkd/base/views/base_views.py
View file @
8222636
...
@@ -277,6 +277,126 @@ class BaseView(object):
...
@@ -277,6 +277,126 @@ class BaseView(object):
cols
=
self
.
list_cols
,
buttons
=
self
.
list_buttons
)
cols
=
self
.
list_cols
,
buttons
=
self
.
list_buttons
)
return
arg
return
arg
def
view_act
(
self
,
**
kwargs
):
url_dict
=
self
.
req
.
matchdict
if
url_dict
[
'act'
]
==
'grid'
:
return
self
.
get_list
(
**
kwargs
)
elif
url_dict
[
'act'
]
==
'csv'
:
return
self
.
csv_response
(
**
kwargs
)
elif
url_dict
[
'act'
]
==
'pdf'
:
return
self
.
pdf_response
(
**
kwargs
)
else
:
return
self
.
next_act
(
**
kwargs
)
def
get_list
(
self
,
**
kwargs
):
url
=
[]
select_list
=
{}
if
not
self
.
columns
:
columns
=
[]
for
d
in
self
.
list_schema
():
global_search
=
True
search_method
=
hasattr
(
d
,
"search_method"
)
\
and
getattr
(
d
,
"search_method"
)
or
"string_contains"
if
hasattr
(
d
,
"global_search"
):
if
d
.
global_search
==
False
:
global_search
=
False
if
hasattr
(
d
,
"field"
):
if
type
(
d
.
field
)
==
str
:
columns
.
append
(
ColumnDT
(
getattr
(
self
.
table
,
d
.
field
),
mData
=
d
.
name
,
global_search
=
global_search
,
search_method
=
search_method
))
else
:
columns
.
append
(
ColumnDT
(
d
.
field
,
mData
=
d
.
name
,
global_search
=
global_search
,
search_method
=
search_method
))
else
:
columns
.
append
(
ColumnDT
(
getattr
(
self
.
table
,
d
.
name
),
mData
=
d
.
name
,
global_search
=
global_search
,
search_method
=
search_method
))
if
hasattr
(
d
,
"widget"
):
if
d
.
widget
:
log
.
debug
(
d
.
widget
)
if
type
(
d
.
widget
)
is
SelectWidget
:
select_list
[
d
.
name
]
=
d
.
widget
.
values
if
hasattr
(
d
,
"url"
):
url
.
append
(
d
.
name
)
else
:
columns
=
self
.
columns
query
=
self
.
db_session
.
query
()
.
select_from
(
self
.
table
)
table_join
=
kwargs
.
get
(
'table_join'
)
if
table_join
is
not
None
:
query
=
table_join
(
query
,
**
kwargs
)
else
:
query
=
self
.
list_join
(
query
,
**
kwargs
)
if
self
.
req
.
user
and
self
.
req
.
user
.
company_id
and
hasattr
(
self
.
table
,
"company_id"
):
query
=
query
.
filter
(
self
.
table
.
company_id
==
self
.
req
.
user
.
company_id
)
table_filter
=
kwargs
.
get
(
'table_filter'
)
if
table_filter
is
not
None
:
query
=
table_filter
(
query
,
**
kwargs
)
else
:
query
=
self
.
list_filter
(
query
,
**
kwargs
)
# log.debug(str(columns))
# qry = query.add_columns(*[c.sqla_expr for c in columns])
# log.debug(str(qry))
row_table
=
DataTables
(
self
.
req
.
GET
,
query
,
columns
)
result
=
row_table
.
output_result
()
data
=
result
and
"data"
in
result
and
result
[
"data"
]
or
{}
for
res
in
data
:
for
k
in
res
:
if
k
in
select_list
.
keys
():
vals
=
select_list
[
k
]
for
r
in
vals
:
if
r
[
0
]
==
res
[
k
]:
res
[
k
]
=
r
[
1
]
""
# for k, v in d.items():
# if k in url and v:
# link = "/".join([self.home, nik_url, v])
# d[k] =f'<a href="{link}" target="_blank">View</a>'
return
result
def
list_join
(
self
,
query
,
**
kwargs
):
return
query
def
list_filter
(
self
,
query
,
**
kwargs
):
return
query
def
next_act
(
self
,
**
kwargs
):
url_dict
=
self
.
req
.
matchdict
raise
HTTPNotFound
def
pdf_response
(
self
,
**
kwargs
):
from
opensipkd.base.tools.report
import
jasper_export
filename
=
jasper_export
(
self
.
report_file
)
return
file_response
(
self
.
req
,
filename
=
filename
[
0
])
def
csv_response
(
self
,
**
kwargs
):
query
=
self
.
table
.
query_register
()
row
=
query
.
first
()
header
=
row
.
_mapping
.
keys
()
rows
=
[
list
(
item
)
for
item
in
query
.
all
()]
filename
=
f
"{get_random_string(16)}.csv"
value
=
{
'header'
:
header
,
'rows'
:
rows
,
}
return
csv_response
(
self
.
req
,
value
,
filename
)
def
get_bindings
(
self
,
row
=
None
):
def
get_bindings
(
self
,
row
=
None
):
return
{
"row"
:
row
}
return
{
"row"
:
row
}
...
@@ -440,120 +560,6 @@ class BaseView(object):
...
@@ -440,120 +560,6 @@ class BaseView(object):
def
after_view
(
self
,
**
kwargs
):
def
after_view
(
self
,
**
kwargs
):
return
self
.
route_list
(
**
kwargs
)
return
self
.
route_list
(
**
kwargs
)
def
pdf_response
(
self
,
**
kwargs
):
from
opensipkd.base.tools.report
import
jasper_export
filename
=
jasper_export
(
self
.
report_file
)
return
file_response
(
self
.
req
,
filename
=
filename
[
0
])
def
csv_response
(
self
,
**
kwargs
):
query
=
self
.
table
.
query_register
()
row
=
query
.
first
()
header
=
row
.
_mapping
.
keys
()
rows
=
[
list
(
item
)
for
item
in
query
.
all
()]
filename
=
f
"{get_random_string(16)}.csv"
value
=
{
'header'
:
header
,
'rows'
:
rows
,
}
return
csv_response
(
self
.
req
,
value
,
filename
)
def
list_join
(
self
,
query
,
**
kwargs
):
return
query
def
list_filter
(
self
,
query
,
**
kwargs
):
return
query
def
get_list
(
self
,
**
kwargs
):
url
=
[]
select_list
=
{}
if
not
self
.
columns
:
columns
=
[]
for
d
in
self
.
list_schema
():
global_search
=
True
if
hasattr
(
d
,
"searchable"
):
if
d
.
searchable
==
False
:
global_search
=
False
if
hasattr
(
d
,
"field"
):
if
type
(
d
.
field
)
==
str
:
columns
.
append
(
ColumnDT
(
getattr
(
self
.
table
,
d
.
field
),
mData
=
d
.
name
,
global_search
=
global_search
))
else
:
columns
.
append
(
ColumnDT
(
d
.
field
,
mData
=
d
.
name
,
global_search
=
global_search
))
else
:
columns
.
append
(
ColumnDT
(
getattr
(
self
.
table
,
d
.
name
),
mData
=
d
.
name
,
global_search
=
global_search
))
if
hasattr
(
d
,
"widget"
):
if
d
.
widget
:
log
.
debug
(
d
.
widget
)
if
type
(
d
.
widget
)
is
SelectWidget
:
select_list
[
d
.
name
]
=
d
.
widget
.
values
if
hasattr
(
d
,
"url"
):
url
.
append
(
d
.
name
)
else
:
columns
=
self
.
columns
query
=
self
.
db_session
.
query
()
.
select_from
(
self
.
table
)
table_join
=
kwargs
.
get
(
'table_join'
)
if
table_join
is
not
None
:
query
=
table_join
(
query
,
**
kwargs
)
else
:
query
=
self
.
list_join
(
query
,
**
kwargs
)
if
self
.
req
.
user
and
self
.
req
.
user
.
company_id
and
hasattr
(
self
.
table
,
"company_id"
):
query
=
query
.
filter
(
self
.
table
.
company_id
==
self
.
req
.
user
.
company_id
)
table_filter
=
kwargs
.
get
(
'table_filter'
)
if
table_filter
is
not
None
:
query
=
table_filter
(
query
,
**
kwargs
)
else
:
query
=
self
.
list_filter
(
query
,
**
kwargs
)
# log.debug(str(columns))
# qry = query.add_columns(*[c.sqla_expr for c in columns])
# log.debug(str(qry))
row_table
=
DataTables
(
self
.
req
.
GET
,
query
,
columns
)
result
=
row_table
.
output_result
()
data
=
result
and
"data"
in
result
and
result
[
"data"
]
or
{}
for
res
in
data
:
for
k
in
res
:
if
k
in
select_list
.
keys
():
vals
=
select_list
[
k
]
for
r
in
vals
:
if
r
[
0
]
==
res
[
k
]:
res
[
k
]
=
r
[
1
]
""
# for k, v in d.items():
# if k in url and v:
# link = "/".join([self.home, nik_url, v])
# d[k] =f'<a href="{link}" target="_blank">View</a>'
return
result
def
next_act
(
self
,
**
kwargs
):
url_dict
=
self
.
req
.
matchdict
raise
HTTPNotFound
def
view_act
(
self
,
**
kwargs
):
url_dict
=
self
.
req
.
matchdict
if
url_dict
[
'act'
]
==
'grid'
:
return
self
.
get_list
(
**
kwargs
)
elif
url_dict
[
'act'
]
==
'csv'
:
return
self
.
csv_response
(
**
kwargs
)
elif
url_dict
[
'act'
]
==
'pdf'
:
return
self
.
pdf_response
(
**
kwargs
)
else
:
return
self
.
next_act
(
**
kwargs
)
def
get_captcha_url
(
self
):
def
get_captcha_url
(
self
):
return
get_urls
(
"/captcha/"
)
+
get_captcha
(
self
.
req
)
return
get_urls
(
"/captcha/"
)
+
get_captcha
(
self
.
req
)
...
...
opensipkd/base/views/common.py
View file @
8222636
from
datatables.clean_regex
import
clean_regex
from
datatables.clean_regex
import
clean_regex
from
datatables.search_methods
import
SEARCH_METHODS
from
sqlalchemy
import
(
from
sqlalchemy
import
(
String
,
Text
,
String
,
Text
,
or_
,
or_
,
...
@@ -98,4 +99,4 @@ class DataTables(BaseDataTables):
...
@@ -98,4 +99,4 @@ class DataTables(BaseDataTables):
# log.info(str(sort_expressions))
# log.info(str(sort_expressions))
for
e
in
sort_expressions
:
for
e
in
sort_expressions
:
print
(
e
)
print
(
e
)
self
.
sort_expressions
=
sort_expressions
self
.
sort_expressions
=
sort_expressions
\ No newline at end of file
\ No newline at end of file
opensipkd/base/views/routes.py
View file @
8222636
import
logging
import
colander
import
colander
from
deform
import
(
widget
,
)
from
pyramid.view
import
view_config
from
sqlalchemy.orm
import
aliased
from
opensipkd.models
import
(
DBSession
,
Route
,
)
from
.
import
BaseView
,
get_urls
_logging
=
logging
.
getLogger
(
__name__
)
@colander.deferred
def
route_widget
(
node
,
kw
):
values
=
kw
.
get
(
'route_list'
,
[])
return
widget
.
AutocompleteInputWidget
(
values
=
values
,
placeholder
=
"Pilih Induk"
)
def
route_widget_form
():
return
widget
.
AutocompleteInputWidget
(
size
=
60
,
min_length
=
3
,
requirements
=
((
"typeahead"
,
None
),
(
"deform"
,
None
),
{
"js"
:
"opensipkd.base:static/js/form/departemen_form.js"
}),
)
class
EditSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
widget
.
HiddenWidget
())
kode
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
'Kode'
)
path
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
'Path'
)
nama
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
'Nama'
)
module
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
description
=
"Nama Aplikasi Untuk Filtering"
)
is_menu
=
colander
.
SchemaNode
(
colander
.
Integer
(),
missing
=
colander
.
drop
,
widget
=
widget
.
CheckboxWidget
(
false_val
=
"0"
,
true_val
=
"1"
),
label
=
"Checklist jika path merupakan Menu"
)
parent_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
# widget=widget.HiddenWidget,
missing
=
colander
.
drop
,
oid
=
"parent_id"
)
parent_nm
=
colander
.
SchemaNode
(
colander
.
String
(),
widget
=
route_widget
,
missing
=
colander
.
drop
,
oid
=
"parent_nm"
)
order_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
missing
=
colander
.
drop
,
description
=
"Pengurutan Menu"
)
permission
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
description
=
"Nama permission untuk menentukan hak akses"
)
class_view
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
description
=
"Nama file tanpa extension yang berisi class Views"
)
def_func
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
description
=
"Nama fungsi dalam class"
)
template
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
default
=
"form.pt"
,
descripton
=
"Nama File template atau 'json' atau renderer"
)
icon
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
)
type
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
widget
.
CheckboxWidget
(
false_val
=
"0"
,
true_val
=
"1"
),
label
=
"Checklist jika type url adalah json"
)
status
=
colander
.
SchemaNode
(
colander
.
String
(),
widget
=
widget
.
CheckboxWidget
(
false_val
=
"0"
,
true_val
=
"1"
))
alias
=
aliased
(
Route
)
from
opensipkd.base.views
import
BaseView
from
opensipkd.base.views.user
import
AddSchema
class
ListSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
widget
.
HiddenWidget
(),
visible
=
False
,
searchable
=
False
,
global_search
=
False
,
)
kode
=
colander
.
SchemaNode
(
colander
.
String
(),
searchable
=
True
)
parent
=
colander
.
SchemaNode
(
colander
.
String
(),
field
=
alias
.
kode
,
)
order_id
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
"Order"
,
global_search
=
False
,
searchable
=
False
,
)
is_menu
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
widget
.
CheckboxWidget
(
false_val
=
"0"
,
true_val
=
"1"
),
title
=
"Menu"
,
searchable
=
True
,
search_method
=
"numeric"
,
global_search
=
False
,
)
class
AddSchema
(
colander
.
Schema
):
nama
=
colander
.
SchemaNode
(
test
=
colander
.
SchemaNode
(
colander
.
String
())
colander
.
String
(),
title
=
'Nama'
,
searchable
=
True
)
path
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
'Path'
,
searchable
=
True
)
template
=
colander
.
SchemaNode
(
colander
.
String
(),
searchable
=
False
,
global_search
=
False
,
)
type
=
colander
.
SchemaNode
(
colander
.
Boolean
(),
widget
=
widget
.
CheckboxWidget
(
false_val
=
"0"
,
true_val
=
"1"
),
searchable
=
True
,
search_method
=
"numeric"
,
global_search
=
False
,
width
=
"50pt"
)
status
=
colander
.
SchemaNode
(
colander
.
Boolean
(),
widget
=
widget
.
CheckboxWidget
(
false_val
=
"0"
,
true_val
=
"1"
),
searchable
=
True
,
search_method
=
"numeric"
,
global_search
=
False
,
)
class
Views
(
BaseView
):
class
Views
(
BaseView
):
def
__init__
(
self
,
request
):
def
__init__
(
self
,
request
):
super
()
.
__init__
(
request
)
super
()
.
__init__
(
request
)
self
.
add_schema
=
AddSchema
self
.
form_params
=
dict
(
scripts
=
""
)
self
.
list_url
=
'routes'
self
.
list_route
=
'routes'
# self.list_buttons = (btn_view, btn_edit, btn_delete)
self
.
list_buttons
=
()
# self.add_schema = AddSchema
self
.
edit_schema
=
EditSchema
self
.
table
=
Route
self
.
list_schema
=
ListSchema
self
.
allow_delete
=
True
self
.
form_scripts
=
"""
$('#parent_nm').bind('typeahead:selected', function (obj, datum, name) {
$('#parent_id').val(datum.id);
$('#parent_kd').val(datum.kode);
console.log(datum.kode);
});
$('#parent_nm').on('input',
function (e) {
let val = $('#parent_nm').val();
if (val === null || val === "") {
$('#parent_id').val("");
$('#parent_kd').val("");
}
});
"""
@view_config
(
route_name
=
'routes'
,
renderer
=
'templates/table.pt'
,
permission
=
'edit-title'
)
def
view_list
(
self
):
kwargs
=
{
"allow_view"
:
False
,
"allow_delete"
:
True
,
"state_save"
:
True
}
return
super
()
.
view_list
(
**
kwargs
)
def
form_validator
(
self
,
form
,
values
):
def
err_nama
():
raise
colander
.
Invalid
(
form
,
'Nama
%
s sudah digunakan oleh ID
%
s'
%
(
values
[
'nama'
],
found
.
id
)
)
def
err_kode
():
raise
colander
.
Invalid
(
form
,
'Kode
%
s sudah digunakan oleh ID
%
s'
%
(
values
[
'kode'
],
found
.
id
)
)
if
'id'
in
form
.
request
.
matchdict
:
uid
=
form
.
request
.
matchdict
[
'id'
]
q
=
DBSession
.
query
(
Route
)
.
filter_by
(
id
=
uid
)
row
=
q
.
first
()
else
:
row
=
None
# cek nama
q
=
Route
.
query
()
.
\
filter_by
(
nama
=
values
[
'nama'
])
found
=
q
.
first
()
if
row
:
if
found
and
found
.
id
!=
row
.
id
:
err_nama
()
elif
found
:
err_nama
()
# cek kode
q
=
Route
.
query
()
.
\
filter_by
(
kode
=
values
[
'kode'
])
found
=
q
.
first
()
if
row
:
if
found
and
found
.
id
!=
row
.
id
:
err_kode
()
elif
found
:
err_kode
()
@view_config
(
route_name
=
'routes-act'
,
renderer
=
'json'
,
permission
=
'edit-title'
)
def
view_act
(
self
):
return
super
()
.
view_act
()
@view_config
(
route_name
=
'routes-edit'
,
renderer
=
'templates/form.pt'
,
permission
=
'edit-title'
)
def
view_edit
(
self
):
return
super
()
.
view_edit
()
@view_config
(
route_name
=
'routes-delete'
,
renderer
=
'templates/form.pt'
,
permission
=
'edit-title'
)
def
view_delete
(
self
):
return
super
()
.
view_delete
()
def
next_act
(
self
,
**
kwargs
):
row
=
kwargs
.
get
(
"row"
)
params
=
self
.
req
.
params
url_dict
=
self
.
req
.
matchdict
if
url_dict
[
'act'
]
==
'hon'
:
term
=
'term'
in
params
and
params
[
'term'
]
or
''
q
=
Route
.
query
()
.
\
filter
(
Route
.
status
==
1
,
Route
.
kode
.
ilike
(
'
%%%
s
%%
'
%
term
))
\
.
order_by
(
Route
.
kode
)
r
=
[]
for
k
in
q
.
all
():
d
=
dict
(
id
=
k
.
id
,
value
=
k
.
kode
,
kode
=
k
.
kode
,
nama
=
k
.
nama
)
r
.
append
(
d
)
return
r
def
get_bindings
(
self
,
row
=
None
):
return
{
"route_list"
:
get_urls
(
f
"{self.req.route_url('routes')}/hon/act"
)}
def
view_reports
(
self
):
def
get_values
(
self
,
row
,
istime
=
False
,
null
=
False
):
c
values
=
super
()
.
get_values
(
row
,
istime
,
null
)
return
super
()
.
view_add
()
if
row
.
parent_id
:
route
=
Route
.
query_id
(
row
.
parent_id
)
.
first
()
values
[
"parent_nm"
]
=
route
and
route
.
kode
or
""
_logging
.
debug
(
values
)
return
values
def
view_report
(
self
):
c
return
super
()
.
view_add
()
\ No newline at end of file
\ No newline at end of file
def
list_join
(
self
,
query
,
**
kwargs
):
return
query
.
outerjoin
(
alias
,
Route
.
parent_id
==
alias
.
id
)
\ No newline at end of file
\ No newline at end of file
opensipkd/base/views/templates/login.pt
View file @
8222636
...
@@ -78,11 +78,19 @@
...
@@ -78,11 +78,19 @@
<input
id=
"password"
type=
"password"
name=
"password"
class=
"form-control"
>
<input
id=
"password"
type=
"password"
name=
"password"
class=
"form-control"
>
<b
class=
"tooltip tooltip-top-right"
><i
class=
"fa fa-lock txt-color-teal"
></i>
ISI
<b
class=
"tooltip tooltip-top-right"
><i
class=
"fa fa-lock txt-color-teal"
></i>
ISI
DENGAN PASSWORD ANDA
</b>
</label>
DENGAN PASSWORD ANDA
</b>
</label>
<div
class=
"note"
>
</section>
<a
id=
"lupa"
name=
"lupa"
<section>
href=
"${home}/reset-password"
>
Lupa Password?
</a>
<div
class=
"form-group"
>
<label
class=
" checkbox checkbox-inline"
>
<input
id=
"show_password"
type=
"checkbox"
style=
"left: 20px;"
>
Show Password
</label>
<div
class=
"note"
>
<a
href=
"${home}/reset-password"
id=
"lupa"
>
Lupa Password?
</a>
</div>
</div>
</div>
</section>
</section>
<section>
<section>
<div
tal:condition=
"'csrf_token' in form"
>
<div
tal:condition=
"'csrf_token' in form"
>
<div
tal:define=
"field form['csrf_token']"
style=
"display: none;"
>
<div
tal:define=
"field form['csrf_token']"
style=
"display: none;"
>
...
@@ -187,5 +195,17 @@
...
@@ -187,5 +195,17 @@
});
});
});
});
</script>
</script>
<script>
$
(
document
).
ready
(
function
()
{
$
(
"#show_password"
).
on
(
"click"
,
function
()
{
var
x
=
$
(
"#password"
);
if
(
x
.
attr
(
"type"
)
===
"password"
)
{
x
.
attr
(
"type"
,
"text"
);
}
else
{
x
.
attr
(
"type"
,
"password"
);
}
});
});
</script>
</body>
</body>
</html>
</html>
\ No newline at end of file
\ No newline at end of file
opensipkd/base/views/user_login.py
View file @
8222636
...
@@ -57,6 +57,9 @@ class Login(CSRFSchema):
...
@@ -57,6 +57,9 @@ class Login(CSRFSchema):
password
=
colander
.
SchemaNode
(
password
=
colander
.
SchemaNode
(
colander
.
String
(),
widget
=
widget
.
PasswordWidget
())
colander
.
String
(),
widget
=
widget
.
PasswordWidget
())
# def after_bind(self, schema, kwargs):
# def after_bind(self, schema, kwargs):
# request = kwargs["request"]
# request = kwargs["request"]
# csrf_token = new_csrf_token(request)
# csrf_token = new_csrf_token(request)
...
@@ -555,4 +558,4 @@ def view_reset_password(request):
...
@@ -555,4 +558,4 @@ def view_reset_password(request):
route_name
=
'reset-password-sent'
,
route_name
=
'reset-password-sent'
,
renderer
=
'templates/reset-password-sent.pt'
)
renderer
=
'templates/reset-password-sent.pt'
)
def
view_reset_password_sent
(
request
):
def
view_reset_password_sent
(
request
):
return
dict
(
title
=
_
(
'Reset password'
))
return
dict
(
title
=
_
(
'Reset password'
))
\ No newline at end of file
\ No newline at end of file
opensipkd/detable/detable.py
View file @
8222636
...
@@ -6,7 +6,7 @@ import re
...
@@ -6,7 +6,7 @@ import re
import
colander
import
colander
import
deform
import
deform
from
deform
import
compat
,
Form
from
deform
import
compat
from
deform
import
field
from
deform
import
field
from
.
import
widget
from
.
import
widget
...
@@ -190,7 +190,7 @@ class DeTable(field.Field):
...
@@ -190,7 +190,7 @@ class DeTable(field.Field):
headers
=
[]
headers
=
[]
cols2
=
[]
cols2
=
[]
for
f
in
schema
:
for
f
in
schema
:
d
=
{
'data'
:
f
.
name
}
d
=
{
'data'
:
f
.
name
,
'title'
:
f
.
title
}
data
=
[]
data
=
[]
if
hasattr
(
f
,
'width'
):
if
hasattr
(
f
,
'width'
):
d
[
"width"
]
=
f
.
width
d
[
"width"
]
=
f
.
width
...
@@ -208,12 +208,13 @@ class DeTable(field.Field):
...
@@ -208,12 +208,13 @@ class DeTable(field.Field):
if
hasattr
(
f
,
'orderable'
):
if
hasattr
(
f
,
'orderable'
):
d
[
"orderable"
]
=
f
.
orderable
d
[
"orderable"
]
=
f
.
orderable
data
.
append
(
f
"orderable: {f.orderable}"
)
data
.
append
(
f
"orderable: {f.orderable}"
)
if
hasattr
(
f
,
"url"
):
if
hasattr
(
f
,
"url"
):
d
[
"url"
]
=
f
.
url
d
[
"url"
]
=
f
.
url
# request = kw.get("request")
#
# request = kw.get("request")
# if request:
#
# if request:
# d["url"] = request.static_url(f.url)
#
# d["url"] = request.static_url(f.url)
# log.debug(d["url"])
#
# log.debug(d["url"])
if
hasattr
(
f
,
"action"
):
if
hasattr
(
f
,
"action"
):
d
[
"action"
]
=
f
.
action
d
[
"action"
]
=
f
.
action
...
@@ -224,8 +225,17 @@ class DeTable(field.Field):
...
@@ -224,8 +225,17 @@ class DeTable(field.Field):
d
[
"visible"
]
=
False
d
[
"visible"
]
=
False
if
isinstance
(
f
.
widget
,
deform
.
widget
.
CheckboxWidget
):
if
isinstance
(
f
.
widget
,
deform
.
widget
.
CheckboxWidget
):
d
[
"checkbox"
]
=
True
d
[
"checkbox"
]
=
True
d
[
"check_val"
]
=
[
f
.
widget
.
true_val
,
f
.
widget
.
false_val
]
else
:
else
:
d
[
"checkbox"
]
=
False
d
[
"checkbox"
]
=
False
# if type(f.typ) == colander.Integer:
# d["field_typ"] = f"int"
# elif type(f.typ) == colander.Boolean:
# d["field_typ"] = f"bool"
# elif type(f.typ) in (colander.Float, colander.Money):
# d["field_typ"] = f"float"
# else:
# d["field_typ"] = f"str"
thousand
=
hasattr
(
f
,
'thousand'
)
and
f
.
thousand
or
None
thousand
=
hasattr
(
f
,
'thousand'
)
and
f
.
thousand
or
None
separator
=
thousand
and
"separator"
in
thousand
and
thousand
[
separator
=
thousand
and
"separator"
in
thousand
and
thousand
[
...
@@ -244,7 +254,7 @@ class DeTable(field.Field):
...
@@ -244,7 +254,7 @@ class DeTable(field.Field):
d
[
"className"
]
=
"text-right"
d
[
"className"
]
=
"text-right"
columns
.
append
(
d
)
columns
.
append
(
d
)
headers
.
append
(
f
.
title
)
headers
.
append
(
f
.
title
)
cols2
.
append
(
data
)
#
cols2.append(data)
self
.
headers
=
headers
self
.
headers
=
headers
self
.
head
=
headers
self
.
head
=
headers
...
...
opensipkd/detable/templates/detable.pt
View file @
8222636
...
@@ -37,13 +37,12 @@
...
@@ -37,13 +37,12 @@
</div>
</div>
<div role="content">
<div role="content">
<div class="widget-body">
<div class="widget-body">
<table tal:condition="filter_columns" id="${tableid}-form-filter">
<div class="row" tal:condition="filter_columns" >
<thead>
<div id="${tableid}-form-filter-container" class="col-md-6">
<tr tal:repeat="child field">
<div id="${tableid}-form-filter" class="collapse">
<th>${child.title}</th>
</div>
</tr>
</div>
</thead>
</div>
</table>
<table id="${tableid}"
<table id="${tableid}"
class="table table-bordered table-hover table-condensed dataTable no-footer">
class="table table-bordered table-hover table-condensed dataTable no-footer">
...
@@ -54,9 +53,9 @@
...
@@ -54,9 +53,9 @@
</thead>
</thead>
<tbody></tbody>
<tbody></tbody>
<
tfoot
>
<
!--? <tfoot>--
>
<
th tal:repeat="child field">${child.title}</th
>
<
!--? <th talrepeat="child field">${child.title}</th>--
>
<
/tfoot
>
<
!--? </tfoot>--
>
</table>
</table>
</div>
</div>
<!-- widget-body -->
<!-- widget-body -->
...
@@ -89,8 +88,15 @@
...
@@ -89,8 +88,15 @@
, 4000);
, 4000);
}
}
var $btnFilter = $("<a/>", {
"href": "#${tableid}-form-filter",
"data-toggle": "collapse",
"class": "btn btn-warning dropdown"
}).html("Filters");
let tb_array = [
let tb_array = [
'<div class="btn-group pull-left">',
'<div class="btn-group pull-left">',
$btnFilter.get(0).outerHTML,
'${structure:buttons}',
'${structure:buttons}',
' ',
' ',
'</div>',
'</div>',
...
@@ -213,28 +219,69 @@
...
@@ -213,28 +219,69 @@
${tableid}Params.ajax = o${tableid}Url;
${tableid}Params.ajax = o${tableid}Url;
}
}
<tal:block tal:condition="filter_columns">
//<talblock talcondition="filter_columns">
$('#${tableid}-form-filter thead th').each(function (i) {
//console.log(${tableid}Columns);
console.log($(this).index());
var html = "";
var title = $(this).text();
for (let co in ${tableid}Columns) {
// var title = $('#${tableid}-form-filter thead th')
var col = ${tableid}Columns[co];
// .eq($(this).index())
if (col.searchable === true) {
// .text();
var col_id = "${tableid}-" + col.data;
$(this).html(
var col_val = localStorage.getItem(col_id);
'<input type="text" placeholder="' + title + '" data-index="' + i + '" />'
if (col_val === null || col_val === undefined) {
);
col_val = "";
});
$("#${tableid}-form-filter").on('keyup', 'th input', function (e) {
var code = e.keyCode || e.which;
if (code === 13) {
o${tableid}
.column($(this).data('index'))
.search(this.value)
.draw();
}
}
});
var txt = 'id="' + col_id + '" data-index="' + co + '" value="' + col_val + '"';
</tal:block>
html += '<div class="form-group">';
if (col.checkbox === true) {
var radioVal = [["", 'Semua'], [col.check_val[0], 'Aktif'], [col.check_val[1], 'Pasif']];
html += '<label class="" for="' + col_id + '">' + col.title + '</label>';
html += '<div class="input-group" id="' + col_id + '">';
for (var rdo = 0; rdo < radioVal.length; rdo++) {
var selected = (col_val === radioVal[rdo][0]) ? "checked" : "";
txt = 'id="' + col_id + '-' + radioVal[rdo][0] + '" ' +
'class="${tableid}-control-filter" data-index="' + co + '"' +
'name="' + col_id + '" value="' + radioVal[rdo][0] + '" '+selected;
html += '<label class="radio-inline">';
html += '<input type="radio" ' + txt + '/>';
html += '<label for="' + col_id + '-' + radioVal[rdo][0] + '">' + radioVal[rdo][1] + '</label>';
html += '</label>';
}
html += '</div>';
} else
html += '<input type="text" class="form-control ' + "${tableid}" + '-control-filter" placeholder="' + col.title + '" ' + txt + '/>';
html += '</div>';
}
}
$("#${tableid}-form-filter").html(html);
$(".${tableid}-control-filter").on('keyup', function (e) {
var code = e.keyCode || e.which;
if (code === 13) {
o${tableid}
.column($(this).data('index'))
.search(this.value)
.draw();
localStorage.setItem($(this).attr('id'), $(this).val());
}
});
$(".${tableid}-control-filter").on('click', function (e) {
var code = e.keyCode || e.which;
if ($(this).attr("type") === 'radio') {
var col_id=$(this).attr('id').split("-");
col_id.length=2;
col_id=col_id.join("-");
o${tableid}
.column($(this).data('index'))
.search(this.value)
.draw();
localStorage.setItem(col_id, $(this).val());
}
});
//</talblock>
o${tableid} = $('#${tableid}').DataTable(${tableid}Params);
o${tableid} = $('#${tableid}').DataTable(${tableid}Params);
let tb = tb_array.join(' ');
let tb = tb_array.join(' ');
...
...
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment