Commit d0f6a355 by Hamsyah

pembaruan terbaru hmzh

1 parent ad9a4007
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.String(),
colander.Set(),
widget=departemen_widget,
oid="departemen_nm")
oid="departemen_nm",
title="Departemen *")
jabatan_id = colander.SchemaNode(
colander.Integer(),
oid="jabatan_id",
widget=widget.HiddenWidget(),
tittle="Jabatan"
)
title="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',
......
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, Placeholder='Pilih Departemen')
values = kw.get('departemen_list', [])
return widget.CheckboxChoiceWidget(values=values, placeholder='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
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!