Skip to content

Commit

Permalink
Make everything optional + remove validations
Browse files Browse the repository at this point in the history
  • Loading branch information
lord-haffi committed Oct 6, 2023
1 parent 8da8d5a commit 9c0c89a
Show file tree
Hide file tree
Showing 89 changed files with 365 additions and 349 deletions.
12 changes: 6 additions & 6 deletions src/bo4e/bo/angebot.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,17 @@ class Angebot(Geschaeftsobjekt):
bo_typ: BoTyp = BoTyp.ANGEBOT
# required attributes
#: Eindeutige Nummer des Angebotes
angebotsnummer: Annotated[str, Field(strict=True, pattern=r"^\d+$")]
angebotsnummer: Optional[str] = None
#: Erstellungsdatum des Angebots
angebotsdatum: datetime
angebotsdatum: Optional[datetime] = None
#: Sparte, für die das Angebot abgegeben wird (Strom/Gas)
sparte: Sparte
sparte: Optional[Sparte] = None
#: Ersteller des Angebots
angebotsgeber: Geschaeftspartner
angebotsgeber: Optional[Geschaeftspartner] = None
#: Empfänger des Angebots
angebotsnehmer: Geschaeftspartner
angebotsnehmer: Optional[Geschaeftspartner] = None

varianten: Annotated[list[Angebotsvariante], Len(1)]
varianten: Optional[list[Angebotsvariante]] = None
""" Eine oder mehrere Varianten des Angebots mit den Angebotsteilen;
Ein Angebot besteht mindestens aus einer Variante."""

Expand Down
6 changes: 4 additions & 2 deletions src/bo4e/bo/ansprechpartner.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ class Ansprechpartner(Geschaeftsobjekt):

# required attributes
bo_typ: BoTyp = BoTyp.ANSPRECHPARTNER
nachname: str #: Nachname (Familienname) des Ansprechpartners
geschaeftspartner: Geschaeftspartner #: Der Geschäftspartner, für den dieser Ansprechpartner modelliert wird
nachname: Optional[str] = None #: Nachname (Familienname) des Ansprechpartners
geschaeftspartner: Optional[
Geschaeftspartner
] = None #: Der Geschäftspartner, für den dieser Ansprechpartner modelliert wird

