Skip to content
Merged
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: 8 additions & 1 deletion admin/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
SampleAdmin,
HydraulicsDataAdmin,
ChemistrySampleInfoAdmin,
RadionuclidesAdmin,
GeologicFormationAdmin,
DataProvenanceAdmin,
TransducerObservationAdmin,
Expand All @@ -64,7 +65,12 @@
from db.group import Group
from db.notes import Notes
from db.sample import Sample
from db.nma_legacy import ChemistrySampleInfo, NMAHydraulicsData, SurfaceWaterData
from db.nma_legacy import (
ChemistrySampleInfo,
NMAHydraulicsData,
NMARadionuclides,
SurfaceWaterData,
)
from db.geologic_formation import GeologicFormation
from db.data_provenance import DataProvenance
from db.transducer import TransducerObservation
Expand Down Expand Up @@ -136,6 +142,7 @@ def create_admin(app):

# Hydraulics
admin.add_view(HydraulicsDataAdmin(NMAHydraulicsData))
admin.add_view(RadionuclidesAdmin(NMARadionuclides))

# Field
admin.add_view(FieldEventAdmin(FieldEvent))
Expand Down
2 changes: 2 additions & 0 deletions admin/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from admin.views.sample import SampleAdmin
from admin.views.hydraulicsdata import HydraulicsDataAdmin
from admin.views.chemistry_sampleinfo import ChemistrySampleInfoAdmin
from admin.views.radionuclides import RadionuclidesAdmin
from admin.views.geologic_formation import GeologicFormationAdmin
from admin.views.data_provenance import DataProvenanceAdmin
from admin.views.transducer_observation import TransducerObservationAdmin
Expand Down Expand Up @@ -61,6 +62,7 @@
"SampleAdmin",
"HydraulicsDataAdmin",
"ChemistrySampleInfoAdmin",
"RadionuclidesAdmin",
"GeologicFormationAdmin",
"DataProvenanceAdmin",
"TransducerObservationAdmin",
Expand Down
28 changes: 16 additions & 12 deletions admin/views/hydraulicsdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,54 +36,54 @@ class HydraulicsDataAdmin(OcotilloModelView):

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

