Commit fdcb63b8 by Ari Agung Prasetiyo Committed by Ari Agung Prasetiyo

user area

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