feat: complete modern urban issues management platform (ShahrNegar)
This commit is contained in:
+280
@@ -0,0 +1,280 @@
|
||||
import sqlite3
|
||||
import os
|
||||
import random
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
DB_PATH = os.path.join(os.path.dirname(__file__), "urban_issues.db")
|
||||
|
||||
def get_db_connection():
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
return conn
|
||||
|
||||
def init_db():
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Issues Table
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS issues (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
tracking_code TEXT UNIQUE NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
category TEXT NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
address TEXT NOT NULL,
|
||||
district INTEGER NOT NULL,
|
||||
priority TEXT NOT NULL, -- 'low', 'medium', 'high', 'emergency'
|
||||
status TEXT NOT NULL, -- 'pending', 'reviewing', 'in_progress', 'resolved', 'rejected'
|
||||
lat REAL NOT NULL,
|
||||
lng REAL NOT NULL,
|
||||
image_url TEXT,
|
||||
resolved_image_url TEXT,
|
||||
reporter_name TEXT,
|
||||
reporter_phone TEXT,
|
||||
official_response TEXT,
|
||||
upvotes INTEGER DEFAULT 0,
|
||||
created_at TEXT NOT NULL,
|
||||
resolved_at TEXT
|
||||
)
|
||||
""")
|
||||
|
||||
# Comments Table
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS comments (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
issue_id INTEGER NOT NULL,
|
||||
author_name TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE
|
||||
)
|
||||
""")
|
||||
|
||||
# Timeline Table
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS timeline (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
issue_id INTEGER NOT NULL,
|
||||
status TEXT NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
description TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE
|
||||
)
|
||||
""")
|
||||
|
||||
# Check if empty, then seed initial realistic data
|
||||
cursor.execute("SELECT COUNT(*) FROM issues")
|
||||
count = cursor.fetchone()[0]
|
||||
|
||||
if count == 0:
|
||||
seed_data(cursor)
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def seed_data(cursor):
|
||||
now = datetime.now()
|
||||
|
||||
sample_issues = [
|
||||
{
|
||||
"tracking_code": "SHR-78214",
|
||||
"title": "فرونشست و چاله عمیق در لاین کندرو",
|
||||
"category": "آسفالت و معابر",
|
||||
"description": "وجود چاله عمیق با قطر حدود ۱ متر پس از بارندگی اخیر که باعث خسارت به لاستیک خودروها و ترمزهای ناگهانی خطرناک میشود.",
|
||||
"address": "بزرگراه شهید همت، نرسیده به خروجی گاندی، لاین کندرو",
|
||||
"district": 3,
|
||||
"priority": "emergency",
|
||||
"status": "in_progress",
|
||||
"lat": 35.7538,
|
||||
"lng": 51.4172,
|
||||
"image_url": "https://images.unsplash.com/photo-1515162816999-a0c47dc192f7?auto=format&fit=crop&w=800&q=80",
|
||||
"resolved_image_url": None,
|
||||
"reporter_name": "علی رضایی",
|
||||
"reporter_phone": "09121112233",
|
||||
"official_response": "اکیپ آسفالتریزی ناحیه ۲ شهرداری منطقه ۳ اعزام گردیده و عملیات زیرسازی و لکهگیری در حال انجام است.",
|
||||
"upvotes": 42,
|
||||
"days_ago": 2,
|
||||
"resolved_at": None,
|
||||
"timeline": [
|
||||
("pending", "ثبت گزارش توسط شهروند", "گزارش در سامانه ۱۳۷ با موفقیت ثبت شد."),
|
||||
("reviewing", "تایید کارشناس و ارجاع به معاونت فنی و عمران", "موضوع به ناحیه ۲ ارجاع داده شد."),
|
||||
("in_progress", "اعزام اکیپ عملیاتی لکهگیری", "تیم فنی با تجهیزات در محل مستقر شد.")
|
||||
],
|
||||
"comments": [
|
||||
("سارا محمدی", "دیروز لاستیک ماشین من هم اینجا آسیب دید، ممنون که پیگیری میکنید."),
|
||||
("حسین کاظمی", "امیدوارم امشب تا قبل از ترافیک صبحگاهی تموم بشه.")
|
||||
]
|
||||
},
|
||||
{
|
||||
"tracking_code": "SHR-65109",
|
||||
"title": "خاموشی کامل پایه چراغهای روشنایی بوستان",
|
||||
"category": "روشنایی و برق",
|
||||
"description": "کل مسیر پیادهروی شرقی بوستان ملت در تاریکی مطلق است که باعث کاهش امنیت خانوادهها و ورزشکاران شبانه شده است.",
|
||||
"address": "خیابان ولیعصر، بوستان ملت، ضلع شرقی جنب دریاچه",
|
||||
"district": 3,
|
||||
"priority": "high",
|
||||
"status": "resolved",
|
||||
"lat": 35.7801,
|
||||
"lng": 51.4116,
|
||||
"image_url": "https://images.unsplash.com/photo-1509114397022-ed747cca3f65?auto=format&fit=crop&w=800&q=80",
|
||||
"resolved_image_url": "https://images.unsplash.com/photo-1517457373958-b7bdd4587205?auto=format&fit=crop&w=800&q=80",
|
||||
"reporter_name": "مریم احمدی",
|
||||
"reporter_phone": "09123334455",
|
||||
"official_response": "کابلکشی زیرزمینی و تعویض پروژکتورهای معیوب توسط اداره زیباسازی و تاسیسات منطقه انجام و روشنایی کامل برقرار گردید.",
|
||||
"upvotes": 68,
|
||||
"days_ago": 5,
|
||||
"resolved_at": (now - timedelta(days=1)).strftime("%Y-%m-%d %H:%M"),
|
||||
"timeline": [
|
||||
("pending", "ثبت گزارش توسط شهروند", "گزارش دریافت شد."),
|
||||
("reviewing", "بررسی میدانی اداره تاسیسات", "نقص کابل اصلی تایید شد."),
|
||||
("in_progress", "تعمیرات و تعویض کابل", "تیم تاسیسات در حال اجرای خط جدید."),
|
||||
("resolved", "تکمیل و رفع نقص روشنایی", "چراغها روشن و مدار به طور کامل تست شد.")
|
||||
],
|
||||
"comments": [
|
||||
("امیر رستمی", "خیلی سریع درستش کردن، واقعا تشکر از عوامل شهرداری."),
|
||||
("نگار توکلی", "دیشب رفتم پارک، همه چراغها درست شده بود.")
|
||||
]
|
||||
},
|
||||
{
|
||||
"tracking_code": "SHR-91203",
|
||||
"title": "انباشت پسماند و سرریز مخزن زباله شهری",
|
||||
"category": "نظافت و پسماند",
|
||||
"description": "مخزن مکانیزه زباله شکسته شده و زبالهها در پیادهرو پخش شده که باعث بوی نامطبوع و تجمع حشرات شده است.",
|
||||
"address": "خیابان آزادی، تقاطع خیابان استاد معین، پلاک ۴۲",
|
||||
"district": 9,
|
||||
"priority": "medium",
|
||||
"status": "pending",
|
||||
"lat": 35.6997,
|
||||
"lng": 51.3486,
|
||||
"image_url": "https://images.unsplash.com/photo-1532996122724-e3c354a0b15b?auto=format&fit=crop&w=800&q=80",
|
||||
"resolved_image_url": None,
|
||||
"reporter_name": "سعید کریمی",
|
||||
"reporter_phone": "09355556677",
|
||||
"official_response": "گزارش در نوبت بررسی ناظر پسماند منطقه قرار گرفته است.",
|
||||
"upvotes": 19,
|
||||
"days_ago": 1,
|
||||
"resolved_at": None,
|
||||
"timeline": [
|
||||
("pending", "ثبت گزارش در سامانه", "منتظر بازرسی و تخصیص سطل جدید مکانیزه.")
|
||||
],
|
||||
"comments": [
|
||||
("مهدی بهرامی", "لطفا سطلهای پدالدار بگذارید که درش بسته بمونه.")
|
||||
]
|
||||
},
|
||||
{
|
||||
"tracking_code": "SHR-44390",
|
||||
"title": "آسیب دیدگی و شکستن شاخههای درخت کهنسال بر اثر طوفان",
|
||||
"category": "فضای سبز و بوستانها",
|
||||
"description": "شاخههای سنگین درخت چنار شکسته و روی سیمهای برق و پیادهرو معلق مانده است، احتمال سقوط روی عابرین وجود دارد.",
|
||||
"address": "خیابان شریعتی، بالاتر از پل رومی، نبش کوچه یاس",
|
||||
"district": 1,
|
||||
"priority": "emergency",
|
||||
"status": "in_progress",
|
||||
"lat": 35.7985,
|
||||
"lng": 51.4332,
|
||||
"image_url": "https://images.unsplash.com/photo-1542601906990-b4d3fb778b09?auto=format&fit=crop&w=800&q=80",
|
||||
"resolved_image_url": None,
|
||||
"reporter_name": "پویا سرمدی",
|
||||
"reporter_phone": "09124445566",
|
||||
"official_response": "اکیپ سازمان بوستانها و آتشنشانی با جرثقیل در حال هرس ایمن و رفع خطر هستند.",
|
||||
"upvotes": 54,
|
||||
"days_ago": 1,
|
||||
"resolved_at": None,
|
||||
"timeline": [
|
||||
("pending", "ثبت فوری گزارش خطر", "هشدار سقوط شاخه دریافت شد."),
|
||||
("reviewing", "هماهنگی با سازمان آتشنشانی و فضای سبز", "اعلام وضعیت اضطراری."),
|
||||
("in_progress", "عملیات رفع خطر و هرس", "حصارکشی پیادهرو و استقرار بالابر.")
|
||||
],
|
||||
"comments": [
|
||||
("رویا صبوری", "خدا رو شکر سریع اومدن نوار خطر کشیدن.")
|
||||
]
|
||||
},
|
||||
{
|
||||
"tracking_code": "SHR-33219",
|
||||
"title": "سد معبر طولانی مصالح ساختمانی و تخریب پیادهرو",
|
||||
"category": "ساختمانسازی و سد معبر",
|
||||
"description": "یک پروژه ساختمانی بیش از سه هفته است که تمام پیادهرو و بخشی از خیابان را با نخاله و داربست بدون راه عبور ایمن مسدود کرده است.",
|
||||
"address": "سعادتآباد، میدان کاج، خیابان مروارید، پلاک ۱۸",
|
||||
"district": 2,
|
||||
"priority": "high",
|
||||
"status": "reviewing",
|
||||
"lat": 35.7794,
|
||||
"lng": 51.3758,
|
||||
"image_url": "https://images.unsplash.com/photo-1541888946425-d0fbb18086f6?auto=format&fit=crop&w=800&q=80",
|
||||
"resolved_image_url": None,
|
||||
"reporter_name": "فرشید نادری",
|
||||
"reporter_phone": "09127778899",
|
||||
"official_response": "اخطاریه ماده ۱۰۰ و رفع سد معبر برای مالک صادر شد. مهلت رفع ۴۸ ساعت میباشد.",
|
||||
"upvotes": 37,
|
||||
"days_ago": 3,
|
||||
"resolved_at": None,
|
||||
"timeline": [
|
||||
("pending", "ثبت گزارش تخلف ساختمانی", "ثبت شد."),
|
||||
("reviewing", "بازدید مامور اجرای احکام شهرداری", "صدور اخطاریه رسمی رفع انسداد معبر.")
|
||||
],
|
||||
"comments": [
|
||||
("کامران شمس", "مادر من با ویلچر مجبور شد بره توی خیابان که خیلی خطرناک بود!")
|
||||
]
|
||||
},
|
||||
{
|
||||
"tracking_code": "SHR-55821",
|
||||
"title": "خرابی و چشمکزن ماندن چراغ راهنمایی تقاطع پرتردد",
|
||||
"category": "ترافیک و حملونقل",
|
||||
"description": "چراغ راهنمایی تقاطع به مدت دو روز چشمکزن زرد مانده که باعث گره کور ترافیکی و تصادفات مکرر شده است.",
|
||||
"address": "میدان فاطمی (جهاد)، تقاطع خیابان جویبار و شهید گمنام",
|
||||
"district": 6,
|
||||
"priority": "high",
|
||||
"status": "resolved",
|
||||
"lat": 35.7208,
|
||||
"lng": 51.4082,
|
||||
"image_url": "https://images.unsplash.com/photo-1517649763962-0c623266ddc0?auto=format&fit=crop&w=800&q=80",
|
||||
"resolved_image_url": "https://images.unsplash.com/photo-1508873696983-2df5703bc275?auto=format&fit=crop&w=800&q=80",
|
||||
"reporter_name": "ندا زمانی",
|
||||
"reporter_phone": "09191113355",
|
||||
"official_response": "برد الکترونیکی کنترلر چراغ توسط شرکت کنترل ترافیک تهران تعویض و زمانبندی هوشمند مجدداً فعال گردید.",
|
||||
"upvotes": 85,
|
||||
"days_ago": 4,
|
||||
"resolved_at": (now - timedelta(days=2)).strftime("%Y-%m-%d %H:%M"),
|
||||
"timeline": [
|
||||
("pending", "ثبت گزارش خرابی علائم ترافیکی", "گزارش دریافت گردید."),
|
||||
("reviewing", "ارجاع به شرکت کنترل ترافیک", "تایید خرابی سختافزاری کنترلر."),
|
||||
("in_progress", "تعویض برد فرمان و سنسورها", "عملیات فنی در محل انجام شد."),
|
||||
("resolved", "راهاندازی و اتصال به مرکز کنترل", "چراغ طبق برنامه زمانبندی هوشمند شروع به کار کرد.")
|
||||
],
|
||||
"comments": [
|
||||
("سامان یوسفی", "دست مریزاد، امروز صبح ترافیک خیلی روانتر بود.")
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
for item in sample_issues:
|
||||
created_time = (now - timedelta(days=item["days_ago"], hours=random.randint(1, 10))).strftime("%Y-%m-%d %H:%M")
|
||||
cursor.execute("""
|
||||
INSERT INTO issues (
|
||||
tracking_code, title, category, description, address, district, priority, status,
|
||||
lat, lng, image_url, resolved_image_url, reporter_name, reporter_phone,
|
||||
official_response, upvotes, created_at, resolved_at
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""", (
|
||||
item["tracking_code"], item["title"], item["category"], item["description"],
|
||||
item["address"], item["district"], item["priority"], item["status"],
|
||||
item["lat"], item["lng"], item["image_url"], item["resolved_image_url"],
|
||||
item["reporter_name"], item["reporter_phone"], item["official_response"],
|
||||
item["upvotes"], created_time, item["resolved_at"]
|
||||
))
|
||||
|
||||
issue_id = cursor.lastrowid
|
||||
|
||||
for tl_status, tl_title, tl_desc in item["timeline"]:
|
||||
cursor.execute("""
|
||||
INSERT INTO timeline (issue_id, status, title, description, created_at)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
""", (issue_id, tl_status, tl_title, tl_desc, created_time))
|
||||
|
||||
for author, comment_text in item["comments"]:
|
||||
cursor.execute("""
|
||||
INSERT INTO comments (issue_id, author_name, content, created_at)
|
||||
VALUES (?, ?, ?, ?)
|
||||
""", (issue_id, author, comment_text, created_time))
|
||||
Reference in New Issue
Block a user