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 d0f6a355
authored
Mar 06, 2025
by
Hamsyah
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
pembaruan terbaru hmzh
1 parent
ad9a4007
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
165 additions
and
205 deletions
opensipkd/base/views/posisi.py
opensipkd/base/views/user_dep.py
opensipkd/base/views/posisi.py
View file @
d0f6a35
import
colander
from
deform
import
(
widget
,
)
from
pyramid.view
import
(
view_config
,
)
from
deform
import
widget
from
pyramid.view
import
view_config
from
sqlalchemy
import
or_
from
sqlalchemy.orm
import
aliased
...
...
@@ -12,13 +12,9 @@ from opensipkd.tools import dmy, date_from_str
from
.
import
widget_os
from
..views
import
ColumnDT
,
DataTables
,
BaseView
from
deform.widget
import
RadioChoiceWidget
SESS_ADD_FAILED
=
'Tambah posisi partner gagal'
SESS_EDIT_FAILED
=
'Edit posisi partner gagal'
class
AddSchema
(
colander
.
Schema
):
nama_widget
=
widget
.
AutocompleteInputWidget
(
size
=
60
,
...
...
@@ -26,70 +22,67 @@ class AddSchema(colander.Schema):
min_length
=
2
,
style
=
"z-index: 100000 !important;"
)
departemen_widget
=
widget
.
AutocompleteInputWidget
(
size
=
60
,
values
=
'/departemen/hon/act'
,
min_length
=
2
,
style
=
"z-index: 100001 !important;"
)
@colander.deferred
def
departemen_widget
(
node
,
kw
):
departemen_list
=
DBSession
.
query
(
Departemen
.
id
,
Departemen
.
nama
)
.
all
()
choices
=
[(
str
(
departemen
.
id
),
departemen
.
nama
)
for
departemen
in
departemen_list
]
return
widget
.
CheckboxChoiceWidget
(
values
=
choices
)
# Widget untuk jabatan diubah menjadi RadioChoiceWidget
@colander.deferred
def
jabatan_widget
(
node
,
kw
):
# Ambil daftar jabatan dari database
jabatan_list
=
DBSession
.
query
(
Jabatan
.
id
,
Jabatan
.
nama
)
.
all
()
# Format data untuk RadioChoiceWidget: [(value, label), ...]
choices
=
[(
str
(
jabatan
.
id
),
jabatan
.
nama
)
for
jabatan
in
jabatan_list
]
return
RadioChoiceWidget
(
values
=
choices
)
choices
=
[(
''
,
'- Pilih Jabatan -'
)]
+
[(
str
(
jabatan
.
id
),
jabatan
.
nama
)
for
jabatan
in
jabatan_list
]
return
widget
.
SelectWidget
(
values
=
choices
)
partner_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
oid
=
"partner_id"
,
widget
=
widget
.
HiddenWidget
(),
)
missing
=
colander
.
null
,
# Tetap izinkan kosong
title
=
"Partner ID"
)
nama
=
colander
.
SchemaNode
(
colander
.
String
(),
widget
=
nama_widget
,
oid
=
"partner_nm"
)
oid
=
"partner_nm"
,
title
=
"Nama"
)
departemen_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
oid
=
"departemen_id"
,
widget
=
widget
.
HiddenWidget
(),
)
missing
=
colander
.
drop
)
departemen
=
colander
.
SchemaNode
(
colander
.
S
tring
(),
colander
.
S
et
(),
widget
=
departemen_widget
,
oid
=
"departemen_nm"
)
oid
=
"departemen_nm"
,
title
=
"Departemen *"
)
jabatan_id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
oid
=
"jabatan_id"
,
widget
=
widget
.
HiddenWidget
(),
tit
tle
=
"Jabatan"
)
tit
le
=
"Jabatan"
,
missing
=
colander
.
drop
)
jabatan
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
jabatan_widget
,
oid
=
"jabatan_nm"
,
title
=
"Jabatan"
)
title
=
"Jabatan
*
"
)
mulai
=
colander
.
SchemaNode
(
colander
.
String
(),
oid
=
"mulai"
,
widget
=
widget_os
.
DateInputWidget
(
css_class
=
"date"
,
format
=
"dd-mm-yyyy"
))
widget
=
widget_os
.
DateInputWidget
(
css_class
=
"date"
,
format
=
"dd-mm-yyyy"
),
title
=
"Mulai"
)
selesai
=
colander
.
SchemaNode
(
colander
.
String
(),
oid
=
"selesai"
,
widget
=
widget_os
.
DateInputWidget
(
css_class
=
"date"
,
format
=
"dd-mm-yyyy"
,
style
=
"z-index: 9999 !important;"
)
)
style
=
"z-index: 9999 !important;"
)
,
title
=
"Selesai"
)
class
EditSchema
(
AddSchema
):
id
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
widget
=
widget
.
HiddenWidget
())
class
ListSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
colander
.
Integer
(),
title
=
"Action"
)
nama
=
colander
.
SchemaNode
(
...
...
@@ -99,7 +92,6 @@ class ListSchema(colander.Schema):
selesai
=
colander
.
SchemaNode
(
colander
.
String
())
class
ViewPartner
(
BaseView
):
def
__init__
(
self
,
request
):
super
(
ViewPartner
,
self
)
.
__init__
(
request
)
...
...
@@ -107,124 +99,28 @@ class ViewPartner(BaseView):
self
.
table
=
PartnerDepartemen
self
.
add_schema
=
AddSchema
self
.
edit_schema
=
EditSchema
# self.form_scripts = """
# $(document).ready(function () {
#
# $('#pegawai_nm').typeahead({
# "hint" : true,
# "highlight": true,
# "minLength": 1,
# "remote" : {
# url: "/partner/hon/act?term=%QUERY",
# beforeSend: function () {
# $('#partner_nm').addClass("loading");
# },
# filter: function(parsedResponse){
# $('#partner_nm').removeClass('loading');
# return parsedResponse;
# }
# },
# },{
# "name" : 'partner_nm',
# "displayKey": 'value',
# });
#
# $('#partner_nm').bind('typeahead:selected', function(obj, datum, name) {
# $('#partner_id').val(datum.id);
# $('#partner_nm').val(datum.nama);
# });
#
# $('#departemen_nm').typeahead({
# "hint" : true,
# "highlight": true,
# "minLength": 1,
# "remote" : {
# url: "/departemen/hon/act?term=%QUERY",
# beforeSend: function () {
# $('#departemen_nm').addClass("loading");
# },
# filter: function(parsedResponse){
# $('#departemen_nm').removeClass('loading');
# return parsedResponse;
# }
# },
# },{
# "name" : 'departemen_nm',
# "displayKey": 'value',
# });
#
# $('#departemen_nm').bind('typeahead:selected', function(obj, datum, name) {
# $('#departemen_id').val(datum.id);
# });
#
#
#
# $('#jabatan_nm').typeahead({
# "hint" : true,
# "highlight": true,
# "minLength": 1,
# "remote" : {
# url: "/partner/departemen/hon_jabatannm/act?term=%QUERY",
# beforeSend: function () {
# $('#jabatan_nm').addClass("loading");
# },
# filter: function(parsedResponse){
# $('#jabatan_nm').removeClass('loading');
# return parsedResponse;
# }
# },
# },{
# "name" : 'jabatan_nm',
# "displayKey": 'value',
# });
#
# $('#jabatan_nm').bind('typeahead:selected', function(obj, datum, name) {
# $('#jabatan_id').val(datum.id);
# $('#jabatan_nm').val(datum.value);
#
# });
# });
# """
#
# self.list_col_defs = json.dumps(
# [{"searchable": False, "visible": False, "targets": [0], }, {
# "searchable": True, "orderable": True, "targets": [1, 2],
# }])
# self.list_cols = [{'title': "ID", 'data': "id"},
# {'title': "NIP", 'data': "nik", 'width': '100pt'},
# {'title': "Nama", 'data': "nama"},
# {'title': "Unit Kerja", 'data': "departemen"},
# {'title': "Jabatan", 'data': "jabatan"},
# {'title': "Pemda", 'data': "jenis"},
# {'title': "Mulai", 'data': "mulai"},
# {'title': "Selesai", 'data': "selesai"}, ]
# self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
# 'btn_close'
# self.form_params = dict(scripts="")
# self.list_url = 'partner/departemen'
self
.
list_route
=
'partner-departemen'
def
form_validator
(
self
,
form
,
value
):
def
err_partner
():
raise
colander
.
Invalid
(
form
,
'Partner Belum Dipilih'
)
print
(
f
"Validating form with values: {value}"
)
# Debugging
def
err_departemen
():
raise
colander
.
Invalid
(
form
,
'Departemen Kerja Belum Dipilih'
)
raise
colander
.
Invalid
(
form
,
'Departemen Kerja Belum Dipilih'
)
def
err_jabatan
():
raise
colander
.
Invalid
(
form
,
'Partner Belum Dipilih'
)
raise
colander
.
Invalid
(
form
,
'Jabatan Belum Dipilih'
)
if
not
value
[
'jabatan_id'
]:
# Validasi jabatan
if
not
value
[
'jabatan'
]
or
value
[
'jabatan'
]
==
''
:
print
(
"Validation failed: Jabatan kosong"
)
err_jabatan
()
elif
not
value
[
'departemen_id'
]:
# Validasi departemen
if
not
value
[
'departemen'
]
or
value
[
'departemen'
]
==
set
():
print
(
"Validation failed: Departemen kosong"
)
err_departemen
()
elif
not
value
[
'partner_id'
]:
err_partner
()
# Tidak memvalidasi partner_id agar opsional
def
save_request
(
self
,
values
,
row
=
None
):
print
(
f
"Saving with values: {values}"
)
# Debugging
request
=
self
.
req
if
'id'
in
request
.
matchdict
:
values
[
'id'
]
=
request
.
matchdict
[
'id'
]
...
...
@@ -238,12 +134,44 @@ class ViewPartner(BaseView):
values
[
'selesai'
]
=
date_from_str
(
values
[
'selesai'
])
else
:
values
[
'selesai'
]
=
None
query_struktural
=
DBSession
.
query
(
Jabatan
.
jenis
)
.
\
filter
(
Jabatan
.
id
==
values
[
'jabatan_id'
])
.
scalar
()
values
[
'jabatan_id'
]
=
query_struktural
row
=
self
.
save
(
values
,
request
.
user
,
row
)
# Simpan jabatan yang dipilih dari dropdown
if
'jabatan'
in
values
and
values
[
'jabatan'
]:
values
[
'jabatan_id'
]
=
values
[
'jabatan'
]
query_struktural
=
DBSession
.
query
(
Jabatan
.
jenis
)
.
filter
(
Jabatan
.
id
==
values
[
'jabatan_id'
])
.
scalar
()
values
[
'jabatan_id'
]
=
query_struktural
if
query_struktural
else
values
[
'jabatan_id'
]
else
:
values
[
'jabatan_id'
]
=
None
# Konversi colander.null ke Python None untuk partner_id
partner_id
=
values
.
get
(
'partner_id'
)
if
partner_id
is
colander
.
null
:
partner_id
=
None
# Simpan setiap departemen yang dipilih sebagai baris baru
if
'departemen'
in
values
and
values
[
'departemen'
]:
for
dept_id
in
values
[
'departemen'
]:
exists
=
DBSession
.
query
(
PartnerDepartemen
)
.
filter_by
(
partner_id
=
partner_id
,
departemen_id
=
int
(
dept_id
),
jabatan_id
=
values
[
'jabatan_id'
]
)
.
first
()
if
not
exists
:
new_row
=
PartnerDepartemen
(
partner_id
=
partner_id
,
# Sekarang pasti None atau integer
departemen_id
=
int
(
dept_id
),
jabatan_id
=
values
[
'jabatan_id'
],
mulai
=
values
[
'mulai'
],
selesai
=
values
[
'selesai'
]
)
DBSession
.
add
(
new_row
)
DBSession
.
flush
()
request
.
session
.
flash
(
'Posisi Partner sudah disimpan.'
)
return
row
return
None
else
:
request
.
session
.
flash
(
'Tidak ada departemen yang dipilih.'
,
'error'
)
return
None
@view_config
(
route_name
=
'partner-departemen'
,
renderer
=
'templates/form.pt'
,
permission
=
'view'
)
...
...
@@ -283,7 +211,6 @@ class ViewPartner(BaseView):
if
self
.
req
.
user
.
company_id
:
q
=
q
.
filter
(
Departemen
.
company_id
==
self
.
req
.
user
.
company_id
)
row_table
=
DataTables
(
request
.
GET
,
q
,
columns
)
return
row_table
.
output_result
()
elif
url_dict
[
'act'
]
==
'hon_departemen'
:
...
...
@@ -292,16 +219,14 @@ class ViewPartner(BaseView):
q
=
PartnerDBSession
.
query
(
Partner
.
id
,
Partner
.
nik
,
Partner
.
nama
,
PartnerDepartemen
.
jabatan_id
,
Jabatan
.
nama
.
label
(
'jabatan_nm'
),
)
.
\
join
(
PartnerDepartemen
)
.
\
join
(
Jabatan
,
(
PartnerDepartemen
.
jabatan_id
==
Jabatan
.
id
))
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
filter
(
PartnerDepartemen
.
departemen_id
==
ses
[
'departemen_id'
])
.
\
filter
(
or_
(
Jabatan
.
kode
==
'101'
,
Jabatan
.
kode
==
'102'
))
.
\
order_by
(
Partner
.
nama
)
)
.
join
(
PartnerDepartemen
)
\
.
join
(
Jabatan
,
(
PartnerDepartemen
.
jabatan_id
==
Jabatan
.
id
))
\
.
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
\
.
filter
(
PartnerDepartemen
.
departemen_id
==
ses
[
'departemen_id'
])
\
.
filter
(
or_
(
Jabatan
.
kode
==
'101'
,
Jabatan
.
kode
==
'102'
))
\
.
order_by
(
Partner
.
nama
)
if
self
.
req
.
user
.
company_id
:
q
=
q
.
filter
(
Departemen
.
company_id
==
self
.
req
.
user
.
company_id
)
rows
=
q
.
all
()
r
=
[]
keys
=
(
'id'
,
'value'
,
'nik'
,
'nama'
,
'jabatan_id'
,
'jabatan_nm'
)
...
...
@@ -314,16 +239,14 @@ class ViewPartner(BaseView):
term
=
'term'
in
params
and
params
[
'term'
]
or
''
prefix
=
'prefix'
in
params
and
params
[
'prefix'
]
or
''
partner_id
=
'partner_id'
in
params
and
params
[
'partner_id'
]
or
0
# filter(or_(Jabatan.kode == '103', Jabatan.kode == '104')) dilepas sementara
q
=
PartnerDBSession
.
query
(
Partner
.
id
,
Partner
.
nik
,
Partner
.
nama
,
PartnerDepartemen
.
jabatan_id
,
Jabatan
.
nama
.
label
(
'jabatan_nm'
),
)
.
\
join
(
PartnerDepartemen
)
.
\
join
(
Jabatan
,
(
PartnerDepartemen
.
jabatan_id
==
Jabatan
.
id
))
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
filter
(
PartnerDepartemen
.
departemen_id
==
ses
[
'departemen_id'
])
.
\
order_by
(
Partner
.
nama
)
)
.
join
(
PartnerDepartemen
)
\
.
join
(
Jabatan
,
(
PartnerDepartemen
.
jabatan_id
==
Jabatan
.
id
))
\
.
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
\
.
filter
(
PartnerDepartemen
.
departemen_id
==
ses
[
'departemen_id'
])
\
.
order_by
(
Partner
.
nama
)
if
self
.
req
.
user
.
company_id
:
q
=
q
.
filter
(
Departemen
.
company_id
==
self
.
req
.
user
.
company_id
)
rows
=
q
.
all
()
...
...
@@ -340,15 +263,13 @@ class ViewPartner(BaseView):
q
=
PartnerDBSession
.
query
(
Partner
.
id
,
Partner
.
nik
,
Partner
.
nama
,
PartnerDepartemen
.
jabatan_id
,
Jabatan
.
nama
.
label
(
'jabatan_nm'
),
)
.
\
join
(
PartnerDepartemen
)
.
\
join
(
Jabatan
,
(
PartnerDepartemen
.
jabatan_id
==
Jabatan
.
id
))
.
\
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
filter
(
PartnerDepartemen
.
departemen_id
==
ses
[
'departemen_id'
])
.
\
filter
(
or_
(
Jabatan
.
kode
==
'101'
,
Jabatan
.
kode
==
'102'
,
Jabatan
.
kode
==
'103'
,
Jabatan
.
kode
==
'104'
))
.
\
order_by
(
Partner
.
nama
)
)
.
join
(
PartnerDepartemen
)
\
.
join
(
Jabatan
,
(
PartnerDepartemen
.
jabatan_id
==
Jabatan
.
id
))
\
.
filter
(
Partner
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
\
.
filter
(
PartnerDepartemen
.
departemen_id
==
ses
[
'departemen_id'
])
\
.
filter
(
or_
(
Jabatan
.
kode
==
'101'
,
Jabatan
.
kode
==
'102'
,
Jabatan
.
kode
==
'103'
,
Jabatan
.
kode
==
'104'
))
\
.
order_by
(
Partner
.
nama
)
if
self
.
req
.
user
.
company_id
:
q
=
q
.
filter
(
Departemen
.
company_id
==
self
.
req
.
user
.
company_id
)
rows
=
q
.
all
()
...
...
@@ -362,9 +283,9 @@ class ViewPartner(BaseView):
elif
url_dict
[
'act'
]
==
'hon_jabatannm'
:
term
=
'term'
in
params
and
params
[
'term'
]
or
''
q
=
DBSession
.
query
(
Jabatan
.
id
,
Jabatan
.
kode
,
Jabatan
.
nama
,
Jabatan
.
jenis
)
.
\
filter
(
Jabatan
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
.
\
order_by
(
Jabatan
.
nama
)
Jabatan
.
jenis
)
\
.
filter
(
Jabatan
.
nama
.
ilike
(
'
%%%
s
%%
'
%
term
))
\
.
order_by
(
Jabatan
.
nama
)
if
self
.
req
.
user
.
company_id
:
q
=
q
.
filter
(
Departemen
.
company_id
==
self
.
req
.
user
.
company_id
)
rows
=
q
.
all
()
...
...
@@ -376,7 +297,6 @@ class ViewPartner(BaseView):
nama_jenis
=
'Fungsional'
else
:
nama_jenis
=
'Keuangan'
d
=
{}
d
[
'id'
]
=
k
[
0
]
d
[
'value'
]
=
k
[
2
]
+
' ('
+
nama_jenis
+
')'
...
...
@@ -387,7 +307,7 @@ class ViewPartner(BaseView):
def
get_values
(
self
,
row
,
istime
=
False
):
values
=
super
()
.
get_values
(
row
,
istime
)
values
[
'nama'
]
=
row
.
partner
.
nama
values
[
'nama'
]
=
row
.
partner
.
nama
if
row
.
partner
else
''
values
[
'jabatan'
]
=
row
.
jabatan
.
nama
values
[
'departemen'
]
=
row
.
departemen
.
nama
values
[
'mulai'
]
=
dmy
(
row
.
mulai
)
...
...
@@ -398,12 +318,11 @@ class ViewPartner(BaseView):
jb
=
Jabatan
.
query_id
(
row
.
jabatan_id
)
.
first
()
if
jb
:
values
[
'struktural_nm'
]
=
jb
.
nama
return
values
@view_config
(
route_name
=
'partner-departemen-view'
,
renderer
=
'templates/form.pt'
,
permission
=
'partner-departemen'
)
def
view_view
(
self
):
# row = query_id(request).first()
def
view_view
(
self
):
return
super
()
.
view_view
()
def
before_add
(
self
):
...
...
@@ -416,6 +335,7 @@ class ViewPartner(BaseView):
renderer
=
'templates/form.pt'
,
permission
=
'partner-departemen'
)
def
view_add
(
self
):
print
(
f
"POST data: {self.req.POST}"
)
# Debugging data yang dikirim dari form
return
super
()
.
view_add
()
@view_config
(
route_name
=
'partner-departemen-edit'
,
...
...
opensipkd/base/views/user_dep.py
View file @
d0f6a35
import
colander
from
deform
import
widget
from
pyramid.view
import
view_config
from
.
import
BaseView
from
...models
import
User
,
DepartemenUser
,
Departemen
,
DBSession
from
.departemen
import
departemen_widget
,
get_departemen_list
from
.departemen
import
get_departemen_list
from
.user
import
user_widget
,
user_select
,
user_list
from
pyramid.i18n
import
TranslationStringFactory
_
=
TranslationStringFactory
(
'myapp'
)
@colander.deferred
def
departemen_widget
(
node
,
kw
):
values
=
kw
.
get
(
'departemen_list'
,
[])
return
widget
.
CheckboxChoiceWidget
(
values
=
values
,
P
laceholder
=
'Pilih Departemen'
)
values
=
kw
.
get
(
'departemen_list'
,
[])
return
widget
.
CheckboxChoiceWidget
(
values
=
values
,
p
laceholder
=
'Pilih Departemen'
)
class
ListSchema
(
colander
.
Schema
):
id
=
colander
.
SchemaNode
(
...
...
@@ -28,8 +26,9 @@ class ListSchema(colander.Schema):
)
departemen_name
=
colander
.
SchemaNode
(
colander
.
String
(),
field
=
Departemen
.
nama
)
field
=
Departemen
.
nama
,
title
=
"Departemen"
)
@colander.deferred
def
departemen_checkbox_widget
(
node
,
kw
):
...
...
@@ -44,23 +43,23 @@ class AddSchema(colander.Schema):
title
=
"User"
,
)
departemen_id
=
colander
.
SchemaNode
(
colander
.
Set
(),
colander
.
Set
(),
# Tetap menggunakan colander.Set()
widget
=
departemen_checkbox_widget
,
oid
=
"departemen_id"
,
title
=
"Departemen"
,
)
class
EditSchema
(
AddSchema
):
id
=
colander
.
SchemaNode
(
colander
.
String
(),
id
=
colander
.
SchemaNode
(
colander
.
String
(),
missing
=
colander
.
drop
,
widget
=
widget
.
HiddenWidget
(
readonly
=
True
)
)
widget
=
widget
.
HiddenWidget
(
readonly
=
True
)
)
class
Views
(
BaseView
):
def
__init__
(
self
,
request
):
super
()
.
__init__
(
request
)
self
.
request
=
request
self
.
list_schema
=
ListSchema
self
.
add_schema
=
AddSchema
self
.
edit_schema
=
EditSchema
...
...
@@ -82,7 +81,8 @@ class Views(BaseView):
return
super
()
.
view_act
()
def
get_bindings
(
self
,
row
=
None
):
return
{
"departemen_list"
:
get_departemen_list
(),
return
{
"departemen_list"
:
get_departemen_list
(),
"user_list"
:
user_list
()
}
...
...
@@ -106,18 +106,58 @@ class Views(BaseView):
def
view_edit
(
self
):
return
super
()
.
view_edit
()
def
save_request
(
self
,
values
,
row
=
None
):
# save(self, row, values):
for
k
,
v
in
values
.
items
():
if
not
v
:
setattr
(
row
,
k
,
None
)
values
[
"level_id"
]
=
1
if
"parent_id"
in
values
and
values
[
"parent_id"
]:
qry_parent
=
self
.
table
.
query_id
(
values
[
"parent_id"
])
parent
=
qry_parent
.
first
()
if
parent
and
parent
.
level_id
:
values
[
"level_id"
]
=
parent
.
level_id
+
1
if
"parent_id"
not
in
values
:
values
[
"parent_id"
]
=
None
row
=
super
()
.
save_request
(
values
,
row
)
return
row
\ No newline at end of file
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
# 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
new_row
=
DepartemenUser
(
user_id
=
user_id
,
departemen_id
=
int
(
departemen_id
)
# Konversi ke integer
)
DBSession
.
add
(
new_row
)
# Commit semua perubahan
DBSession
.
flush
()
return
row
# Kembalikan row jika ada, atau None jika tidak digunakan
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
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