column_list = [
list_fields = [
"global_id",
"well_id",
"point_id",
"thing_id",
"hydraulic_unit",
"hydraulic_unit_type",
"test_top",
"test_bottom",
"t_ft2_d",
"k_darcy",
"data_source",
"object_id",
]

column_sortable_list = [
sortable_fields = [
"global_id",
"well_id",
"point_id",
"thing_id",
"hydraulic_unit",
"hydraulic_unit_type",
"test_top",
"test_bottom",
"t_ft2_d",
"k_darcy",
"data_source",
"object_id",
]

search_fields = [
searchable_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",
"well_id",
"point_id",
"thing_id",
"hydraulic_unit",
"hydraulic_unit_type",
"hydraulic_remarks",
Expand All @@ -101,11 +101,14 @@ class HydraulicsDataAdmin(OcotilloModelView):
"p_decimal_fraction",
"k_darcy",
"data_source",
"object_id",
]

labels = {
field_labels = {
"global_id": "GlobalID",
"well_id": "WellID",
"point_id": "PointID",
"thing_id": "Thing ID",
"hydraulic_unit": "HydraulicUnit",
"hydraulic_unit_type": "HydraulicUnitType",
"hydraulic_remarks": "Hydraulic Remarks",
Expand All @@ -123,6 +126,7 @@ class HydraulicsDataAdmin(OcotilloModelView):
"p_decimal_fraction": "P (decimal fraction)",
"k_darcy": "k (darcy)",
"data_source": "Data Source",
"object_id": "OBJECTID",
}


Expand Down
126 changes: 126 additions & 0 deletions admin/views/radionuclides.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# ===============================================================================
# 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.
# ===============================================================================
"""
RadionuclidesAdmin view for legacy NMA_Radionuclides.
"""
from admin.views.base import OcotilloModelView


class RadionuclidesAdmin(OcotilloModelView):
"""
Admin view for NMARadionuclides model.
"""

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

name = "Radionuclides"
label = "Radionuclides"
icon = "fa fa-radiation"

can_create = False
can_edit = False
can_delete = False

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

list_fields = [
"global_id",
"sample_pt_id",
"sample_point_id",
"thing_id",
"analyte",
"sample_value",
"units",
"analysis_date",
"analyses_agency",
]

sortable_fields = [
"global_id",
"sample_pt_id",
"sample_point_id",
"thing_id",
"analyte",
"sample_value",
"units",
"analysis_date",
"analyses_agency",
"wclab_id",
"object_id",
]

fields_default_sort = [("analysis_date", True)]

searchable_fields = [
"global_id",
"sample_pt_id",
"sample_point_id",
"analyte",
"symbol",
"analysis_method",
"analysis_date",
"notes",
"analyses_agency",
"wclab_id",
]

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

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

fields = [
"global_id",
"sample_pt_id",
"sample_point_id",
"thing_id",
"analyte",
"symbol",
"sample_value",
"units",
"uncertainty",
"analysis_method",
"analysis_date",
"notes",
"volume",
"volume_unit",
"object_id",
"analyses_agency",
"wclab_id",
]

field_labels = {
"global_id": "GlobalID",
"sample_pt_id": "SamplePtID",
"sample_point_id": "SamplePointID",
"thing_id": "Thing ID",
"analyte": "Analyte",
"symbol": "Symbol",
"sample_value": "SampleValue",
"units": "Units",
"uncertainty": "Uncertainty",
"analysis_method": "AnalysisMethod",
"analysis_date": "AnalysisDate",
"notes": "Notes",
"volume": "Volume",
"volume_unit": "VolumeUnit",
"object_id": "OBJECTID",
"analyses_agency": "AnalysesAgency",
"wclab_id": "WCLab_ID",
}


# ============= EOF =============================================
18 changes: 17 additions & 1 deletion alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from alembic import context
from dotenv import load_dotenv
from sqlalchemy import engine_from_config, pool, create_engine
from sqlalchemy import create_engine, engine_from_config, pool, text

from services.util import get_bool_env

Expand Down Expand Up @@ -157,13 +157,29 @@ def getconn():
)

with connectable.connect() as connection:
autocommit_conn = connection.execution_options(isolation_level="AUTOCOMMIT")
role_exists = autocommit_conn.execute(
text("SELECT 1 FROM pg_roles WHERE rolname = 'app_read'")
).first()
if not role_exists:
autocommit_conn.execute(text("CREATE ROLE app_read"))

context.configure(
connection=connection,
target_metadata=target_metadata,
include_object=include_object,
)
with context.begin_transaction():
context.run_migrations()
connection.execute(
text(
"""
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_read;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO app_read;
"""
)
)


if context.is_offline_mode():
Expand Down
29 changes: 28 additions & 1 deletion alembic/versions/d1a2b3c4e5f6_create_nma_hydraulicsdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from alembic import op
import sqlalchemy as sa
from sqlalchemy import inspect
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = "d1a2b3c4e5f6"
Expand All @@ -25,7 +26,13 @@ def upgrade() -> None:
if not inspector.has_table("NMA_HydraulicsData"):
op.create_table(
"NMA_HydraulicsData",
sa.Column("GlobalID", sa.String(length=40), primary_key=True),
sa.Column(
"GlobalID",
postgresql.UUID(as_uuid=True),
primary_key=True,
nullable=False,
),
sa.Column("WellID", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("PointID", sa.String(length=50), nullable=True),
sa.Column("HydraulicUnit", sa.String(length=18), nullable=True),
sa.Column(
Expand All @@ -50,6 +57,23 @@ def upgrade() -> None:
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),
sa.Column("OBJECTID", sa.Integer(), nullable=True),
)
op.create_index(
"ix_nma_hydraulicsdata_objectid",
"NMA_HydraulicsData",
["OBJECTID"],
unique=True,
)
op.create_index(
"ix_nma_hydraulicsdata_pointid",
"NMA_HydraulicsData",
["PointID"],
)
op.create_index(
"ix_nma_hydraulicsdata_wellid",
"NMA_HydraulicsData",
["WellID"],
)


Expand All @@ -58,4 +82,7 @@ def downgrade() -> None:
bind = op.get_bind()
inspector = inspect(bind)
if inspector.has_table("NMA_HydraulicsData"):
op.drop_index("ix_nma_hydraulicsdata_wellid", table_name="NMA_HydraulicsData")
op.drop_index("ix_nma_hydraulicsdata_pointid", table_name="NMA_HydraulicsData")
op.drop_index("ix_nma_hydraulicsdata_objectid", table_name="NMA_HydraulicsData")
op.drop_table("NMA_HydraulicsData")
Loading
Loading