Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions admin/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@
GroupAdmin,
NotesAdmin,
SampleAdmin,
HydraulicsDataAdmin,
GeologicFormationAdmin,
DataProvenanceAdmin,
FieldEventAdmin,
FieldActivityAdmin,
FieldEventParticipantAdmin,
ParameterAdmin,
)
from db.engine import engine
Expand All @@ -60,10 +60,10 @@
from db.group import Group
from db.notes import Notes
from db.sample import Sample
from db.nma_legacy import NMAHydraulicsData
from db.geologic_formation import GeologicFormation
from db.data_provenance import DataProvenance
from db.field import FieldEvent, FieldActivity, FieldEventParticipant
from db.permission_history import PermissionHistory
from db.field import FieldEvent, FieldActivity
from db.parameter import Parameter


Expand Down Expand Up @@ -127,6 +127,9 @@ def create_admin(app):
# Samples
admin.add_view(SampleAdmin(Sample))

# Hydraulics
admin.add_view(HydraulicsDataAdmin(NMAHydraulicsData))

# Field
admin.add_view(FieldEventAdmin(FieldEvent))
admin.add_view(FieldActivityAdmin(FieldActivity))
Expand Down
2 changes: 2 additions & 0 deletions admin/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from admin.views.group import GroupAdmin
from admin.views.notes import NotesAdmin
from admin.views.sample import SampleAdmin
from admin.views.hydraulicsdata import HydraulicsDataAdmin
from admin.views.geologic_formation import GeologicFormationAdmin
from admin.views.data_provenance import DataProvenanceAdmin
from admin.views.field import (
Expand All @@ -55,6 +56,7 @@
"GroupAdmin",
"NotesAdmin",
"SampleAdmin",
"HydraulicsDataAdmin",
"GeologicFormationAdmin",
"DataProvenanceAdmin",
"FieldEventAdmin",
Expand Down
129 changes: 129 additions & 0 deletions admin/views/hydraulicsdata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# ===============================================================================
# Copyright 2026
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ===============================================================================
"""
HydraulicsDataAdmin view for legacy NMA_HydraulicsData.
"""
from admin.views.base import OcotilloModelView


class HydraulicsDataAdmin(OcotilloModelView):
"""
Admin view for NMAHydraulicsData model.
"""

# ========== Basic Configuration ==========

name = "Hydraulics Data"
label = "Hydraulics Data"
icon = "fa fa-tint"

can_create = False
can_edit = False
can_delete = False

# ========== List View ==========

column_list = [
"global_id",
"point_id",
"hydraulic_unit",
"hydraulic_unit_type",
"test_top",
"test_bottom",
"t_ft2_d",
"k_darcy",
"data_source",
]

column_sortable_list = [
"global_id",
"point_id",
"hydraulic_unit",
"hydraulic_unit_type",
"test_top",
"test_bottom",
"t_ft2_d",
"k_darcy",
"data_source",
]

search_fields = [
"global_id",
"point_id",
"hydraulic_unit",
"hydraulic_remarks",
]

column_filters = [
"hydraulic_unit",
"hydraulic_unit_type",
"data_source",
]

can_export = True
export_types = ["csv", "excel"]

page_size = 50
page_size_options = [25, 50, 100, 200]

# ========== Form View ==========

fields = [
"global_id",
"point_id",
"hydraulic_unit",
"hydraulic_unit_type",
"hydraulic_remarks",
"test_top",
"test_bottom",
"t_ft2_d",
"s_dimensionless",
"ss_ft_1",
"sy_decimalfractn",
"kh_ft_d",
"kv_ft_d",
"hl_day_1",
"hd_ft2_d",
"cs_gal_d_ft",
"p_decimal_fraction",
"k_darcy",
"data_source",
]

labels = {
"global_id": "GlobalID",
"point_id": "PointID",
"hydraulic_unit": "HydraulicUnit",
"hydraulic_unit_type": "HydraulicUnitType",
"hydraulic_remarks": "Hydraulic Remarks",
"test_top": "TestTop",
"test_bottom": "TestBottom",
"t_ft2_d": "T (ft2/d)",
"s_dimensionless": "S (dimensionless)",
"ss_ft_1": "Ss (ft-1)",
"sy_decimalfractn": "Sy (decimalfractn)",
"kh_ft_d": "KH (ft/d)",
"kv_ft_d": "KV (ft/d)",
"hl_day_1": "HL (day-1)",
"hd_ft2_d": "HD (ft2/d)",
"cs_gal_d_ft": "Cs (gal/d/ft)",
"p_decimal_fraction": "P (decimal fraction)",
"k_darcy": "k (darcy)",
"data_source": "Data Source",
}


# ============= EOF =============================================
55 changes: 55 additions & 0 deletions alembic/versions/d1a2b3c4e5f6_create_nma_hydraulicsdata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"""Create legacy NMA_HydraulicsData table.

Revision ID: d1a2b3c4e5f6
Revises: c9f1d2e3a4b5
Create Date: 2026-02-10 04:00:00.000000
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy import inspect

# revision identifiers, used by Alembic.
revision: str = "d1a2b3c4e5f6"
down_revision: Union[str, Sequence[str], None] = "c9f1d2e3a4b5"
Comment on lines +15 to +16

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Fix missing Alembic down_revision

The migration declares down_revision as c9f1d2e3a4b5, but there is no corresponding revision file in alembic/versions, so the migration graph is disconnected and alembic upgrade head will fail to resolve this dependency. This blocks schema upgrades in any environment that runs migrations. Point down_revision at the current head revision (e.g., 5f4e2b0a6b8b) or add the missing revision.

Useful? React with 👍 / 👎.

branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
"""Create the legacy hydraulics data table used for backfill."""
bind = op.get_bind()
inspector = inspect(bind)
if not inspector.has_table("NMA_HydraulicsData"):
op.create_table(
"NMA_HydraulicsData",
sa.Column("GlobalID", sa.String(length=40), primary_key=True),
sa.Column("PointID", sa.String(length=50), nullable=True),
sa.Column("HydraulicUnit", sa.String(length=18), nullable=True),
sa.Column("TestTop", sa.SmallInteger(), nullable=False),
sa.Column("TestBottom", sa.SmallInteger(), nullable=False),
sa.Column("HydraulicUnitType", sa.String(length=2), nullable=True),
sa.Column("Hydraulic Remarks", sa.String(length=200), nullable=True),
sa.Column("T (ft2/d)", sa.Float(), nullable=True),
sa.Column("S (dimensionless)", sa.Float(), nullable=True),
sa.Column("Ss (ft-1)", sa.Float(), nullable=True),
sa.Column("Sy (decimalfractn)", sa.Float(), nullable=True),
sa.Column("KH (ft/d)", sa.Float(), nullable=True),
sa.Column("KV (ft/d)", sa.Float(), nullable=True),
sa.Column("HL (day-1)", sa.Float(), nullable=True),
sa.Column("HD (ft2/d)", sa.Float(), nullable=True),
sa.Column("Cs (gal/d/ft)", sa.Float(), nullable=True),
sa.Column("P (decimal fraction)", sa.Float(), nullable=True),
sa.Column("k (darcy)", sa.Float(), nullable=True),
sa.Column("Data Source", sa.String(length=255), nullable=True),
)


def downgrade() -> None:
"""Drop the legacy hydraulics data table."""
bind = op.get_bind()
inspector = inspect(bind)
if inspector.has_table("NMA_HydraulicsData"):
op.drop_table("NMA_HydraulicsData")
47 changes: 39 additions & 8 deletions db/nma_legacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,7 @@
from datetime import date, datetime
from typing import Optional

from sqlalchemy import (
Boolean,
Date,
DateTime,
Float,
Integer,
String,
)
from sqlalchemy import Boolean, Date, DateTime, Float, Integer, SmallInteger, String
from sqlalchemy.orm import Mapped, mapped_column

from db.base import Base
Expand Down Expand Up @@ -148,4 +141,42 @@ class ViewNGWMNLithology(Base):
)


class NMAHydraulicsData(Base):
"""
Legacy HydraulicsData table from AMPAPI.
"""

__tablename__ = "NMA_HydraulicsData"

global_id: Mapped[str] = mapped_column("GlobalID", String(40), primary_key=True)
point_id: Mapped[Optional[str]] = mapped_column("PointID", String(50))
data_source: Mapped[Optional[str]] = mapped_column("Data Source", String(255))

cs_gal_d_ft: Mapped[Optional[float]] = mapped_column("Cs (gal/d/ft)", Float)
hd_ft2_d: Mapped[Optional[float]] = mapped_column("HD (ft2/d)", Float)
hl_day_1: Mapped[Optional[float]] = mapped_column("HL (day-1)", Float)
kh_ft_d: Mapped[Optional[float]] = mapped_column("KH (ft/d)", Float)
kv_ft_d: Mapped[Optional[float]] = mapped_column("KV (ft/d)", Float)
p_decimal_fraction: Mapped[Optional[float]] = mapped_column(
"P (decimal fraction)", Float
)
s_dimensionless: Mapped[Optional[float]] = mapped_column("S (dimensionless)", Float)
ss_ft_1: Mapped[Optional[float]] = mapped_column("Ss (ft-1)", Float)
sy_decimalfractn: Mapped[Optional[float]] = mapped_column(
"Sy (decimalfractn)", Float
)
t_ft2_d: Mapped[Optional[float]] = mapped_column("T (ft2/d)", Float)
k_darcy: Mapped[Optional[float]] = mapped_column("k (darcy)", Float)

test_bottom: Mapped[int] = mapped_column("TestBottom", SmallInteger, nullable=False)
test_top: Mapped[int] = mapped_column("TestTop", SmallInteger, nullable=False)
hydraulic_unit: Mapped[Optional[str]] = mapped_column("HydraulicUnit", String(18))
hydraulic_unit_type: Mapped[Optional[str]] = mapped_column(
"HydraulicUnitType", String(2)
)
hydraulic_remarks: Mapped[Optional[str]] = mapped_column(
"Hydraulic Remarks", String(200)
)


# ============= EOF =============================================
Loading
Loading