fs-lawrisk/tools/bind_city_permits_v2.py

144 lines
5.5 KiB
Python

import os
import sys
import uuid
import logging
import pg8000.native as pg
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Add project root to path
sys.path.append(os.getcwd())
from lawrisk.utils.env_loader import load_env
load_env()
def _lic_pg_conn(autocommit: bool = False) -> pg.Connection:
host = os.getenv("LIC_PG_HOST", "8.138.196.105") # Updated default to match known external IP
port = int(os.getenv("LIC_PG_PORT", os.getenv("PG_PORT", "5432")))
user = os.getenv("LIC_PG_USER", os.getenv("PG_USER", "postgres"))
password = os.getenv("LIC_PG_PASSWORD", "")
database = os.getenv("LIC_PG_DATABASE", "licensing_risks")
logger.info(f"Connecting to {host}:{port}/{database} as {user}")
try:
conn = pg.Connection(user=user, host=host, port=port, password=password, database=database)
conn.autocommit = autocommit
return conn
except Exception as e:
logger.error(f"Connection failed: {e}")
raise
def main():
try:
conn = _lic_pg_conn()
logger.info("Connected to database successfully.")
# 1. Get '市级' Region ID
region_id_city = None
for row in conn.run("SELECT id, name FROM regions WHERE name LIKE '市级%'"):
region_id_city = row[0]
logger.info(f"Found City Region: {row[1]} ({row[0]})")
break
if not region_id_city:
# Fallback if specific name differs
for row in conn.run("SELECT id, name FROM regions WHERE name = '市级'"):
region_id_city = row[0]
break
if not region_id_city:
logger.error("Could not find '市级' region. Exiting.")
return
# 2. Get/Create Admin Department
admin_dept_name = "系统管理部"
admin_dept_code = "SYSADMIN"
result = conn.run("SELECT id FROM service_departments WHERE code = :code", code=admin_dept_code)
if result:
admin_dept_id = result[0][0]
logger.info(f"Found existing Admin Department: {admin_dept_id}")
# Ensure it is bound to City Region
conn.run("UPDATE service_departments SET region_id = :rid WHERE id = :id", rid=region_id_city, id=admin_dept_id)
else:
admin_dept_id = str(uuid.uuid4())
logger.info(f"Creating new Admin Department: {admin_dept_id}")
conn.run("""
INSERT INTO service_departments (id, name, code, region_id, description, grade, unit_level)
VALUES (:id, :name, :code, :rid, 'System Administrator Department', 100, 'municipal')
""", id=admin_dept_id, name=admin_dept_name, code=admin_dept_code, rid=region_id_city)
# 3. Assign 'admin' user to this department
conn.run("""
UPDATE auth_users
SET service_department_id = :dept_id,
role = 'admin',
grade = 100
WHERE username = 'admin'
""", dept_id=admin_dept_id)
logger.info(f"Assigned 'admin' user to department {admin_dept_id}")
# 4. Bind City-level Permis to this Department
# Find permits in the city region
permits = conn.run("""
SELECT p.id, p.name
FROM region_permit_details rpd
JOIN permits p ON p.id = rpd.permit_id
WHERE rpd.region_id = :rid
""", rid=region_id_city)
permit_ids = [row[0] for row in permits]
logger.info(f"Found {len(permit_ids)} permits in '市级' region.")
if not permit_ids:
logger.warning("No permits found to bind!")
return
# Upsert permit_sources
# We want to ensure specific records exist for these permits
updated_count = 0
inserted_count = 0
for pid in permit_ids:
# Check if source exists
existing = conn.run("""
SELECT 1 FROM permit_sources WHERE region_id = :rid AND permit_id = :pid
""", rid=region_id_city, pid=pid)
if existing:
conn.run("""
UPDATE permit_sources
SET bound_department_id = :dept_id,
uploader_department_id = COALESCE(uploader_department_id, :dept_id),
updated_at = NOW()
WHERE region_id = :rid AND permit_id = :pid
""", dept_id=admin_dept_id, rid=region_id_city, pid=pid)
updated_count += 1
else:
conn.run("""
INSERT INTO permit_sources (
region_id, permit_id, source_type, source_name,
uploader_department_id, bound_department_id, created_at, updated_at
) VALUES (
:rid, :pid, 'system_init', 'Initial Binding',
:dept_id, :dept_id, NOW(), NOW()
)
""", rid=region_id_city, pid=pid, dept_id=admin_dept_id)
inserted_count += 1
logger.info(f"Binding complete. Updated: {updated_count}, Inserted: {inserted_count}")
except Exception as e:
logger.error(f"Error: {e}")
import traceback
traceback.print_exc()
finally:
if 'conn' in locals():
conn.close()
if __name__ == "__main__":
main()