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__)
class
ListSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
title
=
"Action"
title
=
"Action"
,
field
=
User
.
id
,
)
user_name
=
colander
.
SchemaNode
(
colander
.
String
(),
...
...
@@ -32,31 +33,28 @@ class ListSchema(colander.Schema):
desa_name
=
colander
.
SchemaNode
(
colander
.
String
(),
field
=
ResDesa
.
nama
)
@colander.deferred
def
desa_checkbox_widget
(
node
,
kw
):
values
=
kw
.
get
(
'desa_list'
,
[])
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
):
user_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
widget
.
SelectWidget
(
values
=
User
.
get_list
()
),
widget
=
widget
.
SelectWidget
(),
oid
=
"user_id"
,
title
=
"User"
,
)
desa_id
=
colander
.
SchemaNode
(
desa_id
s
=
colander
.
SchemaNode
(
colander
.
Set
(),
widget
=
desa_checkbox_widget
,
validator
=
single_choice_validator
,
oid
=
"desa_id"
,
oid
=
"desa_ids"
,
title
=
"Kelurahan/Desa"
,
)
def
after_bind
(
self
,
node
,
kw
):
node
[
'user_id'
]
.
widget
.
values
=
User
.
get_list
()
class
EditSchema
(
AddSchema
):
id
=
colander
.
SchemaNode
(
...
...
@@ -64,13 +62,8 @@ class EditSchema(AddSchema):
missing
=
colander
.
drop
,
widget
=
widget
.
HiddenWidget
(
readonly
=
True
)
)
user_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
missing
=
colander
.
drop
,
widget
=
widget
.
SelectWidget
(
values
=
User
.
get_list
(),
readonly
=
True
),
# Ditampilkan, tetapi readonly
oid
=
"user_id"
,
title
=
"User"
,
)
# def after_bind(self,node, kw):
class
Views
(
BaseView
):
def
__init__
(
self
,
request
):
...
...
@@ -79,12 +72,9 @@ class Views(BaseView):
self
.
add_schema
=
AddSchema
self
.
edit_schema
=
EditSchema
self
.
list_route
=
'user-area'
self
.
table
=
User
Area
self
.
table
=
User
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
):
a
=
AssetResolver
(
module_name
)
resolver
=
a
.
resolve
(
''
)
...
...
@@ -92,14 +82,16 @@ class Views(BaseView):
def
pdf_response
(
self
,
**
kwargs
):
from
opensipkd.base.tools.report
import
jasper_export
logo
=
self
.
get_module_path
(
'opensipkd.base'
)
logo
=
os
.
path
.
join
(
logo
,
'static'
,
'img'
,
'logo.png'
)
path
=
self
.
get_module_path
(
'opensipkd.base'
)
logo
=
os
.
path
.
join
(
path
,
'static'
,
'img'
,
'logo.png'
)
report_file
=
os
.
path
.
join
(
path
,
'reports'
,
'user_area.jrxml'
)
parameters
=
{
"judul"
:
get_params
(
'company'
,
"openSIPKD"
),
"alamat_lengkap"
:
get_params
(
'address'
,
"Bekasi"
),
"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
])
@staticmethod
...
...
@@ -119,12 +111,13 @@ class Views(BaseView):
return
csv_response
(
self
.
req
,
value
,
filename
)
def
list_join
(
self
,
query
,
**
kwargs
):
return
query
.
outerjoin
(
ResDesa
,
ResDesa
.
id
==
self
.
table
.
desa_
id
)
\
.
outerjoin
(
User
,
User
.
id
==
self
.
table
.
user
_id
)
return
query
.
outerjoin
(
UserArea
,
UserArea
.
user_id
==
self
.
table
.
id
)
\
.
outerjoin
(
ResDesa
,
ResDesa
.
id
==
UserArea
.
desa
_id
)
@view_config
(
route_name
=
'user-area'
,
renderer
=
'templates/table.pt'
,
permission
=
'user-view'
)
def
view_list
(
self
,
**
kwargs
):
kwargs
=
{
"allow_delete"
:
False
}
return
super
(
Views
,
self
)
.
view_list
(
**
kwargs
)
@view_config
(
route_name
=
'user-area-act'
,
renderer
=
'json'
,
...
...
@@ -163,35 +156,52 @@ class Views(BaseView):
def
view_edit
(
self
):
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
):
if
row
:
# Mode Edit: Perbarui entri yang ada
desa_ids
=
values
.
get
(
"desa_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
request
=
self
.
req
if
not
row
:
# dibuat apabila penambahan data, karena data yang di submit adalah user_id
user_id
=
values
.
get
(
"user_id"
)
if
not
user_id
:
return
None
desa_ids
=
values
.
get
(
"desa_id"
)
if
desa_ids
:
desa_id
=
next
(
iter
(
desa_ids
))
if
desa_ids
else
None
if
desa_id
is
not
None
:
new_row
=
UserArea
(
user_id
=
user_id
,
desa_id
=
int
(
desa_id
)
)
DBSession
.
add
(
new_row
)
DBSession
.
flush
()
return
new_row
return
None
row
=
self
.
table
.
query_id
(
user_id
)
.
first
()
else
:
# Jika sedang mengedit, hapus entri lama untuk user_id dan desa_id
if
'id'
in
values
:
DBSession
.
query
(
UserArea
)
.
filter_by
(
user_id
=
row
.
id
,
)
.
delete
()
# Tambahkan entri baru untuk setiap departemen yang dipilih
for
desa_id
in
values
[
'desa_ids'
]:
new_row
=
UserArea
(
user_id
=
row
.
id
,
desa_id
=
int
(
desa_id
),
)
DBSession
.
add
(
new_row
)
DBSession
.
flush
()
request
.
session
.
flash
(
'User Area sudah disimpan.'
)
def
get_existing_desa
(
self
,
user_id
):
q
=
DBSession
.
query
(
UserArea
)
.
filter_by
(
user_id
=
user_id
)
r
=
[]
...
...
@@ -202,10 +212,6 @@ class Views(BaseView):
def
get_values
(
self
,
row
,
istime
=
False
):
# Call the parent class's get_values to get the base dictionary
d
=
super
(
Views
,
self
)
.
get_values
(
row
,
istime
)
# Populate the form with the existing data from the selected row
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
d
[
"desa_ids"
]
=
self
.
user_area_set
(
row
)
d
[
"user_id"
]
=
row
.
id
return
d
\ 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