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))
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
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!")
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
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()
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)" )
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)
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}!")
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}!")
def test_indset_sag(firedb: FireDb): sagsinfo = Sagsinfo(aktiv="true", behandler="test") sag = Sag(sagsinfos=[sagsinfo]) firedb.indset_sag(sag)
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")
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(),