Skip to content

Commit

Permalink
Merge pull request #778 from krebslw/niv-ts
Browse files Browse the repository at this point in the history
Punktsamling 4: Tilføj nye niv-underkommandoer til håndtering af punktsamlinger og tidsserie
  • Loading branch information
kbevers authored Oct 2, 2024
2 parents 51c5614 + 6286dd7 commit f62fb43
Show file tree
Hide file tree
Showing 9 changed files with 379 additions and 85 deletions.
148 changes: 138 additions & 10 deletions fire/cli/luk.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
EventType,
Koordinat,
Observation,
PunktSamling,
Tidsserie,
)
from fire.cli.niv import bekræft

Expand Down Expand Up @@ -67,15 +69,9 @@ def punkt(uuid: str, sagsbehandler, **kwargs) -> None:
Se `punkt_hjælp` for yderligere information.
"""
db = fire.cli.firedb
sag = Sag(
id=fire.uuid(),
sagsinfos=[
Sagsinfo(
behandler=sagsbehandler,
beskrivelse="Lukning af objekt med 'fire luk'",
aktiv="true",
)
],

sag = db.ny_sag(
behandler=sagsbehandler, beskrivelse="Lukning af objekt med 'fire luk'"
)
db.session.add(sag)
db.session.flush()
Expand Down Expand Up @@ -217,7 +213,7 @@ def observation(objektid: str, sagsbehandler, **kwargs) -> None:
Fejlmeld en observation i FIRE databasen.
Når en observation fejlmeldes afregistreres den i databasen og
det angives samtidigt at observationen ikke er fejlbehæftet.
det angives samtidigt at observationen er fejlbehæftet.
Observationens objektid kan fx findes ved opslag med
``fire info punkt -O niv <punkt>`` eller ved manuelt opslag i
Expand Down Expand Up @@ -279,3 +275,135 @@ def observation(objektid: str, sagsbehandler, **kwargs) -> None:
else:
db.session.rollback()
fire.cli.print(f"Observation {objektid} IKKE lukket!")


@luk.command()
@click.argument("objektid", type=str)
@click.option(
"--sagsbehandler",
default=getpass.getuser(),
type=str,
help="Angiv andet brugernavn end den aktuelt indloggede",
)
@fire.cli.default_options()
def punktsamling(objektid: str, sagsbehandler, **kwargs) -> None:
"""
Luk en punktsamling i FIRE databasen.
Punktsamlingens objektid skal findes ved manuelt opslag i databasen.
Det kan fx gøres med et udtræk som følgende:
\b
SELECT * FROM punktsamling ps
WHERE ps.navn = 'PUNKTSAMLING_81001'
"""
db = fire.cli.firedb
sag = db.ny_sag(sagsbehandler, beskrivelse="Lukning af punktsamling med 'fire luk'")
db.session.add(sag)
db.session.flush()

try:
ps = (
db.session.query(PunktSamling)
.filter(
PunktSamling.objektid == objektid,
)
.one()
)
except NoResultFound:
fire.cli.print(f"Punktsamling med objektid {objektid} ikke fundet!")
raise SystemExit

sagsevent = sag.ny_sagsevent(beskrivelse=f"'fire luk punktsamling {objektid}")

try:
# Indsæt alle objekter i denne session
db.luk_punktsamling(ps, sagsevent, commit=False)
db.session.flush()
db.luk_sag(sag, commit=False)
db.session.flush()
except DatabaseError as e:
# rul tilbage hvis databasen smider en exception
db.session.rollback()
fire.cli.print(
f"Der opstod en fejl - punktsamling med objektid {objektid} IKKE lukket!"
)
print(e)
else:
tekst = f"""Er du sikker på at du vil lukke punktsamlingen med {objektid}:
{repr(ps)}
"""
if bekræft(tekst):
db.session.commit()
fire.cli.print(f"Punktsamling {objektid} lukket!")
else:
db.session.rollback()
fire.cli.print(f"Punktsamling {objektid} IKKE lukket!")

return


@luk.command()
@click.argument("objektid", type=str)
@click.option(
"--sagsbehandler",
default=getpass.getuser(),
type=str,
help="Angiv andet brugernavn end den aktuelt indloggede",
)
@fire.cli.default_options()
def tidsserie(objektid: str, sagsbehandler, **kwargs) -> None:
"""
Luk en tidsserie i FIRE databasen.
Tidsseriens objektid skal findes ved manuelt opslag i databasen.
Det kan fx gøres med et udtræk som følgende:
\b
SELECT * FROM tidsserie ts
WHERE ts.navn = 'RDIO_5D_IGb08'
"""
db = fire.cli.firedb
sag = db.ny_sag(sagsbehandler, beskrivelse="Lukning af tidsserie med 'fire luk'")
db.session.add(sag)
db.session.flush()

try:
ts = (
db.session.query(Tidsserie)
.filter(
Tidsserie.objektid == objektid,
)
.one()
)
except NoResultFound:
fire.cli.print(f"Tidsserie med objektid {objektid} ikke fundet!")
raise SystemExit

sagsevent = sag.ny_sagsevent(beskrivelse=f"'fire luk tidsserie {objektid}")

try:
# Indsæt alle objekter i denne session
db.luk_tidsserie(ts, sagsevent, commit=False)
db.session.flush()
db.luk_sag(sag, commit=False)
db.session.flush()
except DatabaseError as e:
# rul tilbage hvis databasen smider en exception
db.session.rollback()
fire.cli.print(
f"Der opstod en fejl - tidsserie med objektid {objektid} IKKE lukket!"
)
print(e)
else:
tekst = f"""Er du sikker på at du vil lukke tidsserien med {objektid}:
{repr(ts)}
"""
if bekræft(tekst):
db.session.commit()
fire.cli.print(f"Tidsserie {objektid} lukket!")
else:
db.session.rollback()
fire.cli.print(f"Tidsserie {objektid} IKKE lukket!")
67 changes: 67 additions & 0 deletions fire/cli/niv/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,22 @@
Punkt,
PunktInformation,
Sag,
Tidsserie,
HøjdeTidsserie,
)
from fire.io.regneark import arkdef
from fire.ident import kan_være_gi_nummer
import fire.cli
from fire.cli import firedb, grøn


# Kotesystemer som understøttes i niv-modulet
KOTESYSTEMER = {
"DVR90": "EPSG:5799",
"Jessen": "TS:jessen",
"LRL": "TS:LRL",
}

# ------------------------------------------------------------------------------
niv_help = f"""Nivellement: Arbejdsflow, beregning og analyse
Expand Down Expand Up @@ -701,6 +710,64 @@ def afbryd_hvis_ugyldigt_jessenpunkt(jessenpunkt: Punkt) -> None:
raise SystemExit(1)


