Initial commit -- just started to factor and implement python fast API backend

This commit is contained in:
2026-05-11 12:48:35 +10:00
commit b1b621bc4a
23 changed files with 4101 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
from sqlalchemy.orm import Session
from .database import SessionLocal, engine
from . import models, auth
from datetime import datetime
# Import data directly as if it were coming from data.jsx
USERS = [
{"id": "rod", "name": "Rod", "role": "Owner", "hue": 220, "initials": "R"},
{"id": "lani", "name": "Lani", "role": "Admin", "hue": 340, "initials": "L"},
{"id": "kirra", "name": "Kirra", "role": "Technician", "hue": 160, "initials": "K"},
{"id": "ayron", "name": "Ayron", "role": "Technician", "hue": 40, "initials": "A"},
]
SEED_TASKS = [
{ "id": 't1', "title": 'Call back Mrs. Patel re: Hilux service quote',
"description": 'She left a voicemail Tuesday — wants confirmation on the timing belt price before she books in.',
"assignee": 'lani', "addedBy": 'rod', "priority": 'high', "source": 'imessage',
"addedAt": '2026-05-08T08:42:00', "status": 'open',
"tags": ['quote'] },
{ "id": 't2', "title": 'Email #3814 → Workorder #2207',
"description": 'Auto-converted from inbox. Tell customer ETA of Friday.',
"assignee": 'lani', "addedBy": 'system', "priority": 'med', "source": 'email',
"addedAt": '2026-05-08T07:15:00', "status": 'open',
"tags": ['WO #2207'] },
{ "id": 't3', "title": 'Reorder coolant — 5L × 4',
"description": 'Stock card ran red on the morning sweep.',
"assignee": 'lani', "addedBy": 'kirra', "priority": 'low', "source": 'manual',
"addedAt": '2026-05-07T16:02:00', "status": 'open', "tags": [] },
{ "id": 't4', "title": 'Form response from "K. Wynne" auto-switched to Billing',
"description": 'Originally captured as Service Booking — heads up.',
"assignee": 'lani', "addedBy": 'system', "priority": 'med', "source": 'automation',
"addedAt": '2026-05-08T09:50:00', "status": 'billing',
"tags": ['form'] },
{ "id": 't5', "title": 'Diagnose intermittent misfire — Camry, WO #2199',
"description": 'Cust says it stutters between 6080km/h once warm.',
"assignee": 'kirra', "addedBy": 'rod', "priority": 'high', "source": 'manual',
"addedAt": '2026-05-08T07:50:00', "status": 'open',
"tags": ['WO #2199'] },
{ "id": 't6', "title": 'Sign off on Ayron\'s brake job — Forester',
"description": 'Final torque check + road test before pickup at 3pm.',
"assignee": 'kirra', "addedBy": 'ayron', "priority": 'med', "source": 'manual',
"addedAt": '2026-05-08T09:05:00', "status": 'open', "tags": [] },
{ "id": 't7', "title": 'WO #2188 auto-marked Unsuccessful',
"description": 'Customer no-show twice — please review and decide on next step.',
"assignee": 'kirra', "addedBy": 'system', "priority": 'high', "source": 'automation',
"addedAt": '2026-05-08T06:00:00', "status": 'unsuccessful',
"tags": ['WO #2188'] },
{ "id": 't8', "title": 'Replace front pads + rotors — Forester',
"description": 'Parts arrived yesterday. Bay 2 from 10am.',
"assignee": 'ayron', "addedBy": 'kirra', "priority": 'med', "source": 'manual',
"addedAt": '2026-05-08T08:00:00', "status": 'open',
"tags": ['WO #2201'] },
{ "id": 't9', "title": 'Tidy bay 3 + sweep before lunch',
"description": '',
"assignee": 'ayron', "addedBy": 'rod', "priority": 'low', "source": 'imessage',
"addedAt": '2026-05-08T09:30:00', "status": 'open', "tags": [] },
{ "id": 't10', "title": 'Pickup parts from Repco @ 11:30',
"description": 'Two boxes for WO #2199 + an oil filter for stock.',
"assignee": 'ayron', "addedBy": 'lani', "priority": 'med', "source": 'manual',
"addedAt": '2026-05-08T08:20:00', "status": 'open', "tags": [] },
{ "id": 't11', "title": 'Approve quote on Job #2207 ($1,840)',
"description": 'Lani flagged this — needs your sign-off before sending.',
"assignee": 'rod', "addedBy": 'lani', "priority": 'high', "source": 'manual',
"addedAt": '2026-05-08T09:12:00', "status": 'open',
"tags": ['quote', 'WO #2207'] },
{ "id": 't12', "title": 'Review weekly automation report',
"description": '14 tasks created from email, 6 from iMessage, 2 form re-routes.',
"assignee": 'rod', "addedBy": 'system', "priority": 'low', "source": 'automation',
"addedAt": '2026-05-08T06:00:00', "status": 'open', "tags": [] },
]
SEED_AUDIT = [
{ "id": 'a1', "at": '2026-05-08T09:50:00', "actor": 'system', "action": 'form_rerouted',
"summary": 'Form from K. Wynne auto-switched: Service Booking → Billing form',
"target": 't4' },
{ "id": 'a2', "at": '2026-05-08T09:30:00', "actor": 'rod', "action": 'task_created',
"summary": 'Created task "Tidy bay 3 + sweep before lunch" for Ayron via iMessage',
"target": 't9' },
{ "id": 'a3', "at": '2026-05-08T09:12:00', "actor": 'lani', "action": 'task_assigned',
"summary": 'Assigned "Approve quote on Job #2207" to ROD',
"target": 't11' },
{ "id": 'a4', "at": '2026-05-08T09:05:00', "actor": 'ayron', "action": 'task_moved',
"summary": 'Moved "Sign off on brake job" from Ayron → Kirra',
"target": 't6' },
]
def seed_db():
# Create tables
models.Base.metadata.create_all(bind=engine)
db = SessionLocal()
# Add Users
for u in USERS:
is_admin = u['id'] in ['rod', 'ayron']
db_user = models.User(
id=u['id'],
name=u['name'],
role=u['role'],
hue=u['hue'],
initials=u['initials'],
email=f"{u['id']}@murchison-auto.co",
phone="+64 27 555 0184",
password_hash=auth.get_password_hash("password123"), # Default password
account_type='admin' if is_admin else 'standard'
)
db.merge(db_user)
# Add Tasks
for t in SEED_TASKS:
db_task = models.Task(
id=t['id'],
title=t['title'],
description=t['description'],
assignee_id=t['assignee'],
added_by=t['addedBy'],
priority=t['priority'],
source=t['source'],
status=t['status'],
added_at=datetime.fromisoformat(t['addedAt'])
)
db.merge(db_task)
# Add tags
for tag_name in t.get('tags', []):
tag = db.query(models.Tag).filter(models.Tag.tag == tag_name).first()
if not tag:
tag = models.Tag(tag=tag_name)
db.add(tag)
if tag not in db_task.tags:
db_task.tags.append(tag)
# Add Audit
for a in SEED_AUDIT:
db_audit = models.AuditLog(
id=a['id'],
at=datetime.fromisoformat(a['at']),
actor=a['actor'],
action=a['action'],
summary=a['summary'],
target=a['target']
)
db.merge(db_audit)
db.commit()
db.close()
if __name__ == "__main__":
seed_db()
print("Database seeded!")