Example #1
0
File: mark.py Project: TanyaPS/FIRE
def registrer_sag(filnavn: click.Path, **kwargs) -> None:
    """Skriv indledende sagsoplysninger til FIRE"""
    s = get_setup_dict(filnavn)
    assert "sagsid" in s
    assert "sagsbehandler" in s

    beskrivelse = afsnitsoverskrift(filnavn, "NIVELLEMENTSPROJEKT")

    sagsinfo = Sagsinfo(
        aktiv="true", behandler=s["sagsbehandler"], beskrivelse=beskrivelse
    )
    sag = Sag(id=s["sagsid"], sagsinfos=[sagsinfo])

    # Allerede registreret?
    try:
        sag2 = firedb.hent_sag(sag.id)
    except NoResultFound:
        firedb.indset_sag(sag)
    else:
        print("Sag allerede registreret")

    sag2 = firedb.hent_sag(sag.id)
    assert sag2.id == sag.id
    assert sag2.sagsinfos[0].beskrivelse == sag2.sagsinfos[0].beskrivelse
    print(sag2)
    assert sag2.id == sag.id
    for sagsinfo in sag.sagsinfos:
        print(repr(sagsinfo))
Example #2
0
def sag(firedb):
    s0 = Sag()
    si0 = Sagsinfo(sag=s0, aktiv=Boolean.TRUE, behandler="yyy")
    firedb.session.add(si0)
    firedb.session.add(s0)
    firedb.session.flush()
    return s0
Example #3
0
def punkt(uuid: str, sagsbehandler, **kwargs) -> None:
    """
    Luk et punkt i FIRE databasen.

    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",
            )
        ],
    )
    db.session.add(sag)
    db.session.flush()
    sagsevent = Sagsevent(
        sag=sag,
        eventtype=EventType.PUNKT_NEDLAGT,
        sagseventinfos=[
            SagseventInfo(beskrivelse=f"'fire luk punkt {uuid}"),
        ],
    )

    try:
        punkt = db.hent_punkt(uuid)
    except NoResultFound:
        fire.cli.print(f"Punkt med UUID {uuid} ikke fundet!")
        raise SystemExit

    try:
        # Indsæt alle objekter i denne session
        db.luk_punkt(punkt, 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 - punkt id {uuid} IKKE lukket!")
        print(e)
    else:
        tekst = f"Er du sikker på at du vil lukke punktet {punkt.ident} ({uuid})?"
        spørgsmål = f"{STOP}\n\n" + click.style(tekst, bg="red", fg="white")
        spørgsmål += "\n\n\nLukning af punktet KAN IKKE rulles tilbage. Denne ændring er irreversibel,\n"
        spørgsmål += "tænkt dig grundigt om inden du siger ja."
        if bekræft(spørgsmål):
            db.session.commit()
            fire.cli.print(f"Punkt {punkt.ident} ({uuid} lukket!")
        else:
            db.session.rollback()
            fire.cli.print(f"Punkt {punkt.ident} ({uuid} IKKE lukket!")
Example #4
0
def test_afregistrering_sagsinfo(firedb: FireDb, sag: Sag):
    """
    Test trigger sagsinfo_bi_trg - Automatisk afrestrering af tidligere sagsinfo.
    """
    si1 = Sagsinfo(sag=sag,
                   behandler="B00001",
                   beskrivelse="Første udgave",
                   aktiv=Boolean.TRUE)

    firedb.session.add(si1)
    firedb.session.commit()

    si2 = Sagsinfo(sag=sag,
                   behandler="B00001",
                   beskrivelse="Første udgave",
                   aktiv=Boolean.TRUE)
    firedb.session.add(si1)
    firedb.session.commit()

    assert si1.registreringtil == si2.registreringfra
    assert si2.registreringtil is None
Example #5
0
    def luk_sag(self, sag: Sag):
        """Sætter en sags status til inaktiv"""
        if not isinstance(sag, Sag):
            raise TypeError("'sag' is not an instance of Sag")

        current = sag.sagsinfos[-1]
        new = Sagsinfo(
            aktiv="false",
            journalnummer=current.journalnummer,
            behandler=current.behandler,
            beskrivelse=current.beskrivelse,
            sag=sag,
        )
        self.session.add(new)
        self.session.commit()
Example #6
0
def main():
    infotype = firedb.hent_punktinformationtype(ATTRIBUT)
    if infotype is None:
        firedb.indset_punktinformationtype(
            PunktInformationType(
                name=ATTRIBUT,
                anvendelse=fire.api.model.PunktInformationTypeAnvendelse.TEKST,
                beskrivelse="Fundamentalpunkt i referencesystemet angivet i TEKST",
            )
        )
        infotype = firedb.hent_punktinformationtype(ATTRIBUT)

    print(infotype)

    sagsinfo = Sagsinfo(
        aktiv="true",
        behandler="Kristian Evers",
        beskrivelse=sagsbeskrivelse
    )
    sagid = str(uuid.uuid4())
    firedb.indset_sag(Sag(id=sagid, sagsinfos=[sagsinfo]))
    sag =  firedb.hent_sag(sagid)

    punktinformationer =  []

    for srid, identer in PUNKTER.items():
        for ident in identer:
            try:
                punkt = firedb.hent_punkt(ident)
            except NoResultFound:
                print(f'fejl: {ident}')
                continue
            pi = PunktInformation(infotype=infotype, punkt=punkt, tekst=srid)
            punktinformationer.append(pi)

    sagseventinfo = SagseventInfo(beskrivelse=f"Indsættelse af {ATTRIBUT} attributter")
    sagsevent = Sagsevent(
        id=str(uuid.uuid4()),
        sag=sag,
        eventtype=fire.api.model.EventType.PUNKTINFO_TILFOEJET,
        sagseventinfos=[sagseventinfo],
        punktinformationer=punktinformationer,
    )
    firedb.indset_sagsevent(sagsevent)
def main():
    sagsbeskrivelse = """Indsættelse af GR96/UTM24 koordinater.

