Initial commit -- just started to factor and implement python fast API backend
This commit is contained in:
+150
@@ -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 60–80km/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!")
|
||||
Reference in New Issue
Block a user