Commit f49dc799 by Hamsyah

pembaruan user_dep by hmzh

1 parent 165481bc
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
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!