Koordinaterne indsættes i FIRE i forbindelse med migrering fra
REFGEO til FIRE. Det er nødvendigt at indsætte projicerede
koordinater fordi Oracle databasens UTM transformation ikke
er pålidelig uden for den givne UTM zone. Dette er et problem
i forbindelse med udstillingsmodellen, hvor modellen kræver
at der stilles UTM northing og easting koordinater til rådighed.
Da Oracle ikke kan beregne disse koordinater troværdigt gør vi
det i stedet her med PROJ som motor. PROJ 6.3.1 benyttes.

Tidsstemplet på de transformerede koordinater sættes til
det aktuelle tidspunkt ved indsættelse, og den oprindelige
koordinats tidsstempel føres ikke med til de nye
transformerede koordinater.
"""

    # Undgå at oprette tonsvis af sager i test-fasen.
    # Hvis sagen findes genbruges den, hvis ikke
    # oprettes den.
    sagid = "6baaf540-3e8a-41b1-ae61-b785adf9687c"
    try:
        sag = firedb.hent_sag(sagid)
    except:
        sagsinfo = Sagsinfo(aktiv="true",
                            behandler="Kristian Evers",
                            beskrivelse=sagsbeskrivelse)
        firedb.indset_sag(Sag(id=sagid, sagsinfos=[sagsinfo]))
    finally:
        sag = firedb.hent_sag(sagid)

    utm24_2d = convert_coordinates("EPSG:4747")
    add_coordinates(sag, utm24_2d,
                    "Indsættelse af koordinater transformeret fra GR96 2D")
    utm24_3d = convert_coordinates("EPSG:4909")
    add_coordinates(sag, utm24_3d,
                    "Indsættelse af koordinater transformeret fra GR96 3D")
    utm24_the_rest = convert_heights()
    add_coordinates(
        sag, utm24_the_rest,
        "Indsættelse af koordinater transformeret fra WGS84 (lokationskoordinater)"
    )
Example #8
0
def main():

    firedb.indset_punktinformationtype(
        PunktInformationType(
            name=ATTRIBUT,
            anvendelse=fire.api.model.PunktInformationTypeAnvendelse.FLAG,
            beskrivelse="Punkter i den oprindelige DVR90-udjævning",
        ))
    infotype = firedb.hent_punktinformationtype(ATTRIBUT)

    sagsinfo = Sagsinfo(aktiv="true",
                        behandler="Kristian Evers",
                        beskrivelse=sagsbeskrivelse)
    sagid = str(uuid.uuid4())
    firedb.indset_sag(Sag(id=sagid, sagsinfos=[sagsinfo]))
    sag = firedb.hent_sag(sagid)

    with open(POINT_FILE) as f:
        punkter = [punkt.strip() for punkt in f.readlines()]

        punktinformationer = []
        # interaktion med databasen er pokkers langsomt, vis fremdrift
        with click.progressbar(punkter, label="Punkter") as punkter_progress:
            for ident in punkter_progress:
                try:
                    punkt = get_punkt(ident)
                except sqlalchemy.orm.exc.NoResultFound:
                    print(f"Ident ikke fundet: {ident}")
                    continue

                pi = PunktInformation(infotype=infotype, punkt=punkt)
                punktinformationer.append(pi)

    sagseventinfo = SagseventInfo(
        beskrivelse=f"Indsættelse af {ATTRIBUT} attibutter")
    sagsevent = Sagsevent(
        id=str(uuid.uuid4()),
        sag=sag,
        eventtype=fire.api.model.EventType.PUNKTINFO_TILFOEJET,
        sagseventinfos=[sagseventinfo],
        punktinformationer=punktinformationer,
    )
    firedb.indset_sagsevent(sagsevent)
Example #9
0
def indsæt(
    ident: str, sti: Path, type: str, filnavn: str, sagsbehandler, **kwargs
) -> None:
    r"""
    Indsæt grafik i databasen.

    EKSEMPLER

    Indsæt skitse fra PNG-fil:

        > fire grafik indsæt K-01-01234 K-01-01234.png

    Anvend andet filnavn i databasen:

        > fire grafik indsæt G.M.902 IMG_5234.jpg --filnavn aarhus_domkirke.jpg

    Eksplicer grafiktype og filnavn:

        > fire grafik indsæt K-01-012345 C:\tmp\skitse.png --type skitse --filnavn K-01-012345.png

    """
    db = fire.cli.firedb
    try:
        g = db.hent_grafik(filnavn)
    except NoResultFound:
        g = None

    if g:
        if ident not in g.punkt.identer:
            raise SystemExit(
                f"Kan ikke indsætte {filnavn} på {ident},"
                " allerede regisreret på {g.punkt.ident}"
            )

    punkt = db.hent_punkt(ident)
    if not filnavn:
        filnavn = sti.name

    for grafik in punkt.grafikker:
        if grafik.filnavn == filnavn:
            spørgsmål = f"Grafik med filnavn {filnavn} allerede tilknyttet {punkt.ident} - vil du overskrive det?"
            if bekræft(spørgsmål, gentag=False):
                break
            else:
                raise SystemExit

    # sagshåndtering
    sag = Sag(
        id=fire.uuid(),
        sagsinfos=[
            Sagsinfo(
                aktiv="true",
                behandler=sagsbehandler,
                beskrivelse="Indsættelse af ny grafik med 'fire grafik'",
            )
        ],
    )
    db.indset_sag(sag, commit=False)
    try:
        fire.cli.firedb.session.flush()
    except Exception as ex:
        fire.cli.firedb.session.rollback()
        raise SystemExit(ex)

    # opret grafik
    grafik = Grafik.fra_fil(punkt, sti)
    grafik.type = type
    grafik.filnavn = filnavn

    sagsevent = Sagsevent(
        sag=sag,
        eventtype=EventType.GRAFIK_INDSAT,
        sagseventinfos=[
            SagseventInfo(
                beskrivelse=f"Grafik {filnavn} indsættes på punkt {punkt.ident}"
            )
        ],
        grafikker=[grafik],
    )
    db.indset_sagsevent(sagsevent, commit=False)
    db.luk_sag(sag, commit=False)
    try:
        # Indsæt alle objekter i denne session
        fire.cli.firedb.session.flush()
    except Exception as e:
        # rul tilbage hvis databasen smider en exception
        fire.cli.firedb.session.rollback()
        fire.cli.print(f"Der opstod en fejl - fil {filnavn} IKKE indsat!")
    else:
        spørgsmål = click.style(
            f"Er du sikker på at du vil tilknytte grafikken {filnavn} til {punkt.ident}?",
            bg="red",
            fg="white",
        )
        if bekræft(spørgsmål):
            fire.cli.firedb.session.commit()
            fire.cli.print(f"fil {filnavn} tilknyttet {punkt.ident}!")
        else:
            fire.cli.firedb.session.rollback()
            fire.cli.print(f"fil {filnavn} IKKE tilknyttet {punkt.ident}!")
Example #10
0
def slet(filnavn: str, sagsbehandler: str, **kwargs) -> None:
    """
    Slet en grafik fra databasen.

    Grafikken identificeres ud fra sit filnavn. Filnavnet på en grafik kan findes ved
    opslag med ``fire info punkt <ident>``.
    """
    db = fire.cli.firedb

    try:
        grafik = db.hent_grafik(filnavn)
    except NoResultFound:
        raise SystemExit(f"Fandt ikke {filnavn}!")

    punkt = grafik.punkt

    # sagshåndtering
    sag = Sag(
        id=fire.uuid(),
        sagsinfos=[
            Sagsinfo(
                aktiv="true",
                behandler=sagsbehandler,
                beskrivelse="Afregistrering af grafik med `fire grafik slet`",
            )
        ],
    )
    db.indset_sag(sag, commit=False)
    try:
        fire.cli.firedb.session.flush()
    except Exception as ex:
        fire.cli.firedb.session.rollback()
        raise SystemExit(ex)

    sagsevent = Sagsevent(
        sag=sag,
        sagseventinfos=[
            SagseventInfo(
                beskrivelse=f"Grafik {filnavn} for {punkt.ident} afregistreret"
            )
        ],
    )
    db.luk_grafik(grafik, sagsevent, commit=False)
    db.luk_sag(sag, commit=False)
    try:
        # Indsæt alle objekter i denne session
        fire.cli.firedb.session.flush()
    except Exception as e:
        # rul tilbage hvis databasen smider en exception
        fire.cli.firedb.session.rollback()
        fire.cli.print(f"Der opstod en fejl - fil {filnavn} IKKE slettet!")
    else:
        spørgsmål = click.style(
            f"Er du sikker på at du vil slettet grafikken {filnavn} tilhørende {punkt.ident}?",
            bg="red",
            fg="white",
        )
        if bekræft(spørgsmål):
            fire.cli.firedb.session.commit()
            fire.cli.print(f"fil {filnavn} slettet fra {punkt.ident}!")
        else:
            fire.cli.firedb.session.rollback()
            fire.cli.print(f"fil {filnavn} IKKE slettet fra {punkt.ident}!")
Example #11
0
def test_indset_sag(firedb: FireDb):
    sagsinfo = Sagsinfo(aktiv="true", behandler="test")
    sag = Sag(sagsinfos=[sagsinfo])
    firedb.indset_sag(sag)
Example #12
0
def opret_sag(projektnavn: str, beskrivelse: str, sagsbehandler: str,
              **kwargs) -> None:
    """Registrer ny sag i databasen"""

    if os.path.isfile(f"{projektnavn}.xlsx"):
        fire.cli.print(
            f"Filen '{projektnavn}.xlsx' eksisterer - sagen er allerede oprettet"
        )
        sys.exit(1)

    beskrivelse = " ".join(beskrivelse)

    sag = {
        "Dato": pd.Timestamp.now(),
        "Hvem": sagsbehandler,
        "Hændelse": "sagsoprettelse",
        "Tekst": f"{projektnavn}: {beskrivelse}",
        "uuid": uuid(),
    }
    sagsgang = pd.DataFrame([sag], columns=tuple(arkdef.SAG))

    fire.cli.print(f"Sags/projekt-navn: {projektnavn}  ({sag['uuid']})")
    fire.cli.print(f"Sagsbehandler:     {sagsbehandler}")
    fire.cli.print(f"Beskrivelse:       {beskrivelse}")
    sagsinfo = Sagsinfo(
        aktiv="true",
        behandler=sagsbehandler,
        beskrivelse=f"{projektnavn}: {beskrivelse}",
    )
    fire.cli.firedb.indset_sag(Sag(id=sag["uuid"], sagsinfos=[sagsinfo]),
                               commit=False)
    try:
        fire.cli.firedb.session.flush()
    except Exception as ex:
        fire.cli.firedb.session.rollback()
        fire.cli.print(
            f"Der opstod en fejl - sag {sag.id} for '{projektnavn}' IKKE oprettet"
        )
        return
    else:
        spørgsmål = click.style(
            f"Opretter ny sag i {fire.cli.firedb.db}-databasen - er du sikker? ",
            bg="red",
            fg="white",
        )
        if bekræft(spørgsmål):
            fire.cli.firedb.session.commit()
            fire.cli.print(f"Sag '{projektnavn}' oprettet")
        else:
            fire.cli.firedb.session.rollback()
            fire.cli.print("Opretter IKKE sag")
            # Ved demonstration af systemet er det nyttigt at kunne oprette
            # et sagsregneark, uden at oprette en tilhørende sag
            if not bekræft("Opret sagsregneark alligevel?", gentag=False):
                return

    fire.cli.print(f"Skriver sagsregneark '{projektnavn}.xlsx'")

    # Dummyopsætninger til sagsregnearkets sider
    forside = pd.DataFrame()
    nyetablerede = pd.DataFrame(
        columns=tuple(arkdef.NYETABLEREDE_PUNKTER)).astype(
            arkdef.NYETABLEREDE_PUNKTER)
    notater = pd.DataFrame([{
        "Dato": pd.Timestamp.now(),
        "Hvem": "",
        "Tekst": ""
    }])
    filoversigt = pd.DataFrame(columns=tuple(arkdef.FILOVERSIGT))
    param = pd.DataFrame(
        columns=["Navn", "Værdi"],
        data=[("Version", fire.__version__), ("Database", fire.cli.firedb.db)],
    )

    resultater = {
        "Projektforside": forside,
        "Sagsgang": sagsgang,
        "Nyetablerede punkter": nyetablerede,
        "Notater": notater,
        "Filoversigt": filoversigt,
        "Parametre": param,
    }

    if skriv_ark(projektnavn, resultater):
        # os.startfile() er kun tilgængelig på Windows
        if "startfile" in dir(os):
            fire.cli.print("Færdig! - åbner regneark for check.")
            os.startfile(f"{projektnavn}.xlsx")
Example #13
0
from fire import uuid
import fire.cli
from fire.cli import firedb
import fire.api
from fire.api.model import (
    Sag,
    Sagsinfo,
    Sagsevent,
    SagseventInfo,
    EventType,
)

# Sagshåndtering
sagsbeskrivelse = "Luk alle punkter fra REFGEO hvor MV_STATUS=-1"
sagsinfo = Sagsinfo(aktiv="true",
                    behandler="Kristian Evers",
                    beskrivelse=sagsbeskrivelse)
sagid = "af190b61-190b-413f-ba4d-432ecaca18d2"

try:
    sag = firedb.hent_sag(sagid)
except NoResultFound:
    sag = Sag(id=sagid, sagsinfos=[sagsinfo])
    firedb.indset_sag(sag)

sagsevent = Sagsevent(
    sag=sag,
    sagseventinfos=[
        SagseventInfo(beskrivelse="Lukning af punkter med REFGEO MV_STATUS=-1")
    ],
    id=uuid(),