Commit d4ba51db by Hamsyah

pembaruan base tombol impor dan csv

1 parent 1d523b8b
jenis,nama_lain,nama_pendek,eselon_id/public.eselon.id,nama,kode,status,created
123,fredy,mercury,8,Bendahara Pengeluaran,421,1,2025-03-14
321,brian,may,7,Staf,542,1,2025-03-16
412,paul,mccartney,6,PPTK,643,1,2025-03-15
kode,nama,kategori,dati2_id/res_dati2.kode
32.07.01,Ciamis,kecamatan,ID-JB.05
32.07.02,Cikoneng,kecamatan,ID-JB.05
32.07.03,Cijeungjing,kecamatan,ID-JB.05
32.07.04,Sadananya,kecamatan,ID-JB.05
32.07.05,Cidolog,kecamatan,ID-JB.05
32.07.06,Cihaurbeuti,kecamatan,ID-JB.05
32.07.07,Panumbangan,kecamatan,ID-JB.05
32.07.08,Panjalu,kecamatan,ID-JB.05
32.07.09,Kawali,kecamatan,ID-JB.05
32.07.10,Panawangan,kecamatan,ID-JB.05
32.07.11,Cipaku,kecamatan,ID-JB.05
32.07.12,Jatinagara,kecamatan,ID-JB.05
32.07.13,Rajadesa,kecamatan,ID-JB.05
32.07.14,Sukadana,kecamatan,ID-JB.05
32.07.15,Rancah,kecamatan,ID-JB.05
32.07.16,Tambaksari,kecamatan,ID-JB.05
32.07.17,Lakbok,kecamatan,ID-JB.05
32.07.18,Banjarsari,kecamatan,ID-JB.05
32.07.19,Pamarican,kecamatan,ID-JB.05
32.07.29,Cimaragas,kecamatan,ID-JB.05
32.07.30,Cisaga,kecamatan,ID-JB.05
32.07.31,Sindangkasih,kecamatan,ID-JB.05
32.07.32,Baregbeg,kecamatan,ID-JB.05
32.07.33,Sukamantri,kecamatan,ID-JB.05
32.07.34,Lumbung,kecamatan,ID-JB.05
32.07.35,Purwadadi,kecamatan,ID-JB.05
32.07.37,Banjaranyar,kecamatan,ID-JB.05
value,nama,kode,status,created
123,ndxaka,12345,1,2025-03-14
231,jonojoni,54321,1,2025-03-15
321,ploncowati,32145,1,2025-03-16
\ No newline at end of file \ No newline at end of file
partner_id/public.partner.id,departemen_id/public.departemen.id,jabatan_id/public.jabatan.id,mulai,selesai
1,1,1,2025-02-01,2025-03-12
\ No newline at end of file \ No newline at end of file
user_id/public.users.id,departemen_id/public.departemen.id,id
1,1,8
2,2,2
\ No newline at end of file \ No newline at end of file
...@@ -66,6 +66,7 @@ parameter-add,/parameter/add,Tambah paramater, ...@@ -66,6 +66,7 @@ parameter-add,/parameter/add,Tambah paramater,
parameter-edit,/parameter/{id}/edit,Edit parameter, parameter-edit,/parameter/{id}/edit,Edit parameter,
parameter-view,/parameter/{id}/view,View parameter, parameter-view,/parameter/{id}/view,View parameter,
parameter-delete,/parameter/{id}/delete,Hapus parameter, parameter-delete,/parameter/{id}/delete,Hapus parameter,
parameter-upload,/parameter/upload,Parameter Upload,1,0,
parameter-act,/parameter/{act}/act,Act parameter, parameter-act,/parameter/{act}/act,Act parameter,
upload-logo,/upload/logo,Unggah Logo, upload-logo,/upload/logo,Unggah Logo,
upload-background,/upload/background,Unggah Background, upload-background,/upload/background,Unggah Background,
...@@ -94,6 +95,7 @@ departemen-user-edt,/departemen/user/{id}/edt,User Organisasi Edit,1,0, ...@@ -94,6 +95,7 @@ departemen-user-edt,/departemen/user/{id}/edt,User Organisasi Edit,1,0,
departemen-user-view,/departemen/user/{id}/view,User Organisasi view,1,0, departemen-user-view,/departemen/user/{id}/view,User Organisasi view,1,0,
departemen-user-del,/departemen/user/{id}/del,User Organisasi Hapus,1,0, departemen-user-del,/departemen/user/{id}/del,User Organisasi Hapus,1,0,
departemen-user-rpt,/departemen/user/{rpt}/rpt,User Organisasi Report,1,0, departemen-user-rpt,/departemen/user/{rpt}/rpt,User Organisasi Report,1,0,
departemen-user-upload,/departemen/user/{id}/upload,User Departemen Upload,1,0,
rpc-user,/rpc/user,WebService User Management,1,1, rpc-user,/rpc/user,WebService User Management,1,1,
googleOauth2,/googleOauth2,'Google OAuth2',1 googleOauth2,/googleOauth2,'Google OAuth2',1
googlesignin,/googlesignin, "Google SignIn",1 googlesignin,/googlesignin, "Google SignIn",1
...@@ -114,6 +116,7 @@ jabatan-add,/jabatan/add,Tambah Jabatan, ...@@ -114,6 +116,7 @@ jabatan-add,/jabatan/add,Tambah Jabatan,
jabatan-edit,/jabatan/{id}/edit,Edit Jabatan, jabatan-edit,/jabatan/{id}/edit,Edit Jabatan,
jabatan-view,/jabatan/{id}/view,View Jabatan, jabatan-view,/jabatan/{id}/view,View Jabatan,
jabatan-delete,/jabatan/{id}/delete,Hapus Jabatan, jabatan-delete,/jabatan/{id}/delete,Hapus Jabatan,
jabatan-upload,/jabatan/upload,Upload Jabatan,1,0,
jabatan-act,/jabatan/{act}/act,Act Jabatan, jabatan-act,/jabatan/{act}/act,Act Jabatan,
jabatan-rpt,/jabatan/{rpt}/rpt,Rpt Jabatan, jabatan-rpt,/jabatan/{rpt}/rpt,Rpt Jabatan,
partner-departemen,/partner/departemen,Partner Departemen, partner-departemen,/partner/departemen,Partner Departemen,
...@@ -121,6 +124,7 @@ partner-departemen-add,/partner/departemen/add,Partner Departemen Add, ...@@ -121,6 +124,7 @@ partner-departemen-add,/partner/departemen/add,Partner Departemen Add,
partner-departemen-edit,/partner/departemen/{id}/edit,Partner Departemen Edit, partner-departemen-edit,/partner/departemen/{id}/edit,Partner Departemen Edit,
partner-departemen-view,/partner/departemen/{id}/view,Partner Departemen View, partner-departemen-view,/partner/departemen/{id}/view,Partner Departemen View,
partner-departemen-delete,/partner/departemen/{id}/delete,Partner Departemen Hapus, partner-departemen-delete,/partner/departemen/{id}/delete,Partner Departemen Hapus,
partner-departemen-upload,/partner/departemen/upload,Pertner Departemen Upload,1,0,
partner-departemen-act,/partner/departemen/{act}/act,Partner Departemen Act, partner-departemen-act,/partner/departemen/{act}/act,Partner Departemen Act,
partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report, partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report,
log,/log,Log Aplikasi, log,/log,Log Aplikasi,
......
...@@ -10,6 +10,7 @@ from pyramid.i18n import TranslationStringFactory ...@@ -10,6 +10,7 @@ from pyramid.i18n import TranslationStringFactory
from pyramid.interfaces import IRoutesMapper from pyramid.interfaces import IRoutesMapper
from pyramid.renderers import render_to_response from pyramid.renderers import render_to_response
from pyramid.view import view_config from pyramid.view import view_config
from deform.form import Button
from opensipkd.base import get_params, get_urls from opensipkd.base import get_params, get_urls
from opensipkd.models import ( from opensipkd.models import (
...@@ -22,6 +23,8 @@ log = logging.getLogger(__name__) ...@@ -22,6 +23,8 @@ log = logging.getLogger(__name__)
from datatables import ColumnDT from datatables import ColumnDT
# , DataTables, get_urls) # , DataTables, get_urls)
btn_upload = Button('upload', title=_('import'), css_class="btn-info")
def no_action(): def no_action():
test = ColumnDT test = ColumnDT
......
...@@ -11,6 +11,7 @@ from opensipkd.tools.report import csv_response, open_rml_pdf, open_rml_row, \ ...@@ -11,6 +11,7 @@ from opensipkd.tools.report import csv_response, open_rml_pdf, open_rml_row, \
pdf_response pdf_response
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import BaseView, btn_upload
from ..views import BaseView from ..views import BaseView
...@@ -107,6 +108,7 @@ class ViewJabatan(BaseView): ...@@ -107,6 +108,7 @@ class ViewJabatan(BaseView):
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = Jabatan self.table = Jabatan
self.list_schema = ListSchema self.list_schema = ListSchema
self.list_buttons = self.list_buttons + (btn_upload,)
# self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close) # self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
def get_bindings(self, row=None): def get_bindings(self, row=None):
...@@ -249,6 +251,12 @@ class ViewJabatan(BaseView): ...@@ -249,6 +251,12 @@ class ViewJabatan(BaseView):
permission='jabatan') permission='jabatan')
def view_delete(self): def view_delete(self):
return super().view_delete() return super().view_delete()
@view_config(route_name='jabatan-upload',
renderer='templates/form.pt', permission='jabatan')
def view_upload(self):
self.upload_keys = ["nama_lain"]
return super().view_upload(exts=(".csv", ".tsv"))
def form_validator(self, form, value): def form_validator(self, form, value):
def err_kode(): def err_kode():
......
...@@ -2,11 +2,11 @@ import colander ...@@ -2,11 +2,11 @@ import colander
from deform import (widget, ) from deform import (widget, )
from opensipkd.base.views.provinsi import provinsi_widget from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.models import DBSession, ResKecamatan, ResDati2, ResProvinsi from opensipkd.models import DBSession, ResKecamatan, ResDati2, ResProvinsi
from opensipkd.tools.buttons import btn_upload, btn_close, btn_add from opensipkd.tools.buttons import btn_close, btn_add
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import widget_os from . import widget_os, btn_upload
from .dati2 import dati2_widget from .dati2 import dati2_widget
from ..views import BaseView from ..views import BaseView
...@@ -174,4 +174,4 @@ class Views(BaseView): ...@@ -174,4 +174,4 @@ class Views(BaseView):
@view_config(route_name='kecamatan-upload', @view_config(route_name='kecamatan-upload',
renderer='templates/form.pt', permission='wilayah') renderer='templates/form.pt', permission='wilayah')
def view_upload(self): def view_upload(self):
return super(Views, self).view_upload(exts=(".csv", ".tsv")) return super(Views, self).view_upload(exts=(".csv", ".tsv"))
\ No newline at end of file \ No newline at end of file
...@@ -2,6 +2,7 @@ from colander import Length ...@@ -2,6 +2,7 @@ from colander import Length
import colander import colander
from deform import (widget, ) from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import BaseView, btn_upload
from opensipkd.models import ( from opensipkd.models import (
DBSession, DBSession,
...@@ -76,6 +77,7 @@ class Views(BaseView): ...@@ -76,6 +77,7 @@ class Views(BaseView):
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = Parameter self.table = Parameter
self.list_schema = ListSchema self.list_schema = ListSchema
self.list_buttons = self.list_buttons + (btn_upload,)
@view_config(route_name='parameter', renderer='templates/table.pt', @view_config(route_name='parameter', renderer='templates/table.pt',
permission='user-edit') permission='user-edit')
...@@ -117,3 +119,9 @@ class Views(BaseView): ...@@ -117,3 +119,9 @@ class Views(BaseView):
permission='user-edit') permission='user-edit')
def view_delete(self): def view_delete(self):
return super().view_delete() return super().view_delete()
@view_config(route_name='parameter-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["value"]
return super(Views, self).view_upload(exts=(".csv", ".tsv"))
\ No newline at end of file \ No newline at end of file
...@@ -9,7 +9,7 @@ from opensipkd.models import DBSession as PartnerDBSession, DBSession, \ ...@@ -9,7 +9,7 @@ from opensipkd.models import DBSession as PartnerDBSession, DBSession, \
from opensipkd.models import Departemen, Jabatan from opensipkd.models import Departemen, Jabatan
from opensipkd.models import Partner, PartnerDepartemen from opensipkd.models import Partner, PartnerDepartemen
from opensipkd.tools import dmy, date_from_str from opensipkd.tools import dmy, date_from_str
from . import widget_os from . import widget_os, btn_upload
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah posisi partner gagal' SESS_ADD_FAILED = 'Tambah posisi partner gagal'
...@@ -38,8 +38,7 @@ class AddSchema(colander.Schema): ...@@ -38,8 +38,7 @@ class AddSchema(colander.Schema):
colander.Integer(), colander.Integer(),
oid="partner_id", oid="partner_id",
widget=widget.HiddenWidget(), widget=widget.HiddenWidget(),
missing=colander.null, # Tetap izinkan kosong title="Partner ID") # Field wajib, tanpa missing=colander.null
title="Partner ID")
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
widget=nama_widget, widget=nama_widget,
...@@ -100,6 +99,7 @@ class ViewPartner(BaseView): ...@@ -100,6 +99,7 @@ class ViewPartner(BaseView):
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.list_route = 'partner-departemen' self.list_route = 'partner-departemen'
self.list_buttons = self.list_buttons + (btn_upload,)
def form_validator(self, form, value): def form_validator(self, form, value):
print(f"Validating form with values: {value}") # Debugging print(f"Validating form with values: {value}") # Debugging
...@@ -109,15 +109,23 @@ class ViewPartner(BaseView): ...@@ -109,15 +109,23 @@ class ViewPartner(BaseView):
def err_jabatan(): def err_jabatan():
raise colander.Invalid(form, 'Jabatan Belum Dipilih') raise colander.Invalid(form, 'Jabatan Belum Dipilih')
def err_partner():
raise colander.Invalid(form, 'Partner Belum Dipilih')
# Validasi partner_id
if not value['partner_id'] or value['partner_id'] is colander.null:
print("Validation failed: Partner ID kosong")
err_partner()
# Validasi jabatan # Validasi jabatan
if not value['jabatan'] or value['jabatan'] == '': if not value['jabatan'] or value['jabatan'] == '':
print("Validation failed: Jabatan kosong") print("Validation failed: Jabatan kosong")
err_jabatan() err_jabatan()
# Validasi departemen # Validasi departemen
if not value['departemen'] or value['departemen'] == set(): if not value['departemen'] or value['departemen'] == set():
print("Validation failed: Departemen kosong") print("Validation failed: Departemen kosong")
err_departemen() err_departemen()
# Tidak memvalidasi partner_id agar opsional
def save_request(self, values, row=None): def save_request(self, values, row=None):
print(f"Saving with values: {values}") # Debugging print(f"Saving with values: {values}") # Debugging
...@@ -144,10 +152,11 @@ class ViewPartner(BaseView): ...@@ -144,10 +152,11 @@ class ViewPartner(BaseView):
else: else:
values['jabatan_id'] = None values['jabatan_id'] = None
# Konversi colander.null ke Python None untuk partner_id # Pastikan partner_id ada dan valid
partner_id = values.get('partner_id') partner_id = values.get('partner_id')
if partner_id is colander.null: if not partner_id:
partner_id = None request.session.flash('Partner ID wajib diisi.', 'error')
return None
# Simpan setiap departemen yang dipilih sebagai baris baru # Simpan setiap departemen yang dipilih sebagai baris baru
if 'departemen' in values and values['departemen']: if 'departemen' in values and values['departemen']:
...@@ -159,7 +168,7 @@ class ViewPartner(BaseView): ...@@ -159,7 +168,7 @@ class ViewPartner(BaseView):
).first() ).first()
if not exists: if not exists:
new_row = PartnerDepartemen( new_row = PartnerDepartemen(
partner_id=partner_id, # Sekarang pasti None atau integer partner_id=partner_id, # Tidak lagi opsional
departemen_id=int(dept_id), departemen_id=int(dept_id),
jabatan_id=values['jabatan_id'], jabatan_id=values['jabatan_id'],
mulai=values['mulai'], mulai=values['mulai'],
...@@ -348,4 +357,10 @@ class ViewPartner(BaseView): ...@@ -348,4 +357,10 @@ class ViewPartner(BaseView):
renderer='templates/form.pt', renderer='templates/form.pt',
permission='partner-departemen') permission='partner-departemen')
def view_del(self): def view_del(self):
return super().view_delete()
\ No newline at end of file \ No newline at end of file
return super().view_delete()
@view_config(route_name='partner-departemen-upload',
renderer='templates/form.pt', permission='partner-departemen')
def view_upload(self):
self.upload_keys = ["mulai"]
return super().view_upload(exts=(".csv", ".tsv"))
\ No newline at end of file \ No newline at end of file
import colander import colander
from deform import widget from deform import widget
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView from . import BaseView, btn_upload
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 departemen_widget, get_departemen_list
from .user import user_widget, user_select, user_list from .user import user_widget, user_select, user_list
...@@ -65,6 +65,7 @@ class Views(BaseView): ...@@ -65,6 +65,7 @@ class Views(BaseView):
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.list_route = 'user-departemen' self.list_route = 'user-departemen'
self.table = DepartemenUser self.table = DepartemenUser
self.list_buttons = self.list_buttons + (btn_upload,)
def list_join(self, query, **kwargs): def list_join(self, query, **kwargs):
return query.outerjoin(Departemen, Departemen.id == self.table.departemen_id) \ return query.outerjoin(Departemen, Departemen.id == self.table.departemen_id) \
...@@ -105,6 +106,12 @@ class Views(BaseView): ...@@ -105,6 +106,12 @@ class Views(BaseView):
permission='user-edit') permission='user-edit')
def view_edit(self): def view_edit(self):
return super().view_edit() return super().view_edit()
@view_config(route_name='user-departemen-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["user_id"]
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 # Ambil user_id dari values
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!