Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
aa.gusti
/
opensipkd-base
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit c67ff093
authored
Mar 25, 2025
by
iqbal
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Penambahan alamat pada jasper dan perbaikan menu user area
1 parent
8373a07c
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1395 additions
and
1300 deletions
opensipkd/base/reports/Group.jrxml
opensipkd/base/reports/desa.jrxml
opensipkd/base/reports/eselon.jrxml
opensipkd/base/reports/kabupaten.jrxml
opensipkd/base/reports/partner1.jrxml
opensipkd/base/reports/user_area.jrxml
opensipkd/base/views/dati2.py
opensipkd/base/views/desa.py
opensipkd/base/views/eselon.py
opensipkd/base/views/groups.py
opensipkd/base/views/partner.py
opensipkd/base/views/user_area.py
opensipkd/base/reports/Group.jrxml
View file @
c67ff09
...
...
@@ -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=
"10
0
"
splitType=
"Stretch"
>
<band
height=
"10
1
"
splitType=
"Stretch"
>
<staticText>
<reportElement
x=
"14
3"
y=
"49
"
width=
"269"
height=
"30"
uuid=
"5b7637d7-75f9-4fcb-83f0-3199ee657145"
/>
<reportElement
x=
"14
0"
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>
...
...
opensipkd/base/reports/desa.jrxml
View file @
c67ff09
...
...
@@ -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=
"9
5
"
splitType=
"Stretch"
>
<band
height=
"9
6
"
splitType=
"Stretch"
>
<staticText>
<reportElement
x=
"1
43"
y=
"30"
width=
"26
9"
height=
"30"
uuid=
"458b62a6-e929-4690-a8a0-c260967c1d92"
/>
<reportElement
x=
"1
10"
y=
"30"
width=
"31
9"
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>
...
...
opensipkd/base/reports/eselon.jrxml
View file @
c67ff09
...
...
@@ -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>
...
...
opensipkd/base/reports/kabupaten.jrxml
View file @
c67ff09
...
...
@@ -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>
...
...
opensipkd/base/reports/partner1.jrxml
View file @
c67ff09
...
...
@@ -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=
"2
0"
uuid=
"404cb1e0-9e9b-4d9e-9f12-7ae4ee60561f"
/>
<textElement>
<reportElement
x=
"
0"
y=
"30"
width=
"552"
height=
"3
0"
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>
...
...
opensipkd/base/reports/user_area.jrxml
View file @
c67ff09
...
...
@@ -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>
...
...
opensipkd/base/views/dati2.py
View file @
c67ff09
...
...
@@ -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
)
...
...
opensipkd/base/views/desa.py
View file @
c67ff09
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"
))
opensipkd/base/views/eselon.py
View file @
c67ff09
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
opensipkd/base/views/groups.py
View file @
c67ff09
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
)
opensipkd/base/views/partner.py
View file @
c67ff09
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
)
opensipkd/base/views/user_area.py
View file @
c67ff09
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
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment