first commit
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
from flask import Flask
|
||||
from app.routes import main
|
||||
import os
|
||||
|
||||
def create_app():
|
||||
base_dir = os.path.abspath(os.path.dirname(__file__))
|
||||
template_path = os.path.join(base_dir, '..', 'templates')
|
||||
static_path = os.path.join(base_dir, '..','static')
|
||||
app = Flask(__name__, template_folder=template_path, static_folder=static_path)
|
||||
app.register_blueprint(main)
|
||||
return app
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,111 @@
|
||||
import json
|
||||
from app.apiController import apiController
|
||||
|
||||
|
||||
def swap_latlon(coords):
|
||||
# return [[lon, lat] for lat, lon in coords]
|
||||
# print(coords)
|
||||
# return [
|
||||
# [ [lon, lat] for lat, lon in ring ]
|
||||
# for ring in coords
|
||||
# ]
|
||||
return coords
|
||||
return [
|
||||
[ # Polygon
|
||||
[ # Ring
|
||||
[lon, lat] for lat, lon in ring
|
||||
] for ring in polygon
|
||||
] for polygon in coords
|
||||
]
|
||||
|
||||
|
||||
#MAP DATA
|
||||
#=========================================================
|
||||
def fetch_geojson(conn, level, parent_code=None):
|
||||
# cur = conn.cursor()
|
||||
# cur.execute(f"SELECT id, kode, nama, lat, lng, path, iso FROM {table_name} WHERE id = 1 LIMIT 1")
|
||||
cur = conn.cursor()
|
||||
if level == 'provinsi':
|
||||
old_sql = """
|
||||
SELECT id, kode, nama, lat, lng,
|
||||
CONCAT(
|
||||
REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))),
|
||||
path,
|
||||
REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', ''))))
|
||||
) AS path
|
||||
FROM wil_provinsi
|
||||
"""
|
||||
cur.execute(old_sql)
|
||||
elif level == 'kabupaten':
|
||||
cur.execute(""" SELECT id, kode, nama,lat,lng,
|
||||
CONCAT(
|
||||
REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))),
|
||||
path,
|
||||
REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', ''))))
|
||||
) AS path
|
||||
FROM wil_kabupatenkota WHERE provinsi_id = %s""", (parent_code,))
|
||||
elif level == 'kecamatan':
|
||||
cur.execute("""
|
||||
SELECT id, kode, nama,lat,lng,
|
||||
CONCAT(
|
||||
REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))),
|
||||
path,
|
||||
REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', ''))))
|
||||
) AS path
|
||||
FROM wil_kecamatan WHERE kabupatenkota_id = %s""", (parent_code,))
|
||||
elif level == 'desa':
|
||||
cur.execute("""
|
||||
SELECT id, kode, nama, null as lat, null as lng,
|
||||
CONCAT(
|
||||
REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))),
|
||||
path,
|
||||
REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', ''))))
|
||||
) AS path
|
||||
FROM wil_desa WHERE kecamatan_id = %s""", (parent_code,))
|
||||
else:
|
||||
return {"type": "FeatureCollection", "features": []}
|
||||
features = []
|
||||
|
||||
for row in cur.fetchall():
|
||||
path = row[5]
|
||||
# path = swap_latlon(path)
|
||||
# if not path:
|
||||
# continue
|
||||
# geometry = {
|
||||
# "type": "Polygon",
|
||||
# "coordinates": json.loads(path)
|
||||
# }
|
||||
|
||||
#Multi poligons
|
||||
try:
|
||||
parsed_path = json.loads(path)
|
||||
corrected_path = swap_latlon(parsed_path)
|
||||
except Exception as e:
|
||||
print(f"Error parsing path for row {row[0]}: {e}")
|
||||
continue
|
||||
|
||||
if not corrected_path:
|
||||
continue
|
||||
|
||||
geometry = {
|
||||
"type": "MultiPolygon", # karena bentuk datamu seperti itu
|
||||
"coordinates": corrected_path
|
||||
}
|
||||
|
||||
feature = {
|
||||
"type": "Feature",
|
||||
"geometry": geometry,
|
||||
"properties": {
|
||||
"id": row[0],
|
||||
"kode": row[1],
|
||||
"nama": row[2],
|
||||
"lat": row[3],
|
||||
"lng": row[4]
|
||||
}
|
||||
}
|
||||
features.append(feature)
|
||||
|
||||
return {
|
||||
"type": "FeatureCollection",
|
||||
"features": features
|
||||
}
|
||||
+285
@@ -0,0 +1,285 @@
|
||||
from flask import Blueprint, jsonify, render_template
|
||||
import psycopg2
|
||||
from app import mapController
|
||||
from app.apiController import apiController
|
||||
from app.utils import toRupiah
|
||||
import mysql.connector
|
||||
from contextlib import contextmanager
|
||||
|
||||
main = Blueprint('main', __name__)
|
||||
|
||||
# conn = mysql.connector.connect(
|
||||
# host="192.168.91.102",
|
||||
# database="dbwarehouse",
|
||||
# user="dwhadmin",
|
||||
# password="K3m3nd3s4@2025"
|
||||
# )
|
||||
|
||||
@contextmanager
|
||||
def get_connection():
|
||||
conn = None
|
||||
try:
|
||||
conn = mysql.connector.connect(
|
||||
# 192.168.91.102
|
||||
host="localhost",
|
||||
database="dbwarehouse",
|
||||
# dwhadmin
|
||||
user="root",
|
||||
# K3m3nd3s4@2025
|
||||
password="asalada123"
|
||||
)
|
||||
yield conn
|
||||
finally:
|
||||
if conn is not None and conn.is_connected():
|
||||
conn.close()
|
||||
|
||||
#========================================================
|
||||
# MAIN ROUTE
|
||||
#========================================================
|
||||
@main.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
@main.route("/geojson/provinsi")
|
||||
def get_provinsi():
|
||||
with get_connection() as conn:
|
||||
data = mapController.fetch_geojson(conn,'provinsi')
|
||||
return jsonify(data)
|
||||
|
||||
@main.route("/geojson/kabupaten/<kode_provinsi>")
|
||||
def get_kabupaten(kode_provinsi):
|
||||
with get_connection() as conn:
|
||||
print("PRovinsi kode: ", kode_provinsi)
|
||||
data = mapController.fetch_geojson(conn,'kabupaten', kode_provinsi)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route("/geojson/kecamatan/<kode_kabupaten>")
|
||||
def get_kecamatan(kode_kabupaten):
|
||||
with get_connection() as conn:
|
||||
data = mapController.fetch_geojson(conn,'kecamatan', kode_kabupaten)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route("/geojson/desa/<kode_kecamatan>")
|
||||
def get_desa(kode_kecamatan):
|
||||
with get_connection() as conn:
|
||||
data = mapController.fetch_geojson(conn,'desa', kode_kecamatan)
|
||||
return jsonify(data)
|
||||
|
||||
|
||||
|
||||
|
||||
#=========================================================
|
||||
# API DATA
|
||||
#=============================================================
|
||||
@main.route('/api/desa/total-dana-desa')
|
||||
def get_total_dd():
|
||||
with get_connection() as conn:
|
||||
datas = apiController.getTotalPersentaseSerapan(conn)
|
||||
data = datas['jumlah_per_m']
|
||||
return jsonify(data)
|
||||
|
||||
@main.route("/api/desa/total-serapan-dana")
|
||||
def get_total_Serapan():
|
||||
with get_connection() as conn:
|
||||
data = apiController.getTotalPersentaseSerapan(conn)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/geojson/<level>')
|
||||
def get_geojson(level):
|
||||
print(level)
|
||||
allowed = ['wil_provinsi', 'wil_kabupaten_kota', 'wil_kecamatan', 'wil_kelurahan_desa']
|
||||
if level not in allowed:
|
||||
return jsonify({"error": "Invalid level"}), 400
|
||||
|
||||
geojson_data = mapController.fetch_geojson(conn,level)
|
||||
return jsonify(geojson_data)
|
||||
|
||||
|
||||
#Informasi desa per provinsi
|
||||
@main.route('/api/status-provinsi/<kode_provinsi>')
|
||||
def get_status_provinsi(kode_provinsi):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getStatusProvinsi(conn,kode_provinsi)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi desa per kabupaten/kota
|
||||
@main.route('/api/status-kabupatenkota/<kode_prov>/<kode_kabkota>')
|
||||
def get_status_kabkota(kode_prov, kode_kabkota):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getStatusKabkota(conn,kode_prov, kode_kabkota)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi desa per kecamatan
|
||||
@main.route('/api/status-kecamatan/<kode_provinsi>/<kode_kabupatenkota>/<kode_kecamatan>')
|
||||
def get_status_kecamatan(kode_provinsi, kode_kabupatenkota, kode_kecamatan):
|
||||
print(kode_provinsi, kode_kabupatenkota, kode_kecamatan)
|
||||
with get_connection() as conn:
|
||||
data = apiController.getStatusKecamatan(conn,kode_provinsi, kode_kabupatenkota, kode_kecamatan)
|
||||
data = jsonify(data)
|
||||
return data
|
||||
@main.route("/api/status-bumdes")
|
||||
def get_status_bumdes():
|
||||
with get_connection() as conn:
|
||||
data = apiController.getBumdes(conn)
|
||||
return jsonify(data[0])
|
||||
|
||||
#informasi bumdes Bersama
|
||||
@main.route("/api/status-bumdes-bersama")
|
||||
def get_status_bumdes_bersma():
|
||||
with get_connection() as conn:
|
||||
data = apiController.getBumdes(conn)
|
||||
return jsonify(data[1])
|
||||
|
||||
#informasi pendamping
|
||||
@main.route('/api/pendamping-desa')
|
||||
def get_pendamping():
|
||||
with get_connection() as conn:
|
||||
data = apiController.getPendamping(conn)
|
||||
return jsonify(data[1])
|
||||
#informasi pendamping per desa
|
||||
@main.route('/api/pendamping-per-desa')
|
||||
def get_pendamping_perdesa():
|
||||
with get_connection() as conn:
|
||||
data = apiController.getPendampingPerDesa(conn)
|
||||
return jsonify(data[0])
|
||||
|
||||
#=======================================================================
|
||||
#=======================================================================
|
||||
#informasi Koperasi
|
||||
@main.route('/api/provinsi/koperasi/<kode_prov>')
|
||||
def get_koperasi_by_provinsi(kode_prov):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getDesaDenganAtauTanpaKopmerKab(conn, kode_prov)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/provinsi/pendamping/<kode_prov>')
|
||||
def get_pendamping_per_provinsi(kode_prov):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getPendampingPerProv(conn, kode_prov)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi bumdes per provinsi
|
||||
@main.route("/api/provinsi/bumdes/<kode_provinsi>")
|
||||
def get_status_bumdes_prov(kode_provinsi):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getBumdesProv(conn,kode_provinsi)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi serapan per provinsi
|
||||
@main.route("/api/provinsi/serapan/<kode_provinsi>")
|
||||
def get_provinsi_serapan(kode_provinsi):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getTotalSerapanProv(conn,kode_provinsi)
|
||||
return jsonify(data)
|
||||
|
||||
#=======================================================================
|
||||
#=======================================================================
|
||||
#informasi Koperasi
|
||||
@main.route('/api/kabkota/koperasi/<kode_kabkota>')
|
||||
def get_koperasi_by_kabkota(kode_kabkota):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getDesaDenganAtauTanpaKopmerKab(conn, kode_kabkota)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/kabkota/pendamping/<kode_kabkota>')
|
||||
def get_pendamping_per_kabkota(kode_kabkota):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getPendampingPerKab(conn, kode_kabkota)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi bumdes
|
||||
@main.route("/api/kabkota/bumdes/<kode_kabkota>")
|
||||
def get_status_bumdes_kabkota(kode_kabkota):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getBumdesKab(conn,kode_kabkota)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi serapan
|
||||
@main.route("/api/kabkota/serapan/<kode_kabkota>")
|
||||
def get_kabkota_serapan(kode_kabkota):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getTotalSerapanKab(conn,kode_kabkota)
|
||||
return jsonify(data)
|
||||
|
||||
#=======================================================================
|
||||
#=======================================================================
|
||||
#informasi Koperasi
|
||||
@main.route('/api/kecamatan/koperasi/<kode_kecamatan>')
|
||||
def get_koperasi_by_kecamatan(kode_kecamatan):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getDesaDenganAtauTanpaKopmerKec(conn, kode_kecamatan)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/kecamatan/pendamping/<kode_kecamatan>')
|
||||
def get_pendamping_per_kecamatan(kode_kecamatan):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getPendampingPerKec(conn, kode_kecamatan)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi bumdes
|
||||
@main.route("/api/kecamatan/bumdes/<kode_kecamatan>")
|
||||
def get_status_bumdes_kecamatan(kode_kecamatan):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getBumdesKec(conn,kode_kecamatan)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi serapan
|
||||
@main.route("/api/kecamatan/serapan/<kode_kecamatan>")
|
||||
def get_kecamatan_serapan(kode_kecamatan):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getTotalSerapanKec(conn,kode_kecamatan)
|
||||
return jsonify(data)
|
||||
|
||||
#=======================================================================
|
||||
#=======================================================================
|
||||
#informasi Koperasi
|
||||
@main.route('/api/desa/status/<kode_prov>/<kode_kabkota>/<kode_kecamatan>/<kode_desa>')
|
||||
def get_status_by_desa(kode_prov, kode_kabkota, kode_kecamatan, kode_desa):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getStatusDesaByDesa(conn, kode_prov, kode_kabkota, kode_kecamatan, kode_desa)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/desa/koperasi/<kode_desa>')
|
||||
def get_koperasi_by_desa(kode_desa):
|
||||
data = apiController.getDesaDenganAtauTanpaKopmerDesa(conn, kode_desa)
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/desa/pendamping/<kode_desa>')
|
||||
def get_pendamping_per_desa(kode_desa):
|
||||
with get_connection() as conn:
|
||||
data = apiController.getPendampingPerDesa(conn, kode_desa)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi bumdes
|
||||
@main.route("/api/desa/bumdes/<kode_desa>")
|
||||
def get_status_bumdes_desa(kode_desa):
|
||||
data = apiController.getBumdesDesa(conn,kode_desa)
|
||||
return jsonify(data)
|
||||
|
||||
#informasi serapan
|
||||
@main.route("/api/desa/serapan/<kode_desa>")
|
||||
def get_pdesa_serapan(kode_desa):
|
||||
data = apiController.getTotalSerapanDesa(conn,kode_desa)
|
||||
return jsonify(data)
|
||||
|
||||
#==================
|
||||
# MASTER
|
||||
#===============
|
||||
|
||||
@main.route('/app/master/provinsi')
|
||||
def get_master_provinsi():
|
||||
with get_connection() as conn:
|
||||
data = apiController.provinsi(conn)
|
||||
return data
|
||||
|
||||
@main.route('/api/master/kabkota')
|
||||
def get_master_kabkota():
|
||||
with get_connection() as conn:
|
||||
data = apiController.kabkota
|
||||
return jsonify(data)
|
||||
|
||||
@main.route('/api/master/kecamatan')
|
||||
def get_master_kecamatan():
|
||||
with get_connection() as conn:
|
||||
data = apiController.kecamatan(conn)
|
||||
return jsonify(data)
|
||||
@@ -0,0 +1,3 @@
|
||||
from babel.numbers import format_currency
|
||||
def toRupiah(money):
|
||||
return format_currency(money, 'IDR', locale='id_ID')
|
||||
Reference in New Issue
Block a user