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