FastAPI + PostgreSQL 16. KYC, issue sistemi, permission/group yönetimi, session yönetimi, API client auth (kışla kapısı), officials/persons CRUD. Migration 0001–0013 dahil.
147 lines
6.1 KiB
Python
147 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Türkiye idari birim tiplerini ve büyükşehir/il belediyelerini seed eder.
|
||
"""
|
||
|
||
import os
|
||
import psycopg
|
||
from pathlib import Path
|
||
from dotenv import load_dotenv
|
||
|
||
_here = Path(__file__).parent
|
||
load_dotenv(_here.parent / ".env")
|
||
load_dotenv(_here / ".env", override=False)
|
||
|
||
DSN = os.environ["DATABASE_URL"]
|
||
|
||
UNIT_TYPES = [
|
||
("Büyükşehir Belediyesi", "buyuksehir-belediyesi", "5216 sayılı Kanun kapsamındaki büyükşehir belediyeleri"),
|
||
("İl Belediyesi", "il-belediyesi", "Büyükşehir olmayan illerin merkez belediyesi"),
|
||
("İlçe Belediyesi", "ilce-belediyesi", "İlçe sınırları içindeki belediye"),
|
||
("Belde Belediyesi", "belde-belediyesi", "Nüfusu 5000 ve üzeri belde belediyeleri"),
|
||
("Valilik", "valilik", "İl mülki idare amirliği"),
|
||
("Kaymakamlık", "kaymakamlık", "İlçe mülki idare amirliği"),
|
||
("Büyükşehir İlçe Belediyesi", "buyuksehir-ilce-belediyesi", "Büyükşehir sınırları içindeki ilçe belediyeleri"),
|
||
("Köy Muhtarlığı", "koy-muhtarligi", "Köy yönetim birimi"),
|
||
("Mahalle Muhtarlığı", "mahalle-muhtarligi", "Mahalle yönetim birimi"),
|
||
("İl Özel İdaresi", "il-ozel-idaresi", "İl genelinde hizmet veren idare"),
|
||
("Karayolları Bölge Müdürlüğü", "karayollari-bolge-mudurlugu", "Devlet ve il yolları sorumluluğu"),
|
||
("DSİ Bölge Müdürlüğü", "dsi-bolge-mudurlugu", "Su işleri bölge yönetimi"),
|
||
("Orman İşletme Müdürlüğü", "orman-isletme-mudurlugu", "Orman alanları yönetimi"),
|
||
("Milli Eğitim Müdürlüğü", "milli-egitim-mudurlugu", "İl/ilçe eğitim yönetimi"),
|
||
("Sağlık Müdürlüğü", "saglik-mudurlugu", "İl sağlık hizmetleri yönetimi"),
|
||
]
|
||
|
||
# 2014'ten itibaren büyükşehir olan 30 il
|
||
BUYUKSEHIR_ILLER = [
|
||
"Adana", "Ankara", "Antalya", "Aydın", "Balıkesir", "Bursa", "Denizli",
|
||
"Diyarbakır", "Erzurum", "Eskişehir", "Gaziantep", "Hatay", "İstanbul",
|
||
"İzmir", "Kahramanmaraş", "Kayseri", "Kocaeli", "Konya", "Malatya",
|
||
"Manisa", "Mardin", "Mersin", "Muğla", "Ordu", "Sakarya", "Samsun",
|
||
"Şanlıurfa", "Tekirdağ", "Trabzon", "Van",
|
||
]
|
||
|
||
|
||
def run():
|
||
with psycopg.connect(DSN) as conn:
|
||
# Tipler
|
||
existing_types = {
|
||
row[0] for row in conn.execute("SELECT slug FROM administrative_unit_types")
|
||
}
|
||
inserted_types = 0
|
||
for name, slug, desc in UNIT_TYPES:
|
||
if slug not in existing_types:
|
||
conn.execute(
|
||
"INSERT INTO administrative_unit_types (name, slug, description) VALUES (%s, %s, %s)",
|
||
(name, slug, desc)
|
||
)
|
||
inserted_types += 1
|
||
|
||
conn.commit()
|
||
print(f"Birim tipleri: {inserted_types} yeni eklendi.")
|
||
|
||
# Tip ID'lerini al
|
||
types = {
|
||
row[1]: row[0]
|
||
for row in conn.execute("SELECT id, slug FROM administrative_unit_types")
|
||
}
|
||
|
||
# Büyükşehir ve il belediyeleri
|
||
existing_units = {
|
||
row[0] for row in conn.execute("SELECT name FROM administrative_units")
|
||
}
|
||
|
||
# Tüm illeri çek
|
||
iller = {
|
||
row[0]: row[1]
|
||
for row in conn.execute(
|
||
"SELECT name, id FROM locations WHERE type = 'il' ORDER BY name"
|
||
)
|
||
}
|
||
|
||
inserted_units = 0
|
||
for il_name, loc_id in iller.items():
|
||
is_bs = il_name in BUYUKSEHIR_ILLER
|
||
|
||
if is_bs:
|
||
unit_name = f"{il_name} Büyükşehir Belediyesi"
|
||
type_id = types["buyuksehir-belediyesi"]
|
||
tarih = "2014-03-30"
|
||
else:
|
||
unit_name = f"{il_name} İl Belediyesi"
|
||
type_id = types["il-belediyesi"]
|
||
tarih = "1984-01-01"
|
||
|
||
if unit_name not in existing_units:
|
||
unit_id = conn.execute(
|
||
"INSERT INTO administrative_units (type_id, name, established_at) "
|
||
"VALUES (%s, %s, %s) RETURNING id",
|
||
(type_id, unit_name, tarih)
|
||
).fetchone()[0]
|
||
|
||
# İle bağla
|
||
conn.execute(
|
||
"INSERT INTO location_administrative_units (location_id, unit_id, valid_from) "
|
||
"VALUES (%s, %s, %s)",
|
||
(loc_id, unit_id, tarih)
|
||
)
|
||
|
||
# Büyükşehirde tüm ilçeleri de bağla
|
||
if is_bs:
|
||
ilceler = conn.execute(
|
||
"SELECT id FROM locations WHERE parent_id = %s AND type = 'ilce'",
|
||
(loc_id,)
|
||
).fetchall()
|
||
for (ilce_id,) in ilceler:
|
||
conn.execute(
|
||
"INSERT INTO location_administrative_units (location_id, unit_id, valid_from) "
|
||
"VALUES (%s, %s, %s)",
|
||
(ilce_id, unit_id, tarih)
|
||
)
|
||
|
||
inserted_units += 1
|
||
|
||
# Valilik — her il için
|
||
valilik_name = f"{il_name} Valiliği"
|
||
if valilik_name not in existing_units:
|
||
v_id = conn.execute(
|
||
"INSERT INTO administrative_units (type_id, name, established_at) "
|
||
"VALUES (%s, %s, %s) RETURNING id",
|
||
(types["valilik"], valilik_name, "1923-10-29")
|
||
).fetchone()[0]
|
||
conn.execute(
|
||
"INSERT INTO location_administrative_units (location_id, unit_id, valid_from) "
|
||
"VALUES (%s, %s, %s)",
|
||
(loc_id, v_id, "1923-10-29")
|
||
)
|
||
inserted_units += 1
|
||
|
||
conn.commit()
|
||
print(f"İdari birimler: {inserted_units} yeni eklendi.")
|
||
|
||
total = conn.execute("SELECT COUNT(*) FROM administrative_units").fetchone()[0]
|
||
print(f"Toplam idari birim: {total}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
run()
|