From 4e2998cbf2169490b60e859c651445d4fbc02181 Mon Sep 17 00:00:00 2001 From: Jacob Brown Date: Wed, 1 Oct 2025 11:14:30 -0600 Subject: [PATCH 1/2] refactor: move level_status from obs to activity_status in field_activity --- core/lexicon.json | 49 ++++++++++++++++++++------------------- db/field.py | 4 ++++ db/observation.py | 5 ++-- schemas/field.py | 1 + schemas/observation.py | 3 --- tests/conftest.py | 3 ++- tests/test_observation.py | 10 -------- 7 files changed, 34 insertions(+), 41 deletions(-) diff --git a/core/lexicon.json b/core/lexicon.json index db05e9061..d3cf758d2 100644 --- a/core/lexicon.json +++ b/core/lexicon.json @@ -20,7 +20,7 @@ {"name": "field_contact_role", "description": null}, {"name": "geochronology", "description": null}, {"name": "horizontal_datum", "description": null}, - {"name": "level_status", "description": null}, + {"name": "activity_status", "description": null}, {"name": "measurement_method", "description": null}, {"name": "monitoring_status", "description": null}, {"name": "observed_property", "description": null}, @@ -284,29 +284,30 @@ {"categories": ["thing_type"], "term": "perennial stream", "definition": "that has a continuous flow of water throughout the year, even during drier periods."}, {"categories": ["thing_type"], "term": "ephemeral stream", "definition": "a stream that flows only briefly during and after precipitation events"}, {"categories": ["thing_type"], "term": "meteorological station", "definition": "a station that measures the weather conditions at a particular location"}, - {"categories": ["level_status"], "term": "Water level affected by atmospheric pressure", "definition": "Water level affected by atmospheric pressure"}, - {"categories": ["level_status"], "term": "Water level was frozen (no level recorded).", "definition": "Water level was frozen (no level recorded)."}, - {"categories": ["level_status"], "term": "Site was dry", "definition": "Site was dry"}, - {"categories": ["level_status"], "term": "Site was flowing recently.", "definition": "Site was flowing recently."}, - {"categories": ["level_status"], "term": "Site was flowing. Water level or head couldn't be measured w/out additional equipment.", "definition": "Site was flowing. Water level or head couldn't be measured w/out additional equipment."}, - {"categories": ["level_status"], "term": "Nearby site that taps the same aquifer was flowing.", "definition": "Nearby site that taps the same aquifer was flowing."}, - {"categories": ["level_status"], "term": "Nearby site that taps the same aquifer had been flowing recently.", "definition": "Nearby site that taps the same aquifer had been flowing recently."}, - {"categories": ["level_status"], "term": "Recharge water was being injected into the aquifer at this site.", "definition": "Recharge water was being injected into the aquifer at this site."}, - {"categories": ["level_status"], "term": "Recharge water was being injected into nearby site that taps the same aquifer.", "definition": "Recharge water was being injected into nearby site that taps the same aquifer."}, - {"categories": ["level_status"], "term": "Water was cascading down the inside of the well.", "definition": "Water was cascading down the inside of the well."}, - {"categories": ["level_status"], "term": "Water level was affected by brackish or saline water.", "definition": "Water level was affected by brackish or saline water."}, - {"categories": ["level_status"], "term": "Well was not in hydraulic contact w/formation (from source other than defined in USGS C714 or C93).", "definition": "Well was not in hydraulic contact w/formation (from source other than defined in USGS C714 or C93)."}, - {"categories": ["level_status"], "term": "Measurement was discontinued (no level recorded).", "definition": "Measurement was discontinued (no level recorded)."}, - {"categories": ["level_status"], "term": "Obstruction was encountered in the well (no level recorded)", "definition": "Obstruction was encountered in the well (no level recorded)"}, - {"categories": ["level_status"], "term": "Site was being pumped", "definition": "Site was being pumped"}, - {"categories": ["level_status"], "term": "Site was pumped recently", "definition": "Site was pumped recently"}, - {"categories": ["level_status"], "term": "Nearby site that taps the same aquifer was being pumped", "definition": "Nearby site that taps the same aquifer was being pumped"}, - {"categories": ["level_status"], "term": "Nearby site that taps the same aquifer was pumped recently", "definition": "Nearby site that taps the same aquifer was pumped recently"}, - {"categories": ["level_status"], "term": "Foreign substance present on the water surface", "definition": "Foreign substance present on the water surface"}, - {"categories": ["level_status"], "term": "Well was destroyed (no subsequent water levels should be recorded)", "definition": "Well was destroyed (no subsequent water levels should be recorded)"}, - {"categories": ["level_status"], "term": "Water level affected by stage in nearby surface-water site", "definition": "Water level affected by stage in nearby surface-water site"}, - {"categories": ["level_status"], "term": "Other conditions exist that would affect the level (remarks)", "definition": "Other conditions exist that would affect the level (remarks)"}, - {"categories": ["level_status"], "term": "Water level not affected by status", "definition": "Water level not affected by status"}, + {"categories": ["activity_status"], "term": "Water level affected by atmospheric pressure", "definition": "Water level affected by atmospheric pressure"}, + {"categories": ["activity_status"], "term": "Water level was frozen (no level recorded).", "definition": "Water level was frozen (no level recorded)."}, + {"categories": ["activity_status"], "term": "Site was dry", "definition": "Site was dry"}, + {"categories": ["activity_status"], "term": "Site was flowing recently.", "definition": "Site was flowing recently."}, + {"categories": ["activity_status"], "term": "Site was flowing. Water level or head couldn't be measured w/out additional equipment.", "definition": "Site was flowing. Water level or head couldn't be measured w/out additional equipment."}, + {"categories": ["activity_status"], "term": "Nearby site that taps the same aquifer was flowing.", "definition": "Nearby site that taps the same aquifer was flowing."}, + {"categories": ["activity_status"], "term": "Nearby site that taps the same aquifer had been flowing recently.", "definition": "Nearby site that taps the same aquifer had been flowing recently."}, + {"categories": ["activity_status"], "term": "Recharge water was being injected into the aquifer at this site.", "definition": "Recharge water was being injected into the aquifer at this site."}, + {"categories": ["activity_status"], "term": "Recharge water was being injected into nearby site that taps the same aquifer.", "definition": "Recharge water was being injected into nearby site that taps the same aquifer."}, + {"categories": ["activity_status"], "term": "Water was cascading down the inside of the well.", "definition": "Water was cascading down the inside of the well."}, + {"categories": ["activity_status"], "term": "Water level was affected by brackish or saline water.", "definition": "Water level was affected by brackish or saline water."}, + {"categories": ["activity_status"], "term": "Well was not in hydraulic contact w/formation (from source other than defined in USGS C714 or C93).", "definition": "Well was not in hydraulic contact w/formation (from source other than defined in USGS C714 or C93)."}, + {"categories": ["activity_status"], "term": "Measurement was discontinued (no level recorded).", "definition": "Measurement was discontinued (no level recorded)."}, + {"categories": ["activity_status"], "term": "Obstruction was encountered in the well (no level recorded)", "definition": "Obstruction was encountered in the well (no level recorded)"}, + {"categories": ["activity_status"], "term": "Site was being pumped", "definition": "Site was being pumped"}, + {"categories": ["activity_status"], "term": "Site was pumped recently", "definition": "Site was pumped recently"}, + {"categories": ["activity_status"], "term": "Nearby site that taps the same aquifer was being pumped", "definition": "Nearby site that taps the same aquifer was being pumped"}, + {"categories": ["activity_status"], "term": "Nearby site that taps the same aquifer was pumped recently", "definition": "Nearby site that taps the same aquifer was pumped recently"}, + {"categories": ["activity_status"], "term": "Foreign substance present on the water surface", "definition": "Foreign substance present on the water surface"}, + {"categories": ["activity_status"], "term": "Well was destroyed (no subsequent water levels should be recorded)", "definition": "Well was destroyed (no subsequent water levels should be recorded)"}, + {"categories": ["activity_status"], "term": "Water level affected by stage in nearby surface-water site", "definition": "Water level affected by stage in nearby surface-water site"}, + {"categories": ["activity_status"], "term": "Other conditions exist that would affect the level (remarks)", "definition": "Other conditions exist that would affect the level (remarks)"}, + {"categories": ["activity_status"], "term": "Water level not affected by status", "definition": "Water level not affected by status"}, + {"categories": ["activity_status"], "term": "Water chemistry affected by status", "definition": "Water chemistry affected by status"}, {"categories": ["status"], "term": "Abandoned", "definition": "Abandoned"}, {"categories": ["status"], "term": "Active, pumping well", "definition": "Active, pumping well"}, {"categories": ["status"], "term": "Destroyed, exists but not usable", "definition": "Destroyed, exists but not usable"}, diff --git a/db/field.py b/db/field.py index ca7b99372..d1e70d988 100644 --- a/db/field.py +++ b/db/field.py @@ -129,6 +129,10 @@ class FieldActivity(Base, AutoBaseMixin, ReleaseMixin): nullable=False, comment="The type of activity performed during the field event (e.g., 'groundwater level', 'water chemistry', 'geothermal').", ) + activity_status: Mapped[str] = lexicon_term( + nullable=False, + comment="The status of the activity, whether normal or impacted by external factors like roving bovine, dry well, or equipment failure.", + ) notes: Mapped[str] = mapped_column( nullable=True, comment="Notes or comments about the field activity.", diff --git a/db/observation.py b/db/observation.py index af737a7cf..441ba7886 100644 --- a/db/observation.py +++ b/db/observation.py @@ -56,7 +56,8 @@ class Observation(Base, AutoBaseMixin, ReleaseMixin): ) observed_property: Mapped[str] = lexicon_term(nullable=False) value: Mapped[float] = mapped_column( - nullable=True, + nullable=False, + comment="The value of the observation. If a value could not be retrieved then an observation could not be made. The reason for the missing value should be documented in the correct table, like field_activity.", ) unit: Mapped[str] = lexicon_term(nullable=False) @@ -67,8 +68,6 @@ class Observation(Base, AutoBaseMixin, ReleaseMixin): info={"unit": "ft"}, ) - level_status: Mapped[str] = lexicon_term(nullable=True) - # geothermal observation_depth: Mapped[float] = mapped_column( nullable=True, diff --git a/schemas/field.py b/schemas/field.py index 9f32ed72f..8f5ba9c4e 100644 --- a/schemas/field.py +++ b/schemas/field.py @@ -9,6 +9,7 @@ class FieldActivityResponse(BaseResponseModel): field_event_id: int activity_type: str + activity_status: str class FieldEventResponse(BaseResponseModel): diff --git a/schemas/observation.py b/schemas/observation.py index 1e052fec3..9b1e28f2c 100644 --- a/schemas/observation.py +++ b/schemas/observation.py @@ -68,7 +68,6 @@ class CreateBaseObservation(BaseCreateModel, ValidateObservation): class CreateGroundwaterLevelObservation(CreateBaseObservation): measuring_point_height: float - level_status: str class CreateWaterChemistryObservation(CreateBaseObservation): @@ -94,7 +93,6 @@ class UpdateBaseObservation(BaseUpdateModel, ValidateObservation): class UpdateGroundwaterLevelObservation(UpdateBaseObservation): measuring_point_height: float | None = None - level_status: str | None = None class UpdateWaterChemistryObservation(UpdateBaseObservation): @@ -119,7 +117,6 @@ class BaseObservationResponse(BaseResponseModel): class GroundwaterLevelObservationResponse(BaseObservationResponse): depth_to_water_bgs: float | None measuring_point_height: float | None - level_status: str | None @model_validator(mode="before") def calculate_depth_to_water_bgs(self: Self) -> Self: diff --git a/tests/conftest.py b/tests/conftest.py index 68d6db92e..e9f0b8a06 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -511,6 +511,7 @@ def groundwater_level_field_activity(field_event): field_activity = FieldActivity( field_event_id=field_event.id, activity_type="groundwater level", + activity_status="Water level not affected by status", notes="field activity fixture notes", release_status="draft", ) @@ -525,6 +526,7 @@ def water_chemistry_field_activity(field_event): field_activity = FieldActivity( field_event_id=field_event.id, activity_type="water chemistry", + activity_status="Water chemistry affected by status", notes="field activity fixture notes", release_status="draft", ) @@ -610,7 +612,6 @@ def groundwater_level_observation(sensor, groundwater_level_sample): value=10.0, unit="ft", measuring_point_height=5.0, - level_status="Water level not affected by status", ) session.add(observation) session.commit() diff --git a/tests/test_observation.py b/tests/test_observation.py index ec1c73060..291fefa7d 100644 --- a/tests/test_observation.py +++ b/tests/test_observation.py @@ -81,7 +81,6 @@ def test_add_groundwater_level_observation(groundwater_level_sample, sensor): "measuring_point_height": 53, "sample_id": groundwater_level_sample.id, "sensor_id": sensor.id, - "level_status": "Water level not affected by status", "observed_property": "groundwater level", "unit": "ft", } @@ -96,7 +95,6 @@ def test_add_groundwater_level_observation(groundwater_level_sample, sensor): assert data["value"] == payload["value"] assert data["measuring_point_height"] == payload["measuring_point_height"] assert data["sensor_id"] == payload["sensor_id"] - assert data["level_status"] == payload["level_status"] assert data["observed_property"] == payload["observed_property"] assert ( data["depth_to_water_bgs"] @@ -343,9 +341,6 @@ def test_get_groundwater_level_observations(groundwater_level_observation): data["items"][0]["release_status"] == groundwater_level_observation.release_status ) - assert ( - data["items"][0]["level_status"] == groundwater_level_observation.level_status - ) assert data["items"][0]["value"] == groundwater_level_observation.value assert data["items"][0]["unit"] == groundwater_level_observation.unit assert ( @@ -357,9 +352,6 @@ def test_get_groundwater_level_observations(groundwater_level_observation): data["items"][0]["measuring_point_height"] == groundwater_level_observation.measuring_point_height ) - assert ( - data["items"][0]["level_status"] == groundwater_level_observation.level_status - ) def test_get_groundwater_level_observation_by_id(groundwater_level_observation): @@ -384,7 +376,6 @@ def test_get_groundwater_level_observation_by_id(groundwater_level_observation): == groundwater_level_observation.observed_property[colon_index + 1 :] ) assert data["release_status"] == groundwater_level_observation.release_status - assert data["level_status"] == groundwater_level_observation.level_status assert data["value"] == groundwater_level_observation.value assert data["unit"] == groundwater_level_observation.unit assert ( @@ -396,7 +387,6 @@ def test_get_groundwater_level_observation_by_id(groundwater_level_observation): data["measuring_point_height"] == groundwater_level_observation.measuring_point_height ) - assert data["level_status"] == groundwater_level_observation.level_status def test_get_groundwater_level_observation_by_id_404_not_found( From be73b41a17b90a245a7adbcc21954edd0246514d Mon Sep 17 00:00:00 2001 From: Jacob Brown Date: Wed, 1 Oct 2025 11:18:27 -0600 Subject: [PATCH 2/2] refactor: update water chem activity status term --- core/lexicon.json | 2 +- tests/conftest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/lexicon.json b/core/lexicon.json index d3cf758d2..d506ddc63 100644 --- a/core/lexicon.json +++ b/core/lexicon.json @@ -307,7 +307,7 @@ {"categories": ["activity_status"], "term": "Water level affected by stage in nearby surface-water site", "definition": "Water level affected by stage in nearby surface-water site"}, {"categories": ["activity_status"], "term": "Other conditions exist that would affect the level (remarks)", "definition": "Other conditions exist that would affect the level (remarks)"}, {"categories": ["activity_status"], "term": "Water level not affected by status", "definition": "Water level not affected by status"}, - {"categories": ["activity_status"], "term": "Water chemistry affected by status", "definition": "Water chemistry affected by status"}, + {"categories": ["activity_status"], "term": "Sample not affected by status", "definition": "Sample not affected by status"}, {"categories": ["status"], "term": "Abandoned", "definition": "Abandoned"}, {"categories": ["status"], "term": "Active, pumping well", "definition": "Active, pumping well"}, {"categories": ["status"], "term": "Destroyed, exists but not usable", "definition": "Destroyed, exists but not usable"}, diff --git a/tests/conftest.py b/tests/conftest.py index e9f0b8a06..f9d6b91e5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -526,7 +526,7 @@ def water_chemistry_field_activity(field_event): field_activity = FieldActivity( field_event_id=field_event.id, activity_type="water chemistry", - activity_status="Water chemistry affected by status", + activity_status="Sample not affected by status", notes="field activity fixture notes", release_status="draft", )