memleketmeselesi/mm_data/seed_admin_units.py
Mukan Erkin 2498e75594 init: memleketmeselesi platform — API + migrations
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.
2026-04-27 23:06:59 +03:00

147 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()