Files
myapp/database.py
T

281 lines
15 KiB
Python

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))