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 fdcb63b8
authored
Mar 26, 2025
by
Ari Agung Prasetiyo
Committed by
Ari Agung Prasetiyo
Mar 26, 2025
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
user area
1 parent
4511f70c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
61 deletions
opensipkd/base/views/user_area.py
opensipkd/base/views/user_area.py
View file @
fdcb63b
...
@@ -19,7 +19,8 @@ log = logging.getLogger(__name__)
...
@@ -19,7 +19,8 @@ log = logging.getLogger(__name__)
class
ListSchema
(
colander
.
Schema
):
class
ListSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
colander
.
Integer
(),
title
=
"Action"
title
=
"Action"
,
field
=
User
.
id
,
)
)
user_name
=
colander
.
SchemaNode
(
user_name
=
colander
.
SchemaNode
(
colander
.
String
(),
colander
.
String
(),
...
@@ -32,31 +33,28 @@ class ListSchema(colander.Schema):
...
@@ -32,31 +33,28 @@ class ListSchema(colander.Schema):
desa_name
=
colander
.
SchemaNode
(
desa_name
=
colander
.
SchemaNode
(
colander
.
String
(),
colander
.
String
(),
field
=
ResDesa
.
nama
)
field
=
ResDesa
.
nama
)
@colander.deferred
@colander.deferred
def
desa_checkbox_widget
(
node
,
kw
):
def
desa_checkbox_widget
(
node
,
kw
):
values
=
kw
.
get
(
'desa_list'
,
[])
values
=
kw
.
get
(
'desa_list'
,
[])
return
widget
.
CheckboxChoiceWidget
(
values
=
values
)
return
widget
.
CheckboxChoiceWidget
(
values
=
values
)
def
single_choice_validator
(
node
,
value
):
"""Validator untuk memastikan hanya satu opsi yang dipilih."""
if
len
(
value
)
>
1
:
raise
colander
.
Invalid
(
node
,
"Hanya boleh memilih satu Kelurahan/Desa."
)
class
AddSchema
(
colander
.
Schema
):
class
AddSchema
(
colander
.
Schema
):
user_id
=
colander
.
SchemaNode
(
user_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
colander
.
Integer
(),
widget
=
widget
.
SelectWidget
(
values
=
User
.
get_list
()
),
widget
=
widget
.
SelectWidget
(),
oid
=
"user_id"
,
oid
=
"user_id"
,
title
=
"User"
,
title
=
"User"
,
)
)
desa_id
=
colander
.
SchemaNode
(
desa_id
s
=
colander
.
SchemaNode
(
colander
.
Set
(),
colander
.
Set
(),
widget
=
desa_checkbox_widget
,
widget
=
desa_checkbox_widget
,
validator
=
single_choice_validator
,
oid
=
"desa_ids"
,
oid
=
"desa_id"
,
title
=
"Kelurahan/Desa"
,
title
=
"Kelurahan/Desa"
,
)
)
def
after_bind
(
self
,
node
,
kw
):
node
[
'user_id'
]
.
widget
.
values
=
User
.
get_list
()
class
EditSchema
(
AddSchema
):
class
EditSchema
(
AddSchema
):
id
=
colander
.
SchemaNode
(
id
=
colander
.
SchemaNode
(
...
@@ -64,13 +62,8 @@ class EditSchema(AddSchema):
...
@@ -64,13 +62,8 @@ class EditSchema(AddSchema):
missing
=
colander
.
drop
,
missing
=
colander
.
drop
,
widget
=
widget
.
HiddenWidget
(
readonly
=
True
)
widget
=
widget
.
HiddenWidget
(
readonly
=
True
)
)
)
user_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
# def after_bind(self,node, kw):
missing
=
colander
.
drop
,
widget
=
widget
.
SelectWidget
(
values
=
User
.
get_list
(),
readonly
=
True
),
# Ditampilkan, tetapi readonly
oid
=
"user_id"
,
title
=
"User"
,
)
class
Views
(
BaseView
):
class
Views
(
BaseView
):
def
__init__
(
self
,
request
):
def
__init__
(
self
,
request
):
...
@@ -79,12 +72,9 @@ class Views(BaseView):
...
@@ -79,12 +72,9 @@ class Views(BaseView):
self
.
add_schema
=
AddSchema
self
.
add_schema
=
AddSchema
self
.
edit_schema
=
EditSchema
self
.
edit_schema
=
EditSchema
self
.
list_route
=
'user-area'
self
.
list_route
=
'user-area'
self
.
table
=
User
Area
self
.
table
=
User
self
.
list_buttons
=
self
.
list_buttons
+
self
.
list_report
+
(
btn_upload
,)
self
.
list_buttons
=
self
.
list_buttons
+
self
.
list_report
+
(
btn_upload
,)
path
=
os
.
path
.
dirname
(
__file__
)
path
=
os
.
path
.
dirname
(
path
)
self
.
report_file
=
os
.
path
.
join
(
path
,
'reports'
,
'user_area.jrxml'
)
def
get_module_path
(
self
,
module_name
):
def
get_module_path
(
self
,
module_name
):
a
=
AssetResolver
(
module_name
)
a
=
AssetResolver
(
module_name
)
resolver
=
a
.
resolve
(
''
)
resolver
=
a
.
resolve
(
''
)
...
@@ -92,14 +82,16 @@ class Views(BaseView):
...
@@ -92,14 +82,16 @@ class Views(BaseView):
def
pdf_response
(
self
,
**
kwargs
):
def
pdf_response
(
self
,
**
kwargs
):
from
opensipkd.base.tools.report
import
jasper_export
from
opensipkd.base.tools.report
import
jasper_export
logo
=
self
.
get_module_path
(
'opensipkd.base'
)
path
=
self
.
get_module_path
(
'opensipkd.base'
)
logo
=
os
.
path
.
join
(
logo
,
'static'
,
'img'
,
'logo.png'
)
logo
=
os
.
path
.
join
(
path
,
'static'
,
'img'
,
'logo.png'
)
report_file
=
os
.
path
.
join
(
path
,
'reports'
,
'user_area.jrxml'
)
parameters
=
{
parameters
=
{
"judul"
:
get_params
(
'company'
,
"openSIPKD"
),
"judul"
:
get_params
(
'company'
,
"openSIPKD"
),
"alamat_lengkap"
:
get_params
(
'address'
,
"Bekasi"
),
"alamat_lengkap"
:
get_params
(
'address'
,
"Bekasi"
),
"logo"
:
logo
"logo"
:
logo
}
}
filename
=
jasper_export
(
self
.
report_file
,
parameters
=
parameters
)
filename
=
jasper_export
(
report_file
,
parameters
=
parameters
)
return
file_response
(
self
.
req
,
filename
=
filename
[
0
])
return
file_response
(
self
.
req
,
filename
=
filename
[
0
])
@staticmethod
@staticmethod
...
@@ -119,12 +111,13 @@ class Views(BaseView):
...
@@ -119,12 +111,13 @@ class Views(BaseView):
return
csv_response
(
self
.
req
,
value
,
filename
)
return
csv_response
(
self
.
req
,
value
,
filename
)
def
list_join
(
self
,
query
,
**
kwargs
):
def
list_join
(
self
,
query
,
**
kwargs
):
return
query
.
outerjoin
(
ResDesa
,
ResDesa
.
id
==
self
.
table
.
desa_
id
)
\
return
query
.
outerjoin
(
UserArea
,
UserArea
.
user_id
==
self
.
table
.
id
)
\
.
outerjoin
(
User
,
User
.
id
==
self
.
table
.
user
_id
)
.
outerjoin
(
ResDesa
,
ResDesa
.
id
==
UserArea
.
desa
_id
)
@view_config
(
route_name
=
'user-area'
,
renderer
=
'templates/table.pt'
,
@view_config
(
route_name
=
'user-area'
,
renderer
=
'templates/table.pt'
,
permission
=
'user-view'
)
permission
=
'user-view'
)
def
view_list
(
self
,
**
kwargs
):
def
view_list
(
self
,
**
kwargs
):
kwargs
=
{
"allow_delete"
:
False
}
return
super
(
Views
,
self
)
.
view_list
(
**
kwargs
)
return
super
(
Views
,
self
)
.
view_list
(
**
kwargs
)
@view_config
(
route_name
=
'user-area-act'
,
renderer
=
'json'
,
@view_config
(
route_name
=
'user-area-act'
,
renderer
=
'json'
,
...
@@ -163,35 +156,52 @@ class Views(BaseView):
...
@@ -163,35 +156,52 @@ class Views(BaseView):
def
view_edit
(
self
):
def
view_edit
(
self
):
return
super
(
Views
,
self
)
.
view_edit
()
return
super
(
Views
,
self
)
.
view_edit
()
def
after_save
(
self
,
values
,
row
):
desa_ids
=
values
.
get
(
"desa_ids"
)
existing
=
self
.
user_area_set
(
row
)
unused
=
existing
-
values
[
'desa_ids'
]
if
unused
:
q
=
DBSession
.
query
(
UserArea
)
.
filter_by
(
user_id
=
row
.
id
)
.
filter
(
UserArea
.
group_id
.
in_
(
unused
))
q
.
delete
(
synchronize_session
=
False
)
new
=
values
[
'desa_ids'
]
-
existing
for
aid
in
new
:
ua
=
UserArea
()
ua
.
user_id
=
row
.
id
ua
.
desa_id
=
aid
DBSession
.
add
(
ua
)
DBSession
.
flush
()
return
super
()
.
after_save
(
self
,
values
,
row
)
def
user_area_set
(
self
,
row
):
q
=
DBSession
.
query
(
UserArea
)
.
filter_by
(
user_id
=
row
.
id
)
r
=
[]
for
ua
in
q
:
r
.
append
(
str
(
ua
.
desa_id
))
return
set
(
r
)
def
save_request
(
self
,
values
,
row
=
None
):
def
save_request
(
self
,
values
,
row
=
None
):
if
row
:
# Mode Edit: Perbarui entri yang ada
request
=
self
.
req
desa_ids
=
values
.
get
(
"desa_id"
)
if
not
row
:
# dibuat apabila penambahan data, karena data yang di submit adalah user_id
if
desa_ids
:
desa_id
=
next
(
iter
(
desa_ids
))
if
desa_ids
else
None
if
desa_id
is
not
None
:
row
.
desa_id
=
int
(
desa_id
)
# Perbarui desa_id pada row yang ada
# user_id tidak diubah, tetap dari row.user_id
DBSession
.
add
(
row
)
DBSession
.
flush
()
return
row
return
None
else
:
# Mode Tambah: Buat entri baru tanpa menghapus entri lama
user_id
=
values
.
get
(
"user_id"
)
user_id
=
values
.
get
(
"user_id"
)
if
not
user_id
:
row
=
self
.
table
.
query_id
(
user_id
)
.
first
()
return
None
else
:
desa_ids
=
values
.
get
(
"desa_id"
)
# Jika sedang mengedit, hapus entri lama untuk user_id dan desa_id
if
desa_ids
:
if
'id'
in
values
:
desa_id
=
next
(
iter
(
desa_ids
))
if
desa_ids
else
None
DBSession
.
query
(
UserArea
)
.
filter_by
(
if
desa_id
is
not
None
:
user_id
=
row
.
id
,
new_row
=
UserArea
(
)
.
delete
()
user_id
=
user_id
,
desa_id
=
int
(
desa_id
)
# Tambahkan entri baru untuk setiap departemen yang dipilih
)
for
desa_id
in
values
[
'desa_ids'
]:
DBSession
.
add
(
new_row
)
new_row
=
UserArea
(
DBSession
.
flush
()
user_id
=
row
.
id
,
return
new_row
desa_id
=
int
(
desa_id
),
return
None
)
DBSession
.
add
(
new_row
)
DBSession
.
flush
()
request
.
session
.
flash
(
'User Area sudah disimpan.'
)
def
get_existing_desa
(
self
,
user_id
):
def
get_existing_desa
(
self
,
user_id
):
q
=
DBSession
.
query
(
UserArea
)
.
filter_by
(
user_id
=
user_id
)
q
=
DBSession
.
query
(
UserArea
)
.
filter_by
(
user_id
=
user_id
)
r
=
[]
r
=
[]
...
@@ -202,10 +212,6 @@ class Views(BaseView):
...
@@ -202,10 +212,6 @@ class Views(BaseView):
def
get_values
(
self
,
row
,
istime
=
False
):
def
get_values
(
self
,
row
,
istime
=
False
):
# Call the parent class's get_values to get the base dictionary
# Call the parent class's get_values to get the base dictionary
d
=
super
(
Views
,
self
)
.
get_values
(
row
,
istime
)
d
=
super
(
Views
,
self
)
.
get_values
(
row
,
istime
)
d
[
"desa_ids"
]
=
self
.
user_area_set
(
row
)
# Populate the form with the existing data from the selected row
d
[
"user_id"
]
=
row
.
id
d
[
"id"
]
=
str
(
row
.
id
)
# Hidden field for the row ID
d
[
"user_id"
]
=
row
.
user_id
# Pre-fill user_id (readonly in edit form)
d
[
"desa_id"
]
=
{
str
(
row
.
desa_id
)}
# Pre-fill desa_id as a single-item set
return
d
return
d
\ No newline at end of file
\ No newline at end of file
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