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