Commit f49dc799 by Hamsyah

pembaruan user_dep by hmzh

1 parent 165481bc
import colander import colander
import logging
from deform import widget from deform import widget
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView, button_import from . import BaseView, button_import
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 get_departemen_list
from .user import user_widget, user_select, user_list from .user import user_list
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
_ = TranslationStringFactory('myapp') _ = TranslationStringFactory('myapp')
log = logging.getLogger(__name__)
@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, multiple=True, placeholder='Pilih Departemen')
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode( id = colander.SchemaNode(
...@@ -33,7 +35,7 @@ class ListSchema(colander.Schema): ...@@ -33,7 +35,7 @@ class ListSchema(colander.Schema):
@colander.deferred @colander.deferred
def departemen_checkbox_widget(node, kw): def departemen_checkbox_widget(node, kw):
values = kw.get('departemen_list', []) values = kw.get('departemen_list', [])
return widget.CheckboxChoiceWidget(values=values) return widget.CheckboxChoiceWidget(values=values, multiple=True)
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
user_id = colander.SchemaNode( user_id = colander.SchemaNode(
...@@ -43,7 +45,7 @@ class AddSchema(colander.Schema): ...@@ -43,7 +45,7 @@ class AddSchema(colander.Schema):
title="User", title="User",
) )
departemen_id = colander.SchemaNode( departemen_id = colander.SchemaNode(
colander.Set(), # Tetap menggunakan colander.Set() colander.Set(),
widget=departemen_checkbox_widget, widget=departemen_checkbox_widget,
oid="departemen_id", oid="departemen_id",
title="Departemen", title="Departemen",
...@@ -82,10 +84,17 @@ class Views(BaseView): ...@@ -82,10 +84,17 @@ class Views(BaseView):
return super().view_act() return super().view_act()
def get_bindings(self, row=None): def get_bindings(self, row=None):
return { bindings = {
"departemen_list": get_departemen_list(), "departemen_list": get_departemen_list(),
"user_list": user_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', @view_config(route_name='user-departemen-add', renderer='templates/form.pt',
permission='user-edit') permission='user-edit')
...@@ -114,57 +123,53 @@ class Views(BaseView): ...@@ -114,57 +123,53 @@ class Views(BaseView):
return super(Views, self).view_upload(exts=(".csv", ".tsv")) return super(Views, self).view_upload(exts=(".csv", ".tsv"))
def save_request(self, values, row=None): def save_request(self, values, row=None):
# Ambil user_id dari values
user_id = values.get("user_id") user_id = values.get("user_id")
if not 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: 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( selected_departemen = set(
str(departemen_id) for departemen_id in values["departemen_id"] str(departemen_id) for departemen_id in values["departemen_id"]
if departemen_id is not None and str(departemen_id) != "None" if departemen_id is not None and str(departemen_id) != "None"
) )
# Batasi ke maksimal dua pilihan
# Departemen yang tidak dipilih lagi (akan dihapus) selected_list = sorted(selected_departemen)[:2] # Ambil dua yang pertama
unused_departemen = existing_departemen - selected_departemen dept1 = int(selected_list[0]) if selected_list else None
dept2 = int(selected_list[1]) if len(selected_list) > 1 else None
# Hapus departemen yang tidak dipilih lagi, pastikan hanya integer yang valid
if unused_departemen: existing_row = DBSession.query(DepartemenUser).filter_by(user_id=user_id).first()
valid_unused = [int(d) for d in unused_departemen if d.isdigit()] if selected_list:
if valid_unused: if existing_row:
DBSession.query(DepartemenUser).filter_by(user_id=user_id) \ # Update jika sudah ada
.filter(DepartemenUser.departemen_id.in_(valid_unused)) \ existing_row.departemen_id = dept1
.delete(synchronize_session=False) existing_row.sub_departemen = dept2
else:
# Departemen baru yang dipilih (akan ditambahkan) # Tambah baru jika belum ada
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( new_row = DepartemenUser(
user_id=user_id, user_id=user_id,
departemen_id=int(departemen_id) # Konversi ke integer departemen_id=dept1,
sub_departemen=dept2
) )
DBSession.add(new_row) 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() DBSession.flush()
return row # Kembalikan row jika ada, atau None jika tidak digunakan return row
def get_existing_departemen(self, user_id): 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
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 \ 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!