Commit c67ff093 by iqbal

Penambahan alamat pada jasper dan perbaikan menu user area

1 parent 8373a07c
......@@ -7,6 +7,7 @@
<defaultValueExpression><![CDATA["PEMERINTAH KABUPATEN KUNINGAN"]]></defaultValueExpression>
</parameter>
<parameter name="logo" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString>
<![CDATA[select * FROM groups]]>
</queryString>
......@@ -34,9 +35,9 @@
<band splitType="Stretch"/>
</background>
<title>
<band height="100" splitType="Stretch">
<band height="101" splitType="Stretch">
<staticText>
<reportElement x="143" y="49" width="269" height="30" uuid="5b7637d7-75f9-4fcb-83f0-3199ee657145"/>
<reportElement x="140" y="32" width="269" height="30" uuid="5b7637d7-75f9-4fcb-83f0-3199ee657145"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
......@@ -53,12 +54,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>
<textField>
<reportElement x="230" y="19" width="100" height="30" uuid="32f184cc-d09f-44cc-9637-84400c055f5e"/>
<reportElement x="140" y="2" width="269" height="30" uuid="32f184cc-d09f-44cc-9637-84400c055f5e"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="16" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="10" y="62" width="551" height="30" uuid="eac58289-71ef-45cd-8d35-17d219ef7847"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{alamat_lengkap}]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
......
......@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString>
<![CDATA[select * FROM res_desa JOIN res_kecamatan ON res_desa.kecamatan_id = res_kecamatan.id;]]>
</queryString>
......@@ -112,9 +113,9 @@
<band splitType="Stretch"/>
</background>
<title>
<band height="95" splitType="Stretch">
<band height="96" splitType="Stretch">
<staticText>
<reportElement x="143" y="30" width="269" height="30" uuid="458b62a6-e929-4690-a8a0-c260967c1d92"/>
<reportElement x="110" y="30" width="319" height="30" uuid="458b62a6-e929-4690-a8a0-c260967c1d92"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
......@@ -137,6 +138,13 @@
</textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="50" width="551" height="30" uuid="a1b164d9-0cd8-4f6f-807b-506312e81fd9"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{alamat_lengkap}]]></textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
......@@ -198,14 +206,19 @@
<textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="161" y="0" width="210" height="21" uuid="e07771a9-7326-46ef-b09c-e0b5a02dad3c"/>
<reportElement x="161" y="0" width="210" height="21" uuid="e07771a9-7326-46ef-b09c-e0b5a02dad3c">
<property name="com.jaspersoft.studio.unit.rightIndent" value="pixel"/>
<property name="com.jaspersoft.studio.unit.leftIndent" value="px"/>
</reportElement>
<box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression>
</textField>
<textField>
......
......@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString>
<![CDATA[select * FROM eselon]]>
</queryString>
......@@ -67,7 +68,7 @@
<band splitType="Stretch"/>
</background>
<title>
<band height="89" splitType="Stretch">
<band height="95" splitType="Stretch">
<staticText>
<reportElement x="143" y="30" width="269" height="30" uuid="8be6d74b-7953-470f-8fbb-799d55a1f230"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
......@@ -92,6 +93,13 @@
</textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="50" width="551" height="30" uuid="1b5edd70-0a69-437b-8d36-d5fe76327040"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{alamat_lengkap}]]></textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
......
......@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString>
<![CDATA[select * FROM res_dati2 join res_provinsi ON res_dati2.provinsi_id = res_provinsi.id]]>
</queryString>
......@@ -136,12 +137,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>
<textField>
<reportElement x="240" y="0" width="100" height="30" uuid="caa2d5c9-f7f6-4c74-a52b-8014d519c5c3"/>
<reportElement x="143" y="0" width="269" height="30" uuid="caa2d5c9-f7f6-4c74-a52b-8014d519c5c3"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="16" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="2" y="48" width="550" height="30" uuid="4cabc0db-0c35-4c0f-8e53-5723054d06af"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{alamat_lengkap}]]></textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
......@@ -203,25 +211,33 @@
<textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="161" y="0" width="210" height="21" uuid="042939e5-65d9-4170-b4d3-67f999964030"/>
<reportElement x="161" y="0" width="210" height="21" uuid="042939e5-65d9-4170-b4d3-67f999964030">
<property name="com.jaspersoft.studio.unit.leftIndent" value="px"/>
</reportElement>
<box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box>
<textElement textAlignment="Left" verticalAlignment="Middle"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="371" y="0" width="181" height="21" uuid="2db6a1ee-202a-4714-a0b6-ab4545981f01"/>
<reportElement x="371" y="0" width="181" height="21" uuid="2db6a1ee-202a-4714-a0b6-ab4545981f01">
<property name="com.jaspersoft.studio.unit.leftIndent" value="px"/>
</reportElement>
<box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box>
<textElement textAlignment="Left" verticalAlignment="Middle"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{COLUMN_14}]]></textFieldExpression>
</textField>
</band>
......
......@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString>
<![CDATA[select * FROM partner]]>
</queryString>
......@@ -209,8 +210,8 @@
<title>
<band height="91" splitType="Stretch">
<staticText>
<reportElement x="204" y="40" width="130" height="20" uuid="404cb1e0-9e9b-4d9e-9f12-7ae4ee60561f"/>
<textElement>
<reportElement x="0" y="30" width="552" height="30" uuid="404cb1e0-9e9b-4d9e-9f12-7ae4ee60561f"/>
<textElement textAlignment="Center">
<font size="14" isBold="true"/>
</textElement>
<text><![CDATA[DAFTAR PARTNER]]></text>
......@@ -226,12 +227,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>
<textField>
<reportElement x="220" y="0" width="100" height="30" uuid="167de0fa-238f-4d7c-9bb8-8b282cb08dbd"/>
<reportElement x="0" y="0" width="552" height="30" uuid="167de0fa-238f-4d7c-9bb8-8b282cb08dbd"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="-6" y="50" width="551" height="30" uuid="d9376b77-97ac-43f7-8837-7cedc45a38a4"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{alamat_lengkap}]]></textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
......@@ -306,14 +314,18 @@
<textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="110" y="0" width="160" height="21" uuid="5eae21bc-8f4a-44e4-9e8a-66da6ee9de99"/>
<reportElement x="110" y="0" width="160" height="21" uuid="5eae21bc-8f4a-44e4-9e8a-66da6ee9de99">
<property name="com.jaspersoft.studio.unit.leftIndent" value="px"/>
</reportElement>
<box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression>
</textField>
<textField>
......@@ -330,6 +342,7 @@
<textField>
<reportElement x="270" y="0" width="160" height="21" uuid="b00fbbe6-e991-4a59-837e-601a2462aebf">
<property name="com.jaspersoft.studio.spreadsheet.connectionID" value="add93502-c54f-4ef3-912a-338d7f0ff64b"/>
<property name="com.jaspersoft.studio.unit.leftIndent" value="px"/>
</reportElement>
<box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
......@@ -337,7 +350,9 @@
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
</textField>
</band>
......
......@@ -5,7 +5,7 @@
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="POSTGRES"/>
<parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/>
<parameter name="alamat" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString language="SQL">
<![CDATA[select * from user_area join res_desa on user_area.desa_id = res_desa.id join users on user_area.user_id = users.id;]]>
</queryString>
......@@ -157,12 +157,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>
<textField>
<reportElement x="220" y="0" width="100" height="30" uuid="f3b018df-9d30-4be3-837b-db47a83dfadc"/>
<reportElement x="143" y="0" width="269" height="30" uuid="f3b018df-9d30-4be3-837b-db47a83dfadc"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="16" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="50" width="551" height="30" uuid="9d916137-3fc4-4759-b377-4b95c1bbfafc"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{alamat_lengkap}]]></textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
......
......@@ -93,6 +93,7 @@ class ViewDati2(BaseView):
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
print(parameters)
......
import os
import colander
from deform import (widget, )
from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2
from . import BaseView, btn_upload
from opensipkd.tools.buttons import btn_close, btn_add
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response
from .dati2 import dati2_widget
from opensipkd.tools import get_random_string
from .kecamatan import kecamatan_widget
from .provinsi import provinsi_widget
from ..views import BaseView
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah desa gagal'
SESS_EDIT_FAILED = 'Edit desa gagal'
def get_desa_list():
# r = [("", "--Pilih Desa--")]
r = []
q = DBSession.query(ResDesa).order_by(ResDesa.nama)
for row in q:
g = (str(row.id), (f"{row.kode}/ {row.nama}"))
r.append(g)
return r
@colander.deferred
def desa_widget(node, kw):
values = kw.get('desa_list', [])
return widget.Select2Widget(values=values,
placeholder="Pilih Desa/Kelurahan")
class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget,
validator=colander.Length(max=32),
oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(colander.String(),
widget=dati2_widget,
validator=colander.Length(max=32),
oid="dati2_id",
slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=",
title="Kabupaten/Kota",
)
kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget,
validator=colander.Length(max=32),
oid="kecamatan_id",
title="Kecamatan")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_desa),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(),
validator=colander.Length(max=128),
oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
kecamatan = colander.SchemaNode(colander.String(), field=ResKecamatan.nama)
class ViewDesa(BaseView):
def __init__(self, request):
super(ViewDesa, self).__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_url = 'desa'
self.list_route = 'desa'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDesa
self.list_schema = ListSchema
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', 'desa.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(ResDesa.kecamatan_id, ResDesa.kode, ResDesa.kategori,ResDesa.nama).order_by(ResDesa.kecamatan_id)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(ResDesa).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResDesa.query_kode(value['kode']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResDesa.query_nama(value['nama']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list()
kecamatan = row and row.kecamatan or None
kecamatan_list = kecamatan and ResKecamatan.get_list(kecamatan.dati2_id) or []
dati2 = kecamatan and kecamatan.dati2 or None
dati2_list = dati2 and ResDati2.get_list(dati2.provinsi_id) or []
return dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
)
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
kecamatan = row and row.kecamatan or None
d["dati2_id"] = kecamatan and kecamatan.dati2_id or None
dati2 = kecamatan and kecamatan.dati2 or None
d["provinsi_id"] = dati2 and dati2.provinsi_id or None
return d
@view_config(route_name='desa-view',
renderer='templates/form.pt', permission='wilayah')
def view_view(self):
return super().view_view()
@view_config(route_name='desa',
renderer='templates/table.pt',
permission='wilayah')
def view_list(self):
return super(ViewDesa, self).view_list()
def list_join(self, query):
return query.outerjoin(ResKecamatan)
@view_config(route_name='desa-act', renderer='json',
permission='view')
def view_act(self):
return super().view_act()
def next_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'select':
kecamatan_id = request.params["kecamatan_id"]
data = ResDesa.get_list(kecamatan_id)
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='desa-add',
renderer='templates/form.pt', permission='wilayah')
def view_add(self):
return super(ViewDesa, self).view_add()
@view_config(route_name='desa-edit',
renderer='templates/form.pt', permission='wilayah')
def view_edt(self):
return super(ViewDesa, self).view_edit()
@view_config(route_name='desa-delete',
renderer='templates/form.pt', permission='wilayah')
def view_delete(self):
return super(ViewDesa, self).view_delete()
@view_config(route_name='desa-upload',
renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super().view_upload(exts=('.csv', ".tsv"))
import os
import colander
from deform import (widget, )
from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2
from . import BaseView, btn_upload
from opensipkd.tools.buttons import btn_close, btn_add
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response
from .dati2 import dati2_widget
from opensipkd.tools import get_random_string
from .kecamatan import kecamatan_widget
from .provinsi import provinsi_widget
from ..views import BaseView
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah desa gagal'
SESS_EDIT_FAILED = 'Edit desa gagal'
def get_desa_list():
# r = [("", "--Pilih Desa--")]
r = []
q = DBSession.query(ResDesa).order_by(ResDesa.nama)
for row in q:
g = (str(row.id), (f"{row.kode}/ {row.nama}"))
r.append(g)
return r
@colander.deferred
def desa_widget(node, kw):
values = kw.get('desa_list', [])
return widget.Select2Widget(values=values,
placeholder="Pilih Desa/Kelurahan")
class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget,
validator=colander.Length(max=32),
oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(colander.String(),
widget=dati2_widget,
validator=colander.Length(max=32),
oid="dati2_id",
slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=",
title="Kabupaten/Kota",
)
kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget,
validator=colander.Length(max=32),
oid="kecamatan_id",
title="Kecamatan")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_desa),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(),
validator=colander.Length(max=128),
oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
kecamatan = colander.SchemaNode(colander.String(), field=ResKecamatan.nama)
class ViewDesa(BaseView):
def __init__(self, request):
super(ViewDesa, self).__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_url = 'desa'
self.list_route = 'desa'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDesa
self.list_schema = ListSchema
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', 'desa.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(ResDesa.kecamatan_id, ResDesa.kode, ResDesa.kategori,ResDesa.nama).order_by(ResDesa.kecamatan_id)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(ResDesa).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResDesa.query_kode(value['kode']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResDesa.query_nama(value['nama']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list()
kecamatan = row and row.kecamatan or None
kecamatan_list = kecamatan and ResKecamatan.get_list(kecamatan.dati2_id) or []
dati2 = kecamatan and kecamatan.dati2 or None
dati2_list = dati2 and ResDati2.get_list(dati2.provinsi_id) or []
return dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
)
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
kecamatan = row and row.kecamatan or None
d["dati2_id"] = kecamatan and kecamatan.dati2_id or None
dati2 = kecamatan and kecamatan.dati2 or None
d["provinsi_id"] = dati2 and dati2.provinsi_id or None
return d
@view_config(route_name='desa-view',
renderer='templates/form.pt', permission='wilayah')
def view_view(self):
return super().view_view()
@view_config(route_name='desa',
renderer='templates/table.pt',
permission='wilayah')
def view_list(self):
return super(ViewDesa, self).view_list()
def list_join(self, query):
return query.outerjoin(ResKecamatan)
@view_config(route_name='desa-act', renderer='json',
permission='view')
def view_act(self):
return super().view_act()
def next_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'select':
kecamatan_id = request.params["kecamatan_id"]
data = ResDesa.get_list(kecamatan_id)
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='desa-add',
renderer='templates/form.pt', permission='wilayah')
def view_add(self):
return super(ViewDesa, self).view_add()
@view_config(route_name='desa-edit',
renderer='templates/form.pt', permission='wilayah')
def view_edt(self):
return super(ViewDesa, self).view_edit()
@view_config(route_name='desa-delete',
renderer='templates/form.pt', permission='wilayah')
def view_delete(self):
return super(ViewDesa, self).view_delete()
@view_config(route_name='desa-upload',
renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super().view_upload(exts=('.csv', ".tsv"))
import os
import colander
from deform import (
widget,
)
from pyramid.view import (
view_config,
)
from opensipkd.models import (
DBSession,
Eselon
)
from ..views import BaseView
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import get_random_string
SESS_ADD_FAILED = 'Tambah eselon gagal'
SESS_EDIT_FAILED = 'Edit eselon gagal'
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=128),
oid="nama")
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val='1', false_val='0'),
default=1,
oid="status")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget())
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="nama")
status = colander.SchemaNode(
colander.Boolean(),
widget=widget.CheckboxWidget(),
oid="status")
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'eselon'
self.list_route = 'eselon'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Eselon
self.list_schema = ListSchema
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', 'eselon.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(Eselon.kode, Eselon.nama, Eselon.status).order_by(Eselon.kode)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
@view_config(route_name='eselon', renderer='templates/table.pt',
permission='eselon')
def view_list(self):
return super(Views, self).view_list()
@view_config(route_name='eselon-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["kode"]
return super().view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='eselon-act', renderer='json',
permission='read')
def view_act(self):
return super(Views, self).view_act()
def next_act(self):
params = self.params
url_dict = self.req.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
qry = Eselon.query(). \
filter(Eselon.kode.ilike('%%%s%%' % term)). \
order_by(Eselon.kode)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.kode,
nama=row.nama
)
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
qry = Eselon.query(). \
filter(Eselon.nama.ilike('%%%s%%' % term)). \
order_by(Eselon.nama)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.nama,
kode=row.kode,
)
r.append(d)
return r
@view_config(route_name='eselon-add', renderer='templates/form.pt',
permission='eselon')
def view_add(self):
return super().view_add()
@view_config(route_name='eselon-edit', renderer='templates/form.pt',
permission='eselon')
def view_edit(self):
return super().view_edit()
@view_config(route_name='eselon-view', renderer='templates/form.pt',
permission='eselon')
def view_view(self):
return super().view_view()
@view_config(route_name='eselon-delete', renderer='templates/form.pt',
permission='eselon')
def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Nama %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
# edit
def err_ruang():
raise colander.Invalid(form,
'Nama ruang %s tidak boleh lebih dari 1 karakter.' % (
value['ruang']))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Eselon).filter_by(id=uid)
eselon = q.first()
else:
eselon = None
q = Eselon.query_kode(value['kode'])
found = q.first()
if eselon:
if found and found.id != eselon.id:
err_kode()
elif found:
err_kode()
found = Eselon.query_nama(value['nama']).first()
if eselon:
if found and found.id != eselon.id:
err_nama()
elif found:
import os
import colander
from deform import (
widget,
)
from pyramid.view import (
view_config,
)
from opensipkd.models import (
DBSession,
Eselon
)
from ..views import BaseView
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import get_random_string
SESS_ADD_FAILED = 'Tambah eselon gagal'
SESS_EDIT_FAILED = 'Edit eselon gagal'
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=128),
oid="nama")
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val='1', false_val='0'),
default=1,
oid="status")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget())
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="nama")
status = colander.SchemaNode(
colander.Boolean(),
widget=widget.CheckboxWidget(),
oid="status")
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'eselon'
self.list_route = 'eselon'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Eselon
self.list_schema = ListSchema
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', 'eselon.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(Eselon.kode, Eselon.nama, Eselon.status).order_by(Eselon.kode)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
@view_config(route_name='eselon', renderer='templates/table.pt',
permission='eselon')
def view_list(self):
return super(Views, self).view_list()
@view_config(route_name='eselon-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["kode"]
return super().view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='eselon-act', renderer='json',
permission='read')
def view_act(self):
return super(Views, self).view_act()
def next_act(self):
params = self.params
url_dict = self.req.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
qry = Eselon.query(). \
filter(Eselon.kode.ilike('%%%s%%' % term)). \
order_by(Eselon.kode)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.kode,
nama=row.nama
)
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
qry = Eselon.query(). \
filter(Eselon.nama.ilike('%%%s%%' % term)). \
order_by(Eselon.nama)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.nama,
kode=row.kode,
)
r.append(d)
return r
@view_config(route_name='eselon-add', renderer='templates/form.pt',
permission='eselon')
def view_add(self):
return super().view_add()
@view_config(route_name='eselon-edit', renderer='templates/form.pt',
permission='eselon')
def view_edit(self):
return super().view_edit()
@view_config(route_name='eselon-view', renderer='templates/form.pt',
permission='eselon')
def view_view(self):
return super().view_view()
@view_config(route_name='eselon-delete', renderer='templates/form.pt',
permission='eselon')
def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Nama %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
# edit
def err_ruang():
raise colander.Invalid(form,
'Nama ruang %s tidak boleh lebih dari 1 karakter.' % (
value['ruang']))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Eselon).filter_by(id=uid)
eselon = q.first()
else:
eselon = None
q = Eselon.query_kode(value['kode'])
found = q.first()
if eselon:
if found and found.id != eselon.id:
err_kode()
elif found:
err_kode()
found = Eselon.query_nama(value['nama']).first()
if eselon:
if found and found.id != eselon.id:
err_nama()
elif found:
err_nama()
\ No newline at end of file
import os
import re
import colander
from deform import widget
from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from . import BaseView
from opensipkd.tools import get_random_string
from opensipkd.tools.report import csv_response, file_response
from opensipkd.models import (
DBSession,
Group,
Permission,
GroupPermission,
)
_ = TranslationStringFactory ('user')
@colander.deferred
def name_validator(node, kw):
return NameValidator(kw['group'])
@colander.deferred
def permissions_widget(node, kw):
values = kw.get('permissions_list', [])
return widget.CheckboxChoiceWidget(values=values)
class AddSchema(colander.Schema):
group_name = colander.SchemaNode(
colander.String(),
validator= name_validator)
description = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=256),
missing=colander.drop)
permissions = colander.SchemaNode(
colander.Set(), widget=permissions_widget, title='Hak akses', missing=colander.drop)
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.Integer(),
widget=widget.HiddenWidget(readonly=True),
missing=colander.drop)
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), visible=False, title="Action")
group_name = colander.SchemaNode(
colander.String(), )
description = colander.SchemaNode(colander.String())
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.list_schema = ListSchema
self.list_route = "group"
self.table = Group
self.add_schema = AddSchema
self.edit_schema = EditSchema
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', 'Group.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
def get_bindings(self, row=None):
return dict(group=row,
permissions_list=get_permissions_list())
@staticmethod
def query_register():
return DBSession.query(Group.group_name, Group.description,Group.permissions).order_by(Group.group_name)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
@view_config(
route_name='group', renderer='templates/table.pt',
permission='user-view')
def view_list(self):
return super(Views, self).view_list()
@view_config(
route_name='group-act', renderer='json', permission='user-view')
def view_act(self):
return super(Views, self).view_act()
def next_act(self):
request = self.req
url_dict = request.matchdict
params = self.params
if url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
q = DBSession.query(Group.id, Group.description).filter(
Group.description.ilike('%{}%'.format(term))). \
order_by(Group.group_name)
rows = q.all()
r = []
for k in rows:
d = dict(id=k[0], value=k[1])
r.append(d)
return r
@view_config(
route_name='group-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super(Views, self).view_add()
def save_request(self, values, row=None):
insert = not row
vals = values.copy()
vals.pop('permissions')
row = self.save(vals, self.req.user, row)
existing = group_permission_set(row)
unused = existing - values['permissions']
if unused:
q = DBSession.query(GroupPermission).filter_by(group_id=row.id). \
filter(GroupPermission.perm_name.in_(unused))
q.delete(synchronize_session=False)
new = values['permissions'] - existing
for perm_name in new:
gp = GroupPermission()
gp.group_id = row.id
gp.perm_name = perm_name
DBSession.add(gp)
data = dict(group_name=row.group_name)
if insert:
ts = _('group-added', default='{group_name} group has been added.', mapping=data)
else:
ts = _('group-updated', default='${group_name} group profile updated', mapping=data)
self.ses.flash(ts)
return row
def get_values(self, row, istime=False):
values = super(Views, self).get_values(row, istime)
values['permissions'] = group_permission_set(row)
return values
@view_config(
route_name='group-view', renderer='templates/form.pt',
permission='user-view')
def view_view(self):
return super(Views, self).view_view()
@view_config(route_name='group-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["group_name"]
return super().view_upload(exts=('.csv', ".tsv"))
@view_config(
route_name='group-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edit(self):
return super(Views, self).view_edit()
#def delete_msg(self, row):
#data = dict(group_name=row.group_name)
#ts = _('group-deleted',
#default='{group_name} group has been deleted.',
#mapping=data)
#self.ses.flash(ts)
@view_config(
route_name='group-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super(Views, self).view_delete()
def clean_name(s):
s = s.strip()
while s.find(' ') > -1:
s = s.replace(' ', ' ')
return s
class Validator:
def __init__(self, group):
self.group = group
class NameValidator(Validator):
def __call__(self, node, value):
group_name = value
def group_max():
raise colander.Invalid(node, _('Maksimal 128 karakter'))
# Jika karakter melebihi 128 karakter maka, panggil fungsi
if (len(group_name) > 128):
group_max()
if self.group and self.group.group_name.lower() == group_name.lower():
return
q = DBSession.query(Group). \
filter(Group.group_name.ilike(group_name))
found = q.first()
if not found:
return
data = dict(group_name=group_name, gid=found.id)
ts = _(
'group-name-already-used',
default='Group name ${group_name} already used by ID ${gid}',
mapping=data)
raise colander.Invalid(node, ts)
@colander.deferred
def name_validator(node, kw):
return NameValidator(kw['group'])
@colander.deferred
def permissions_widget(node, kw):
values = kw.get('permission_list', [])
return widget.CheckboxChoiceWidget(values=values)
def get_permissions_list():
q = DBSession.query(Permission)
r = []
for perm in q.order_by(Permission.description):
row = (perm.perm_name, perm.description)
r.append(row)
return r
def group_permission_set(group):
q = DBSession.query(GroupPermission).filter_by(group_id=group.id)
r = []
for gp in q:
r.append(gp.perm_name)
return set(r)
import os
import re
import colander
from deform import widget
from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from . import BaseView
from opensipkd.tools import get_random_string
from opensipkd.tools.report import csv_response, file_response
from opensipkd.models import (
DBSession,
Group,
Permission,
GroupPermission,
)
_ = TranslationStringFactory ('user')
@colander.deferred
def name_validator(node, kw):
return NameValidator(kw['group'])
@colander.deferred
def permissions_widget(node, kw):
values = kw.get('permissions_list', [])
return widget.CheckboxChoiceWidget(values=values)
class AddSchema(colander.Schema):
group_name = colander.SchemaNode(
colander.String(),
validator= name_validator)
description = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=256),
missing=colander.drop)
permissions = colander.SchemaNode(
colander.Set(), widget=permissions_widget, title='Hak akses', missing=colander.drop)
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.Integer(),
widget=widget.HiddenWidget(readonly=True),
missing=colander.drop)
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), visible=False, title="Action")
group_name = colander.SchemaNode(
colander.String(), )
description = colander.SchemaNode(colander.String())
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.list_schema = ListSchema
self.list_route = "group"
self.table = Group
self.add_schema = AddSchema
self.edit_schema = EditSchema
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', 'Group.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
def get_bindings(self, row=None):
return dict(group=row,
permissions_list=get_permissions_list())
@staticmethod
def query_register():
return DBSession.query(Group.group_name, Group.description,Group.permissions).order_by(Group.group_name)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
@view_config(
route_name='group', renderer='templates/table.pt',
permission='user-view')
def view_list(self):
return super(Views, self).view_list()
@view_config(
route_name='group-act', renderer='json', permission='user-view')
def view_act(self):
return super(Views, self).view_act()
def next_act(self):
request = self.req
url_dict = request.matchdict
params = self.params
if url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
q = DBSession.query(Group.id, Group.description).filter(
Group.description.ilike('%{}%'.format(term))). \
order_by(Group.group_name)
rows = q.all()
r = []
for k in rows:
d = dict(id=k[0], value=k[1])
r.append(d)
return r
@view_config(
route_name='group-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super(Views, self).view_add()
def save_request(self, values, row=None):
insert = not row
vals = values.copy()
vals.pop('permissions')
row = self.save(vals, self.req.user, row)
existing = group_permission_set(row)
unused = existing - values['permissions']
if unused:
q = DBSession.query(GroupPermission).filter_by(group_id=row.id). \
filter(GroupPermission.perm_name.in_(unused))
q.delete(synchronize_session=False)
new = values['permissions'] - existing
for perm_name in new:
gp = GroupPermission()
gp.group_id = row.id
gp.perm_name = perm_name
DBSession.add(gp)
data = dict(group_name=row.group_name)
if insert:
ts = _('group-added', default='{group_name} group has been added.', mapping=data)
else:
ts = _('group-updated', default='${group_name} group profile updated', mapping=data)
self.ses.flash(ts)
return row
def get_values(self, row, istime=False):
values = super(Views, self).get_values(row, istime)
values['permissions'] = group_permission_set(row)
return values
@view_config(
route_name='group-view', renderer='templates/form.pt',
permission='user-view')
def view_view(self):
return super(Views, self).view_view()
@view_config(route_name='group-upload',
renderer='templates/form.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["group_name"]
return super().view_upload(exts=('.csv', ".tsv"))
@view_config(
route_name='group-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edit(self):
return super(Views, self).view_edit()
#def delete_msg(self, row):
#data = dict(group_name=row.group_name)
#ts = _('group-deleted',
#default='{group_name} group has been deleted.',
#mapping=data)
#self.ses.flash(ts)
@view_config(
route_name='group-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super(Views, self).view_delete()
def clean_name(s):
s = s.strip()
while s.find(' ') > -1:
s = s.replace(' ', ' ')
return s
class Validator:
def __init__(self, group):
self.group = group
class NameValidator(Validator):
def __call__(self, node, value):
group_name = value
def group_max():
raise colander.Invalid(node, _('Maksimal 128 karakter'))
# Jika karakter melebihi 128 karakter maka, panggil fungsi
if (len(group_name) > 128):
group_max()
if self.group and self.group.group_name.lower() == group_name.lower():
return
q = DBSession.query(Group). \
filter(Group.group_name.ilike(group_name))
found = q.first()
if not found:
return
data = dict(group_name=group_name, gid=found.id)
ts = _(
'group-name-already-used',
default='Group name ${group_name} already used by ID ${gid}',
mapping=data)
raise colander.Invalid(node, ts)
@colander.deferred
def name_validator(node, kw):
return NameValidator(kw['group'])
@colander.deferred
def permissions_widget(node, kw):
values = kw.get('permission_list', [])
return widget.CheckboxChoiceWidget(values=values)
def get_permissions_list():
q = DBSession.query(Permission)
r = []
for perm in q.order_by(Permission.description):
row = (perm.perm_name, perm.description)
r.append(row)
return r
def group_permission_set(group):
q = DBSession.query(GroupPermission).filter_by(group_id=group.id)
r = []
for gp in q:
r.append(gp.perm_name)
return set(r)
import os
import logging
import colander
from deform import (
widget, Button,
)
from opensipkd.base import get_id_card_folder
from opensipkd.models import DBSession, Partner, PartnerFiles
from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.models.common import ResCompany
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import Upload, img_exts
from pyramid.i18n import TranslationStringFactory
from opensipkd.tools import get_random_string
from pyramid.view import (
view_config,
)
from . import BaseView, btn_upload
from .company import company_widget
from .partner_base import PartnerSchema
# from .. import partner_idcard_url
from ..views import BaseView
log = logging.getLogger(__name__)
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah partner gagal'
SESS_EDIT_FAILED = 'Edit partner gagal'
class AddSchema(PartnerSchema):
is_vendor = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="is_vendor",
title="Vendor")
is_customer = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="is_customer",
title="Customer")
company_id = colander.SchemaNode(
colander.Integer(),
widget=company_widget,
missing=colander.drop,
oid="company_id",
title="Company")
def after_bind(self, schema, kwargs):
super().after_bind(schema, kwargs)
request = kwargs["request"]
if request.user.company_id:
self["company_id"].widget = widget.HiddenWidget()
self["company_id"].default = request.user.company_id
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(),
)
def after_bind(self, schema, kwargs):
super().after_bind(schema, kwargs)
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=128),
oid="nama")
email = colander.SchemaNode(
colander.String(),
oid="email")
idcard = colander.SchemaNode(
colander.String(),
oid="idcard",
title="Identitas"
)
status = colander.SchemaNode(
colander.Boolean(),
widget=widget.CheckboxWidget(),
oid="status")
created = colander.SchemaNode(
colander.String())
def after_bind(self, schema, kw):
request = kw.get("request")
self["idcard"].url = request.static_url(get_id_card_folder("/"))
class ViewPartner(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'partner'
self.list_route = 'partner'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Partner
self.list_schema = ListSchema
self.save_state = True
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', 'partner1.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(Partner.is_vendor, Partner.is_customer,Partner.company_id).order_by(Partner.is_vendor)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
########
# List #
########
@view_config(route_name='partner', renderer='templates/table.pt',
permission='user-view')
def view_list(self):
new_buttons = {"kta":
{"obj": "kta",
"js": """if (m{tableid}ID!=null)
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/kta?{params}';
else displayEmptyID();
"""
},
"ktp":
{"obj": Button("ktp", title=_('KTP'), css_class="btn-danger"),
"js": """if (m{tableid}ID!=null)
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/ktp?{params}';
else displayEmptyID();
"""
}
}
return super().view_list(new_buttons=new_buttons)
@view_config(route_name='partner-act', renderer='json',
permission='user-view')
def view_act(self):
return super().view_act()
def next_act(self):
request = self.req
params = request.params
url_dict = request.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.kode.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
filter(Partner.is_vendor == 1). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama)
row = q.first()
if not row:
return []
keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()]
return r
elif url_dict['act'] == 'vendor': # vendor only
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
filter(Partner.is_vendor == 1). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
return r
elif url_dict['act'] == 'customer': # customer only
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
filter(Partner.is_customer == 1). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
return r
@view_config(route_name='partner-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super().view_add()
@view_config(route_name='partner-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edt(self):
return super().view_edit()
@view_config(route_name='partner-view', renderer='templates/form.pt',
permission='user-edit')
def view_view(self):
return super().view_view()
@view_config(route_name='partner-upload',
renderer='templates/upload.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["kode"]
return super(ViewPartner,self).view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='partner-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Partner).filter_by(id=uid)
row = q.first()
else:
row = None
q = Partner.query_kode(value['kode'])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
if "idcard" in value and value["idcard"]:
idcard = value["idcard"]
if "fp" in idcard and idcard["fp"] and idcard["fp"] != b'':
path = get_id_card_folder()
upload = Upload(path)
value["idcard"] = upload.save_fp(idcard)
else:
value.pop("idcard")
value['is_vendor'] = 'is_vendor' in value and \
value['is_vendor'] and 1 or 0
value['is_customer'] = 'is_customer' in value and \
value['is_customer'] and 1 or 0
value["status"] = 'status' in value and value['status'] and 1 or 0
def get_bindings(self, row=None):
result = super().get_bindings(row)
provinsi_list = ResProvinsi.get_list()
dati2_list = row and row.provinsi_id and ResDati2.get_list(
row.provinsi_id) or []
kecamatan_list = row and row.dati2_id and ResKecamatan.get_list(
row.dati2_id) or []
desa_list = row and row.kecamatan_id and ResDesa.get_list(
row.kecamatan_id) or []
result.update(dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
desa_list=desa_list,
company_list=ResCompany.get_list()
))
return result
def save_request(self, values, row=None):
# if "idcard" in values and values["idcard"]:
# if str(self.req.POST['upload']) != "":
# folder = self.get_params("idcard_folder", '/tmp/idcard')
# upload = Upload(folder)
# file_name = upload.save(self.req, 'upload', img_exts)
# values["idcard"] = file_name
# else:
# del values["idcard"]
row = super().save_request(values, row)
return row
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
if "idcard" in d and d["idcard"]:
filename = d["idcard"]
url = self.req.static_url(get_id_card_folder("/"))
preview_url = "/".join([url, filename])
log.info(preview_url)
d["idcard"] = {"uid": filename.split(".")[0],
"filename": filename,
"preview_url": preview_url
}
return d
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
@colander.deferred
def partner_widget(node, kw):
values = kw.get('partner_list', [])
return widget.Select2Widget(values=values)
import os
import logging
import colander
from deform import (
widget, Button,
)
from opensipkd.base import get_id_card_folder
from opensipkd.models import DBSession, Partner, PartnerFiles
from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.models.common import ResCompany
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import Upload, img_exts
from pyramid.i18n import TranslationStringFactory
from opensipkd.tools import get_random_string
from pyramid.view import (
view_config,
)
from . import BaseView, btn_upload
from .company import company_widget
from .partner_base import PartnerSchema
# from .. import partner_idcard_url
from ..views import BaseView
log = logging.getLogger(__name__)
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah partner gagal'
SESS_EDIT_FAILED = 'Edit partner gagal'
class AddSchema(PartnerSchema):
is_vendor = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="is_vendor",
title="Vendor")
is_customer = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="is_customer",
title="Customer")
company_id = colander.SchemaNode(
colander.Integer(),
widget=company_widget,
missing=colander.drop,
oid="company_id",
title="Company")
def after_bind(self, schema, kwargs):
super().after_bind(schema, kwargs)
request = kwargs["request"]
if request.user.company_id:
self["company_id"].widget = widget.HiddenWidget()
self["company_id"].default = request.user.company_id
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(),
)
def after_bind(self, schema, kwargs):
super().after_bind(schema, kwargs)
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=128),
oid="nama")
email = colander.SchemaNode(
colander.String(),
oid="email")
idcard = colander.SchemaNode(
colander.String(),
oid="idcard",
title="Identitas"
)
status = colander.SchemaNode(
colander.Boolean(),
widget=widget.CheckboxWidget(),
oid="status")
created = colander.SchemaNode(
colander.String())
def after_bind(self, schema, kw):
request = kw.get("request")
self["idcard"].url = request.static_url(get_id_card_folder("/"))
class ViewPartner(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'partner'
self.list_route = 'partner'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Partner
self.list_schema = ListSchema
self.save_state = True
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', 'partner1.jrxml')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
print(parameters)
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(Partner.is_vendor, Partner.is_customer,Partner.company_id).order_by(Partner.is_vendor)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys()
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
return csv_response(self.req, value, filename)
########
# List #
########
@view_config(route_name='partner', renderer='templates/table.pt',
permission='user-view')
def view_list(self):
new_buttons = {"kta":
{"obj": "kta",
"js": """if (m{tableid}ID!=null)
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/kta?{params}';
else displayEmptyID();
"""
},
"ktp":
{"obj": Button("ktp", title=_('KTP'), css_class="btn-danger"),
"js": """if (m{tableid}ID!=null)
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/ktp?{params}';
else displayEmptyID();
"""
}
}
return super().view_list(new_buttons=new_buttons)
@view_config(route_name='partner-act', renderer='json',
permission='user-view')
def view_act(self):
return super().view_act()
def next_act(self):
request = self.req
params = request.params
url_dict = request.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.kode.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
filter(Partner.is_vendor == 1). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama)
row = q.first()
if not row:
return []
keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()]
return r
elif url_dict['act'] == 'vendor': # vendor only
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
filter(Partner.is_vendor == 1). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
return r
elif url_dict['act'] == 'customer': # customer only
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'),
Partner.kode, Partner.nama). \
filter(Partner.nama.ilike('%%%s%%' % term)). \
filter(Partner.is_customer == 1). \
order_by(Partner.nama)
keys = q.first().keys()
r = []
for k in q.all():
d = dict(zip(keys, k))
r.append(d)
return r
@view_config(route_name='partner-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super().view_add()
@view_config(route_name='partner-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edt(self):
return super().view_edit()
@view_config(route_name='partner-view', renderer='templates/form.pt',
permission='user-edit')
def view_view(self):
return super().view_view()
@view_config(route_name='partner-upload',
renderer='templates/upload.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["kode"]
return super(ViewPartner,self).view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='partner-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Partner).filter_by(id=uid)
row = q.first()
else:
row = None
q = Partner.query_kode(value['kode'])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
if "idcard" in value and value["idcard"]:
idcard = value["idcard"]
if "fp" in idcard and idcard["fp"] and idcard["fp"] != b'':
path = get_id_card_folder()
upload = Upload(path)
value["idcard"] = upload.save_fp(idcard)
else:
value.pop("idcard")
value['is_vendor'] = 'is_vendor' in value and \
value['is_vendor'] and 1 or 0
value['is_customer'] = 'is_customer' in value and \
value['is_customer'] and 1 or 0
value["status"] = 'status' in value and value['status'] and 1 or 0
def get_bindings(self, row=None):
result = super().get_bindings(row)
provinsi_list = ResProvinsi.get_list()
dati2_list = row and row.provinsi_id and ResDati2.get_list(
row.provinsi_id) or []
kecamatan_list = row and row.dati2_id and ResKecamatan.get_list(
row.dati2_id) or []
desa_list = row and row.kecamatan_id and ResDesa.get_list(
row.kecamatan_id) or []
result.update(dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
desa_list=desa_list,
company_list=ResCompany.get_list()
))
return result
def save_request(self, values, row=None):
# if "idcard" in values and values["idcard"]:
# if str(self.req.POST['upload']) != "":
# folder = self.get_params("idcard_folder", '/tmp/idcard')
# upload = Upload(folder)
# file_name = upload.save(self.req, 'upload', img_exts)
# values["idcard"] = file_name
# else:
# del values["idcard"]
row = super().save_request(values, row)
return row
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
if "idcard" in d and d["idcard"]:
filename = d["idcard"]
url = self.req.static_url(get_id_card_folder("/"))
preview_url = "/".join([url, filename])
log.info(preview_url)
d["idcard"] = {"uid": filename.split(".")[0],
"filename": filename,
"preview_url": preview_url
}
return d
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
@colander.deferred
def partner_widget(node, kw):
values = kw.get('partner_list', [])
return widget.Select2Widget(values=values)
import os
import colander
import logging
from deform import widget
from pyramid.view import view_config
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from ...models import DBSession, ResDesa, User, UserArea
from .desa import desa_widget, get_desa_list
from sqlalchemy import func
from pyramid.i18n import TranslationStringFactory
from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import get_random_string
_ = TranslationStringFactory('myapp')
log = logging.getLogger(__name__)
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.Integer(),
title="Action"
)
user_name = colander.SchemaNode(
colander.String(),
field=User.user_name,
title="User"
)
desa_kd = colander.SchemaNode(
colander.String(),
field=ResDesa.kode)
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) # Tetap menggunakan CheckboxChoiceWidget
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()),
oid="user_id",
title="User",
)
desa_id = colander.SchemaNode(
colander.Set(), # Kembali ke colander.Set()
widget=desa_checkbox_widget,
validator=single_choice_validator, # Tambahkan validator
oid="desa_id",
title="Kelurahan/Desa",
)
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.list_route = 'user-area'
self.table = UserArea
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')
# Mendapatkan path gambar
def get_module_path(self, module_name):
a = AssetResolver(module_name)
resolver = a.resolve('')
return resolver.abspath()
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')
parameters = {
"judul": get_params('company', "openSIPKD"),
"logo": logo
}
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(UserArea.user_id, UserArea.desa_id).order_by(UserArea.user_id)
def csv_response(self, **kwargs):
query = self.query_register() # Panggil sebagai metode instance
row = query.first()
header = row._mapping.keys() if row else ['user_id', 'desa_id'] # Tambahkan fallback jika query kosong
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
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)
@view_config(route_name='user-area', renderer='templates/table.pt',
permission='user-view')
def view_list(self, **kwargs):
return super(Views, self).view_list(**kwargs)
@view_config(route_name='user-area-act', renderer='json',
permission='user-view')
def view_act(self):
return super(Views, self).view_act()
def get_bindings(self, row=None):
return {
"desa_list": get_desa_list()
}
@view_config(route_name='user-area-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super(Views, self).view_add()
@view_config(route_name='user-area-view', renderer='templates/form.pt',
permission='user-view')
def view_view(self):
return super(Views, self).view_view()
@view_config(route_name='user-area-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super(Views, self).view_delete()
@view_config(route_name='user-area-upload',
renderer='templates/upload.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["user_id"]
return super(Views, self).view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='user-area-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edit(self):
return super(Views, self).view_edit()
def save_request(self, values, row=None):
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:
existing_desa = self.get_existing_desa(user_id)
desa_id_str = str(desa_id)
if desa_id_str not in existing_desa:
DBSession.query(UserArea).filter_by(user_id=user_id).delete(synchronize_session=False)
new_row = UserArea(
user_id=user_id,
desa_id=int(desa_id)
)
DBSession.add(new_row)
DBSession.flush()
return row
def get_existing_desa(self, user_id):
q = DBSession.query(UserArea).filter_by(user_id=user_id)
r = []
for ug in q:
r.append(str(ug.desa_id))
return set(r)
def get_values(self, row, istime=False):
d = super(Views, self).get_values(row, istime)
existing_desa = self.get_existing_desa(row.user_id)
d["desa_id"] = {next(iter(existing_desa))} if existing_desa else set()
import os
import colander
import logging
from deform import widget
from pyramid.view import view_config
from . import BaseView, btn_upload
from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params
from ...models import DBSession, ResDesa, User, UserArea
from .desa import desa_widget, get_desa_list
from sqlalchemy import func
from pyramid.i18n import TranslationStringFactory
from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import get_random_string
_ = TranslationStringFactory('myapp')
log = logging.getLogger(__name__)
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.Integer(),
title="Action"
)
user_name = colander.SchemaNode(
colander.String(),
field=User.user_name,
title="User"
)
desa_kd = colander.SchemaNode(
colander.String(),
field=ResDesa.kode)
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()),
oid="user_id",
title="User",
)
desa_id = colander.SchemaNode(
colander.Set(),
widget=desa_checkbox_widget,
validator=single_choice_validator,
oid="desa_id",
title="Kelurahan/Desa",
)
class EditSchema(AddSchema):
id = colander.SchemaNode(
colander.String(),
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",
)
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.list_route = 'user-area'
self.table = UserArea
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('')
return resolver.abspath()
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')
parameters = {
"judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo
}
filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register():
return DBSession.query(UserArea.user_id, UserArea.desa_id).order_by(UserArea.user_id)
def csv_response(self, **kwargs):
query = self.query_register()
row = query.first()
header = row._mapping.keys() if row else ['user_id', 'desa_id']
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv"
value = {
'header': header,
'rows': rows,
}
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)
@view_config(route_name='user-area', renderer='templates/table.pt',
permission='user-view')
def view_list(self, **kwargs):
return super(Views, self).view_list(**kwargs)
@view_config(route_name='user-area-act', renderer='json',
permission='user-view')
def view_act(self):
return super(Views, self).view_act()
def get_bindings(self, row=None):
return {
"desa_list": get_desa_list()
}
@view_config(route_name='user-area-add', renderer='templates/form.pt',
permission='user-edit')
def view_add(self):
return super(Views, self).view_add()
@view_config(route_name='user-area-view', renderer='templates/form.pt',
permission='user-view')
def view_view(self):
return super(Views, self).view_view()
@view_config(route_name='user-area-delete', renderer='templates/form.pt',
permission='user-edit')
def view_delete(self):
return super(Views, self).view_delete()
@view_config(route_name='user-area-upload',
renderer='templates/upload.pt', permission='user-upload')
def view_upload(self):
self.upload_keys = ["user_id"]
return super(Views, self).view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='user-area-edit', renderer='templates/form.pt',
permission='user-edit')
def view_edit(self):
return super(Views, self).view_edit()
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
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
def get_existing_desa(self, user_id):
q = DBSession.query(UserArea).filter_by(user_id=user_id)
r = []
for ug in q:
r.append(str(ug.desa_id))
return set(r)
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
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!