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 f49dc799
authored
Mar 17, 2025
by
Hamsyah
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
pembaruan user_dep by hmzh
1 parent
165481bc
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
49 additions
and
44 deletions
opensipkd/base/views/user_dep.py
opensipkd/base/views/user_dep.py
View file @
f49dc79
import
colander
import
logging
from
deform
import
widget
from
pyramid.view
import
view_config
from
.
import
BaseView
,
button_import
from
...models
import
User
,
DepartemenUser
,
Departemen
,
DBSession
from
.departemen
import
departemen_widget
,
get_departemen_list
from
.user
import
user_
widget
,
user_select
,
user_
list
from
.departemen
import
get_departemen_list
from
.user
import
user_list
from
pyramid.i18n
import
TranslationStringFactory
_
=
TranslationStringFactory
(
'myapp'
)
log
=
logging
.
getLogger
(
__name__
)
@colander.deferred
def
departemen_widget
(
node
,
kw
):
values
=
kw
.
get
(
'departemen_list'
,
[])
return
widget
.
CheckboxChoiceWidget
(
values
=
values
,
placeholder
=
'Pilih Departemen'
)
return
widget
.
CheckboxChoiceWidget
(
values
=
values
,
multiple
=
True
,
placeholder
=
'Pilih Departemen'
)
class
ListSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
...
...
@@ -33,7 +35,7 @@ class ListSchema(colander.Schema):
@colander.deferred
def
departemen_checkbox_widget
(
node
,
kw
):
values
=
kw
.
get
(
'departemen_list'
,
[])
return
widget
.
CheckboxChoiceWidget
(
values
=
values
)
return
widget
.
CheckboxChoiceWidget
(
values
=
values
,
multiple
=
True
)
class
AddSchema
(
colander
.
Schema
):
user_id
=
colander
.
SchemaNode
(
...
...
@@ -43,7 +45,7 @@ class AddSchema(colander.Schema):
title
=
"User"
,
)
departemen_id
=
colander
.
SchemaNode
(
colander
.
Set
(),
# Tetap menggunakan colander.Set()
colander
.
Set
(),
widget
=
departemen_checkbox_widget
,
oid
=
"departemen_id"
,
title
=
"Departemen"
,
...
...
@@ -82,10 +84,17 @@ class Views(BaseView):
return
super
()
.
view_act
()
def
get_bindings
(
self
,
row
=
None
):
return
{
bindings
=
{
"departemen_list"
:
get_departemen_list
(),
"user_list"
:
user_list
()
}
if
row
and
hasattr
(
row
,
'user_id'
):
existing_depts
=
self
.
get_existing_departemen
(
row
.
user_id
)
bindings
[
"default_values"
]
=
{
"user_id"
:
row
.
user_id
,
"departemen_id"
:
list
(
existing_depts
)
}
return
bindings
@view_config
(
route_name
=
'user-departemen-add'
,
renderer
=
'templates/form.pt'
,
permission
=
'user-edit'
)
...
...
@@ -114,57 +123,53 @@ class Views(BaseView):
return
super
(
Views
,
self
)
.
view_upload
(
exts
=
(
".csv"
,
".tsv"
))
def
save_request
(
self
,
values
,
row
=
None
):
# Ambil user_id dari values
user_id
=
values
.
get
(
"user_id"
)
if
not
user_id
:
return
None
# Tidak ada user_id, kembalikan None atau tangani sesuai kebutuhan
return
None
# Jika ada departemen_id dalam values
if
"departemen_id"
in
values
:
# Ambil departemen yang sudah ada untuk user ini
existing_departemen
=
self
.
get_existing_departemen
(
user_id
)
# Konversi departemen_id dari set ke set of strings, filter None
selected_departemen
=
set
(
str
(
departemen_id
)
for
departemen_id
in
values
[
"departemen_id"
]
if
departemen_id
is
not
None
and
str
(
departemen_id
)
!=
"None"
)
# Departemen yang tidak dipilih lagi (akan dihapus)
unused_departemen
=
existing_departemen
-
selected_departemen
# Hapus departemen yang tidak dipilih lagi, pastikan hanya integer yang valid
if
unused_departemen
:
valid_unused
=
[
int
(
d
)
for
d
in
unused_departemen
if
d
.
isdigit
()]
if
valid_unused
:
DBSession
.
query
(
DepartemenUser
)
.
filter_by
(
user_id
=
user_id
)
\
.
filter
(
DepartemenUser
.
departemen_id
.
in_
(
valid_unused
))
\
.
delete
(
synchronize_session
=
False
)
# Departemen baru yang dipilih (akan ditambahkan)
new_departemen
=
selected_departemen
-
existing_departemen
# Tambahkan departemen baru, periksa duplikat sebelum insert
for
departemen_id
in
new_departemen
:
if
departemen_id
.
isdigit
():
# Pastikan hanya angka yang diproses
# Cek apakah kombinasi user_id dan departemen_id sudah ada
exists
=
DBSession
.
query
(
DepartemenUser
)
.
filter_by
(
user_id
=
user_id
,
departemen_id
=
int
(
departemen_id
)
)
.
first
()
if
not
exists
:
# Hanya tambahkan jika belum ada
# Batasi ke maksimal dua pilihan
selected_list
=
sorted
(
selected_departemen
)[:
2
]
# Ambil dua yang pertama
dept1
=
int
(
selected_list
[
0
])
if
selected_list
else
None
dept2
=
int
(
selected_list
[
1
])
if
len
(
selected_list
)
>
1
else
None
existing_row
=
DBSession
.
query
(
DepartemenUser
)
.
filter_by
(
user_id
=
user_id
)
.
first
()
if
selected_list
:
if
existing_row
:
# Update jika sudah ada
existing_row
.
departemen_id
=
dept1
existing_row
.
sub_departemen
=
dept2
else
:
# Tambah baru jika belum ada
new_row
=
DepartemenUser
(
user_id
=
user_id
,
departemen_id
=
int
(
departemen_id
)
# Konversi ke integer
departemen_id
=
dept1
,
sub_departemen
=
dept2
)
DBSession
.
add
(
new_row
)
else
:
# Jika tidak ada pilihan, hapus row yang ada
if
existing_row
:
DBSession
.
delete
(
existing_row
)
# Commit semua perubahan
DBSession
.
flush
()
return
row
# Kembalikan row jika ada, atau None jika tidak digunakan
return
row
def
get_existing_departemen
(
self
,
user_id
):
# Ambil semua departemen yang sudah ada untuk user tertentu
q
=
DBSession
.
query
(
DepartemenUser
)
.
filter_by
(
user_id
=
user_id
)
# Pastikan hanya mengembalikan string dari departemen_id yang valid
return
set
(
str
(
row
.
departemen_id
)
for
row
in
q
if
row
.
departemen_id
is
not
None
)
\ No newline at end of file
row
=
DBSession
.
query
(
DepartemenUser
)
.
filter_by
(
user_id
=
user_id
)
.
first
()
result
=
set
()
if
row
:
if
row
.
departemen_id
:
result
.
add
(
str
(
row
.
departemen_id
))
if
row
.
sub_departemen
:
result
.
add
(
str
(
row
.
sub_departemen
))
return
result
def
get_values
(
self
,
row
,
istime
=
False
):
d
=
super
(
Views
,
self
)
.
get_values
(
row
,
istime
)
d
[
"departemen_id"
]
=
self
.
get_existing_departemen
(
row
.
user_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