Commit d0f6a355 by Hamsyah

pembaruan terbaru hmzh

1 parent ad9a4007
import colander import colander
from deform import widget from deform import widget
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView from . import BaseView
from ...models import User, DepartemenUser, Departemen, DBSession from ...models import User, DepartemenUser, Departemen, DBSession
from .departemen import departemen_widget, get_departemen_list from .departemen import departemen_widget, get_departemen_list
from .departemen import get_departemen_list
from .user import user_widget, user_select, user_list from .user import user_widget, user_select, user_list
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
_ = TranslationStringFactory('myapp')
@colander.deferred @colander.deferred
def departemen_widget(node, kw): def departemen_widget(node, kw):
values = kw.get ('departemen_list',[]) values = kw.get('departemen_list', [])
return widget.CheckboxChoiceWidget(values=values, Placeholder='Pilih Departemen') return widget.CheckboxChoiceWidget(values=values, placeholder='Pilih Departemen')
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode( id = colander.SchemaNode(
...@@ -28,8 +26,9 @@ class ListSchema(colander.Schema): ...@@ -28,8 +26,9 @@ class ListSchema(colander.Schema):
) )
departemen_name = colander.SchemaNode( departemen_name = colander.SchemaNode(
colander.String(), colander.String(),
field=Departemen.nama) field=Departemen.nama,
title="Departemen"
)
@colander.deferred @colander.deferred
def departemen_checkbox_widget(node, kw): def departemen_checkbox_widget(node, kw):
...@@ -44,23 +43,23 @@ class AddSchema(colander.Schema): ...@@ -44,23 +43,23 @@ class AddSchema(colander.Schema):
title="User", title="User",
) )
departemen_id = colander.SchemaNode( departemen_id = colander.SchemaNode(
colander.Set(), colander.Set(), # Tetap menggunakan colander.Set()
widget=departemen_checkbox_widget, widget=departemen_checkbox_widget,
oid="departemen_id", oid="departemen_id",
title="Departemen", title="Departemen",
) )
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), id = colander.SchemaNode(
colander.String(),
missing=colander.drop, missing=colander.drop,
widget=widget.HiddenWidget(readonly=True)) widget=widget.HiddenWidget(readonly=True)
)
class Views(BaseView): class Views(BaseView):
def __init__(self, request): def __init__(self, request):
super().__init__(request) super().__init__(request)
self.request = request
self.list_schema = ListSchema self.list_schema = ListSchema
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
...@@ -82,7 +81,8 @@ class Views(BaseView): ...@@ -82,7 +81,8 @@ class Views(BaseView):
return super().view_act() return super().view_act()
def get_bindings(self, row=None): def get_bindings(self, row=None):
return {"departemen_list": get_departemen_list(), return {
"departemen_list": get_departemen_list(),
"user_list": user_list() "user_list": user_list()
} }
...@@ -106,18 +106,58 @@ class Views(BaseView): ...@@ -106,18 +106,58 @@ class Views(BaseView):
def view_edit(self): def view_edit(self):
return super().view_edit() 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 \ 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 \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!