# optional attributes
anrede: Optional[Anrede] = None #: Mögliche Anrede des Ansprechpartners
Expand Down
18 changes: 9 additions & 9 deletions src/bo4e/bo/ausschreibung.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,32 +35,32 @@ class Ausschreibung(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.AUSSCHREIBUNG
#: Vom Herausgeber der Ausschreibung vergebene eindeutige Nummer
ausschreibungsnummer: str
ausschreibungsnummer: Optional[str] = None
#: Aufzählung für die Typisierung von Ausschreibungen
ausschreibungstyp: Ausschreibungstyp
ausschreibungstyp: Optional[Ausschreibungstyp] = None
#: Bezeichnungen für die Ausschreibungsphasen
ausschreibungsstatus: Ausschreibungsstatus
ausschreibungsstatus: Optional[Ausschreibungsstatus] = None
#: Kennzeichen, ob die Ausschreibung kostenpflichtig ist
kostenpflichtig: bool
kostenpflichtig: Optional[bool] = None
#: Gibt den Veröffentlichungszeitpunkt der Ausschreibung an
veroeffentlichungszeitpunkt: datetime
ausschreibender: Geschaeftspartner
veroeffentlichungszeitpunkt: Optional[datetime] = None
ausschreibender: Optional[Geschaeftspartner] = None
"""
Mit diesem Objekt können Geschäftspartner übertragen werden.
Sowohl Unternehmen, als auch Privatpersonen können Geschäftspartner sein
"""
abgabefrist: Zeitraum
abgabefrist: Optional[Zeitraum] = None
"""
Diese Komponente wird zur Abbildung von Zeiträumen in Form von Dauern oder der Angabe von Start und Ende verwendet.
Es muss daher entweder eine Dauer oder ein Zeitraum in Form von Start und Ende angegeben sein
"""
bindefrist: Zeitraum
bindefrist: Optional[Zeitraum] = None
"""
Diese Komponente wird zur Abbildung von Zeiträumen in Form von Dauern oder der Angabe von Start und Ende verwendet.
Es muss daher entweder eine Dauer oder ein Zeitraum in Form von Start und Ende angegeben sein
"""
#: Die einzelnen Lose, aus denen sich die Ausschreibung zusammensetzt
lose: Annotated[list[Ausschreibungslos], Len(1)]
lose: Optional[list[Ausschreibungslos]] = None

# optional attributes
#: Aufzählung der unterstützten Ausschreibungsportale
Expand Down
24 changes: 12 additions & 12 deletions src/bo4e/bo/buendelvertrag.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,32 @@ class Buendelvertrag(Geschaeftsobjekt):

# pylint: disable=duplicate-code
#: Eine im Verwendungskontext eindeutige Nummer für den Vertrag
vertragsnummer: str
vertragsnummer: Optional[str] = None
#: Hier ist festgelegt, um welche Art von Vertrag es sich handelt. Z.B. Netznutzungvertrag
vertragsart: Vertragsart
vertragsart: Optional[Vertragsart] = None
#: Gibt den Status des Vertrages an
vertragsstatus: Vertragsstatus
vertragsstatus: Optional[Vertragsstatus] = None
#: Unterscheidungsmöglichkeiten für die Sparte
sparte: Sparte
sparte: Optional[Sparte] = None
#: Gibt an, wann der Vertrag beginnt (inklusiv)
vertragsbeginn: datetime
vertragsbeginn: Optional[datetime] = None
#: Gibt an, wann der Vertrag (voraussichtlich) endet oder beendet wurde (exklusiv)
vertragsende: datetime
vertragsende: Optional[datetime] = None
#: Der "erstgenannte" Vertragspartner. In der Regel der Aussteller des Vertrags.
#: Beispiel: "Vertrag zwischen Vertagspartner 1 ..."
vertragspartner1: Geschaeftspartner
vertragspartner1: Optional[Geschaeftspartner] = None
#: Der "zweitgenannte" Vertragspartner. In der Regel der Empfänger des Vertrags.
#: Beispiel "Vertrag zwischen Vertagspartner 1 und Vertragspartner 2"
vertragspartner2: Geschaeftspartner
vertragspartner2: Optional[Geschaeftspartner] = None

# optional attributes
#: Die Liste mit den Einzelverträgen zu den Abnahmestellen
einzelvertraege: Optional[List[Vertrag]] = []
einzelvertraege: Optional[list[Vertrag]] = None
#: Festlegungen zu Laufzeiten und Kündigungsfristen
vertragskonditionen: Optional[List[Vertragskonditionen]] = []
vertragskonditionen: Optional[list[Vertragskonditionen]] = None
#: Unterzeichner des Vertragspartners1
unterzeichnervp1: Optional[List[Unterschrift]] = []
unterzeichnervp1: Optional[list[Unterschrift]] = None
#: Unterzeichner des Vertragspartners2
unterzeichnervp2: Optional[List[Unterschrift]] = []
unterzeichnervp2: Optional[list[Unterschrift]] = None
#: Beschreibung zum Vertrag
beschreibung: Optional[str] = None
8 changes: 4 additions & 4 deletions src/bo4e/bo/energiemenge.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
Contains Energiemenge class
and corresponding marshmallow schema for de-/serialization
"""
from typing import Annotated
from typing import Annotated, Optional

from annotated_types import Len

Expand Down Expand Up @@ -31,11 +31,11 @@ class Energiemenge(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.ENERGIEMENGE
#: Eindeutige Nummer der Marktlokation bzw. der Messlokation, zu der die Energiemenge gehört
lokations_id: str
lokations_id: Optional[str] = None
# todo: add validator such that only mess- or marktlokations IDs are accepted + cross check with lokationstyp
#: Gibt an, ob es sich um eine Markt- oder Messlokation handelt
lokationstyp: Lokationstyp
lokationstyp: Optional[Lokationstyp] = None

#: Gibt den Verbrauch in einer Zeiteinheit an
energieverbrauch: Annotated[list[Verbrauch], Len(1)]
energieverbrauch: Optional[list[Verbrauch]] = None
# there are no optional attributes
4 changes: 2 additions & 2 deletions src/bo4e/bo/fremdkosten.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ class Fremdkosten(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.FREMDKOSTEN
#: Für diesen Zeitraum wurden die Kosten ermittelt
gueltigkeit: Zeitraum
gueltigkeit: Optional[Zeitraum] = None
# optional attributes
#: Die Gesamtsumme über alle Kostenblöcke und -positionen
summe_kosten: Optional[Betrag] = None
#: In Kostenblöcken werden Kostenpositionen zusammengefasst. Beispiele: Netzkosten, Umlagen, Steuern etc
kostenbloecke: Optional[List[Fremdkostenblock]] = None
kostenbloecke: Optional[list[Fremdkostenblock]] = None
2 changes: 1 addition & 1 deletion src/bo4e/bo/geschaeftsobjekt.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Geschaeftsobjekt(BaseModel):
# bo_typ is used as discriminator f.e. for databases or deserialization

# optional attributes
externe_referenzen: Optional[List[ExterneReferenz]] = []
externe_referenzen: Optional[list[ExterneReferenz]] = None

#: Hier können IDs anderer Systeme hinterlegt werden (z.B. eine SAP-GP-Nummer oder eine GUID)
# pylint: disable=duplicate-code
Expand Down
8 changes: 4 additions & 4 deletions src/bo4e/bo/geschaeftspartner.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class Geschaeftspartner(Geschaeftsobjekt):

# required attributes
bo_typ: BoTyp = BoTyp.GESCHAEFTSPARTNER
name1: str
name1: Optional[str] = None
"""
Erster Teil des Namens.
Hier kann der Firmenname oder bei Privatpersonen beispielsweise der Nachname dagestellt werden.
Expand All @@ -40,13 +40,13 @@ class Geschaeftspartner(Geschaeftsobjekt):
# todo: replace name1/2/3 with something more readable. no one wants to deal with that. maybe serialize as name1/2/3
# but resolve to readable python fields under the hood

gewerbekennzeichnung: bool
gewerbekennzeichnung: Optional[bool] = None
"""
Kennzeichnung ob es sich um einen Gewerbe/Unternehmen (gewerbeKennzeichnung = true)
oder eine Privatperson handelt. (gewerbeKennzeichnung = false)
"""
#: Rollen, die die Geschäftspartner inne haben (z.B. Interessent, Kunde)
geschaeftspartnerrolle: List[Geschaeftspartnerrolle]
geschaeftspartnerrolle: Optional[list[Geschaeftspartnerrolle]] = None
# todo: rename to plural

# optional attributes
Expand All @@ -70,7 +70,7 @@ class Geschaeftspartner(Geschaeftsobjekt):
#: Amtsgericht bzw Handelsregistergericht, das die Handelsregisternummer herausgegeben hat
amtsgericht: Optional[str] = None
#: Bevorzugte Kontaktwege des Geschäftspartners
kontaktweg: Optional[List[Kontaktart]] = []
kontaktweg: Optional[list[Kontaktart]] = None
#: Die Steuer-ID des Geschäftspartners; Beispiel: "DE 813281825"
umsatzsteuer_id: Optional[str] = None
#: Die Gläubiger-ID welche im Zahlungsverkehr verwendet wird; Z.B. "DE 47116789"
Expand Down
8 changes: 4 additions & 4 deletions src/bo4e/bo/kosten.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ class Kosten(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.KOSTEN
#: Klasse der Kosten, beispielsweise Fremdkosten
kostenklasse: Kostenklasse
kostenklasse: Optional[Kostenklasse] = None
#: Für diesen Zeitraum wurden die Kosten ermittelt
gueltigkeit: Zeitraum
gueltigkeit: Optional[Zeitraum] = None
#: In Kostenblöcken werden Kostenpositionen zusammengefasst. Beispiele: Netzkosten, Umlagen, Steuern etc
kostenbloecke: Annotated[list[Kostenblock], Len(1)]
kostenbloecke: Optional[list[Kostenblock]] = None

# optional attributes
#: Die Gesamtsumme über alle Kostenblöcke und -positionen
summe_kosten: Optional[List[Betrag]] = None
summe_kosten: Optional[list[Betrag]] = None
16 changes: 8 additions & 8 deletions src/bo4e/bo/lastgang.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,24 @@ class _LastgangBody(Geschaeftsobjekt):
"""

#: Angabe, ob es sich um einen Gas- oder Stromlastgang handelt
sparte: Sparte
sparte: Optional[Sparte] = None

#: Eindeutige Nummer der Marktlokation bzw der Messlokation, zu der der Lastgang gehört
lokations_id: str
lokations_id: Optional[str] = None

#: Marktlokation oder Messlokation
lokationstyp: str
lokationstyp: Optional[str] = None
# todo: implement a lokations-id + lokationstyp cross check (such that lokationstyp malo checks for valid malo id)
# https://github.com/Hochfrequenz/BO4E-python/issues/321

#: Definition der gemessenen Größe anhand ihrer Einheit
messgroesse: Mengeneinheit
messgroesse: Optional[Mengeneinheit] = None

# optional attributes
#: Versionsnummer des Lastgangs
version: Optional[str] = None
#: Die OBIS-Kennzahl für den Wert, die festlegt, welche Größe mit dem Stand gemeldet wird, z.B. '1-0:1.8.1'
obis_kennzahl: Optional[constr(strict=True, pattern=OBIS_PATTERN)] = None # type: ignore[valid-type]
obis_kennzahl: Optional[constr(strict=True)] = None # type: ignore[valid-type]


# pylint: disable=too-many-instance-attributes, too-few-public-methods
Expand All @@ -61,12 +61,12 @@ class LastgangKompakt(_LastgangBody):
bo_typ: BoTyp = BoTyp.LASTGANG_KOMPAKT

#: Angabe des Rasters innerhalb aller Tagesvektoren dieses Lastgangs
zeitintervall: Zeitintervall
zeitintervall: Optional[Zeitintervall] = None
# todo: implement a cross check that this zeitintervall is actually the one used in tagesvektoren
# https://github.com/Hochfrequenz/BO4E-python/issues/322

#: Die im Lastgang enthaltenen Messwerte in Form von Tagesvektoren
tagesvektoren: List[Tagesvektor]
tagesvektoren: Optional[list[Tagesvektor]] = None


# pylint: disable=too-many-instance-attributes, too-few-public-methods
Expand All @@ -91,4 +91,4 @@ class Lastgang(_LastgangBody):
bo_typ: BoTyp = BoTyp.LASTGANG

#: Die im Lastgang enthaltenen Messwerte
werte: Annotated[list[Zeitreihenwert], Len(1)]
werte: Optional[list[Zeitreihenwert]] = None
10 changes: 5 additions & 5 deletions src/bo4e/bo/marktlokation.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,15 @@ class Marktlokation(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.MARKTLOKATION
#: Identifikationsnummer einer Marktlokation, an der Energie entweder verbraucht, oder erzeugt wird.
marktlokations_id: str
marktlokations_id: Optional[str] = None
_marktlokations_id_check = field_validator("marktlokations_id")(validate_marktlokations_id)
#: Sparte der Marktlokation, z.B. Gas oder Strom
sparte: Sparte
sparte: Optional[Sparte] = None
#: Kennzeichnung, ob Energie eingespeist oder entnommen (ausgespeist) wird
energierichtung: Energierichtung
energierichtung: Optional[Energierichtung] = None
#: Die Bilanzierungsmethode, RLM oder SLP
bilanzierungsmethode: Bilanzierungsmethode
netzebene: Netzebene
bilanzierungsmethode: Optional[Bilanzierungsmethode] = None
netzebene: Optional[Netzebene] = None
"""
Netzebene, in der der Bezug der Energie erfolgt.
Bei Strom Spannungsebene der Lieferung, bei Gas Druckstufe.
Expand Down
8 changes: 4 additions & 4 deletions src/bo4e/bo/marktteilnehmer.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ class Marktteilnehmer(Geschaeftspartner):
# required attributes
bo_typ: BoTyp = BoTyp.MARKTTEILNEHMER
#: Gibt im Klartext die Bezeichnung der Marktrolle an
marktrolle: Marktrolle
marktrolle: Optional[Marktrolle] = None
#: Gibt die Codenummer der Marktrolle an
rollencodenummer: Annotated[str, Field(strict=True, pattern=r"^\d{13}$")]
rollencodenummer: Optional[str] = None
#: Gibt den Typ des Codes an
rollencodetyp: Rollencodetyp
rollencodetyp: Optional[Rollencodetyp] = None
#: Sparte des Marktteilnehmers, z.B. Gas oder Strom
sparte: Sparte
sparte: Optional[Sparte] = None

# optional attributes
#: Die 1:1-Kommunikationsadresse des Marktteilnehmers; Diese wird in der Marktkommunikation verwendet.
Expand Down
10 changes: 5 additions & 5 deletions src/bo4e/bo/messlokation.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,21 @@ class Messlokation(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.MESSLOKATION
#: Die Messlokations-Identifikation; Das ist die frühere Zählpunktbezeichnung
messlokations_id: Annotated[str, Field(pattern=_melo_id_pattern.pattern)]
messlokations_id: Optional[str] = None
#: Sparte der Messlokation, z.B. Gas oder Strom
sparte: Sparte
sparte: Optional[Sparte] = None

# optional attributes
#: Spannungsebene der Messung
netzebene_messung: Optional[Netzebene] = None
#: Die Nummer des Messgebietes in der ene't-Datenbank
messgebietnr: Optional[str] = None
#: Liste der Hardware, die zu dieser Messstelle gehört
geraete: Optional[List[Hardware]] = None
geraete: Optional[list[Hardware]] = None
#: Liste der Messdienstleistungen, die zu dieser Messstelle gehört
messdienstleistung: Optional[List[Dienstleistung]] = None # todo: rename to plural
messdienstleistung: Optional[list[Dienstleistung]] = None # todo: rename to plural
#: Zähler, die zu dieser Messlokation gehören
messlokationszaehler: Optional[List[Zaehler]] = None
messlokationszaehler: Optional[list[Zaehler]] = None

# only one of the following two optional codenr attributes can be set
grundzustaendiger_msb_codenr: Optional[str] = None
Expand Down
14 changes: 7 additions & 7 deletions src/bo4e/bo/netznutzungsrechnung.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,26 +31,26 @@ class Netznutzungsrechnung(Rechnung):
# required attributes
bo_typ: BoTyp = BoTyp.NETZNUTZUNGSRECHNUNG
#: Sparte (Strom, Gas ...) für die die Rechnung ausgestellt ist
sparte: Sparte
absendercodenummer: Annotated[str, Field(strict=True, pattern=r"^\d{13}$")]
sparte: Optional[Sparte] = None
absendercodenummer: Optional[str] = None
"""
Die Rollencodenummer des Absenders (siehe :class:`Marktteilnehmer`).
Über die Nummer können weitere Informationen zum Marktteilnehmer ermittelt werden.
"""
empfaengercodenummer: Annotated[str, Field(strict=True, pattern=r"^\d{13}$")]
empfaengercodenummer: Optional[str] = None
"""
Die Rollencodenummer des Empfängers (siehe :class:`Marktteilnehmer`).
Über die Nummer können weitere Informationen zum Marktteilnehmer ermittelt werden.
"""
#: Aus der INVOIC entnommen
nnrechnungsart: NNRechnungsart
nnrechnungsart: Optional[NNRechnungsart] = None
#: Aus der INVOIC entnommen
nnrechnungstyp: NNRechnungstyp
nnrechnungstyp: Optional[NNRechnungstyp] = None

#: Kennzeichen, ob es sich um ein Original (true) oder eine Kopie handelt (false)
original: bool
original: Optional[bool] = None
#: Kennzeichen, ob es sich um eine simulierte Rechnung, z.B. zur Rechnungsprüfung handelt
simuliert: bool
simuliert: Optional[bool] = None

# optional attributes
lokations_id: Optional[str] = None
Expand Down
10 changes: 5 additions & 5 deletions src/bo4e/bo/preisblatt.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ class Preisblatt(Geschaeftsobjekt):
# required attributes
bo_typ: BoTyp = BoTyp.PREISBLATT
#: Eine Bezeichnung für das Preisblatt
bezeichnung: str
bezeichnung: Optional[str] = None
#: Preisblatt gilt für angegebene Sparte
sparte: Sparte
sparte: Optional[Sparte] = None
#: Merkmal, das anzeigt, ob es sich um vorläufige oder endgültige Preise handelt
preisstatus: Preisstatus
preisstatus: Optional[Preisstatus] = None
#: Der Zeitraum für den der Preis festgelegt ist
gueltigkeit: Zeitraum
gueltigkeit: Optional[Zeitraum] = None
#: Die einzelnen Positionen, die mit dem Preisblatt abgerechnet werden können. Z.B. Arbeitspreis, Grundpreis etc
preispositionen: Annotated[list[Preisposition], Len(1)]
preispositionen: Optional[list[Preisposition]] = None
# optional attributes
#: Der Netzbetreiber, der die Preise veröffentlicht hat
herausgeber: Optional[Marktteilnehmer] = None
Loading

0 comments on commit 9c0c89a

Please sign in to comment.