Commit c67ff093 by iqbal

Penambahan alamat pada jasper dan perbaikan menu user area

1 parent 8373a07c
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
<defaultValueExpression><![CDATA["PEMERINTAH KABUPATEN KUNINGAN"]]></defaultValueExpression> <defaultValueExpression><![CDATA["PEMERINTAH KABUPATEN KUNINGAN"]]></defaultValueExpression>
</parameter> </parameter>
<parameter name="logo" class="java.lang.String"/> <parameter name="logo" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString> <queryString>
<![CDATA[select * FROM groups]]> <![CDATA[select * FROM groups]]>
</queryString> </queryString>
...@@ -34,9 +35,9 @@ ...@@ -34,9 +35,9 @@
<band splitType="Stretch"/> <band splitType="Stretch"/>
</background> </background>
<title> <title>
<band height="100" splitType="Stretch"> <band height="101" splitType="Stretch">
<staticText> <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"> <textElement textAlignment="Center" verticalAlignment="Middle">
<font size="14" isBold="true"/> <font size="14" isBold="true"/>
</textElement> </textElement>
...@@ -53,12 +54,19 @@ ...@@ -53,12 +54,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression> <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image> </image>
<textField> <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"> <textElement textAlignment="Center" verticalAlignment="Middle">
<font size="16" isBold="true"/> <font size="16" isBold="true"/>
</textElement> </textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression> <textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField> </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> </band>
</title> </title>
<pageHeader> <pageHeader>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/> <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/> <parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/> <parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString> <queryString>
<![CDATA[select * FROM res_desa JOIN res_kecamatan ON res_desa.kecamatan_id = res_kecamatan.id;]]> <![CDATA[select * FROM res_desa JOIN res_kecamatan ON res_desa.kecamatan_id = res_kecamatan.id;]]>
</queryString> </queryString>
...@@ -112,9 +113,9 @@ ...@@ -112,9 +113,9 @@
<band splitType="Stretch"/> <band splitType="Stretch"/>
</background> </background>
<title> <title>
<band height="95" splitType="Stretch"> <band height="96" splitType="Stretch">
<staticText> <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"> <textElement textAlignment="Center" verticalAlignment="Middle">
<font size="14" isBold="true"/> <font size="14" isBold="true"/>
</textElement> </textElement>
...@@ -137,6 +138,13 @@ ...@@ -137,6 +138,13 @@
</textElement> </textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression> <textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField> </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> </band>
</title> </title>
<columnHeader> <columnHeader>
...@@ -198,14 +206,19 @@ ...@@ -198,14 +206,19 @@
<textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression>
</textField> </textField>
<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> <box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box> </box>
<textElement textAlignment="Center" verticalAlignment="Middle"/> <textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression>
</textField> </textField>
<textField> <textField>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/> <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/> <parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/> <parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString> <queryString>
<![CDATA[select * FROM eselon]]> <![CDATA[select * FROM eselon]]>
</queryString> </queryString>
...@@ -67,7 +68,7 @@ ...@@ -67,7 +68,7 @@
<band splitType="Stretch"/> <band splitType="Stretch"/>
</background> </background>
<title> <title>
<band height="89" splitType="Stretch"> <band height="95" splitType="Stretch">
<staticText> <staticText>
<reportElement x="143" y="30" width="269" height="30" uuid="8be6d74b-7953-470f-8fbb-799d55a1f230"/> <reportElement x="143" y="30" width="269" height="30" uuid="8be6d74b-7953-470f-8fbb-799d55a1f230"/>
<textElement textAlignment="Center" verticalAlignment="Middle"> <textElement textAlignment="Center" verticalAlignment="Middle">
...@@ -92,6 +93,13 @@ ...@@ -92,6 +93,13 @@
</textElement> </textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression> <textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField> </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> </band>
</title> </title>
<columnHeader> <columnHeader>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/> <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/> <parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/> <parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString> <queryString>
<![CDATA[select * FROM res_dati2 join res_provinsi ON res_dati2.provinsi_id = res_provinsi.id]]> <![CDATA[select * FROM res_dati2 join res_provinsi ON res_dati2.provinsi_id = res_provinsi.id]]>
</queryString> </queryString>
...@@ -136,12 +137,19 @@ ...@@ -136,12 +137,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression> <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image> </image>
<textField> <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"> <textElement textAlignment="Center" verticalAlignment="Middle">
<font size="16" isBold="true"/> <font size="16" isBold="true"/>
</textElement> </textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression> <textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField> </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> </band>
</title> </title>
<columnHeader> <columnHeader>
...@@ -203,25 +211,33 @@ ...@@ -203,25 +211,33 @@
<textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression>
</textField> </textField>
<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> <box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box> </box>
<textElement textAlignment="Left" verticalAlignment="Middle"/> <textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression>
</textField> </textField>
<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> <box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box> </box>
<textElement textAlignment="Left" verticalAlignment="Middle"/> <textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{COLUMN_14}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{COLUMN_14}]]></textFieldExpression>
</textField> </textField>
</band> </band>
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<property name="com.jaspersoft.studio.data.sql.tables" value=""/> <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<parameter name="logo" class="java.lang.String"/> <parameter name="logo" class="java.lang.String"/>
<parameter name="judul" class="java.lang.String"/> <parameter name="judul" class="java.lang.String"/>
<parameter name="alamat_lengkap" class="java.lang.String"/>
<queryString> <queryString>
<![CDATA[select * FROM partner]]> <![CDATA[select * FROM partner]]>
</queryString> </queryString>
...@@ -209,8 +210,8 @@ ...@@ -209,8 +210,8 @@
<title> <title>
<band height="91" splitType="Stretch"> <band height="91" splitType="Stretch">
<staticText> <staticText>
<reportElement x="204" y="40" width="130" height="20" uuid="404cb1e0-9e9b-4d9e-9f12-7ae4ee60561f"/> <reportElement x="0" y="30" width="552" height="30" uuid="404cb1e0-9e9b-4d9e-9f12-7ae4ee60561f"/>
<textElement> <textElement textAlignment="Center">
<font size="14" isBold="true"/> <font size="14" isBold="true"/>
</textElement> </textElement>
<text><![CDATA[DAFTAR PARTNER]]></text> <text><![CDATA[DAFTAR PARTNER]]></text>
...@@ -226,12 +227,19 @@ ...@@ -226,12 +227,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression> <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image> </image>
<textField> <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"> <textElement textAlignment="Center" verticalAlignment="Middle">
<font size="14" isBold="true"/> <font size="14" isBold="true"/>
</textElement> </textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression> <textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField> </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> </band>
</title> </title>
<columnHeader> <columnHeader>
...@@ -306,14 +314,18 @@ ...@@ -306,14 +314,18 @@
<textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression>
</textField> </textField>
<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> <box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box> </box>
<textElement textAlignment="Center" verticalAlignment="Middle"/> <textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression>
</textField> </textField>
<textField> <textField>
...@@ -330,6 +342,7 @@ ...@@ -330,6 +342,7 @@
<textField> <textField>
<reportElement x="270" y="0" width="160" height="21" uuid="b00fbbe6-e991-4a59-837e-601a2462aebf"> <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.spreadsheet.connectionID" value="add93502-c54f-4ef3-912a-338d7f0ff64b"/>
<property name="com.jaspersoft.studio.unit.leftIndent" value="px"/>
</reportElement> </reportElement>
<box> <box>
<topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
...@@ -337,7 +350,9 @@ ...@@ -337,7 +350,9 @@
<bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
</box> </box>
<textElement textAlignment="Center" verticalAlignment="Middle"/> <textElement textAlignment="Left" verticalAlignment="Middle">
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{email}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
</textField> </textField>
</band> </band>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="POSTGRES"/> <property name="com.jaspersoft.studio.data.defaultdataadapter" value="POSTGRES"/>
<parameter name="logo" class="java.lang.String"/> <parameter name="logo" class="java.lang.String"/>
<parameter name="judul" 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"> <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;]]> <![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> </queryString>
...@@ -157,12 +157,19 @@ ...@@ -157,12 +157,19 @@
<imageExpression><![CDATA[$P{logo}]]></imageExpression> <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image> </image>
<textField> <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"> <textElement textAlignment="Center" verticalAlignment="Middle">
<font size="16" isBold="true"/> <font size="16" isBold="true"/>
</textElement> </textElement>
<textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression> <textFieldExpression><![CDATA[$P{judul}]]></textFieldExpression>
</textField> </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> </band>
</title> </title>
<columnHeader> <columnHeader>
......
...@@ -93,6 +93,7 @@ class ViewDati2(BaseView): ...@@ -93,6 +93,7 @@ class ViewDati2(BaseView):
logo = os.path.join(logo, 'static', 'img', 'logo.png') logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = { parameters = {
"judul": get_params('company', "openSIPKD"), "judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
"logo": logo "logo": logo
} }
print(parameters) print(parameters)
......
import os import os
import colander import colander
from deform import (widget, ) from deform import (widget, )
from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2 from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2
from . import BaseView, btn_upload from . import BaseView, btn_upload
from opensipkd.tools.buttons import 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 BaseView, btn_upload from . import BaseView, btn_upload
from pyramid.path import AssetResolver from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from .dati2 import dati2_widget from .dati2 import dati2_widget
from opensipkd.tools import get_random_string from opensipkd.tools import get_random_string
from .kecamatan import kecamatan_widget from .kecamatan import kecamatan_widget
from .provinsi import provinsi_widget from .provinsi import provinsi_widget
from ..views import BaseView from ..views import BaseView
_ = TranslationStringFactory("opensipkd") _ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah desa gagal' SESS_ADD_FAILED = 'Tambah desa gagal'
SESS_EDIT_FAILED = 'Edit desa gagal' SESS_EDIT_FAILED = 'Edit desa gagal'
def get_desa_list(): def get_desa_list():
# r = [("", "--Pilih Desa--")] # r = [("", "--Pilih Desa--")]
r = [] r = []
q = DBSession.query(ResDesa).order_by(ResDesa.nama) q = DBSession.query(ResDesa).order_by(ResDesa.nama)
for row in q: for row in q:
g = (str(row.id), (f"{row.kode}/ {row.nama}")) g = (str(row.id), (f"{row.kode}/ {row.nama}"))
r.append(g) r.append(g)
return r return r
@colander.deferred @colander.deferred
def desa_widget(node, kw): def desa_widget(node, kw):
values = kw.get('desa_list', []) values = kw.get('desa_list', [])
return widget.Select2Widget(values=values, return widget.Select2Widget(values=values,
placeholder="Pilih Desa/Kelurahan") placeholder="Pilih Desa/Kelurahan")
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(), provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget, widget=provinsi_widget,
validator=colander.Length(max=32), validator=colander.Length(max=32),
oid="provinsi_id", oid="provinsi_id",
slave="dati2_id", slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=", slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi", title="Provinsi",
) )
dati2_id = colander.SchemaNode(colander.String(), dati2_id = colander.SchemaNode(colander.String(),
widget=dati2_widget, widget=dati2_widget,
validator=colander.Length(max=32), validator=colander.Length(max=32),
oid="dati2_id", oid="dati2_id",
slave="kecamatan_id", slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=", slave_url="/kecamatan/select/act?dati2_id=",
title="Kabupaten/Kota", title="Kabupaten/Kota",
) )
kecamatan_id = colander.SchemaNode(colander.String(), kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget, widget=kecamatan_widget,
validator=colander.Length(max=32), validator=colander.Length(max=32),
oid="kecamatan_id", oid="kecamatan_id",
title="Kecamatan") title="Kecamatan")
kode = colander.SchemaNode(colander.String(), kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(), kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_desa), widget=widget.SelectWidget(values=kategori_desa),
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), nama = colander.SchemaNode(colander.String(),
validator=colander.Length(max=128), validator=colander.Length(max=128),
oid="nama") oid="nama")
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop, id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True)) widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action")) title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode") kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama") nama = colander.SchemaNode(colander.String(), title="Nama")
kecamatan = colander.SchemaNode(colander.String(), field=ResKecamatan.nama) kecamatan = colander.SchemaNode(colander.String(), field=ResKecamatan.nama)
class ViewDesa(BaseView): class ViewDesa(BaseView):
def __init__(self, request): def __init__(self, request):
super(ViewDesa, self).__init__(request) super(ViewDesa, self).__init__(request)
self.form_scripts = "" self.form_scripts = ""
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = 'desa' self.list_url = 'desa'
self.list_route = 'desa' self.list_route = 'desa'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = ResDesa self.table = ResDesa
self.list_schema = ListSchema self.list_schema = ListSchema
self.list_buttons = self.list_buttons + self.list_report + (btn_upload,) self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__) path = os.path.dirname(__file__)
path = os.path.dirname(path) path = os.path.dirname(path)
self.report_file = os.path.join(path, 'reports', 'desa.jrxml') self.report_file = os.path.join(path, 'reports', 'desa.jrxml')
# Mendapatkan path gambar # Mendapatkan path gambar
def get_module_path(self, module_name): def get_module_path(self, module_name):
a = AssetResolver(module_name) a = AssetResolver(module_name)
resolver = a.resolve('') resolver = a.resolve('')
return resolver.abspath() return resolver.abspath()
def pdf_response(self, **kwargs): def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================") # print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base') logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png') logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = { parameters = {
"judul": get_params('company', "openSIPKD"), "judul": get_params('company', "openSIPKD"),
"logo": logo "alamat_lengkap": get_params('address', "Bekasi"),
} "logo": logo
print(parameters) }
filename = jasper_export(self.report_file, parameters=parameters) print(parameters)
return file_response(self.req, filename=filename[0]) filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register(): @staticmethod
return DBSession.query(ResDesa.kecamatan_id, ResDesa.kode, ResDesa.kategori,ResDesa.nama).order_by(ResDesa.kecamatan_id) 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() def csv_response(self, **kwargs):
row = query.first() query = self.query_register()
header = row._mapping.keys() row = query.first()
rows = [list(item) for item in query.all()] header = row._mapping.keys()
filename = f"{get_random_string(16)}.csv" rows = [list(item) for item in query.all()]
value = { filename = f"{get_random_string(16)}.csv"
'header': header, value = {
'rows': rows, 'header': header,
} 'rows': rows,
return csv_response(self.req, value, filename) }
return csv_response(self.req, value, filename)
def form_validator(self, form, value):
def err_kode(): def form_validator(self, form, value):
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % ( def err_kode():
value['kode'], found.nama)) raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form, def err_nama():
'Uraian %s sudah digunakan oleh kode %s' % ( raise colander.Invalid(form,
value['nama'], found.kode)) 'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id'] if 'id' in form.request.matchdict:
q = DBSession.query(ResDesa).filter_by(id=uid) uid = form.request.matchdict['id']
row = q.first() q = DBSession.query(ResDesa).filter_by(id=uid)
else: row = q.first()
row = None else:
row = None
q = ResDesa.query_kode(value['kode']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"]) q = ResDesa.query_kode(value['kode']) \
found = q.first() .filter(ResDesa.kecamatan_id == value["kecamatan_id"])
if row: found = q.first()
if found and found.id != row.id: if row:
err_kode() if found and found.id != row.id:
elif found: err_kode()
err_kode() elif found:
err_kode()
found = ResDesa.query_nama(value['nama']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"]).first() found = ResDesa.query_nama(value['nama']) \
if found: .filter(ResDesa.kecamatan_id == value["kecamatan_id"]).first()
if found and found.id != row.id: if found:
err_nama() if found and found.id != row.id:
elif found: err_nama()
err_nama() elif found:
err_nama()
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list() def get_bindings(self, row=None):
kecamatan = row and row.kecamatan or None provinsi_list = ResProvinsi.get_list()
kecamatan_list = kecamatan and ResKecamatan.get_list(kecamatan.dati2_id) or [] kecamatan = row and row.kecamatan or None
dati2 = kecamatan and kecamatan.dati2 or None kecamatan_list = kecamatan and ResKecamatan.get_list(kecamatan.dati2_id) or []
dati2_list = dati2 and ResDati2.get_list(dati2.provinsi_id) or [] dati2 = kecamatan and kecamatan.dati2 or None
return dict( dati2_list = dati2 and ResDati2.get_list(dati2.provinsi_id) or []
provinsi_list=provinsi_list, return dict(
dati2_list=dati2_list, provinsi_list=provinsi_list,
kecamatan_list=kecamatan_list, dati2_list=dati2_list,
) kecamatan_list=kecamatan_list,
)
def get_values(self, row, istime=False):
d = super().get_values(row, istime) def get_values(self, row, istime=False):
kecamatan = row and row.kecamatan or None d = super().get_values(row, istime)
d["dati2_id"] = kecamatan and kecamatan.dati2_id or None kecamatan = row and row.kecamatan or None
dati2 = kecamatan and kecamatan.dati2 or None d["dati2_id"] = kecamatan and kecamatan.dati2_id or None
d["provinsi_id"] = dati2 and dati2.provinsi_id or None dati2 = kecamatan and kecamatan.dati2 or None
return d d["provinsi_id"] = dati2 and dati2.provinsi_id or None
return d
@view_config(route_name='desa-view',
renderer='templates/form.pt', permission='wilayah') @view_config(route_name='desa-view',
def view_view(self): renderer='templates/form.pt', permission='wilayah')
return super().view_view() def view_view(self):
return super().view_view()
@view_config(route_name='desa',
renderer='templates/table.pt', @view_config(route_name='desa',
permission='wilayah') renderer='templates/table.pt',
def view_list(self): permission='wilayah')
return super(ViewDesa, self).view_list() def view_list(self):
return super(ViewDesa, self).view_list()
def list_join(self, query):
return query.outerjoin(ResKecamatan) def list_join(self, query):
return query.outerjoin(ResKecamatan)
@view_config(route_name='desa-act', renderer='json',
permission='view') @view_config(route_name='desa-act', renderer='json',
def view_act(self): permission='view')
return super().view_act() def view_act(self):
return super().view_act()
def next_act(self):
request = self.req def next_act(self):
url_dict = request.matchdict request = self.req
if url_dict['act'] == 'select': url_dict = request.matchdict
kecamatan_id = request.params["kecamatan_id"] if url_dict['act'] == 'select':
data = ResDesa.get_list(kecamatan_id) kecamatan_id = request.params["kecamatan_id"]
result = {f"{k[0]}": k[1] for k in data} data = ResDesa.get_list(kecamatan_id)
return result result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='desa-add',
renderer='templates/form.pt', permission='wilayah') @view_config(route_name='desa-add',
def view_add(self): renderer='templates/form.pt', permission='wilayah')
return super(ViewDesa, self).view_add() def view_add(self):
return super(ViewDesa, self).view_add()
@view_config(route_name='desa-edit',
renderer='templates/form.pt', permission='wilayah') @view_config(route_name='desa-edit',
def view_edt(self): renderer='templates/form.pt', permission='wilayah')
return super(ViewDesa, self).view_edit() def view_edt(self):
return super(ViewDesa, self).view_edit()
@view_config(route_name='desa-delete',
renderer='templates/form.pt', permission='wilayah') @view_config(route_name='desa-delete',
def view_delete(self): renderer='templates/form.pt', permission='wilayah')
return super(ViewDesa, self).view_delete() def view_delete(self):
return super(ViewDesa, self).view_delete()
@view_config(route_name='desa-upload',
renderer='templates/form.pt', permission='wilayah') @view_config(route_name='desa-upload',
def view_upload(self): renderer='templates/form.pt', permission='wilayah')
return super().view_upload(exts=('.csv', ".tsv")) def view_upload(self):
return super().view_upload(exts=('.csv', ".tsv"))
import os import os
import colander import colander
from deform import ( from deform import (
widget, widget,
) )
from pyramid.view import ( from pyramid.view import (
view_config, view_config,
) )
from opensipkd.models import ( from opensipkd.models import (
DBSession, DBSession,
Eselon Eselon
) )
from ..views import BaseView from ..views import BaseView
from . import BaseView, btn_upload from . import BaseView, btn_upload
from pyramid.path import AssetResolver from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import get_random_string from opensipkd.tools import get_random_string
SESS_ADD_FAILED = 'Tambah eselon gagal' SESS_ADD_FAILED = 'Tambah eselon gagal'
SESS_EDIT_FAILED = 'Edit eselon gagal' SESS_EDIT_FAILED = 'Edit eselon gagal'
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
kode = colander.SchemaNode( kode = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=32), validator=colander.Length(max=32),
oid="kode") oid="kode")
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=128), validator=colander.Length(max=128),
oid="nama") oid="nama")
status = colander.SchemaNode( status = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=widget.CheckboxWidget(true_val='1', false_val='0'), widget=widget.CheckboxWidget(true_val='1', false_val='0'),
default=1, default=1,
oid="status") oid="status")
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), id = colander.SchemaNode(colander.String(),
missing=colander.drop, missing=colander.drop,
widget=widget.HiddenWidget()) widget=widget.HiddenWidget())
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action") id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode( kode = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=32), validator=colander.Length(max=32),
oid="kode", oid="kode",
title="Kode", title="Kode",
width="100pt") width="100pt")
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=64), validator=colander.Length(max=64),
oid="nama") oid="nama")
status = colander.SchemaNode( status = colander.SchemaNode(
colander.Boolean(), colander.Boolean(),
widget=widget.CheckboxWidget(), widget=widget.CheckboxWidget(),
oid="status") oid="status")
class Views(BaseView): class Views(BaseView):
def __init__(self, request): def __init__(self, request):
super(Views, self).__init__(request) super(Views, self).__init__(request)
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = 'eselon' self.list_url = 'eselon'
self.list_route = 'eselon' self.list_route = 'eselon'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = Eselon self.table = Eselon
self.list_schema = ListSchema self.list_schema = ListSchema
self.list_buttons = self.list_buttons + self.list_report + (btn_upload,) self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__) path = os.path.dirname(__file__)
path = os.path.dirname(path) path = os.path.dirname(path)
self.report_file = os.path.join(path, 'reports', 'eselon.jrxml') self.report_file = os.path.join(path, 'reports', 'eselon.jrxml')
# Mendapatkan path gambar # Mendapatkan path gambar
def get_module_path(self, module_name): def get_module_path(self, module_name):
a = AssetResolver(module_name) a = AssetResolver(module_name)
resolver = a.resolve('') resolver = a.resolve('')
return resolver.abspath() return resolver.abspath()
def pdf_response(self, **kwargs): def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================") # print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base') logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png') logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = { parameters = {
"judul": get_params('company', "openSIPKD"), "judul": get_params('company', "openSIPKD"),
"logo": logo "alamat_lengkap": get_params('address', "Bekasi"),
} "logo": logo
print(parameters) }
filename = jasper_export(self.report_file, parameters=parameters) print(parameters)
return file_response(self.req, filename=filename[0]) filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register(): @staticmethod
return DBSession.query(Eselon.kode, Eselon.nama, Eselon.status).order_by(Eselon.kode) 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() def csv_response(self, **kwargs):
row = query.first() query = self.query_register()
header = row._mapping.keys() row = query.first()
rows = [list(item) for item in query.all()] header = row._mapping.keys()
filename = f"{get_random_string(16)}.csv" rows = [list(item) for item in query.all()]
value = { filename = f"{get_random_string(16)}.csv"
'header': header, value = {
'rows': rows, 'header': header,
} 'rows': rows,
return csv_response(self.req, value, filename) }
return csv_response(self.req, value, filename)
@view_config(route_name='eselon', renderer='templates/table.pt',
permission='eselon') @view_config(route_name='eselon', renderer='templates/table.pt',
def view_list(self): permission='eselon')
return super(Views, self).view_list() def view_list(self):
return super(Views, self).view_list()
@view_config(route_name='eselon-upload',
renderer='templates/form.pt', permission='user-upload') @view_config(route_name='eselon-upload',
def view_upload(self): renderer='templates/form.pt', permission='user-upload')
self.upload_keys = ["kode"] def view_upload(self):
return super().view_upload(exts=('.csv', ".tsv")) self.upload_keys = ["kode"]
return super().view_upload(exts=('.csv', ".tsv"))
@view_config(route_name='eselon-act', renderer='json',
permission='read') @view_config(route_name='eselon-act', renderer='json',
def view_act(self): permission='read')
return super(Views, self).view_act() def view_act(self):
return super(Views, self).view_act()
def next_act(self):
params = self.params def next_act(self):
url_dict = self.req.matchdict params = self.params
if url_dict['act'] == 'hok': url_dict = self.req.matchdict
term = 'term' in params and params['term'] or '' if url_dict['act'] == 'hok':
qry = Eselon.query(). \ term = 'term' in params and params['term'] or ''
filter(Eselon.kode.ilike('%%%s%%' % term)). \ qry = Eselon.query(). \
order_by(Eselon.kode) filter(Eselon.kode.ilike('%%%s%%' % term)). \
order_by(Eselon.kode)
r = []
for row in qry.all(): r = []
d = dict( for row in qry.all():
id=row.id, d = dict(
value=row.kode, id=row.id,
nama=row.nama value=row.kode,
) nama=row.nama
r.append(d) )
return r r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or '' elif url_dict['act'] == 'hon':
prefix = 'prefix' in params and params['prefix'] or '' term = 'term' in params and params['term'] or ''
qry = Eselon.query(). \ prefix = 'prefix' in params and params['prefix'] or ''
filter(Eselon.nama.ilike('%%%s%%' % term)). \ qry = Eselon.query(). \
order_by(Eselon.nama) filter(Eselon.nama.ilike('%%%s%%' % term)). \
r = [] order_by(Eselon.nama)
for row in qry.all(): r = []
d = dict( for row in qry.all():
id=row.id, d = dict(
value=row.nama, id=row.id,
kode=row.kode, value=row.nama,
) kode=row.kode,
r.append(d) )
return r r.append(d)
return r
@view_config(route_name='eselon-add', renderer='templates/form.pt',
permission='eselon') @view_config(route_name='eselon-add', renderer='templates/form.pt',
def view_add(self): permission='eselon')
return super().view_add() def view_add(self):
return super().view_add()
@view_config(route_name='eselon-edit', renderer='templates/form.pt',
permission='eselon') @view_config(route_name='eselon-edit', renderer='templates/form.pt',
def view_edit(self): permission='eselon')
return super().view_edit() def view_edit(self):
return super().view_edit()
@view_config(route_name='eselon-view', renderer='templates/form.pt',
permission='eselon') @view_config(route_name='eselon-view', renderer='templates/form.pt',
def view_view(self): permission='eselon')
return super().view_view() def view_view(self):
return super().view_view()
@view_config(route_name='eselon-delete', renderer='templates/form.pt',
permission='eselon') @view_config(route_name='eselon-delete', renderer='templates/form.pt',
def view_delete(self): permission='eselon')
return super().view_delete() def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode(): def form_validator(self, form, value):
raise colander.Invalid(form, def err_kode():
'Kode %s sudah digunakan oleh %s' % ( raise colander.Invalid(form,
value['kode'], found.nama)) 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form, def err_nama():
'Nama %s sudah digunakan oleh kode %s' % ( raise colander.Invalid(form,
value['nama'], found.kode)) 'Nama %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
# edit
def err_ruang(): # edit
raise colander.Invalid(form, def err_ruang():
'Nama ruang %s tidak boleh lebih dari 1 karakter.' % ( raise colander.Invalid(form,
value['ruang'])) 'Nama ruang %s tidak boleh lebih dari 1 karakter.' % (
value['ruang']))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id'] if 'id' in form.request.matchdict:
q = DBSession.query(Eselon).filter_by(id=uid) uid = form.request.matchdict['id']
eselon = q.first() q = DBSession.query(Eselon).filter_by(id=uid)
else: eselon = q.first()
eselon = None else:
eselon = None
q = Eselon.query_kode(value['kode'])
found = q.first() q = Eselon.query_kode(value['kode'])
if eselon: found = q.first()
if found and found.id != eselon.id: if eselon:
err_kode() if found and found.id != eselon.id:
elif found: err_kode()
err_kode() elif found:
err_kode()
found = Eselon.query_nama(value['nama']).first()
if eselon: found = Eselon.query_nama(value['nama']).first()
if found and found.id != eselon.id: if eselon:
err_nama() if found and found.id != eselon.id:
elif found: err_nama()
elif found:
err_nama() err_nama()
\ No newline at end of file \ No newline at end of file
import os import os
import re import re
import colander import colander
from deform import widget from deform import widget
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 . import BaseView, btn_upload
from pyramid.path import AssetResolver from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params from . import BaseView, button_import, get_params
from . import BaseView from . import BaseView
from opensipkd.tools import get_random_string from opensipkd.tools import get_random_string
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from opensipkd.models import ( from opensipkd.models import (
DBSession, DBSession,
Group, Group,
Permission, Permission,
GroupPermission, GroupPermission,
) )
_ = TranslationStringFactory ('user') _ = TranslationStringFactory ('user')
@colander.deferred @colander.deferred
def name_validator(node, kw): def name_validator(node, kw):
return NameValidator(kw['group']) return NameValidator(kw['group'])
@colander.deferred @colander.deferred
def permissions_widget(node, kw): def permissions_widget(node, kw):
values = kw.get('permissions_list', []) values = kw.get('permissions_list', [])
return widget.CheckboxChoiceWidget(values=values) return widget.CheckboxChoiceWidget(values=values)
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
group_name = colander.SchemaNode( group_name = colander.SchemaNode(
colander.String(), colander.String(),
validator= name_validator) validator= name_validator)
description = colander.SchemaNode( description = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=256), validator=colander.Length(max=256),
missing=colander.drop) missing=colander.drop)
permissions = colander.SchemaNode( permissions = colander.SchemaNode(
colander.Set(), widget=permissions_widget, title='Hak akses', missing=colander.drop) colander.Set(), widget=permissions_widget, title='Hak akses', missing=colander.drop)
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.Integer(), id = colander.SchemaNode(colander.Integer(),
widget=widget.HiddenWidget(readonly=True), widget=widget.HiddenWidget(readonly=True),
missing=colander.drop) missing=colander.drop)
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), visible=False, title="Action") id = colander.SchemaNode(colander.Integer(), visible=False, title="Action")
group_name = colander.SchemaNode( group_name = colander.SchemaNode(
colander.String(), ) colander.String(), )
description = colander.SchemaNode(colander.String()) description = colander.SchemaNode(colander.String())
class Views(BaseView): class Views(BaseView):
def __init__(self, request): def __init__(self, request):
super(Views, self).__init__(request) super(Views, self).__init__(request)
self.list_schema = ListSchema self.list_schema = ListSchema
self.list_route = "group" self.list_route = "group"
self.table = Group self.table = Group
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.list_buttons = self.list_buttons + self.list_report + (btn_upload,) self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__) path = os.path.dirname(__file__)
path = os.path.dirname(path) path = os.path.dirname(path)
self.report_file = os.path.join(path, 'reports', 'Group.jrxml') self.report_file = os.path.join(path, 'reports', 'Group.jrxml')
# Mendapatkan path gambar # Mendapatkan path gambar
def get_module_path(self, module_name): def get_module_path(self, module_name):
a = AssetResolver(module_name) a = AssetResolver(module_name)
resolver = a.resolve('') resolver = a.resolve('')
return resolver.abspath() return resolver.abspath()
def pdf_response(self, **kwargs): def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================") # print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base') logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png') logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = { parameters = {
"judul": get_params('company', "openSIPKD"), "judul": get_params('company', "openSIPKD"),
"logo": logo "alamat_lengkap": get_params('address', "Bekasi"),
} "logo": logo
print(parameters) }
filename = jasper_export(self.report_file, parameters=parameters) print(parameters)
return file_response(self.req, filename=filename[0]) 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, def get_bindings(self, row=None):
permissions_list=get_permissions_list()) return dict(group=row,
@staticmethod permissions_list=get_permissions_list())
def query_register(): @staticmethod
return DBSession.query(Group.group_name, Group.description,Group.permissions).order_by(Group.group_name) 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() def csv_response(self, **kwargs):
row = query.first() query = self.query_register()
header = row._mapping.keys() row = query.first()
rows = [list(item) for item in query.all()] header = row._mapping.keys()
filename = f"{get_random_string(16)}.csv" rows = [list(item) for item in query.all()]
value = { filename = f"{get_random_string(16)}.csv"
'header': header, value = {
'rows': rows, 'header': header,
} 'rows': rows,
return csv_response(self.req, value, filename) }
return csv_response(self.req, value, filename)
@view_config(
route_name='group', renderer='templates/table.pt', @view_config(
permission='user-view') route_name='group', renderer='templates/table.pt',
def view_list(self): permission='user-view')
return super(Views, self).view_list() def view_list(self):
return super(Views, self).view_list()
@view_config(
route_name='group-act', renderer='json', permission='user-view') @view_config(
def view_act(self): route_name='group-act', renderer='json', permission='user-view')
return super(Views, self).view_act() def view_act(self):
return super(Views, self).view_act()
def next_act(self):
request = self.req def next_act(self):
url_dict = request.matchdict request = self.req
params = self.params url_dict = request.matchdict
if url_dict['act'] == 'hon': params = self.params
term = 'term' in params and params['term'] or '' if url_dict['act'] == 'hon':
q = DBSession.query(Group.id, Group.description).filter( term = 'term' in params and params['term'] or ''
Group.description.ilike('%{}%'.format(term))). \ q = DBSession.query(Group.id, Group.description).filter(
order_by(Group.group_name) Group.description.ilike('%{}%'.format(term))). \
rows = q.all() order_by(Group.group_name)
r = [] rows = q.all()
for k in rows: r = []
d = dict(id=k[0], value=k[1]) for k in rows:
r.append(d) d = dict(id=k[0], value=k[1])
return r r.append(d)
return r
@view_config(
route_name='group-add', renderer='templates/form.pt', @view_config(
permission='user-edit') route_name='group-add', renderer='templates/form.pt',
def view_add(self): permission='user-edit')
return super(Views, self).view_add() def view_add(self):
return super(Views, self).view_add()
def save_request(self, values, row=None):
insert = not row def save_request(self, values, row=None):
vals = values.copy() insert = not row
vals.pop('permissions') vals = values.copy()
row = self.save(vals, self.req.user, row) vals.pop('permissions')
existing = group_permission_set(row) row = self.save(vals, self.req.user, row)
unused = existing - values['permissions'] existing = group_permission_set(row)
if unused: unused = existing - values['permissions']
q = DBSession.query(GroupPermission).filter_by(group_id=row.id). \ if unused:
filter(GroupPermission.perm_name.in_(unused)) q = DBSession.query(GroupPermission).filter_by(group_id=row.id). \
q.delete(synchronize_session=False) filter(GroupPermission.perm_name.in_(unused))
new = values['permissions'] - existing q.delete(synchronize_session=False)
for perm_name in new: new = values['permissions'] - existing
gp = GroupPermission() for perm_name in new:
gp.group_id = row.id gp = GroupPermission()
gp.perm_name = perm_name gp.group_id = row.id
DBSession.add(gp) gp.perm_name = perm_name
data = dict(group_name=row.group_name) DBSession.add(gp)
if insert: data = dict(group_name=row.group_name)
ts = _('group-added', default='{group_name} group has been added.', mapping=data) 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) else:
self.ses.flash(ts) ts = _('group-updated', default='${group_name} group profile updated', mapping=data)
return row self.ses.flash(ts)
return row
def get_values(self, row, istime=False):
values = super(Views, self).get_values(row, istime) def get_values(self, row, istime=False):
values['permissions'] = group_permission_set(row) values = super(Views, self).get_values(row, istime)
return values values['permissions'] = group_permission_set(row)
return values
@view_config(
route_name='group-view', renderer='templates/form.pt', @view_config(
permission='user-view') route_name='group-view', renderer='templates/form.pt',
def view_view(self): permission='user-view')
return super(Views, self).view_view() def view_view(self):
return super(Views, self).view_view()
@view_config(route_name='group-upload',
renderer='templates/form.pt', permission='user-upload') @view_config(route_name='group-upload',
def view_upload(self): renderer='templates/form.pt', permission='user-upload')
self.upload_keys = ["group_name"] def view_upload(self):
return super().view_upload(exts=('.csv', ".tsv")) self.upload_keys = ["group_name"]
return super().view_upload(exts=('.csv', ".tsv"))
@view_config(
route_name='group-edit', renderer='templates/form.pt', @view_config(
permission='user-edit') route_name='group-edit', renderer='templates/form.pt',
def view_edit(self): permission='user-edit')
return super(Views, self).view_edit() def view_edit(self):
return super(Views, self).view_edit()
#def delete_msg(self, row):
#data = dict(group_name=row.group_name) #def delete_msg(self, row):
#ts = _('group-deleted', #data = dict(group_name=row.group_name)
#default='{group_name} group has been deleted.', #ts = _('group-deleted',
#mapping=data) #default='{group_name} group has been deleted.',
#self.ses.flash(ts) #mapping=data)
#self.ses.flash(ts)
@view_config(
route_name='group-delete', renderer='templates/form.pt', @view_config(
permission='user-edit') route_name='group-delete', renderer='templates/form.pt',
def view_delete(self): permission='user-edit')
return super(Views, self).view_delete() def view_delete(self):
return super(Views, self).view_delete()
def clean_name(s):
s = s.strip() def clean_name(s):
while s.find(' ') > -1: s = s.strip()
s = s.replace(' ', ' ') while s.find(' ') > -1:
return s s = s.replace(' ', ' ')
return s
class Validator:
def __init__(self, group): class Validator:
self.group = group def __init__(self, group):
self.group = group
class NameValidator(Validator):
class NameValidator(Validator):
def __call__(self, node, value):
group_name = value def __call__(self, node, value):
def group_max(): group_name = value
raise colander.Invalid(node, _('Maksimal 128 karakter')) def group_max():
raise colander.Invalid(node, _('Maksimal 128 karakter'))
# Jika karakter melebihi 128 karakter maka, panggil fungsi
if (len(group_name) > 128): # Jika karakter melebihi 128 karakter maka, panggil fungsi
group_max() if (len(group_name) > 128):
group_max()
if self.group and self.group.group_name.lower() == group_name.lower():
return if self.group and self.group.group_name.lower() == group_name.lower():
return
q = DBSession.query(Group). \
filter(Group.group_name.ilike(group_name)) q = DBSession.query(Group). \
found = q.first() filter(Group.group_name.ilike(group_name))
if not found: found = q.first()
return if not found:
data = dict(group_name=group_name, gid=found.id) return
ts = _( data = dict(group_name=group_name, gid=found.id)
'group-name-already-used', ts = _(
default='Group name ${group_name} already used by ID ${gid}', 'group-name-already-used',
mapping=data) default='Group name ${group_name} already used by ID ${gid}',
raise colander.Invalid(node, ts) mapping=data)
raise colander.Invalid(node, ts)
@colander.deferred
def name_validator(node, kw): @colander.deferred
return NameValidator(kw['group']) def name_validator(node, kw):
return NameValidator(kw['group'])
@colander.deferred
def permissions_widget(node, kw): @colander.deferred
values = kw.get('permission_list', []) def permissions_widget(node, kw):
return widget.CheckboxChoiceWidget(values=values) values = kw.get('permission_list', [])
return widget.CheckboxChoiceWidget(values=values)
def get_permissions_list():
q = DBSession.query(Permission) def get_permissions_list():
r = [] q = DBSession.query(Permission)
for perm in q.order_by(Permission.description): r = []
row = (perm.perm_name, perm.description) for perm in q.order_by(Permission.description):
r.append(row) row = (perm.perm_name, perm.description)
return r r.append(row)
return r
def group_permission_set(group):
q = DBSession.query(GroupPermission).filter_by(group_id=group.id) def group_permission_set(group):
r = [] q = DBSession.query(GroupPermission).filter_by(group_id=group.id)
for gp in q: r = []
r.append(gp.perm_name) for gp in q:
return set(r) r.append(gp.perm_name)
return set(r)
import os import os
import logging import logging
import colander import colander
from deform import ( from deform import (
widget, Button, widget, Button,
) )
from opensipkd.base import get_id_card_folder from opensipkd.base import get_id_card_folder
from opensipkd.models import DBSession, Partner, PartnerFiles from opensipkd.models import DBSession, Partner, PartnerFiles
from opensipkd.models import ( from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa) ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.models.common import ResCompany from opensipkd.models.common import ResCompany
from . import BaseView, btn_upload from . import BaseView, btn_upload
from pyramid.path import AssetResolver from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params from . import BaseView, button_import, get_params
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import Upload, img_exts from opensipkd.tools import Upload, img_exts
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from opensipkd.tools import get_random_string from opensipkd.tools import get_random_string
from pyramid.view import ( from pyramid.view import (
view_config, view_config,
) )
from . import BaseView, btn_upload from . import BaseView, btn_upload
from .company import company_widget from .company import company_widget
from .partner_base import PartnerSchema from .partner_base import PartnerSchema
# from .. import partner_idcard_url # from .. import partner_idcard_url
from ..views import BaseView from ..views import BaseView
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
_ = TranslationStringFactory("opensipkd") _ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah partner gagal' SESS_ADD_FAILED = 'Tambah partner gagal'
SESS_EDIT_FAILED = 'Edit partner gagal' SESS_EDIT_FAILED = 'Edit partner gagal'
class AddSchema(PartnerSchema): class AddSchema(PartnerSchema):
is_vendor = colander.SchemaNode( is_vendor = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"), widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="is_vendor", oid="is_vendor",
title="Vendor") title="Vendor")
is_customer = colander.SchemaNode( is_customer = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"), widget=widget.CheckboxWidget(true_val="1", false_val="0"),
oid="is_customer", oid="is_customer",
title="Customer") title="Customer")
company_id = colander.SchemaNode( company_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=company_widget, widget=company_widget,
missing=colander.drop, missing=colander.drop,
oid="company_id", oid="company_id",
title="Company") title="Company")
def after_bind(self, schema, kwargs): def after_bind(self, schema, kwargs):
super().after_bind(schema, kwargs) super().after_bind(schema, kwargs)
request = kwargs["request"] request = kwargs["request"]
if request.user.company_id: if request.user.company_id:
self["company_id"].widget = widget.HiddenWidget() self["company_id"].widget = widget.HiddenWidget()
self["company_id"].default = request.user.company_id self["company_id"].default = request.user.company_id
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), id = colander.SchemaNode(colander.String(),
missing=colander.drop, missing=colander.drop,
widget=widget.HiddenWidget(), widget=widget.HiddenWidget(),
) )
def after_bind(self, schema, kwargs): def after_bind(self, schema, kwargs):
super().after_bind(schema, kwargs) super().after_bind(schema, kwargs)
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action")) title=_("action", default="Action"))
kode = colander.SchemaNode( kode = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=32), validator=colander.Length(max=32),
oid="kode", oid="kode",
title="Kode", title="Kode",
width="100pt") width="100pt")
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=128), validator=colander.Length(max=128),
oid="nama") oid="nama")
email = colander.SchemaNode( email = colander.SchemaNode(
colander.String(), colander.String(),
oid="email") oid="email")
idcard = colander.SchemaNode( idcard = colander.SchemaNode(
colander.String(), colander.String(),
oid="idcard", oid="idcard",
title="Identitas" title="Identitas"
) )
status = colander.SchemaNode( status = colander.SchemaNode(
colander.Boolean(), colander.Boolean(),
widget=widget.CheckboxWidget(), widget=widget.CheckboxWidget(),
oid="status") oid="status")
created = colander.SchemaNode( created = colander.SchemaNode(
colander.String()) colander.String())
def after_bind(self, schema, kw): def after_bind(self, schema, kw):
request = kw.get("request") request = kw.get("request")
self["idcard"].url = request.static_url(get_id_card_folder("/")) self["idcard"].url = request.static_url(get_id_card_folder("/"))
class ViewPartner(BaseView): class ViewPartner(BaseView):
def __init__(self, request): def __init__(self, request):
super().__init__(request) super().__init__(request)
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = 'partner' self.list_url = 'partner'
self.list_route = 'partner' self.list_route = 'partner'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.table = Partner self.table = Partner
self.list_schema = ListSchema self.list_schema = ListSchema
self.save_state = True self.save_state = True
self.list_buttons = self.list_buttons + self.list_report + (btn_upload,) self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__) path = os.path.dirname(__file__)
path = os.path.dirname(path) path = os.path.dirname(path)
self.report_file = os.path.join(path, 'reports', 'partner1.jrxml') self.report_file = os.path.join(path, 'reports', 'partner1.jrxml')
# Mendapatkan path gambar # Mendapatkan path gambar
def get_module_path(self, module_name): def get_module_path(self, module_name):
a = AssetResolver(module_name) a = AssetResolver(module_name)
resolver = a.resolve('') resolver = a.resolve('')
return resolver.abspath() return resolver.abspath()
def pdf_response(self, **kwargs): def pdf_response(self, **kwargs):
# print("PDF RESPONSE======================================") # print("PDF RESPONSE======================================")
from opensipkd.base.tools.report import jasper_export from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base') logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png') logo = os.path.join(logo, 'static', 'img', 'logo.png')
parameters = { parameters = {
"judul": get_params('company', "openSIPKD"), "judul": get_params('company', "openSIPKD"),
"logo": logo "alamat_lengkap": get_params('address', "Bekasi"),
} "logo": logo
print(parameters) }
filename = jasper_export(self.report_file, parameters=parameters) print(parameters)
return file_response(self.req, filename=filename[0]) filename = jasper_export(self.report_file, parameters=parameters)
return file_response(self.req, filename=filename[0])
@staticmethod
def query_register(): @staticmethod
return DBSession.query(Partner.is_vendor, Partner.is_customer,Partner.company_id).order_by(Partner.is_vendor) 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() def csv_response(self, **kwargs):
row = query.first() query = self.query_register()
header = row._mapping.keys() row = query.first()
rows = [list(item) for item in query.all()] header = row._mapping.keys()
filename = f"{get_random_string(16)}.csv" rows = [list(item) for item in query.all()]
value = { filename = f"{get_random_string(16)}.csv"
'header': header, value = {
'rows': rows, 'header': header,
} 'rows': rows,
return csv_response(self.req, value, filename) }
return csv_response(self.req, value, filename)
########
# List # ########
######## # List #
@view_config(route_name='partner', renderer='templates/table.pt', ########
permission='user-view') @view_config(route_name='partner', renderer='templates/table.pt',
def view_list(self): permission='user-view')
new_buttons = {"kta": def view_list(self):
{"obj": "kta", new_buttons = {"kta":
"js": """if (m{tableid}ID!=null) {"obj": "kta",
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/kta?{params}'; "js": """if (m{tableid}ID!=null)
else displayEmptyID(); window.location=o{tableid}Uri+'/'+m{tableid}ID+'/kta?{params}';
""" else displayEmptyID();
}, """
"ktp": },
{"obj": Button("ktp", title=_('KTP'), css_class="btn-danger"), "ktp":
"js": """if (m{tableid}ID!=null) {"obj": Button("ktp", title=_('KTP'), css_class="btn-danger"),
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/ktp?{params}'; "js": """if (m{tableid}ID!=null)
else displayEmptyID(); window.location=o{tableid}Uri+'/'+m{tableid}ID+'/ktp?{params}';
""" else displayEmptyID();
} """
} }
return super().view_list(new_buttons=new_buttons) }
return super().view_list(new_buttons=new_buttons)
@view_config(route_name='partner-act', renderer='json',
permission='user-view') @view_config(route_name='partner-act', renderer='json',
def view_act(self): permission='user-view')
return super().view_act() def view_act(self):
return super().view_act()
def next_act(self):
request = self.req def next_act(self):
params = request.params request = self.req
url_dict = request.matchdict params = request.params
if url_dict['act'] == 'hok': url_dict = request.matchdict
term = 'term' in params and params['term'] or '' if url_dict['act'] == 'hok':
prefix = 'prefix' in params and params['prefix'] or '' term = 'term' in params and params['term'] or ''
q = DBSession.query(Partner.id, Partner.kode.label('value'), prefix = 'prefix' in params and params['prefix'] or ''
Partner.kode, Partner.nama). \ q = DBSession.query(Partner.id, Partner.kode.label('value'),
filter(Partner.nama.ilike('%%%s%%' % term)). \ Partner.kode, Partner.nama). \
filter(Partner.is_vendor == 1). \ filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama) filter(Partner.is_vendor == 1). \
keys = q.first().keys() order_by(Partner.nama)
r = [] keys = q.first().keys()
for k in q.all(): r = []
d = dict(zip(keys, k)) for k in q.all():
r.append(d) d = dict(zip(keys, k))
return r r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or '' elif url_dict['act'] == 'hon':
prefix = 'prefix' in params and params['prefix'] or '' term = 'term' in params and params['term'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'), prefix = 'prefix' in params and params['prefix'] or ''
Partner.kode, Partner.nama). \ q = DBSession.query(Partner.id, Partner.nama.label('value'),
filter(Partner.nama.ilike('%%%s%%' % term)). \ Partner.kode, Partner.nama). \
order_by(Partner.nama) filter(Partner.nama.ilike('%%%s%%' % term)). \
row = q.first() order_by(Partner.nama)
if not row: row = q.first()
return [] if not row:
return []
keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()] keys = row.keys()
return r 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 '' elif url_dict['act'] == 'vendor': # vendor only
prefix = 'prefix' in params and params['prefix'] or '' term = 'term' in params and params['term'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'), prefix = 'prefix' in params and params['prefix'] or ''
Partner.kode, Partner.nama). \ q = DBSession.query(Partner.id, Partner.nama.label('value'),
filter(Partner.nama.ilike('%%%s%%' % term)). \ Partner.kode, Partner.nama). \
filter(Partner.is_vendor == 1). \ filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama) filter(Partner.is_vendor == 1). \
keys = q.first().keys() order_by(Partner.nama)
r = [] keys = q.first().keys()
for k in q.all(): r = []
d = dict(zip(keys, k)) for k in q.all():
r.append(d) d = dict(zip(keys, k))
return r r.append(d)
return r
elif url_dict['act'] == 'customer': # customer only
term = 'term' in params and params['term'] or '' elif url_dict['act'] == 'customer': # customer only
prefix = 'prefix' in params and params['prefix'] or '' term = 'term' in params and params['term'] or ''
q = DBSession.query(Partner.id, Partner.nama.label('value'), prefix = 'prefix' in params and params['prefix'] or ''
Partner.kode, Partner.nama). \ q = DBSession.query(Partner.id, Partner.nama.label('value'),
filter(Partner.nama.ilike('%%%s%%' % term)). \ Partner.kode, Partner.nama). \
filter(Partner.is_customer == 1). \ filter(Partner.nama.ilike('%%%s%%' % term)). \
order_by(Partner.nama) filter(Partner.is_customer == 1). \
keys = q.first().keys() order_by(Partner.nama)
r = [] keys = q.first().keys()
for k in q.all(): r = []
d = dict(zip(keys, k)) for k in q.all():
r.append(d) d = dict(zip(keys, k))
return r r.append(d)
return r
@view_config(route_name='partner-add', renderer='templates/form.pt',
permission='user-edit') @view_config(route_name='partner-add', renderer='templates/form.pt',
def view_add(self): permission='user-edit')
return super().view_add() def view_add(self):
return super().view_add()
@view_config(route_name='partner-edit', renderer='templates/form.pt',
permission='user-edit') @view_config(route_name='partner-edit', renderer='templates/form.pt',
def view_edt(self): permission='user-edit')
return super().view_edit() def view_edt(self):
return super().view_edit()
@view_config(route_name='partner-view', renderer='templates/form.pt',
permission='user-edit') @view_config(route_name='partner-view', renderer='templates/form.pt',
def view_view(self): permission='user-edit')
return super().view_view() def view_view(self):
return super().view_view()
@view_config(route_name='partner-upload',
renderer='templates/upload.pt', permission='user-upload') @view_config(route_name='partner-upload',
def view_upload(self): renderer='templates/upload.pt', permission='user-upload')
self.upload_keys = ["kode"] def view_upload(self):
return super(ViewPartner,self).view_upload(exts=('.csv', ".tsv")) 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') @view_config(route_name='partner-delete', renderer='templates/form.pt',
def view_delete(self): permission='user-edit')
return super().view_delete() def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode(): def form_validator(self, form, value):
raise colander.Invalid(form, def err_kode():
'Kode %s sudah digunakan oleh %s' % ( raise colander.Invalid(form,
value['kode'], found.nama)) 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id'] if 'id' in form.request.matchdict:
q = DBSession.query(Partner).filter_by(id=uid) uid = form.request.matchdict['id']
row = q.first() q = DBSession.query(Partner).filter_by(id=uid)
else: row = q.first()
row = None else:
row = None
q = Partner.query_kode(value['kode'])
found = q.first() q = Partner.query_kode(value['kode'])
if row: found = q.first()
if found and found.id != row.id: if row:
err_kode() if found and found.id != row.id:
elif found: err_kode()
err_kode() elif found:
if "idcard" in value and value["idcard"]: err_kode()
idcard = value["idcard"] if "idcard" in value and value["idcard"]:
if "fp" in idcard and idcard["fp"] and idcard["fp"] != b'': idcard = value["idcard"]
path = get_id_card_folder() if "fp" in idcard and idcard["fp"] and idcard["fp"] != b'':
upload = Upload(path) path = get_id_card_folder()
value["idcard"] = upload.save_fp(idcard) upload = Upload(path)
value["idcard"] = upload.save_fp(idcard)
else:
value.pop("idcard") else:
value.pop("idcard")
value['is_vendor'] = 'is_vendor' in value and \
value['is_vendor'] and 1 or 0 value['is_vendor'] = 'is_vendor' in value and \
value['is_customer'] = 'is_customer' in value and \ value['is_vendor'] and 1 or 0
value['is_customer'] and 1 or 0 value['is_customer'] = 'is_customer' in value and \
value["status"] = 'status' in value and value['status'] and 1 or 0 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) def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list() result = super().get_bindings(row)
dati2_list = row and row.provinsi_id and ResDati2.get_list( provinsi_list = ResProvinsi.get_list()
row.provinsi_id) or [] dati2_list = row and row.provinsi_id and ResDati2.get_list(
kecamatan_list = row and row.dati2_id and ResKecamatan.get_list( row.provinsi_id) or []
row.dati2_id) or [] kecamatan_list = row and row.dati2_id and ResKecamatan.get_list(
desa_list = row and row.kecamatan_id and ResDesa.get_list( row.dati2_id) or []
row.kecamatan_id) or [] desa_list = row and row.kecamatan_id and ResDesa.get_list(
result.update(dict( row.kecamatan_id) or []
provinsi_list=provinsi_list, result.update(dict(
dati2_list=dati2_list, provinsi_list=provinsi_list,
kecamatan_list=kecamatan_list, dati2_list=dati2_list,
desa_list=desa_list, kecamatan_list=kecamatan_list,
company_list=ResCompany.get_list() desa_list=desa_list,
)) company_list=ResCompany.get_list()
))
return result
return result
def save_request(self, values, row=None):
# if "idcard" in values and values["idcard"]: def save_request(self, values, row=None):
# if str(self.req.POST['upload']) != "": # if "idcard" in values and values["idcard"]:
# folder = self.get_params("idcard_folder", '/tmp/idcard') # if str(self.req.POST['upload']) != "":
# upload = Upload(folder) # folder = self.get_params("idcard_folder", '/tmp/idcard')
# file_name = upload.save(self.req, 'upload', img_exts) # upload = Upload(folder)
# values["idcard"] = file_name # file_name = upload.save(self.req, 'upload', img_exts)
# else: # values["idcard"] = file_name
# del values["idcard"] # else:
# del values["idcard"]
row = super().save_request(values, row)
return row row = super().save_request(values, row)
return row
def get_values(self, row, istime=False):
d = super().get_values(row, istime) def get_values(self, row, istime=False):
if "idcard" in d and d["idcard"]: d = super().get_values(row, istime)
filename = d["idcard"] if "idcard" in d and d["idcard"]:
url = self.req.static_url(get_id_card_folder("/")) filename = d["idcard"]
preview_url = "/".join([url, filename]) url = self.req.static_url(get_id_card_folder("/"))
log.info(preview_url) preview_url = "/".join([url, filename])
d["idcard"] = {"uid": filename.split(".")[0], log.info(preview_url)
"filename": filename, d["idcard"] = {"uid": filename.split(".")[0],
"preview_url": preview_url "filename": filename,
} "preview_url": preview_url
return d }
return d
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete() def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
@colander.deferred
def partner_widget(node, kw): @colander.deferred
values = kw.get('partner_list', []) def partner_widget(node, kw):
return widget.Select2Widget(values=values) values = kw.get('partner_list', [])
return widget.Select2Widget(values=values)
import os import os
import colander import colander
import logging import logging
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 . import BaseView, btn_upload
from pyramid.path import AssetResolver from pyramid.path import AssetResolver
from . import BaseView, button_import, get_params from . import BaseView, button_import, get_params
from ...models import DBSession, ResDesa, User, UserArea from ...models import DBSession, ResDesa, User, UserArea
from .desa import desa_widget, get_desa_list from .desa import desa_widget, get_desa_list
from sqlalchemy import func from sqlalchemy import func
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from opensipkd.tools import get_random_string from opensipkd.tools import get_random_string
_ = TranslationStringFactory('myapp') _ = TranslationStringFactory('myapp')
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode( id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
title="Action" title="Action"
) )
user_name = colander.SchemaNode( user_name = colander.SchemaNode(
colander.String(), colander.String(),
field=User.user_name, field=User.user_name,
title="User" title="User"
) )
desa_kd = colander.SchemaNode( desa_kd = colander.SchemaNode(
colander.String(), colander.String(),
field=ResDesa.kode) field=ResDesa.kode)
desa_name = colander.SchemaNode( desa_name = colander.SchemaNode(
colander.String(), colander.String(),
field=ResDesa.nama) field=ResDesa.nama)
@colander.deferred @colander.deferred
def desa_checkbox_widget(node, kw): def desa_checkbox_widget(node, kw):
values = kw.get('desa_list', []) values = kw.get('desa_list', [])
return widget.CheckboxChoiceWidget(values=values) # Tetap menggunakan CheckboxChoiceWidget return widget.CheckboxChoiceWidget(values=values)
def single_choice_validator(node, value): def single_choice_validator(node, value):
"""Validator untuk memastikan hanya satu opsi yang dipilih.""" """Validator untuk memastikan hanya satu opsi yang dipilih."""
if len(value) > 1: if len(value) > 1:
raise colander.Invalid(node, "Hanya boleh memilih satu Kelurahan/Desa.") raise colander.Invalid(node, "Hanya boleh memilih satu Kelurahan/Desa.")
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
user_id = colander.SchemaNode( user_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=widget.SelectWidget(values=User.get_list()), widget=widget.SelectWidget(values=User.get_list()),
oid="user_id", oid="user_id",
title="User", title="User",
) )
desa_id = colander.SchemaNode( desa_id = colander.SchemaNode(
colander.Set(), # Kembali ke colander.Set() colander.Set(),
widget=desa_checkbox_widget, widget=desa_checkbox_widget,
validator=single_choice_validator, # Tambahkan validator validator=single_choice_validator,
oid="desa_id", oid="desa_id",
title="Kelurahan/Desa", title="Kelurahan/Desa",
) )
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), id = colander.SchemaNode(
missing=colander.drop, colander.String(),
widget=widget.HiddenWidget(readonly=True)) missing=colander.drop,
widget=widget.HiddenWidget(readonly=True)
class Views(BaseView): )
def __init__(self, request): user_id = colander.SchemaNode(
super(Views, self).__init__(request) colander.Integer(),
self.list_schema = ListSchema missing=colander.drop,
self.add_schema = AddSchema widget=widget.SelectWidget(values=User.get_list(), readonly=True), # Ditampilkan, tetapi readonly
self.edit_schema = EditSchema oid="user_id",
self.list_route = 'user-area' title="User",
self.table = UserArea )
self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__) class Views(BaseView):
path = os.path.dirname(path) def __init__(self, request):
self.report_file = os.path.join(path, 'reports', 'user_area.jrxml') super(Views, self).__init__(request)
self.list_schema = ListSchema
# Mendapatkan path gambar self.add_schema = AddSchema
def get_module_path(self, module_name): self.edit_schema = EditSchema
a = AssetResolver(module_name) self.list_route = 'user-area'
resolver = a.resolve('') self.table = UserArea
return resolver.abspath() self.list_buttons = self.list_buttons + self.list_report + (btn_upload,)
path = os.path.dirname(__file__)
def pdf_response(self, **kwargs): path = os.path.dirname(path)
from opensipkd.base.tools.report import jasper_export self.report_file = os.path.join(path, 'reports', 'user_area.jrxml')
logo = self.get_module_path('opensipkd.base')
logo = os.path.join(logo, 'static', 'img', 'logo.png') def get_module_path(self, module_name):
parameters = { a = AssetResolver(module_name)
"judul": get_params('company', "openSIPKD"), resolver = a.resolve('')
"logo": logo return resolver.abspath()
}
filename = jasper_export(self.report_file, parameters=parameters) def pdf_response(self, **kwargs):
return file_response(self.req, filename=filename[0]) from opensipkd.base.tools.report import jasper_export
logo = self.get_module_path('opensipkd.base')
@staticmethod logo = os.path.join(logo, 'static', 'img', 'logo.png')
def query_register(): parameters = {
return DBSession.query(UserArea.user_id, UserArea.desa_id).order_by(UserArea.user_id) "judul": get_params('company', "openSIPKD"),
"alamat_lengkap": get_params('address', "Bekasi"),
def csv_response(self, **kwargs): "logo": logo
query = self.query_register() # Panggil sebagai metode instance }
row = query.first() filename = jasper_export(self.report_file, parameters=parameters)
header = row._mapping.keys() if row else ['user_id', 'desa_id'] # Tambahkan fallback jika query kosong return file_response(self.req, filename=filename[0])
rows = [list(item) for item in query.all()]
filename = f"{get_random_string(16)}.csv" @staticmethod
value = { def query_register():
'header': header, return DBSession.query(UserArea.user_id, UserArea.desa_id).order_by(UserArea.user_id)
'rows': rows,
} def csv_response(self, **kwargs):
return csv_response(self.req, value, filename) query = self.query_register()
row = query.first()
def list_join(self, query, **kwargs): header = row._mapping.keys() if row else ['user_id', 'desa_id']
return query.outerjoin(ResDesa, ResDesa.id == self.table.desa_id) \ rows = [list(item) for item in query.all()]
.outerjoin(User, User.id == self.table.user_id) filename = f"{get_random_string(16)}.csv"
value = {
@view_config(route_name='user-area', renderer='templates/table.pt', 'header': header,
permission='user-view') 'rows': rows,
def view_list(self, **kwargs): }
return super(Views, self).view_list(**kwargs) return csv_response(self.req, value, filename)
@view_config(route_name='user-area-act', renderer='json', def list_join(self, query, **kwargs):
permission='user-view') return query.outerjoin(ResDesa, ResDesa.id == self.table.desa_id) \
def view_act(self): .outerjoin(User, User.id == self.table.user_id)
return super(Views, self).view_act()
@view_config(route_name='user-area', renderer='templates/table.pt',
def get_bindings(self, row=None): permission='user-view')
return { def view_list(self, **kwargs):
"desa_list": get_desa_list() return super(Views, self).view_list(**kwargs)
}
@view_config(route_name='user-area-act', renderer='json',
@view_config(route_name='user-area-add', renderer='templates/form.pt', permission='user-view')
permission='user-edit') def view_act(self):
def view_add(self): return super(Views, self).view_act()
return super(Views, self).view_add()
def get_bindings(self, row=None):
@view_config(route_name='user-area-view', renderer='templates/form.pt', return {
permission='user-view') "desa_list": get_desa_list()
def view_view(self): }
return super(Views, self).view_view()
@view_config(route_name='user-area-add', renderer='templates/form.pt',
@view_config(route_name='user-area-delete', renderer='templates/form.pt', permission='user-edit')
permission='user-edit') def view_add(self):
def view_delete(self): return super(Views, self).view_add()
return super(Views, self).view_delete()
@view_config(route_name='user-area-view', renderer='templates/form.pt',
@view_config(route_name='user-area-upload', permission='user-view')
renderer='templates/upload.pt', permission='user-upload') def view_view(self):
def view_upload(self): return super(Views, self).view_view()
self.upload_keys = ["user_id"]
return super(Views, self).view_upload(exts=('.csv', ".tsv")) @view_config(route_name='user-area-delete', renderer='templates/form.pt',
permission='user-edit')
@view_config(route_name='user-area-edit', renderer='templates/form.pt', def view_delete(self):
permission='user-edit') return super(Views, self).view_delete()
def view_edit(self):
return super(Views, self).view_edit() @view_config(route_name='user-area-upload',
renderer='templates/upload.pt', permission='user-upload')
def save_request(self, values, row=None): def view_upload(self):
user_id = values.get("user_id") self.upload_keys = ["user_id"]
if not user_id: return super(Views, self).view_upload(exts=('.csv', ".tsv"))
return None
desa_ids = values.get("desa_id") @view_config(route_name='user-area-edit', renderer='templates/form.pt',
if desa_ids: permission='user-edit')
desa_id = next(iter(desa_ids)) if desa_ids else None def view_edit(self):
if desa_id is not None: return super(Views, self).view_edit()
existing_desa = self.get_existing_desa(user_id)
desa_id_str = str(desa_id) def save_request(self, values, row=None):
if desa_id_str not in existing_desa: if row: # Mode Edit: Perbarui entri yang ada
DBSession.query(UserArea).filter_by(user_id=user_id).delete(synchronize_session=False) desa_ids = values.get("desa_id")
new_row = UserArea( if desa_ids:
user_id=user_id, desa_id = next(iter(desa_ids)) if desa_ids else None
desa_id=int(desa_id) if desa_id is not None:
) row.desa_id = int(desa_id) # Perbarui desa_id pada row yang ada
DBSession.add(new_row) # user_id tidak diubah, tetap dari row.user_id
DBSession.flush() DBSession.add(row)
return row DBSession.flush()
return row
def get_existing_desa(self, user_id): return None
q = DBSession.query(UserArea).filter_by(user_id=user_id) else: # Mode Tambah: Buat entri baru tanpa menghapus entri lama
r = [] user_id = values.get("user_id")
for ug in q: if not user_id:
r.append(str(ug.desa_id)) return None
return set(r) desa_ids = values.get("desa_id")
if desa_ids:
def get_values(self, row, istime=False): desa_id = next(iter(desa_ids)) if desa_ids else None
d = super(Views, self).get_values(row, istime) if desa_id is not None:
existing_desa = self.get_existing_desa(row.user_id) new_row = UserArea(
d["desa_id"] = {next(iter(existing_desa))} if existing_desa else set() 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 return d
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!