def hent_relevante_tidsserier(
hts_ark: pd.DataFrame, punkt: Punkt, fastholdt_punkt: Punkt, fastholdt_kote: float
) -> list[Tidsserie]:
"""
Henter de relevante tidsserier fra Højdetidsserier-arket
Med "relevante" skal forstås tidsserier der har ``punkt`` som punkt, og som hører
under en punktsamling der har ``fastholdt_punkt`` og ``fastholdt_kote`` som fastholdt
punkt hhv. kote.
Derudover kontrolleres oplysningerne i Højdetidsserier-fanen. Hvis de er forkerte
udsendes fejlmeddelelser.
"""
# Gå igennem alle punktets tidsserier i arket
tidsserier = []
for index, htsdata in hts_ark[hts_ark["Punkt"] == punkt.ident].iterrows():

# Den her fejler hvis man opgiver en tidsserie i HTS-fanen som ikke findes!
tidsserie = fire.cli.firedb.hent_tidsserie(htsdata["Tidsserienavn"])

# Den her fejler hvis den fundne tidsserie ikke har punkt som punkt
# Vil kun ske hvis man manuelt har tastet noget mærkeligt ind i arket.
if tidsserie.punkt != punkt:
fire.cli.print(
f"FEJL: Mismatch mellem punkt {punkt.ident} og tidsserie {tidsserie.navn}!",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

# Samme som ovenstående, men for Punktgruppenavn
if tidsserie.punktsamling.navn != htsdata["Punktgruppenavn"]:
fire.cli.print(
f"FEJL: Mismatch mellem punktgruppe {htsdata['Punktgruppenavn']} og tidsserie {tidsserie.navn}!",
fg="white",
bg="red",
bold=True,
)
raise SystemExit(1)

if (
tidsserie.punktsamling.jessenpunkt != fastholdt_punkt
or tidsserie.punktsamling.jessenkote != fastholdt_kote
):
# Spring tidsserier over som ikke matcher det fastholdte punkt/kote
# Brugeren bliver nødt til at angive hvilke tidsserier der skal have opdateret
# koten.
continue

tidsserier.append(tidsserie)

if not tidsserier:
fire.cli.print(f"Fandt ingen relevante tidsserier for {punkt.ident}")

return tidsserier


"""
Modulnavne starter med `_` for at undgå konflikter,
der i visse tilfælde kan opstå.
Expand Down
Loading

0 comments on commit f62fb43

Please sign in to comment.