Commit fdcb63b8 by Ari Agung Prasetiyo Committed by Ari Agung Prasetiyo

user area

1 parent 4511f70c
......@@ -19,7 +19,8 @@ log = logging.getLogger(__name__)
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.Integer(),
title="Action"
title="Action",
field=User.id,
)
user_name = colander.SchemaNode(
colander.String(),
......@@ -32,31 +33,28 @@ class ListSchema(colander.Schema):
desa_name = colander.SchemaNode(
colander.String(),
field=ResDesa.nama)
@colander.deferred
def desa_checkbox_widget(node, kw):
values = kw.get('desa_list', [])
return widget.CheckboxChoiceWidget(values=values)
def single_choice_validator(node, value):
"""Validator untuk memastikan hanya satu opsi yang dipilih."""
if len(value) > 1:
raise colander.Invalid(node, "Hanya boleh memilih satu Kelurahan/Desa.")
class AddSchema(colander.Schema):
user_id = colander.SchemaNode(
colander.Integer(),
widget=widget.SelectWidget(values=User.get_list()),
widget=widget.SelectWidget(),
oid="user_id",
title="User",
)
desa_id = colander.SchemaNode(
desa_ids = colander.SchemaNode(
colander.Set(),
widget=desa_checkbox_widget,
validator=single_choice_validator,
oid="desa_id",
oid="desa_ids",
title="Kelurahan/Desa",
)
def after_bind(self,node, kw):
node['user_id'].widget.values = User.get_list()
class EditSchema(AddSchema):
id = colander.SchemaNode(
......@@ -64,13 +62,8 @@ class EditSchema(AddSchema):
missing=colander.drop,
widget=widget.HiddenWidget(readonly=True)
)
user_id = colander.SchemaNode(
colander.Integer(),
missing=colander.drop,
widget=widget.SelectWidget(values=User.get_list(), readonly=True), # Ditampilkan, tetapi readonly
oid="user_id",
title="User",
)
# def after_bind(self,node, kw):
class Views(BaseView):
def __init__(self, request):
......@@ -79,12 +72,9 @@ class Views(BaseView):
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.list_route = 'user-area'
self.table = UserArea
self.table = User
self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__)
path = os.path.dirname(path)
self.report_file = os.path.join(path, 'reports', 'user_area.jrxml')
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
......@@ -92,14 +82,16 @@ class Views(BaseView):
def pdf_response(self, **kwargs):
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
path = self.get_module_path('opensipkd.base')
logo = os.path.join(path, 'static', 'img', 'logo.png')
report_file = os.path.join(path, 'reports', 'user_area.jrxml')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
filename = jasper_export(self.report_file, parameters=parameters)
filename = jasper_export(report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
......@@ -119,12 +111,13 @@ class Views(BaseView):
return csv_response(self.req, value, filename)
def list_join(self, query, **kwargs):
return query.outerjoin(ResDesa, ResDesa.id == self.table.desa_id) \
.outerjoin(User, User.id == self.table.user_id)
return query.outerjoin(UserArea, UserArea.user_id == self.table.id) \
.outerjoin(ResDesa, ResDesa.id == UserArea.desa_id)
@view_config(route_name='user-area', renderer='templates/table.pt',
permission='user-view')
def view_list(self, **kwargs):
kwargs = {"allow_delete": False}
return super(Views, self).view_list(**kwargs)
@view_config(route_name='user-area-act', renderer='json',
......@@ -163,35 +156,52 @@ class Views(BaseView):
def view_edit(self):
return super(Views, self).view_edit()
def after_save(self, values, row):
desa_ids = values.get("desa_ids")
existing = self.user_area_set(row)
unused = existing - values['desa_ids']
if unused:
q = DBSession.query(UserArea).filter_by(user_id=row.id).filter(
UserArea.group_id.in_(unused))
q.delete(synchronize_session=False)
new = values['desa_ids'] - existing
for aid in new:
ua = UserArea()
ua.user_id = row.id
ua.desa_id = aid
DBSession.add(ua)
DBSession.flush()
return super().after_save(self, values, row)
def user_area_set(self, row):
q = DBSession.query(UserArea).filter_by(user_id=row.id)
r = []
for ua in q:
r.append(str(ua.desa_id))
return set(r)
def save_request(self, values, row=None):
if row: # Mode Edit: Perbarui entri yang ada
desa_ids = values.get("desa_id")
if desa_ids:
desa_id = next(iter(desa_ids)) if desa_ids else None
if desa_id is not None:
row.desa_id = int(desa_id) # Perbarui desa_id pada row yang ada
# user_id tidak diubah, tetap dari row.user_id
DBSession.add(row)
DBSession.flush()
return row
return None
else: # Mode Tambah: Buat entri baru tanpa menghapus entri lama
request = self.req
if not row: # dibuat apabila penambahan data, karena data yang di submit adalah user_id
user_id = values.get("user_id")
if not user_id:
return None
desa_ids = values.get("desa_id")
if desa_ids:
desa_id = next(iter(desa_ids)) if desa_ids else None
if desa_id is not None:
new_row = UserArea(
user_id=user_id,
desa_id=int(desa_id)
)
DBSession.add(new_row)
DBSession.flush()
return new_row
return None
row = self.table.query_id(user_id).first()
else:
# Jika sedang mengedit, hapus entri lama untuk user_id dan desa_id
if 'id' in values:
DBSession.query(UserArea).filter_by(
user_id=row.id,
).delete()
# Tambahkan entri baru untuk setiap departemen yang dipilih
for desa_id in values['desa_ids']:
new_row = UserArea(
user_id=row.id,
desa_id=int(desa_id),
)
DBSession.add(new_row)
DBSession.flush()
request.session.flash('User Area sudah disimpan.')
def get_existing_desa(self, user_id):
q = DBSession.query(UserArea).filter_by(user_id=user_id)
r = []
......@@ -202,10 +212,6 @@ class Views(BaseView):
def get_values(self, row, istime=False):
# Call the parent class's get_values to get the base dictionary
d = super(Views, self).get_values(row, istime)
# Populate the form with the existing data from the selected row
d["id"] = str(row.id) # Hidden field for the row ID
d["user_id"] = row.user_id # Pre-fill user_id (readonly in edit form)
d["desa_id"] = {str(row.desa_id)} # Pre-fill desa_id as a single-item set
d["desa_ids"] = self.user_area_set(row)
d["user_id"] = row.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!