204 lines
5.4 KiB
Python
204 lines
5.4 KiB
Python
"""Generate Store and StoreLocation seed data."""
|
|
|
|
import uuid
|
|
from datetime import UTC, datetime
|
|
|
|
from cartsnitch_common.constants import StoreSlug
|
|
from cartsnitch_common.seed.config import NUM_LOCATIONS_PER_STORE
|
|
|
|
# Fixed store definitions
|
|
_STORE_DEFS: list[dict] = [
|
|
{
|
|
"name": "Meijer",
|
|
"slug": StoreSlug.MEIJER,
|
|
"logo_url": "https://www.meijer.com/favicon.ico",
|
|
"website_url": "https://www.meijer.com",
|
|
},
|
|
{
|
|
"name": "Kroger",
|
|
"slug": StoreSlug.KROGER,
|
|
"logo_url": "https://www.kroger.com/favicon.ico",
|
|
"website_url": "https://www.kroger.com",
|
|
},
|
|
{
|
|
"name": "Target",
|
|
"slug": StoreSlug.TARGET,
|
|
"logo_url": "https://www.target.com/favicon.ico",
|
|
"website_url": "https://www.target.com",
|
|
},
|
|
]
|
|
|
|
# SE Michigan locations per store (5 each = 15 total)
|
|
_LOCATION_DEFS: dict[StoreSlug, list[dict]] = {
|
|
StoreSlug.MEIJER: [
|
|
{
|
|
"address": "3145 Ann Arbor-Saline Rd",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48103",
|
|
"lat": 42.2434,
|
|
"lng": -83.8102,
|
|
},
|
|
{
|
|
"address": "700 W Ellsworth Rd",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48108",
|
|
"lat": 42.2318,
|
|
"lng": -83.7581,
|
|
},
|
|
{
|
|
"address": "5100 Oakman Blvd",
|
|
"city": "Dearborn",
|
|
"state": "MI",
|
|
"zip": "48126",
|
|
"lat": 42.3223,
|
|
"lng": -83.1952,
|
|
},
|
|
{
|
|
"address": "15555 Northline Rd",
|
|
"city": "Southgate",
|
|
"state": "MI",
|
|
"zip": "48195",
|
|
"lat": 42.2089,
|
|
"lng": -83.1953,
|
|
},
|
|
{
|
|
"address": "2855 Washtenaw Ave",
|
|
"city": "Ypsilanti",
|
|
"state": "MI",
|
|
"zip": "48197",
|
|
"lat": 42.2461,
|
|
"lng": -83.6388,
|
|
},
|
|
],
|
|
StoreSlug.KROGER: [
|
|
{
|
|
"address": "2010 W Stadium Blvd",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48103",
|
|
"lat": 42.2706,
|
|
"lng": -83.7807,
|
|
},
|
|
{
|
|
"address": "1100 S Main St",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48104",
|
|
"lat": 42.2555,
|
|
"lng": -83.7469,
|
|
},
|
|
{
|
|
"address": "23650 Michigan Ave",
|
|
"city": "Dearborn",
|
|
"state": "MI",
|
|
"zip": "48124",
|
|
"lat": 42.3221,
|
|
"lng": -83.2135,
|
|
},
|
|
{
|
|
"address": "14000 Michigan Ave",
|
|
"city": "Dearborn",
|
|
"state": "MI",
|
|
"zip": "48126",
|
|
"lat": 42.3281,
|
|
"lng": -83.1789,
|
|
},
|
|
{
|
|
"address": "3965 Packard St",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48108",
|
|
"lat": 42.2298,
|
|
"lng": -83.7196,
|
|
},
|
|
],
|
|
StoreSlug.TARGET: [
|
|
{
|
|
"address": "3165 Ann Arbor-Saline Rd",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48103",
|
|
"lat": 42.2431,
|
|
"lng": -83.8097,
|
|
},
|
|
{
|
|
"address": "4001 Carpenter Rd",
|
|
"city": "Ypsilanti",
|
|
"state": "MI",
|
|
"zip": "48197",
|
|
"lat": 42.2373,
|
|
"lng": -83.6617,
|
|
},
|
|
{
|
|
"address": "16000 Ford Rd",
|
|
"city": "Dearborn",
|
|
"state": "MI",
|
|
"zip": "48126",
|
|
"lat": 42.3312,
|
|
"lng": -83.2098,
|
|
},
|
|
{
|
|
"address": "17300 Eureka Rd",
|
|
"city": "Southgate",
|
|
"state": "MI",
|
|
"zip": "48195",
|
|
"lat": 42.2001,
|
|
"lng": -83.2014,
|
|
},
|
|
{
|
|
"address": "2400 E Stadium Blvd",
|
|
"city": "Ann Arbor",
|
|
"state": "MI",
|
|
"zip": "48104",
|
|
"lat": 42.2624,
|
|
"lng": -83.7102,
|
|
},
|
|
],
|
|
}
|
|
|
|
|
|
def generate_stores() -> list[dict]:
|
|
"""Return 3 fixed store records."""
|
|
now = datetime.now(tz=UTC)
|
|
stores = []
|
|
for defn in _STORE_DEFS:
|
|
stores.append(
|
|
{
|
|
"id": uuid.uuid4(),
|
|
"name": defn["name"],
|
|
"slug": defn["slug"],
|
|
"logo_url": defn["logo_url"],
|
|
"website_url": defn["website_url"],
|
|
"created_at": now,
|
|
"updated_at": now,
|
|
}
|
|
)
|
|
return stores
|
|
|
|
|
|
def generate_store_locations(stores: list[dict]) -> list[dict]:
|
|
"""Return 5 locations per store (15 total)."""
|
|
now = datetime.now(tz=UTC)
|
|
slug_to_id = {s["slug"]: s["id"] for s in stores}
|
|
locations = []
|
|
for slug, loc_defs in _LOCATION_DEFS.items():
|
|
store_id = slug_to_id[slug]
|
|
for loc in loc_defs[:NUM_LOCATIONS_PER_STORE]:
|
|
locations.append(
|
|
{
|
|
"id": uuid.uuid4(),
|
|
"store_id": store_id,
|
|
"address": loc["address"],
|
|
"city": loc["city"],
|
|
"state": loc["state"],
|
|
"zip": loc["zip"],
|
|
"lat": loc["lat"],
|
|
"lng": loc["lng"],
|
|
"created_at": now,
|
|
"updated_at": now,
|
|
}
|
|
)
|
|
return locations
|