Spaces:
Sleeping
Sleeping
Upload 5 files
Browse files- app.db +0 -0
- config.py +9 -0
- populate_db.py +135 -0
- requirements.txt +24 -0
- run.py +7 -0
app.db
ADDED
Binary file (86 kB). View file
|
|
config.py
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
|
3 |
+
class Config:
|
4 |
+
SECRET_KEY = os.environ.get("SECRET_KEY") or "you-will-never-guess"
|
5 |
+
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL") or \
|
6 |
+
"sqlite:///" + os.path.join(os.path.abspath(os.path.dirname(__file__)), "app.db")
|
7 |
+
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
8 |
+
GROQ_API_KEY = "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"
|
9 |
+
|
populate_db.py
ADDED
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from app import create_app, db
|
2 |
+
from app.models import Country, Case, InterrogationSession, GeneratedQuestion, InterrogationResponse, Report, CaseStatus
|
3 |
+
import random
|
4 |
+
from datetime import datetime, timedelta
|
5 |
+
|
6 |
+
app = create_app()
|
7 |
+
|
8 |
+
# --- Helper function to generate random names ---
|
9 |
+
def generate_random_name():
|
10 |
+
first_names = ["Aaliyah", "Aarav", "Beatrix", "Bodhi", "Cassian", "Clara", "Declan", "Elara", "Felix", "Fiona", "Gideon", "Hazel", "Jasper", "Juniper", "Kai", "Luna", "Milo", "Nora", "Orion", "Ophelia", "Phoenix", "Quinn", "Rowan", "Seraphina", "Silas", "Stella", "Theodore", "Violet", "Xavier", "Zara"]
|
11 |
+
last_names = ["Abe", "Chen", "Da Silva", "El-Sayed", "Fernandez", "Garcia", "Ivanov", "Jones", "Kim", "Kowalski", "Li", "Martinez", "Müller", "Nguyen", "Okafor", "Patel", "Popescu", "Rossi", "Santos", "Schmidt", "Singh", "Smith", "Tanaka", "Tremblay", "Van Der Berg", "Williams", "Wilson", "Yamamoto", "Zhang", "Zimmerman"]
|
12 |
+
return f"{random.choice(first_names)} {random.choice(last_names)}"
|
13 |
+
|
14 |
+
# --- Helper function to generate random text ---
|
15 |
+
def generate_random_text(length=100):
|
16 |
+
words = ["lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", "magna", "aliqua"]
|
17 |
+
return " ".join(random.choice(words) for _ in range(length // 5)).capitalize() + "."
|
18 |
+
|
19 |
+
# --- Function to populate the database ---
|
20 |
+
def populate_database():
|
21 |
+
with app.app_context():
|
22 |
+
db.drop_all() # Clear existing data
|
23 |
+
db.create_all() # Create tables
|
24 |
+
|
25 |
+
# 1. Populate Countries
|
26 |
+
countries_data = [
|
27 |
+
# GCC
|
28 |
+
{"name": "Saudi Arabia", "region": "GCC"},
|
29 |
+
{"name": "UAE", "region": "GCC"},
|
30 |
+
{"name": "Qatar", "region": "GCC"},
|
31 |
+
{"name": "Bahrain", "region": "GCC"},
|
32 |
+
{"name": "Oman", "region": "GCC"},
|
33 |
+
{"name": "Kuwait", "region": "GCC"},
|
34 |
+
# EU
|
35 |
+
{"name": "Germany", "region": "EU"},
|
36 |
+
{"name": "France", "region": "EU"},
|
37 |
+
{"name": "Italy", "region": "EU"},
|
38 |
+
{"name": "Spain", "region": "EU"},
|
39 |
+
# African Countries
|
40 |
+
{"name": "South Africa", "region": "Africa"},
|
41 |
+
{"name": "Nigeria", "region": "Africa"},
|
42 |
+
{"name": "Kenya", "region": "Africa"},
|
43 |
+
# North America
|
44 |
+
{"name": "USA", "region": "North America"},
|
45 |
+
{"name": "Canada", "region": "North America"},
|
46 |
+
# Indian Subcontinent
|
47 |
+
{"name": "India", "region": "Indian Subcontinent"},
|
48 |
+
{"name": "Pakistan", "region": "Indian Subcontinent"},
|
49 |
+
{"name": "Bangladesh", "region": "Indian Subcontinent"},
|
50 |
+
{"name": "Sri Lanka", "region": "Indian Subcontinent"},
|
51 |
+
# East Asia
|
52 |
+
{"name": "China", "region": "East Asia"},
|
53 |
+
{"name": "Japan", "region": "East Asia"},
|
54 |
+
]
|
55 |
+
|
56 |
+
created_countries = {}
|
57 |
+
for country_data in countries_data:
|
58 |
+
country = Country(name=country_data["name"], region=country_data["region"])
|
59 |
+
db.session.add(country)
|
60 |
+
created_countries[country_data["name"]] = country
|
61 |
+
db.session.commit()
|
62 |
+
print("Countries populated.")
|
63 |
+
|
64 |
+
# 2. Populate Sample Cases
|
65 |
+
case_types = ["Fraud", "Theft", "Cybercrime", "Assault", "Homicide", "Drug Trafficking"]
|
66 |
+
all_countries = Country.query.all()
|
67 |
+
if not all_countries:
|
68 |
+
print("No countries found, cannot create cases.")
|
69 |
+
return
|
70 |
+
|
71 |
+
cases = []
|
72 |
+
for i in range(10): # Create 10 sample cases
|
73 |
+
case = Case(
|
74 |
+
case_id_display=f"C-2024{str(i+1).zfill(4)}",
|
75 |
+
case_type=random.choice(case_types),
|
76 |
+
suspect_name=generate_random_name(),
|
77 |
+
profile_details=generate_random_text(150),
|
78 |
+
evidence_summary=generate_random_text(200),
|
79 |
+
status=random.choice(list(CaseStatus)),
|
80 |
+
country_context=random.choice(all_countries) # Assign a random country for context
|
81 |
+
)
|
82 |
+
db.session.add(case)
|
83 |
+
cases.append(case)
|
84 |
+
db.session.commit()
|
85 |
+
print(f"{len(cases)} Cases populated.")
|
86 |
+
|
87 |
+
# 3. Populate Interrogation Sessions, Questions, Responses, and Reports for each case
|
88 |
+
for case_obj in cases:
|
89 |
+
# Create an interrogation session
|
90 |
+
session = InterrogationSession(
|
91 |
+
case_id=case_obj.id,
|
92 |
+
session_date=datetime.utcnow() - timedelta(days=random.randint(1, 30)),
|
93 |
+
summary_notes=generate_random_text(100)
|
94 |
+
)
|
95 |
+
db.session.add(session)
|
96 |
+
db.session.commit() # Commit session to get its ID
|
97 |
+
|
98 |
+
# Create generated questions for the session
|
99 |
+
question_categories = ["Identity & Timeline", "Evidence Confrontation", "Alibi Verification", "Psychological Pressure"]
|
100 |
+
for _ in range(random.randint(5, 12)): # 5 to 12 questions per session
|
101 |
+
question = GeneratedQuestion(
|
102 |
+
interrogation_session_id=session.id,
|
103 |
+
question_text=generate_random_text(50) + "?",
|
104 |
+
category=random.choice(question_categories)
|
105 |
+
)
|
106 |
+
db.session.add(question)
|
107 |
+
db.session.commit() # Commit question to get its ID
|
108 |
+
|
109 |
+
# Create a response for the question
|
110 |
+
response_tags = ["evasiveness", "contradiction", "alibi failure", "confession hint", "cooperative"]
|
111 |
+
response = InterrogationResponse(
|
112 |
+
generated_question_id=question.id,
|
113 |
+
response_text=generate_random_text(80),
|
114 |
+
tags=",".join(random.sample(response_tags, random.randint(0,2)))
|
115 |
+
)
|
116 |
+
db.session.add(response)
|
117 |
+
db.session.commit()
|
118 |
+
|
119 |
+
# Create a report for the case
|
120 |
+
report = Report(
|
121 |
+
case_id=case_obj.id,
|
122 |
+
llm_json_output='{"summary": "' + generate_random_text(100) + '", "findings": "' + generate_random_text(150) + '"}',
|
123 |
+
report_content_summary=generate_random_text(250),
|
124 |
+
recommendations=generate_random_text(120),
|
125 |
+
report_country_context=case_obj.country_context # Use the same country as the case for the report
|
126 |
+
)
|
127 |
+
db.session.add(report)
|
128 |
+
db.session.commit()
|
129 |
+
print("Interrogation Sessions, Questions, Responses, and Reports populated.")
|
130 |
+
|
131 |
+
print("Database populated successfully!")
|
132 |
+
|
133 |
+
if __name__ == "__main__":
|
134 |
+
populate_database()
|
135 |
+
|
requirements.txt
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
annotated-types==0.7.0
|
2 |
+
anyio==4.9.0
|
3 |
+
blinker==1.9.0
|
4 |
+
certifi==2025.4.26
|
5 |
+
click==8.1.8
|
6 |
+
distro==1.9.0
|
7 |
+
Flask==3.1.0
|
8 |
+
Flask-SQLAlchemy==3.1.1
|
9 |
+
greenlet==3.2.1
|
10 |
+
groq==0.24.0
|
11 |
+
h11==0.16.0
|
12 |
+
httpcore==1.0.9
|
13 |
+
httpx==0.28.1
|
14 |
+
idna==3.10
|
15 |
+
itsdangerous==2.2.0
|
16 |
+
Jinja2==3.1.6
|
17 |
+
MarkupSafe==3.0.2
|
18 |
+
pydantic==2.11.4
|
19 |
+
pydantic_core==2.33.2
|
20 |
+
sniffio==1.3.1
|
21 |
+
SQLAlchemy==2.0.40
|
22 |
+
typing-inspection==0.4.0
|
23 |
+
typing_extensions==4.13.2
|
24 |
+
Werkzeug==3.1.3
|
run.py
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from app import create_app
|
2 |
+
|
3 |
+
app = create_app()
|
4 |
+
|
5 |
+
if __name__ == "__main__":
|
6 |
+
app.run(host="0.0.0.0", port=5000, debug=True)
|
7 |
+
|