From 1c8490f76f6724e7d6abf04f0b5ccc44a5f82476 Mon Sep 17 00:00:00 2001 From: Chase Martin Date: Wed, 14 Jan 2026 08:05:41 -0800 Subject: [PATCH 1/5] fix: remove erase rebuild from lifecycle function in mode = development --- core/app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/core/app.py b/core/app.py index 2f271243..e4339dfa 100644 --- a/core/app.py +++ b/core/app.py @@ -37,7 +37,6 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: Application lifespan event handler to initialize the database and lexicon. """ if settings.get_enum("MODE") == "development": - erase_and_rebuild_db() from transfers.seed import seed_all seed_all(10) From bda234c728c135478454399ef743d7fa229692f0 Mon Sep 17 00:00:00 2001 From: Chase Martin Date: Wed, 14 Jan 2026 08:14:44 -0800 Subject: [PATCH 2/5] fix: add lexicon and parameter check and seeding to seed.py --- transfers/seed.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/transfers/seed.py b/transfers/seed.py index 5dd0ea83..cf922cca 100644 --- a/transfers/seed.py +++ b/transfers/seed.py @@ -53,9 +53,23 @@ def get_terms_by_category(s, category_name: str) -> list[LexiconTerm]: ) ) +def ensure_seed_prereqs() -> None: + """Ensure that lexicon and parameter data exist before seeding.""" + from core.initializers import init_lexicon, init_parameter + + with session_ctx() as s: + has_lexicon = s.scalar(select(LexiconTerm.id).limit(1)) is not None + has_parameter = s.scalar(select(Parameter.id).limit(1)) is not None + + if not has_lexicon: + init_lexicon() + if not has_parameter: + init_parameter() def seed_all(n: int = 5): """Seed roughly `n` of each main entity and connect them.""" + # Ensure lexicon and parameter exist + ensure_seed_prereqs() new_mexico_bounds = [ (36.9, -106.6), # Taos area (35.1, -106.6), # Albuquerque From 132abc27ff71ba9ddf9d6d1417aebd09604a6740 Mon Sep 17 00:00:00 2001 From: Chase Martin Date: Wed, 14 Jan 2026 08:21:01 -0800 Subject: [PATCH 3/5] feat: add skip_if_exists to seed function to not re-seed if data is already in dev db. --- core/app.py | 4 ++-- transfers/seed.py | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/app.py b/core/app.py index e4339dfa..4ce61a2f 100644 --- a/core/app.py +++ b/core/app.py @@ -34,12 +34,12 @@ @asynccontextmanager async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: """ - Application lifespan event handler to initialize the database and lexicon. + Application lifespan event handler to seed data in development mode. """ if settings.get_enum("MODE") == "development": from transfers.seed import seed_all - seed_all(10) + seed_all(10, skip_if_exists=True) register_routes(app) yield diff --git a/transfers/seed.py b/transfers/seed.py index cf922cca..7e5033ca 100644 --- a/transfers/seed.py +++ b/transfers/seed.py @@ -53,6 +53,7 @@ def get_terms_by_category(s, category_name: str) -> list[LexiconTerm]: ) ) + def ensure_seed_prereqs() -> None: """Ensure that lexicon and parameter data exist before seeding.""" from core.initializers import init_lexicon, init_parameter @@ -66,9 +67,16 @@ def ensure_seed_prereqs() -> None: if not has_parameter: init_parameter() -def seed_all(n: int = 5): + +def seed_data_exists() -> bool: + with session_ctx() as s: + return s.scalar(select(Contact.id).limit(1)) is not None + + +def seed_all(n: int = 5, skip_if_exists: bool = False): """Seed roughly `n` of each main entity and connect them.""" - # Ensure lexicon and parameter exist + if skip_if_exists and seed_data_exists(): + return ensure_seed_prereqs() new_mexico_bounds = [ (36.9, -106.6), # Taos area From 9892f751feb60504daea180d4a62d76023a51cf0 Mon Sep 17 00:00:00 2001 From: Chase Martin Date: Wed, 14 Jan 2026 09:26:05 -0800 Subject: [PATCH 4/5] fix: change existing data function name and add print statements --- transfers/seed.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/transfers/seed.py b/transfers/seed.py index 7e5033ca..24aa82e8 100644 --- a/transfers/seed.py +++ b/transfers/seed.py @@ -68,14 +68,15 @@ def ensure_seed_prereqs() -> None: init_parameter() -def seed_data_exists() -> bool: +def contact_data_exists() -> bool: with session_ctx() as s: return s.scalar(select(Contact.id).limit(1)) is not None def seed_all(n: int = 5, skip_if_exists: bool = False): """Seed roughly `n` of each main entity and connect them.""" - if skip_if_exists and seed_data_exists(): + if skip_if_exists and contact_data_exists(): + print("Contact data exists; skipping seeding.") return ensure_seed_prereqs() new_mexico_bounds = [ @@ -455,6 +456,7 @@ def seed_all(n: int = 5, skip_if_exists: bool = False): print(f"Error committing seed data: {e}") raise + print("Seeding data finished.") if __name__ == "__main__": seed_all(5) From 143e150ac2151f40835686fc9905f133bdc578ac Mon Sep 17 00:00:00 2001 From: chasetmartin Date: Wed, 14 Jan 2026 17:26:27 +0000 Subject: [PATCH 5/5] Formatting changes --- transfers/seed.py | 1 + 1 file changed, 1 insertion(+) diff --git a/transfers/seed.py b/transfers/seed.py index 24aa82e8..f3cf741b 100644 --- a/transfers/seed.py +++ b/transfers/seed.py @@ -458,5 +458,6 @@ def seed_all(n: int = 5, skip_if_exists: bool = False): print("Seeding data finished.") + if __name__ == "__main__": seed_all(5)