Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
irul
/
opensipkd-base
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 59ce6bc7
authored
Dec 10, 2024
by
aa.gusti
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
datatable date
1 parent
8ec0c6d1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
103 additions
and
40 deletions
opensipkd/base/__init__.py
opensipkd/base/scripts/initializedb.py
opensipkd/base/views/base_views.py
opensipkd/base/views/routes.py
opensipkd/detable/detable.py
opensipkd/detable/templates/detable.pt
opensipkd/base/__init__.py
View file @
59ce6bc
...
...
@@ -500,6 +500,7 @@ def add_view_config(config, module, view_name):
renderer
=
renderers
)
except
Exception
as
e
:
log
.
error
(
str
(
e
))
log
.
error
(
dict
(
row
.
__dict__
))
config
.
scan
(
'.'
)
...
...
opensipkd/base/scripts/initializedb.py
View file @
59ce6bc
...
...
@@ -46,7 +46,10 @@ def routes_callback(typ, **kwargs):
return
None
value
=
splited_last
elif
field
==
"class_view"
:
if
data
[
"def_func"
]
==
"list"
and
not
data
[
"class_view"
]:
if
data
[
"def_func"
]
==
"list"
and
not
data
[
"class_view"
]
\
or
splited_last
not
in
[
"add"
,
"edit"
,
"delete"
,
"view"
,
"act"
,
"report"
]:
log
.
debug
(
splited
[
-
1
:])
log
.
debug
(
data
)
return
"_"
.
join
(
splited
[
1
:])
if
splited_last
==
"menu"
:
...
...
opensipkd/base/views/base_views.py
View file @
59ce6bc
...
...
@@ -136,7 +136,7 @@ class BaseView(object):
self
.
list_buttons
=
(
btn_add
,
btn_close
)
self
.
columns
=
None
self
.
form_params
=
dict
(
scripts
=
""
)
self
.
list_url
=
''
self
.
list_url
=
[]
self
.
list_route
=
''
self
.
list_schema
=
colander
.
Schema
self
.
allow_view
=
True
...
...
@@ -145,7 +145,9 @@ class BaseView(object):
self
.
allow_post
=
False
self
.
allow_unpost
=
False
self
.
state_save
=
False
self
.
server_side
=
True
self
.
list_form
=
None
self
.
form_list
=
None
self
.
filter_columns
=
False
self
.
form_scripts
=
"""
...
...
@@ -243,16 +245,18 @@ class BaseView(object):
allow_unpost
=
kwargs
.
get
(
"allow_unpost"
,
self
.
allow_unpost
)
state_save
=
kwargs
.
get
(
"state_save"
,
self
.
state_save
)
filter_columns
=
kwargs
.
get
(
"filter_columns"
,
self
.
filter_columns
)
server_side
=
kwargs
.
get
(
"server_side"
,
self
.
server_side
)
schema
=
self
.
list_schema
()
schema
=
schema
.
bind
(
request
=
self
.
req
)
list_url
=
kwargs
.
get
(
"list_url"
,
None
)
new_buttons
=
kwargs
.
get
(
"new_buttons"
)
if
not
new_buttons
:
new_buttons
=
self
.
new_buttons
if
not
list_url
:
list_url
=
kwargs
.
get
(
"list_url"
,
self
.
list_url
)
if
not
list_url
and
self
.
list_route
:
list_url
=
self
.
req
.
route_url
(
self
.
list_route
)
action_suffix
=
kwargs
.
get
(
"action_suffix"
,
"/grid/act"
)
list_url
=
list_url
and
list_url
[
0
:
1
]
!=
"/"
and
"/"
+
list_url
or
list_url
action_suffix
=
list_url
and
kwargs
.
get
(
"action_suffix"
,
"/grid/act"
)
or
None
table
=
DeTable
(
schema
,
action
=
list_url
,
action_suffix
=
action_suffix
,
...
...
@@ -266,9 +270,14 @@ class BaseView(object):
state_save
=
state_save
,
new_buttons
=
new_buttons
,
filter_columns
=
filter_columns
,
server_side
=
server_side
)
resources
=
table
.
get_widget_resources
()
# resources=dict(css="", js="")
if
kwargs
.
get
(
"is_object"
):
return
dict
(
form
=
table
,
scripts
=
""
,
css
=
resources
[
"css"
],
js
=
resources
[
"js"
])
return
dict
(
form
=
table
.
render
(),
scripts
=
""
,
css
=
resources
[
"css"
],
js
=
resources
[
"js"
])
...
...
@@ -294,9 +303,13 @@ class BaseView(object):
def
get_list
(
self
,
**
kwargs
):
url
=
[]
select_list
=
{}
list_schema
=
kwargs
.
get
(
"list_schema"
)
if
not
list_schema
:
list_schema
=
self
.
list_schema
and
self
.
list_schema
or
self
.
form_list
if
not
self
.
columns
:
columns
=
[]
for
d
in
self
.
list_schema
():
for
d
in
list_schema
():
global_search
=
True
search_method
=
hasattr
(
d
,
"search_method"
)
\
and
getattr
(
d
,
"search_method"
)
or
"string_contains"
...
...
@@ -406,11 +419,17 @@ class BaseView(object):
def
next_edit
(
self
,
form
,
**
kwargs
):
return
self
.
route_list
(
**
kwargs
)
def
returned_form
(
self
,
form
,
table
,
**
kwargs
):
def
returned_form
(
self
,
form
,
table
=
None
,
**
kwargs
):
resources
=
form
.
get_widget_resources
()
readonly
=
"readonly"
in
kwargs
and
kwargs
[
"readonly"
]
or
False
kwargs
[
"readonly"
]
=
readonly
is_object
=
kwargs
.
get
(
"is_object"
,
self
.
is_object
)
if
dict
==
type
(
table
):
resources
[
"js"
]
.
extend
(
set
(
table
[
"js"
])
-
set
(
resources
[
"js"
]))
resources
[
"css"
]
.
extend
(
set
(
table
[
"css"
])
-
set
(
resources
[
"css"
]))
table
=
table
[
"form"
]
# resources["js"] = list(resources["js"])
# resources["css"] = list(resources["css"])
if
is_object
:
return
dict
(
form
=
form
,
table
=
table
and
table
.
render
()
or
None
,
...
...
@@ -566,10 +585,10 @@ class BaseView(object):
def
view_add
(
self
,
**
kwargs
):
# bindings = self.get_bindings()
form
=
self
.
get_form
(
self
.
add_schema
,
**
kwargs
)
table
=
self
.
get_item_table
(
**
kwargs
)
resources
=
form
.
get_widget_resources
()
is_object
=
kwargs
.
get
(
"is_object"
,
self
.
is_object
)
kwargs
[
"is_object"
]
=
is_object
table
=
self
.
get_item_table
(
**
kwargs
)
if
self
.
req
.
POST
:
if
'save'
in
self
.
req
.
POST
:
controls
=
self
.
req
.
POST
.
items
()
...
...
@@ -657,7 +676,11 @@ class BaseView(object):
return
d
def
get_item_table
(
self
,
row
=
None
,
**
kwargs
):
return
None
if
not
self
.
form_list
:
return
None
self
.
list_schema
=
self
.
form_list
kwargs
[
"is_object"
]
=
True
return
self
.
view_list
(
**
kwargs
)
def
before_edit
(
self
,
form
):
"""
...
...
@@ -748,6 +771,7 @@ class BaseView(object):
form
=
self
.
get_form
(
self
.
edit_schema
,
buttons
=
(
btn_delete
,
btn_cancel
))
table
=
self
.
get_item_table
(
row
)
resources
=
form
.
get_widget_resources
()
form
.
set_appstruct
(
self
.
get_values
(
row
))
kwargs
[
"readonly"
]
=
True
...
...
opensipkd/base/views/routes.py
View file @
59ce6bc
...
...
@@ -140,7 +140,12 @@ class ListSchema(colander.Schema):
path
=
colander
.
SchemaNode
(
colander
.
String
(),
title
=
'Path'
,
searchable
=
True
)
template
=
colander
.
SchemaNode
(
class_view
=
colander
.
SchemaNode
(
colander
.
String
(),
searchable
=
False
,
global_search
=
False
,
)
def_func
=
colander
.
SchemaNode
(
colander
.
String
(),
searchable
=
False
,
global_search
=
False
,
...
...
opensipkd/detable/detable.py
View file @
59ce6bc
...
...
@@ -107,7 +107,7 @@ class DeTable(field.Field):
filters
=
'true'
,
paginates
=
'true'
,
params
=
""
,
server_side
=
'true'
,
server_side
=
True
,
state_save
=
True
,
data
=
[],
allow_edit
=
True
,
...
...
@@ -123,6 +123,7 @@ class DeTable(field.Field):
self
.
rows
=
kw
.
get
(
"rows"
)
self
.
action
=
action
self
.
tableid
=
tableid
self
.
data
=
data
new_buttons
=
kw
.
get
(
"new_buttons"
)
or
()
...
...
@@ -192,8 +193,7 @@ class DeTable(field.Field):
table_widget
=
widget
.
TableWidget
()
self
.
widget
=
table_widget
self
.
server_side
=
server_side
self
.
server_side
=
json
.
dumps
(
server_side
)
self
.
data
=
data
columns
=
[]
headers
=
[]
...
...
@@ -236,10 +236,13 @@ class DeTable(field.Field):
if
isinstance
(
f
.
widget
,
deform
.
widget
.
HiddenWidget
):
d
[
"visible"
]
=
False
if
isinstance
(
f
.
widget
,
deform
.
widget
.
CheckboxWidget
):
el
if
isinstance
(
f
.
widget
,
deform
.
widget
.
CheckboxWidget
):
d
.
update
(
self
.
widget_checkbox
(
f
))
elif
isinstance
(
f
.
widget
,
deform
.
widget
.
SelectWidget
):
d
.
update
(
self
.
widget_select
(
f
))
else
:
d
[
"checkbox"
]
=
False
d
[
"wg_checkbox"
]
=
False
d
[
"wg_select"
]
=
False
if
hasattr
(
f
,
"url"
):
url
=
f
.
url
d
[
"render"
]
=
"""
...
...
@@ -294,7 +297,6 @@ class DeTable(field.Field):
# cols2.append(data)
filter_scripts
=
self
.
get_filter_scripts
(
f
)
self
.
filter_scripts
=
filter_scripts
self
.
filter_form
=
filter_form
...
...
@@ -313,8 +315,8 @@ class DeTable(field.Field):
def
widget_checkbox
(
self
,
column
):
d
=
{}
d
[
"checkbox"
]
=
True
d
[
"
check
_val"
]
=
[
column
.
widget
.
true_val
,
column
.
widget
.
false_val
]
d
[
"
wg_
checkbox"
]
=
True
d
[
"
wg_checkbox
_val"
]
=
[
column
.
widget
.
true_val
,
column
.
widget
.
false_val
]
d
[
"className"
]
=
"text-center"
d
[
"width"
]
=
"30pt"
# d["render"] = """
...
...
@@ -329,6 +331,16 @@ class DeTable(field.Field):
return
d
def
widget_select
(
self
,
column
):
d
=
{}
d
[
"wg_select"
]
=
True
d
[
"wg_select_val"
]
=
column
.
widget
.
values
if
column
.
widget
.
values
:
for
val
in
column
.
widget
.
values
:
if
hasattr
(
column
,
f
"color_{val}"
):
d
[
f
"color_{val}"
]
=
getattr
(
column
,
f
"color_{val}"
)
return
d
def
action_url
(
self
,
f
):
act
=
""
if
self
.
allow_view
:
...
...
@@ -365,8 +377,8 @@ class DeTable(field.Field):
txt
=
f
'id="{col_id}" data-index={field_index} '
html
+=
'<div class="form-group">'
if
isinstance
(
f
.
widget
,
deform
.
widget
.
CheckboxWidget
):
check_val
=
[
f
.
widget
.
true_val
,
f
.
widget
.
false_val
]
radio_val
=
[[
""
,
'Semua'
],
[
check_val
[
0
],
'Aktif'
],
[
check_val
[
1
],
'Pasif'
]]
wg_
check_val
=
[
f
.
widget
.
true_val
,
f
.
widget
.
false_val
]
radio_val
=
[[
""
,
'Semua'
],
[
wg_check_val
[
0
],
'Aktif'
],
[
wg_
check_val
[
1
],
'Pasif'
]]
html
+=
'<label class="" for="'
+
col_id
+
'">'
+
f
.
title
+
'</label>'
html
+=
'<div class="input-group" id="'
+
col_id
+
'">'
for
rdo
in
range
(
len
(
radio_val
)):
...
...
@@ -381,26 +393,43 @@ class DeTable(field.Field):
html
+=
f
'{radio_val[rdo][1]}</label>'
html
+=
'</label>'
html
+=
'</div>'
# elif isinstance(f.typ, colander.Date):
# requirements = f.widget.requirements
# for requirement in requirements:
# if type(requirement) == dict and "js" in requirement:
# for req in requirement:
#
# html += f'<input type="text" class="form-control {self.tableid}-control-filter hasDatePicker"'
# html += f'placeholder="{f.title}" {txt}/>'
# html += """
# <script type="text/javascript">
# deform.addCallback(
# '%s',
# function deform_cb(oid) {
# $('#'+oid).datepicker();
# }
# );
# </script>
# """ % self.tableid
elif
isinstance
(
f
.
widget
,
deform
.
widget
.
SelectWidget
):
wg_select_val
=
f
.
widget
.
values
html
+=
f
'<select class="form-control {self.tableid}-control-filter"'
html
+=
f
'placeholder="{f.title}" {txt}/>'
html
+=
'<option value="">Semua</option>'
for
key
in
wg_select_val
:
html
+=
f
'<option value="{key}">{wg_select_val[key]}</option>'
html
+=
'</select>'
elif
isinstance
(
f
.
typ
,
colander
.
Date
):
html
+=
f
'<div class="form-group" {txt}>'
html
+=
f
'<div class="input-group">'
html
+=
f
'<span class="input-group-addon">{f.title}</span>'
html
+=
f
'<span class="input-group-addon"><input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
html
+=
f
'data-index={field_index} placeholder="{f.title} Awal" '
html
+=
f
'name="{col_id}" id="{col_id}-min"/></span>'
html
+=
f
'<span class="input-group-addon"><input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
html
+=
f
'data-index={field_index} placeholder="{f.title} Akhir" '
html
+=
f
'name="{col_id}" id="{col_id}-max" /></span>'
html
+=
f
'</div>'
html
+=
f
'</div>'
# html += """
# <script type="text/javascript">
# deform.addCallback(
# '%s',
# function deform_cb(oid) {
# $('#'+oid).datepicker();
# }
# );
# </script>
# """ % self.tableid
# requirements = f.widget.requirements
# for requirement in requirements:
# if type(requirement) == dict and "js" in requirement:
# for req in requirement:
#
else
:
html
+=
f
'<input type="text" class="form-control {self.tableid}-control-filter"'
html
+=
f
'placeholder="{f.title}" {txt}/>'
...
...
@@ -410,6 +439,7 @@ class DeTable(field.Field):
def
get_filter_scripts
(
self
,
f
):
return
""
"""
for (let co in ${tableid}Columns) {
if (${tableid}Columns[co].checkbox === true) {
...
...
opensipkd/detable/templates/detable.pt
View file @
59ce6bc
This diff is collapsed.
Click to expand it.
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