gea-program 0.31.0__tar.gz → 0.32.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gea_program-0.31.0 → gea_program-0.32.0}/PKG-INFO +19 -2
- {gea_program-0.31.0 → gea_program-0.32.0}/README.md +18 -1
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/__init__.py +1 -1
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/__main__.py +39 -4
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/acceptance_tests.py +166 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/gamma.py +2 -2
- gea_program-0.32.0/gea/help/setup.md +11 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/helplib.py +2 -1
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/osdu.py +5 -5
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/ppdm.py +7 -1
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/service.py +31 -2
- gea_program-0.32.0/gea/setup_checklist.py +256 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/sra.py +1 -1
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/web/app.html +77 -2
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/workspace.py +16 -2
- {gea_program-0.31.0 → gea_program-0.32.0}/gea_program.egg-info/PKG-INFO +19 -2
- {gea_program-0.31.0 → gea_program-0.32.0}/gea_program.egg-info/SOURCES.txt +2 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/pyproject.toml +1 -1
- {gea_program-0.31.0 → gea_program-0.32.0}/LICENSE +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/accuracy_statement.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/alarm_engine.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/backup.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/bench.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/blind_harness.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/med_160_sapropels.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog_map.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/catalog_register.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/certificates.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/cli.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/client_reports.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/config_versioning.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/conformance.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/correlation.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/dashboard.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/deviation.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/dlis.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/dnp3.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/doctor.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/downhole_engine.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/drift_monitor.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/earth_model.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/edr.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/elevation.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/etp.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/etp12_schemas.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/example_register_map.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/fat_sat.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/files.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/fixtures/README.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/fixtures/ne_110m_coastline.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/follower.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/forward_model.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/friction_priors.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/gauge_aging.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/gauge_specs.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/geodesy.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/gravity_reference.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/hartip.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/TESTER_GUIDE.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/alarms.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/audit-update.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/backup.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/catalog.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/conformance.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/data-in.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/dlis.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/doctor.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/drift.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/edr.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/etp.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/field-ports.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/files.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/historian.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/instruments.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/interval.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/month-end.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/notifications.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/osdu.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/patches.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/ppdm.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/quakeml.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/quality.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/seedlink.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/seismic.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/site.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/sites.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/slip.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/soak.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/sra.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/start.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/structure.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/tools.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/transients.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/upkeep.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/vibration.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/help/well-tests.md +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/housekeeping.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/interval.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/inverse_engine.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/jobs.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/live_ports.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/loadtest.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/matplotlib_demo.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/modbus.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/modbus_rtu.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/model_card.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/month_end.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/mqtt_port.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/notify.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/opcua_port.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/operator_app.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/patches.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/permits.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/piwebapi.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/ports.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/profile_catalog.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/project.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/qt6_downhole_app.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/quakeml.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reconciler.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/libmseed_steim.provenance.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/reference/tool_sources.json +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/rock_inventory.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/sample_record.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/sample_well_profile.csv +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/sbom.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seedlink.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/segy.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_array.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_assoc.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_detect.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_film.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_harmonic.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_qc.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_response.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_signature.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_track.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_uncertainty.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/seismic_unlisted.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/sensor_swap.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/service_life.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/shapefile.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/shell.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/shut_in.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/sla_report.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/slip.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/soak.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/store_forward.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/strata_join.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/structure.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/supervisor.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/survey_cmd.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/survey_view.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/telemetry.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/tool_catalog.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/tool_library.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/tool_taxonomy.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/transient.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/vibration.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/well_assembler.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/well_test_validation.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/wits0.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea/witsml.py +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea_program.egg-info/dependency_links.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea_program.egg-info/entry_points.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea_program.egg-info/requires.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/gea_program.egg-info/top_level.txt +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/setup.cfg +0 -0
- {gea_program-0.31.0 → gea_program-0.32.0}/tests/test_acceptance.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gea-program
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.32.0
|
|
4
4
|
Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
|
|
5
5
|
Author: Daniel T. Murphy
|
|
6
6
|
License: MPL-2.0
|
|
@@ -125,7 +125,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
|
|
|
125
125
|
gea client-report --report accuracy --out client_report
|
|
126
126
|
gea model-cards --out model_cards
|
|
127
127
|
gea sbom --out sbom
|
|
128
|
-
gea accept # the product gate (
|
|
128
|
+
gea accept # the product gate (383 checks)
|
|
129
129
|
gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
|
|
130
130
|
gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
|
|
131
131
|
gea gui # the desktop window (pip install "gea-program[desktop]")
|
|
@@ -648,6 +648,23 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
|
|
|
648
648
|
itself; `gea help seedlink`. A TexNet station is served by EarthScope at
|
|
649
649
|
`rtserve.iris.washington.edu:18000`, network `TX`.
|
|
650
650
|
|
|
651
|
+
### The setup checklist
|
|
652
|
+
|
|
653
|
+
The Setup tab (`#/setup`, `gea checklist --workspace C:\site`) says what a
|
|
654
|
+
workspace still needs before its reports can be handed over, read from the
|
|
655
|
+
workspace as it stands: an administrator, the wells, a site record naming
|
|
656
|
+
the client, a backup folder off the machine, a current backup, the daily
|
|
657
|
+
schedule, current reports, and for each well its surface location and
|
|
658
|
+
datum, its reference elevation with its source, and its US Well Number.
|
|
659
|
+
Each item carries its own form or button - declare the position, take the
|
|
660
|
+
ground level from USGS 3DEP to check, create the site, back up now - and,
|
|
661
|
+
where every value is already known, the command to paste. The tab's badge
|
|
662
|
+
counts the required items still to do and the Home page names the next
|
|
663
|
+
one. A drilling record's depth events are confirmed by a person against
|
|
664
|
+
the daily drilling reports, with a note; the confirmation stops counting
|
|
665
|
+
if the record changes. `gea checklist` exits 0 when everything required is
|
|
666
|
+
done. `gea help setup`.
|
|
667
|
+
|
|
651
668
|
### Tools and ports
|
|
652
669
|
|
|
653
670
|
The Tools & ports tab (`#/tools`, `gea tools`) opens on the **downhole tool
|
|
@@ -86,7 +86,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
|
|
|
86
86
|
gea client-report --report accuracy --out client_report
|
|
87
87
|
gea model-cards --out model_cards
|
|
88
88
|
gea sbom --out sbom
|
|
89
|
-
gea accept # the product gate (
|
|
89
|
+
gea accept # the product gate (383 checks)
|
|
90
90
|
gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
|
|
91
91
|
gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
|
|
92
92
|
gea gui # the desktop window (pip install "gea-program[desktop]")
|
|
@@ -609,6 +609,23 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
|
|
|
609
609
|
itself; `gea help seedlink`. A TexNet station is served by EarthScope at
|
|
610
610
|
`rtserve.iris.washington.edu:18000`, network `TX`.
|
|
611
611
|
|
|
612
|
+
### The setup checklist
|
|
613
|
+
|
|
614
|
+
The Setup tab (`#/setup`, `gea checklist --workspace C:\site`) says what a
|
|
615
|
+
workspace still needs before its reports can be handed over, read from the
|
|
616
|
+
workspace as it stands: an administrator, the wells, a site record naming
|
|
617
|
+
the client, a backup folder off the machine, a current backup, the daily
|
|
618
|
+
schedule, current reports, and for each well its surface location and
|
|
619
|
+
datum, its reference elevation with its source, and its US Well Number.
|
|
620
|
+
Each item carries its own form or button - declare the position, take the
|
|
621
|
+
ground level from USGS 3DEP to check, create the site, back up now - and,
|
|
622
|
+
where every value is already known, the command to paste. The tab's badge
|
|
623
|
+
counts the required items still to do and the Home page names the next
|
|
624
|
+
one. A drilling record's depth events are confirmed by a person against
|
|
625
|
+
the daily drilling reports, with a note; the confirmation stops counting
|
|
626
|
+
if the record changes. `gea checklist` exits 0 when everything required is
|
|
627
|
+
done. `gea help setup`.
|
|
628
|
+
|
|
612
629
|
### Tools and ports
|
|
613
630
|
|
|
614
631
|
The Tools & ports tab (`#/tools`, `gea tools`) opens on the **downhole tool
|
|
@@ -468,6 +468,13 @@ def main(argv=None) -> int:
|
|
|
468
468
|
p_ws.add_argument("--sat", action="store_true", help="refresh: also run the SAT protocol")
|
|
469
469
|
p_ws.add_argument("--outage", action="append", default=None, help="refresh: outage window start/end (ISO), repeatable")
|
|
470
470
|
|
|
471
|
+
p_ck = sub.add_parser("checklist", help="the setup checklist: what this workspace still needs before its reports can be handed over - read from the workspace as it stands")
|
|
472
|
+
p_ck.add_argument("--workspace", type=str, default=None, help="the workspace folder, e.g. C:\\site")
|
|
473
|
+
p_ck.add_argument("--json", action="store_true")
|
|
474
|
+
p_ck.add_argument("--confirm", type=str, default=None, help="record a person's check of a confirmation item, e.g. events:Well-30636033")
|
|
475
|
+
p_ck.add_argument("--note", type=str, default="", help="--confirm: what it was checked against (required)")
|
|
476
|
+
p_ck.add_argument("--actor", type=str, default="cli")
|
|
477
|
+
|
|
471
478
|
p_sv = sub.add_parser("serve", help="serve the dashboard over a workspace: the page, the reports and the JSON API (standard library HTTP)")
|
|
472
479
|
p_sv.add_argument("--workspace", type=str, required=True, help="the workspace folder (gea workspace --action init)")
|
|
473
480
|
p_sv.add_argument("--host", type=str, default="127.0.0.1", help="bind address; 0.0.0.0 exposes it on the site network (put TLS in front)")
|
|
@@ -1890,6 +1897,31 @@ def main(argv=None) -> int:
|
|
|
1890
1897
|
elif a.cmd == "update":
|
|
1891
1898
|
from .doctor import update as _update
|
|
1892
1899
|
return _update(check_only=a.check, extras=a.extras, as_json=a.json)
|
|
1900
|
+
elif a.cmd == "checklist":
|
|
1901
|
+
import json as _json
|
|
1902
|
+
from . import setup_checklist as _SC
|
|
1903
|
+
from .cli import _safe_stdout
|
|
1904
|
+
from .workspace import Workspace, WorkspaceError
|
|
1905
|
+
_safe_stdout()
|
|
1906
|
+
if not a.workspace:
|
|
1907
|
+
raise SystemExit("checklist needs --workspace, e.g. --workspace C:\\site")
|
|
1908
|
+
try:
|
|
1909
|
+
ws = Workspace(a.workspace)
|
|
1910
|
+
except WorkspaceError as e:
|
|
1911
|
+
raise SystemExit(f"checklist: {e}")
|
|
1912
|
+
if a.confirm:
|
|
1913
|
+
try:
|
|
1914
|
+
rec = _SC.confirm(ws, a.confirm, a.actor, a.note)
|
|
1915
|
+
except ValueError as e:
|
|
1916
|
+
raise SystemExit(f"checklist: {e}")
|
|
1917
|
+
print(f"confirmed {a.confirm} by {rec['by']} at {rec['utc']}: {rec['note']}")
|
|
1918
|
+
return 0
|
|
1919
|
+
r = _SC.checklist(ws)
|
|
1920
|
+
if a.json:
|
|
1921
|
+
print(_json.dumps(r, indent=1))
|
|
1922
|
+
else:
|
|
1923
|
+
print(_SC.text(r))
|
|
1924
|
+
return 0 if r["ready"] else 2
|
|
1893
1925
|
elif a.cmd == "serve":
|
|
1894
1926
|
from .service import Service
|
|
1895
1927
|
from .workspace import WorkspaceError
|
|
@@ -2078,16 +2110,19 @@ def main(argv=None) -> int:
|
|
|
2078
2110
|
print(f"3DEP ground elevation {r['elev_ft']:,.2f} ft ({r['source']})")
|
|
2079
2111
|
elif a.ref_elev_ft is not None or a.ref_elev_datum or a.ref_elev_source:
|
|
2080
2112
|
surface["elevation"] = {"ft": a.ref_elev_ft, "datum": a.ref_elev_datum, "source": a.ref_elev_source}
|
|
2081
|
-
|
|
2113
|
+
identity = {"api_number": a.api} if a.api else {}
|
|
2114
|
+
disposal = {k: v for k, v in {"uic_number": a.uic, "depth_tier": a.depth_tier, "formation_basis": a.formation,
|
|
2082
2115
|
"channel_pressure": a.channel_pressure, "channel_rate": a.channel_rate, "rate_unit": a.rate_unit,
|
|
2083
2116
|
"bhp_method": a.bhp_method, "channel_bhp": a.channel_bhp, "top_interval_ft": a.top_interval_ft,
|
|
2084
2117
|
"base_interval_ft": a.base_interval_ft, "depth_reference": a.depth_ref,
|
|
2085
2118
|
"gradient_psi_ft": a.gradient_psi_ft}.items() if v is not None}
|
|
2086
|
-
if
|
|
2119
|
+
if a.api and (disposal or (ws.well(a.well).get("disposal") or {})):
|
|
2120
|
+
disposal["api_number"] = a.api # a disposal well keeps its number in the block the SRA packet reads too
|
|
2121
|
+
if not surface and not disposal and not identity:
|
|
2087
2122
|
raise SystemExit("set-well: nothing to declare (give --lat/--lon, --ref-elev-ft, or any of --api --uic --depth-tier --top-interval-ft ...)")
|
|
2088
2123
|
surface = surface or None
|
|
2089
|
-
w = ws.set_well(a.well, surface=surface, disposal=disposal or None, actor=a.actor)
|
|
2090
|
-
print(f"well {a.well}: surface {w.get('surface')}; disposal {w.get('disposal')}"); return 0
|
|
2124
|
+
w = ws.set_well(a.well, surface=surface, disposal=disposal or None, identity=identity or None, actor=a.actor)
|
|
2125
|
+
print(f"well {a.well}: surface {w.get('surface')}; identity {w.get('identity')}; disposal {w.get('disposal')}"); return 0
|
|
2091
2126
|
elif a.action == "sra-define":
|
|
2092
2127
|
if not a.site or not a.name or a.lat is None or a.lon is None or a.radius_km is None or not a.plan_date:
|
|
2093
2128
|
raise SystemExit("sra-define needs --site, --name, --lat, --lon, --radius-km and --plan-date")
|
|
@@ -8005,6 +8005,171 @@ def section_bz_tool_library(tmp: str) -> None:
|
|
|
8005
8005
|
"a placeholder; the help page"
|
|
8006
8006
|
+ (f" [failed: {', '.join(failed3)}]" if failed3 else ""))
|
|
8007
8007
|
|
|
8008
|
+
|
|
8009
|
+
def section_ca_setup_checklist(tmp: str) -> None:
|
|
8010
|
+
"""Section CA - the setup checklist: what a workspace still needs before its reports can be handed over, read from
|
|
8011
|
+
the workspace as it stands, each item with its form, button or command; a producing well's US Well Number declared as
|
|
8012
|
+
its identity, not as a disposal well's; a drilling record with depth events written through the client-report guard."""
|
|
8013
|
+
import http.cookiejar
|
|
8014
|
+
import subprocess as _sp
|
|
8015
|
+
import urllib.request
|
|
8016
|
+
import urllib.error
|
|
8017
|
+
from . import edr as E
|
|
8018
|
+
from . import backup as BK
|
|
8019
|
+
from . import ppdm as PP
|
|
8020
|
+
from . import helplib as H
|
|
8021
|
+
from . import setup_checklist as SC
|
|
8022
|
+
from .client_reports import FORBIDDEN_TERMS
|
|
8023
|
+
from .workspace import Workspace
|
|
8024
|
+
from .service import Service, Users
|
|
8025
|
+
pkg = Path(__file__).parent
|
|
8026
|
+
d = Path(tmp, "ca"); d.mkdir()
|
|
8027
|
+
|
|
8028
|
+
def _raises(fn, exc, words=""):
|
|
8029
|
+
try:
|
|
8030
|
+
fn()
|
|
8031
|
+
except exc as e:
|
|
8032
|
+
return words in str(e)
|
|
8033
|
+
return False
|
|
8034
|
+
|
|
8035
|
+
ev = E.selftest_events(str(d))
|
|
8036
|
+
wsp = str(d / "ws"); ws = Workspace.create(wsp, "Pad 3", actor="tester")
|
|
8037
|
+
w = ws.add_well_file(ev["path"], display="Well 30693545", actor="tester")
|
|
8038
|
+
ws.refresh_dashboard(actor="tester")
|
|
8039
|
+
rdir = Path(wsp, "reports", "wells", w["id"])
|
|
8040
|
+
rec = json.loads((rdir / "drilling_record.json").read_text(encoding="utf-8")) if (rdir / "drilling_record.json").is_file() else {}
|
|
8041
|
+
flat_msg = ""
|
|
8042
|
+
try:
|
|
8043
|
+
E.gamma_lithology(E.gamma_log(E.read(ev["path"]), keep=E._keep_masks(E.read(ev["path"]), E.depth_events(E.read(ev["path"])))[1]))
|
|
8044
|
+
except ValueError as e:
|
|
8045
|
+
flat_msg = str(e)
|
|
8046
|
+
flat_lith = (rec.get("gamma") or {}).get("lithology") or {}
|
|
8047
|
+
Users(str(Path(wsp, "users.json"))).add("admin1", "admin-pass-12", "admin")
|
|
8048
|
+
r0 = SC.checklist(ws)
|
|
8049
|
+
ids = {i["id"]: i for i in r0["items"]}
|
|
8050
|
+
r_cli0 = _sp.run([sys.executable, "-m", "gea", "checklist", "--workspace", wsp], capture_output=True, text=True)
|
|
8051
|
+
c1 = {
|
|
8052
|
+
"edr_record": rec.get("total_depth_md_ft") == 5750.0 and len(rec.get("depth_events") or []) == 4 and not (rdir / "drilling_record_not_written.json").exists()
|
|
8053
|
+
and not any(t in json.dumps(rec).lower() for t in FORBIDDEN_TERMS),
|
|
8054
|
+
"items": {"accounts", "wells", "site", "backup_folder", "backup_taken", "backup_schedule", "reports_current", "fleet", "stress", "layers",
|
|
8055
|
+
f"surface:{w['id']}", f"elevation:{w['id']}", f"api:{w['id']}", f"events:{w['id']}"} == set(ids)
|
|
8056
|
+
and r0["counts"]["required"] == 10 and r0["counts"]["required_done"] == 3 and r0["next"] == "site" and not r0["ready"]
|
|
8057
|
+
and ids["accounts"]["status"] == "DONE" and ids["wells"]["status"] == "DONE" and ids["reports_current"]["status"] == "DONE"
|
|
8058
|
+
and ids[f"surface:{w['id']}"]["status"] == "TO DO" and ids[f"events:{w['id']}"]["level"] == "recommended"
|
|
8059
|
+
and ids[f"elevation:{w['id']}"]["action"]["needs_surface"] is True,
|
|
8060
|
+
"commands": all("<" not in (i.get("cli") or "") for i in r0["items"]) and ids["reports_current"]["cli"] == f"gea workspace --path {wsp} --action refresh"
|
|
8061
|
+
and ids[f"surface:{w['id']}"]["cli"] is None and "survey plat" in " ".join(ids[f"surface:{w['id']}"]["needs"]),
|
|
8062
|
+
"text": "3 of 10 required done" in SC.text(r0) and "[ ] Surface location and its datum" in SC.text(r0) and "needs: latitude and longitude" in SC.text(r0)
|
|
8063
|
+
and "Next: A site record ties the wells to the client." in SC.text(r0),
|
|
8064
|
+
"cli": r_cli0.returncode == 2 and "Setup checklist - Pad 3: 3 of 10 required done" in r_cli0.stdout,
|
|
8065
|
+
"confirm_rules": _raises(lambda: SC.confirm(ws, f"events:{w['id']}", "tester", ""), ValueError, "needs a note")
|
|
8066
|
+
and _raises(lambda: SC.confirm(ws, "site", "tester", "x"), ValueError, "not an item"),
|
|
8067
|
+
"flat_gamma": bool(flat_msg) and "none is invented" in flat_msg and not any(t in flat_msg.lower() for t in FORBIDDEN_TERMS)
|
|
8068
|
+
and "none is invented" in str(flat_lith.get("why", "")),
|
|
8069
|
+
}
|
|
8070
|
+
SC.confirm(ws, f"events:{w['id']}", "tester", "daily drilling reports 1-3 Jul 2026")
|
|
8071
|
+
c_ok = {i["id"]: i for i in SC.checklist(ws)["items"]}[f"events:{w['id']}"]
|
|
8072
|
+
cf = json.loads(Path(wsp, "config", "checklist.json").read_text(encoding="utf-8"))
|
|
8073
|
+
cf["confirmed"][f"events:{w['id']}"]["basis"] = "2 event(s), TD 5000.0"
|
|
8074
|
+
Path(wsp, "config", "checklist.json").write_text(json.dumps(cf), encoding="utf-8")
|
|
8075
|
+
c_stale = {i["id"]: i for i in SC.checklist(ws)["items"]}[f"events:{w['id']}"]
|
|
8076
|
+
c1["confirm"] = (c_ok["status"] == "DONE" and "confirmed by tester" in c_ok["detail"] and "daily drilling reports 1-3 Jul 2026" in c_ok["detail"]
|
|
8077
|
+
and c_stale["status"] == "TO DO" and "check again" in c_stale["detail"] and '"checklist.confirm"' in Path(wsp, "records", "audit.jsonl").read_text(encoding="utf-8"))
|
|
8078
|
+
SC.confirm(ws, f"events:{w['id']}", "tester", "daily drilling reports 1-3 Jul 2026")
|
|
8079
|
+
failed1 = [k for k, v in c1.items() if not v]
|
|
8080
|
+
ok(not failed1,
|
|
8081
|
+
"CA1 the checklist read from the workspace: ten required items for a workspace with one drilling-recorder well (the accounts, the wells, a site "
|
|
8082
|
+
"record with the client, the backup folder, a current backup, the daily schedule, current reports, and the well's surface location, reference "
|
|
8083
|
+
"elevation and US Well Number), the fleet and the depth-event check recommended, stress and layers optional; the next item named; a command "
|
|
8084
|
+
"printed only where it can be pasted as it stands; `gea checklist` exits 2 until it is ready; a confirmation needs its note, is kept with the "
|
|
8085
|
+
"name and time, and stops counting when the drilling record changes; a flat gamma curve's message, and the drilling record that carries it, pass "
|
|
8086
|
+
"the client-report guard"
|
|
8087
|
+
+ (f" [failed: {', '.join(failed1)}]" if failed1 else ""))
|
|
8088
|
+
|
|
8089
|
+
# the well number: a producing well's identity, not a disposal well's
|
|
8090
|
+
w2 = ws.add_well_file(ev["path"], display="Producer 2", actor="tester")
|
|
8091
|
+
r_api = _sp.run([sys.executable, "-m", "gea", "workspace", "--path", wsp, "--action", "set-well", "--well", w2["id"], "--api", "42-109-33456"], capture_output=True, text=True)
|
|
8092
|
+
w2r = ws.well(w2["id"])
|
|
8093
|
+
ws.set_well(w2["id"], disposal={"uic_number": "000123"}, actor="tester")
|
|
8094
|
+
r_api2 = _sp.run([sys.executable, "-m", "gea", "workspace", "--path", wsp, "--action", "set-well", "--well", w2["id"], "--api", "42-109-33457"], capture_output=True, text=True)
|
|
8095
|
+
w2d = ws.well(w2["id"])
|
|
8096
|
+
ident = PP.well_identity(w2r)
|
|
8097
|
+
ws.remove_well(w2["id"], actor="tester")
|
|
8098
|
+
users = Users(str(Path(wsp, "users.json"))); users.add("op", "operator-pass-1", "operator"); users.add("v", "viewer-pass-1", "viewer")
|
|
8099
|
+
out_dir = str(d / "backups")
|
|
8100
|
+
svc = Service(wsp, port=0, scheduler=False).start()
|
|
8101
|
+
base_url = svc.url.rstrip("/")
|
|
8102
|
+
|
|
8103
|
+
def session(name, pw):
|
|
8104
|
+
o = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
|
|
8105
|
+
|
|
8106
|
+
def call(method, path, body=None):
|
|
8107
|
+
req = urllib.request.Request(base_url + path, method=method, data=(json.dumps(body).encode() if body is not None else None))
|
|
8108
|
+
req.add_header("Content-Type", "application/json"); req.add_header("X-GEA-Action", "1")
|
|
8109
|
+
try:
|
|
8110
|
+
with o.open(req, timeout=120) as rr_:
|
|
8111
|
+
return rr_.status, json.loads(rr_.read())
|
|
8112
|
+
except urllib.error.HTTPError as e:
|
|
8113
|
+
return e.code, json.loads(e.read())
|
|
8114
|
+
call("POST", "/api/login", {"name": name, "password": pw})
|
|
8115
|
+
return call
|
|
8116
|
+
try:
|
|
8117
|
+
view, op, adm = session("v", "viewer-pass-1"), session("op", "operator-pass-1"), session("admin1", "admin-pass-12")
|
|
8118
|
+
st_ck, ck = view("GET", "/api/setup/checklist")
|
|
8119
|
+
st_b0, b0 = view("GET", "/api/badges")
|
|
8120
|
+
st_sv, _ = view("POST", "/api/sites/add", {"display": "Pad 3", "client": "Acme", "wells": [w["id"]]})
|
|
8121
|
+
st_s, site = op("POST", "/api/sites/add", {"display": "Pad 3", "client": "Acme Operating", "wells": [w["id"]]})
|
|
8122
|
+
st_s2, s2 = op("POST", "/api/sites/add", {"display": "Empty", "client": "Acme", "wells": []})
|
|
8123
|
+
st_d1, _ = op("POST", f"/api/wells/{w['id']}/declare", {"surface": {"lat": 31.84, "lon": -104.21, "datum": "NAD83"}})
|
|
8124
|
+
st_d2, _ = op("POST", f"/api/wells/{w['id']}/declare", {"surface": {"elevation": {"ft": 3532.5, "datum": "KB", "source": "completion report W-2"}}})
|
|
8125
|
+
st_d3, wd3 = op("POST", f"/api/wells/{w['id']}/declare", {"identity": {"api_number": "42-109-33456"}})
|
|
8126
|
+
st_bc, _ = adm("POST", "/api/backup/config", {"out_dir": out_dir})
|
|
8127
|
+
st_bs, _ = adm("POST", "/api/backup/schedule", {})
|
|
8128
|
+
st_cv, _ = view("POST", "/api/setup/confirm", {"item": f"events:{w['id']}", "note": "x"})
|
|
8129
|
+
BK.make(wsp, out_dir, actor="tester")
|
|
8130
|
+
st_ck2, ck2 = view("GET", "/api/setup/checklist")
|
|
8131
|
+
st_b1, b1 = view("GET", "/api/badges")
|
|
8132
|
+
finally:
|
|
8133
|
+
svc.stop()
|
|
8134
|
+
r_cli1 = _sp.run([sys.executable, "-m", "gea", "checklist", "--workspace", wsp], capture_output=True, text=True)
|
|
8135
|
+
c2 = {
|
|
8136
|
+
"identity": r_api.returncode == 0 and (w2r.get("identity") or {}).get("api_number") == "42-109-33456" and "disposal" not in w2r
|
|
8137
|
+
and not any("no US Well Number" in g for g in ident["gaps"]) and PP.declared_api(w2r) == "42-109-33456"
|
|
8138
|
+
and r_api2.returncode == 0 and (w2d.get("disposal") or {}).get("api_number") == "42-109-33457" and (w2d.get("identity") or {}).get("api_number") == "42-109-33457",
|
|
8139
|
+
"api": st_ck == 200 and ck["counts"]["required"] == 10 and st_b0 == 200 and b0.get("setup_todo") == 7
|
|
8140
|
+
and st_sv == 403 and st_s == 200 and site["client"] == "Acme Operating" and st_s2 == 400 and "nothing in it" in s2.get("error", "")
|
|
8141
|
+
and st_d1 == 200 and st_d2 == 200 and st_d3 == 200 and wd3["identity"]["api_number"] == "42-109-33456" and "disposal" not in wd3
|
|
8142
|
+
and st_bc == 200 and st_bs == 200 and st_cv == 403,
|
|
8143
|
+
"ready": st_ck2 == 200 and ck2["ready"] and ck2["counts"]["required_done"] == 10 and st_b1 == 200 and b1.get("setup_todo") == 0
|
|
8144
|
+
and r_cli1.returncode == 0 and "Ready to hand over." in r_cli1.stdout and "[x] US Well Number (API)" in r_cli1.stdout
|
|
8145
|
+
and "42-109-33456 - Texas, county 109" in r_cli1.stdout,
|
|
8146
|
+
}
|
|
8147
|
+
failed2 = [k for k, v in c2.items() if not v]
|
|
8148
|
+
if "ready" in failed2:
|
|
8149
|
+
failed2.append("left: " + ", ".join(i["id"] for i in ck2.get("items", []) if i["level"] == "required" and i["status"] != "DONE"))
|
|
8150
|
+
ok(not failed2,
|
|
8151
|
+
"CA2 done through the page's own calls: a site created with its client (an operator's act, not a viewer's; a site with no wells turned away), "
|
|
8152
|
+
"the surface location, the reference elevation and the US Well Number declared, the backup folder set and the daily backup scheduled by an "
|
|
8153
|
+
"administrator, a backup taken - and the checklist ready, the Setup badge at zero, `gea checklist` exiting 0; a US Well Number declared for "
|
|
8154
|
+
"a producing well is its identity and does not make it a disposal well, while a disposal well's number stays where the SRA packet reads it"
|
|
8155
|
+
+ (f" [failed: {', '.join(failed2)}]" if failed2 else ""))
|
|
8156
|
+
|
|
8157
|
+
page_src = (pkg / "web" / "app.html").read_text(encoding="utf-8")
|
|
8158
|
+
help_md = (pkg / "help" / "setup.md").read_text(encoding="utf-8")
|
|
8159
|
+
c3 = {
|
|
8160
|
+
"page": all(x in page_src for x in ("VIEWS.setup", "['#/setup', 'Setup']", "'#/setup': b => [b.setup_todo", "/api/setup/checklist", "/api/setup/confirm",
|
|
8161
|
+
"/api/sites/add", 'data-kind="surface"', 'data-kind="elevation"', 'data-kind="api"', 'data-kind="site"',
|
|
8162
|
+
'data-kind="backup_folder"', 'data-kind="confirm"', "Go to the next item", 'role="progressbar"', "Ground level from 3DEP",
|
|
8163
|
+
"ck-home", "Show done items")),
|
|
8164
|
+
"help": any(t["topic"] == "setup" for t in H.topics()) and not H.check("setup") and H.VIEW_TOPIC.get("setup") == "setup"
|
|
8165
|
+
and "a done item as a correct one" in help_md.split("will not call a measurement")[1],
|
|
8166
|
+
}
|
|
8167
|
+
failed3 = [k for k, v in c3.items() if not v]
|
|
8168
|
+
ok(not failed3,
|
|
8169
|
+
"CA3 the Setup tab with its badge, the Home page's next item, each item's form or button, the progress bar, the done items folded away on "
|
|
8170
|
+
"request; the help page and its view mapping"
|
|
8171
|
+
+ (f" [failed: {', '.join(failed3)}]" if failed3 else ""))
|
|
8172
|
+
|
|
8008
8173
|
def main() -> int:
|
|
8009
8174
|
print("GEA-Program - ACCEPTANCE SUITE (the product gate)")
|
|
8010
8175
|
# a handle a job subprocess still holds at the end must not turn a finished gate into a traceback on Windows:
|
|
@@ -8086,6 +8251,7 @@ def main() -> int:
|
|
|
8086
8251
|
section_bx_pasteable(tmp)
|
|
8087
8252
|
section_by_edr(tmp)
|
|
8088
8253
|
section_bz_tool_library(tmp)
|
|
8254
|
+
section_ca_setup_checklist(tmp)
|
|
8089
8255
|
if _FAILS:
|
|
8090
8256
|
print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
|
|
8091
8257
|
for f in _FAILS:
|
|
@@ -81,8 +81,8 @@ def shale_volume(gr: np.ndarray,
|
|
|
81
81
|
if gr_shale <= gr_clean:
|
|
82
82
|
raise ValueError(
|
|
83
83
|
f"GR_shale ({gr_shale:g}) must exceed GR_clean ({gr_clean:g}) - "
|
|
84
|
-
"a flat curve carries no lithology contrast
|
|
85
|
-
"
|
|
84
|
+
"a flat curve carries no lithology contrast, and none is "
|
|
85
|
+
"invented")
|
|
86
86
|
raw = (g - gr_clean) / (gr_shale - gr_clean)
|
|
87
87
|
vsh = np.clip(raw, 0.0, 1.0)
|
|
88
88
|
clamped = int(np.sum((raw < 0.0) | (raw > 1.0)) - np.sum(np.isnan(raw)))
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# The setup checklist
|
|
2
|
+
|
|
3
|
+
> What this workspace still needs before its reports can be handed over, read from the workspace as it stands. An item is done because what it asks for is there - a declared surface location, a backup on the disk, a site record naming the client - and to do otherwise, with what is missing named. Required items are counted; recommended and optional ones are shown beside them. The Setup tab carries a badge with the required items still to do, and the Home page says which one is next.
|
|
4
|
+
|
|
5
|
+
**The command**: the page is Setup on the dashboard. Each item carries its own form or button: the surface location and its datum, the reference elevation (kelly bushing, ground level or derrick floor) with its source - or the ground level from the USGS 3DEP point service at the declared position, to check before declaring - and the US Well Number for each well; Create the site with its client and its wells; the backup folder, Back up now and the daily schedule; Refresh the reports. "Go to the next item" takes you to the first required item not done. At the command line, `gea checklist --workspace C:\site` prints the list and exits 0 when every required item is done, 2 when one is not; `--json` is the machine record. Where every value is known the item prints the command to run as it stands; where the operator must supply a value it names the values and where they come from instead. A drilling record's depth events are confirmed by a person against the daily drilling reports: on the page, or `gea checklist --workspace C:\site --confirm events:Well-30636033 --note "daily drilling reports, 30 Jun to 12 Jul"`.
|
|
6
|
+
|
|
7
|
+
**What it writes**: the checklist itself writes nothing - it is read fresh each time. Its actions write what they always write: a declaration into the well's record (`set-well`), a site record, the backup configuration, a backup, a schedule entry, the refreshed reports, each in the audit log. A confirmation is kept in `config\checklist.json` with the name, the time and the note, and in the audit log; when the drilling record changes - a different number of events or a different total depth - the confirmation no longer counts and the item says to check again. A US Well Number is declared as the well's identity; it no longer marks a producing well as a disposal well.
|
|
8
|
+
|
|
9
|
+
**The number to check**: the count of required items done against the count required; each well's declared position against the survey plat, its datum against the plat's, its reference elevation against the completion report, and its US Well Number against the permit - the checklist says a value is declared, not that it is right.
|
|
10
|
+
|
|
11
|
+
**What this page will not call a measurement**: a declaration - a position, an elevation or a well number is what the operator stated, recorded with who stated it; a 3DEP ground elevation as the kelly bushing - it is the ground at the declared position, NAVD88, and is offered only as ground level; a confirmation as a check the program made - it is a person's, with their note; a done item as a correct one.
|
|
@@ -43,6 +43,7 @@ INDEX: List[tuple] = [
|
|
|
43
43
|
('edr', 'The drilling recorder', 'the rig\'s one-second EDR export read as delivered - sections, depths, hours on bottom, the rate of penetration, the recorder\'s MD-TVD table - and what the record will not say'),
|
|
44
44
|
('dlis', 'The DLIS log', 'a well log as it is delivered (API RP66 V1), read as the standard lays it out: the frames, the channels, what was skipped; into the strata survey'),
|
|
45
45
|
('historian', 'The historian pull', 'an operator\'s gauge history out of the PI System through PI Web API, read-only, every value with its archive time and flags'),
|
|
46
|
+
('setup', 'The setup checklist', 'what this workspace still needs before its reports can be handed over - each well\'s location, elevation and number, the client site, the backup, the reports - read from the workspace as it stands, each with its form or button'),
|
|
46
47
|
('tools', 'Tools and ports', 'every class of downhole tool in use across the industry with a hover description and a pop-open tutorial, your own fleet with its datasheets, the gauges this program reads with their citations and ratings, the formats and protocols that bring readings in, and the rating check on a tool string'),
|
|
47
48
|
('field-ports', 'The field ports', 'Modbus RTU on the serial line, DNP3 from the pad RTU, HART-IP from the transmitter itself - read-only, polled, with the stand-ins to rehearse against'),
|
|
48
49
|
('slip', 'Slip tendency on the mapped faults', 'the declared stress state resolved on each mapped fault around a well: the slip tendency, the pressure to slip, the World Stress Map as the SHmax source, the published Hennings values beside'),
|
|
@@ -68,7 +69,7 @@ REQUIRED_LINES = ('**The command**', '**What it writes**', '**The number to chec
|
|
|
68
69
|
VIEW_TOPIC: Dict[str, str] = {
|
|
69
70
|
'home': 'start', 'wells': 'data-in', 'well': 'drift', 'live': 'patches', 'patch': 'patches', 'files': 'files', 'alarms': 'alarms',
|
|
70
71
|
'approvals': 'well-tests', 'config': 'site', 'reports': 'drift', 'verify': 'start', 'survey': 'data-in', 'jobs': 'site',
|
|
71
|
-
'admin': 'site', 'prefs': 'site', 'search': 'start', 'welcome': 'start', 'seismic': 'seismic', 'seismic_station': 'seismic', 'track': 'seismic', 'sar': 'seismic', 'sites': 'sites', 'audit': 'audit-update', 'tools': 'tools', 'catalog': 'catalog',
|
|
72
|
+
'admin': 'site', 'prefs': 'site', 'search': 'start', 'welcome': 'start', 'seismic': 'seismic', 'seismic_station': 'seismic', 'track': 'seismic', 'sar': 'seismic', 'sites': 'sites', 'setup': 'setup', 'audit': 'audit-update', 'tools': 'tools', 'catalog': 'catalog',
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
|
|
@@ -144,21 +144,21 @@ def well_record(well: dict, ctx: Context) -> dict:
|
|
|
144
144
|
ident = P.well_identity(well)
|
|
145
145
|
wn = ident.get('us_well_number') or {}
|
|
146
146
|
data: Dict[str, Any] = {**_common(ctx), 'FacilityName': well.get('display') or well['id'],
|
|
147
|
-
'FacilityID': wn.get('api10') if wn.get('status') == 'VALID' else (
|
|
147
|
+
'FacilityID': wn.get('api10') if wn.get('status') == 'VALID' else (P.declared_api(well) or well['id']),
|
|
148
148
|
'FacilityTypeID': ctx.ref('reference-data--FacilityType', 'Well'),
|
|
149
149
|
'OperatingEnvironmentID': ctx.ref('reference-data--OperatingEnvironment', 'Onshore'),
|
|
150
150
|
'NameAliases': [{'AliasName': well['id'], 'AliasNameTypeID': ctx.ref('reference-data--AliasNameType', 'UniqueIdentifier')}],
|
|
151
151
|
'ExtensionProperties': {'gea': {'well_id': well['id'], 'kind': well.get('kind'), 'role': disp.get('role')}}}
|
|
152
|
-
if
|
|
153
|
-
data['NameAliases'].append({'AliasName':
|
|
152
|
+
if P.declared_api(well):
|
|
153
|
+
data['NameAliases'].append({'AliasName': P.declared_api(well), 'AliasNameTypeID': ctx.ref('reference-data--AliasNameType', 'RegulatoryIdentifier')})
|
|
154
154
|
if wn.get('status') == 'VALID':
|
|
155
155
|
# the US Well Number as the standard writes it: the ten-digit well origin, typed; the state named in the extension
|
|
156
156
|
data['NameAliases'].append({'AliasName': wn['api10'], 'AliasNameTypeID': ctx.ref('reference-data--AliasNameType', 'USWellNumber')})
|
|
157
157
|
data['ExtensionProperties']['gea']['us_well_number'] = {'api10': wn['api10'], 'api12': wn.get('api12'), 'api14': wn.get('api14'),
|
|
158
158
|
'state': wn['state'], 'county_code': wn['county']['code'],
|
|
159
159
|
'unique_well': wn['unique_well'], 'identifies': wn['identifies']}
|
|
160
|
-
elif
|
|
161
|
-
data['ExtensionProperties']['gea']['us_well_number'] = {'declared':
|
|
160
|
+
elif P.declared_api(well):
|
|
161
|
+
data['ExtensionProperties']['gea']['us_well_number'] = {'declared': P.declared_api(well), 'status': 'INVALID', 'problems': wn.get('problems')}
|
|
162
162
|
if disp.get('uic_number'):
|
|
163
163
|
data['NameAliases'].append({'AliasName': disp['uic_number'], 'AliasNameTypeID': ctx.ref('reference-data--AliasNameType', 'PermitNumber')})
|
|
164
164
|
if ctx.operator_org_id:
|
|
@@ -130,13 +130,19 @@ def parse_well_number(text: Any) -> dict:
|
|
|
130
130
|
# --------------------------------------------------------------------------------------------------------------
|
|
131
131
|
# the well's identity as "What is a Well" components
|
|
132
132
|
# --------------------------------------------------------------------------------------------------------------
|
|
133
|
+
def declared_api(well: dict) -> Optional[str]:
|
|
134
|
+
"""The US Well Number the operator declared for a well: its identity block, or - for a well declared before the
|
|
135
|
+
identity block existed - its disposal block."""
|
|
136
|
+
return ((well.get('identity') or {}).get('api_number') or (well.get('disposal') or {}).get('api_number') or None)
|
|
137
|
+
|
|
138
|
+
|
|
133
139
|
def well_identity(well: dict, site: Optional[dict] = None, channels: Optional[List[str]] = None) -> dict:
|
|
134
140
|
"""The components of PPDM's "What is a Well" the site can name for this well, from what the operator
|
|
135
141
|
declared (set-well) and what the program holds; every component it cannot name is a gap by name."""
|
|
136
142
|
disp = well.get('disposal') or {}
|
|
137
143
|
surf = well.get('surface') or {}
|
|
138
144
|
wid = well['id']
|
|
139
|
-
api = parse_well_number(
|
|
145
|
+
api = parse_well_number(declared_api(well)) if declared_api(well) else None
|
|
140
146
|
comps: Dict[str, Any] = {}
|
|
141
147
|
gaps: List[str] = []
|
|
142
148
|
aliases: List[dict] = [{'name': well.get('display') or wid, 'type': 'operator name', 'basis': 'the name the operator gave the record'},
|
|
@@ -1222,7 +1222,16 @@ class App:
|
|
|
1222
1222
|
return {'alarms_unacked': unacked, 'alarms_active': active, 'alarms_shelved': shelved, 'approvals_pending': pend,
|
|
1223
1223
|
'jobs_running': running, 'jobs_failed_24h': failed,
|
|
1224
1224
|
'patches_down': sum(1 for p in pst if p.get('status') in ('DOWN', 'DEGRADED')), 'patches': len(pst),
|
|
1225
|
-
'generated_utc': utc_now_iso()}
|
|
1225
|
+
'setup_todo': self._setup_todo(), 'generated_utc': utc_now_iso()}
|
|
1226
|
+
|
|
1227
|
+
def _setup_todo(self) -> int:
|
|
1228
|
+
"""The required setup items not done, for the Setup tab's badge."""
|
|
1229
|
+
try:
|
|
1230
|
+
from . import setup_checklist as _SC
|
|
1231
|
+
c = _SC.checklist(self.ws)['counts']
|
|
1232
|
+
return c['required'] - c['required_done']
|
|
1233
|
+
except Exception:
|
|
1234
|
+
return 0
|
|
1226
1235
|
|
|
1227
1236
|
def since(self, after: Optional[str], limit: int = 50) -> dict:
|
|
1228
1237
|
"""What happened since `after` (ISO UTC; default: the signed-in user's previous sign-in): audit actions grouped, alarm events, jobs."""
|
|
@@ -1650,6 +1659,9 @@ def make_handler(app: App):
|
|
|
1650
1659
|
if path == '/api/tools':
|
|
1651
1660
|
from . import tool_catalog as _TC
|
|
1652
1661
|
return self._json(200, _TC.catalog())
|
|
1662
|
+
if path == '/api/setup/checklist':
|
|
1663
|
+
from . import setup_checklist as _SC
|
|
1664
|
+
return self._json(200, _SC.checklist(app.ws))
|
|
1653
1665
|
if path == '/api/tools/taxonomy':
|
|
1654
1666
|
from . import tool_taxonomy as _TX
|
|
1655
1667
|
q = qs.get('q', [''])[0]; cat = qs.get('category', [''])[0] or None
|
|
@@ -1880,6 +1892,22 @@ def make_handler(app: App):
|
|
|
1880
1892
|
depth_ft=(float(b['depth_ft']) if b.get('depth_ft') is not None else None), actor=user['name']))
|
|
1881
1893
|
except WorkspaceError as e:
|
|
1882
1894
|
raise ApiError(404, str(e))
|
|
1895
|
+
if path == '/api/setup/confirm':
|
|
1896
|
+
App.require(user, 'operator')
|
|
1897
|
+
from . import setup_checklist as _SC
|
|
1898
|
+
b = body or {}
|
|
1899
|
+
try:
|
|
1900
|
+
return self._json(200, _SC.confirm(app.ws, str(b.get('item') or ''), user['name'], str(b.get('note') or '')))
|
|
1901
|
+
except ValueError as e:
|
|
1902
|
+
raise ApiError(400, str(e))
|
|
1903
|
+
if path == '/api/sites/add':
|
|
1904
|
+
App.require(user, 'operator')
|
|
1905
|
+
b = body or {}
|
|
1906
|
+
try:
|
|
1907
|
+
return self._json(200, app.ws.add_site(str(b.get('display') or '').strip(), wells=[str(x) for x in (b.get('wells') or [])],
|
|
1908
|
+
client=str(b.get('client') or '').strip(), note=str(b.get('note') or ''), actor=user['name']))
|
|
1909
|
+
except WorkspaceError as e:
|
|
1910
|
+
raise ApiError(400, str(e))
|
|
1883
1911
|
if path == '/api/tools/fleet':
|
|
1884
1912
|
App.require(user, 'operator')
|
|
1885
1913
|
from . import tool_taxonomy as _TX
|
|
@@ -1944,7 +1972,8 @@ def make_handler(app: App):
|
|
|
1944
1972
|
wid = path[len('/api/wells/'):-len('/declare')]
|
|
1945
1973
|
b = body or {}
|
|
1946
1974
|
try:
|
|
1947
|
-
return self._json(200, app.ws.set_well(wid, surface=(b.get('surface') or None), disposal=(b.get('disposal') or None),
|
|
1975
|
+
return self._json(200, app.ws.set_well(wid, surface=(b.get('surface') or None), disposal=(b.get('disposal') or None),
|
|
1976
|
+
identity=(b.get('identity') or None), actor=user['name']))
|
|
1948
1977
|
except WorkspaceError as e:
|
|
1949
1978
|
raise ApiError(400, str(e))
|
|
1950
1979
|
if path == '/api/elevation':
|