Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lahti: asetetaan kuljetustietojen vaatimat osapuolten roolit #62

Merged
merged 8 commits into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion db/migrations/R__import_koodisto_osapuolenlaji.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
insert into jkr_koodistot.osapuolenrooli(id, selite) values
(1,'Omistaja'),
(2,'Vanhin asukas'),
(3,'Asiakas')
(11,'Tilaaja sekajäte'),
(12,'Tilaaja biojäte'),
(13,'Tilaaja muovipakkaus'),
(14,'Tilaaja kartonkipakkaus'),
(15,'Tilaaja lasipakkaus'),
(16,'Tilaaja metalli'),
(17,'Tilaaja monilokero'),
(18,'Tilaaja liete'),
(111,'Kimppaisäntä sekajäte'),
(112,'Kimppaisäntä biojäte'),
(113,'Kimppaisäntä muovipakkaus'),
(114,'Kimppaisäntä kartonkipakkaus'),
(115,'Kimppaisäntä lasipakkaus'),
(116,'Kimppaisäntä metalli'),
(211,'Kimppaosakas sekajäte'),
(212,'Kimppaosakas biojäte'),
(213,'Kimppaosakas muovipakkaus'),
(214,'Kimppaosakas kartonkipakkaus'),
(215,'Kimppaosakas lasipakkaus'),
(216,'Kimppaosakas metalli')
on conflict (id) do update set selite = excluded.selite;
1 change: 1 addition & 0 deletions jkrimporter/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ class TyhjennysSopimus(BaseSopimus):
@dataclass
class KimppaSopimus(TyhjennysSopimus):
isannan_asiakasnumero: Optional[Tunnus] = None
asiakas_on_isanta: bool = False


@dataclass
Expand Down
33 changes: 22 additions & 11 deletions jkrimporter/providers/db/codes.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,29 @@ class OsapuolenlajiTyyppi(Enum):


class OsapuolenrooliTyyppi(Enum):
# Definitions at https://github.com/GispoCoding/jkr-lahti/issues/73
ASIAKAS = "Asiakas"
VANHIN_ASUKAS = "Vanhin asukas"
ASUKAS = "Asukas"
# Definitions at https://github.com/GispoCoding/jkr-lahti/issues/96
OMISTAJA = "Omistaja"
SEKAJATE_TILAAJA = "Sekajätteen tilaaja"
ENERGIAJATE_TILAAJA = "Energiajätteen tilaaja"
PAKKAUS_JA_BIOJATE_TILAAJA = "Pakkaus- ja biojätteen tilaaja"
AKP_TILAAJA = "Apk-tilaaja"
LIETE_KULJETUS_TILAAJA = "Lietteen kuljetuksen tilaaja"
KIMPPAISANTA = "Kimppaisäntä"
KIMPPAOSAKAS = "Kimppaosakas"
VANHIN_ASUKAS = "Vanhin asukas"
SEKAJATE_TILAAJA = "Tilaaja sekajäte"
BIOJATE_TILAAJA = "Tilaaja biojäte"
MUOVI_TILAAJA = "Tilaaja muovipakkaus"
KARTONKI_TILAAJA = "Tilaaja kartonkipakkaus"
LASI_TILAAJA = "Tilaaja lasipakkaus"
METALLI_TILAAJA = "Tilaaja metalli"
MONILOKERO_TILAAJA = "Tilaaja monilokero"
LIETE_TILAAJA = "Tilaaja liete"
SEKAJATE_KIMPPAISANTA = "Kimppaisäntä sekajäte"
BIOJATE_KIMPPAISANTA = "Kimppaisäntä biojäte"
MUOVI_KIMPPAISANTA = "Kimppaisäntä muovipakkaus"
KARTONKI_KIMPPAISANTA = "Kimppaisäntä kartonkipakkaus"
LASI_KIMPPAISANTA = "Kimppaisäntä lasipakkaus"
METALLI_KIMPPAISANTA = "Kimppaisäntä metalli"
SEKAJATE_KIMPPAOSAKAS = "Kimppaosakas sekajäte"
BIOJATE_KIMPPAOSAKAS = "Kimppaosakas biojäte"
MUOVI_KIMPPAOSAKAS = "Kimppaosakas muovipakkaus"
KARTONKI_KIMPPAOSAKAS = "Kimppaosakas kartonkipakkaus"
LASI_KIMPPAOSAKAS = "Kimppaosakas lasipakkaus"
METALLI_KIMPPAOSAKAS = "Kimppaosakas metalli"


class RakennuksenKayttotarkoitusTyyppi(Enum):
Expand Down
138 changes: 93 additions & 45 deletions jkrimporter/providers/db/services/osapuoli.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
from typing import TYPE_CHECKING

from jkrimporter.model import Asiakas
from jkrimporter.model import Asiakas, Jatelaji, SopimusTyyppi

from .. import codes
from ..codes import OsapuolenlajiTyyppi, OsapuolenrooliTyyppi
Expand All @@ -12,50 +10,100 @@ def create_or_update_haltija_osapuoli(
session, kohde, asiakas: "Asiakas", update_contacts: bool
):
"""
Luo kohteelle haltijaosapuolen

TODO: päivitä haltijan/asiakakkaan yhteystiedot (ml. poistaminen) #26
Luo kohteelle haltijaosapuolet jätelajeittain
"""

asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.ASIAKAS]

# Filter osapuoli by the same tiedontuottaja. This way, we don't
# override data coming from other tiedontuottajat, including DVV.
tiedontuottaja = asiakas.asiakasnumero.jarjestelma
# this is any asiakas from the same source
db_haltijat = [
kohteen_osapuoli.osapuoli
for kohteen_osapuoli in kohde.kohteen_osapuolet_collection
if kohteen_osapuoli.osapuolenrooli == asiakasrooli and
kohteen_osapuoli.osapuoli.tiedontuottaja_tunnus == tiedontuottaja
]

# this is asiakas with the same name and address
exists = any(
db_haltija.nimi == asiakas.haltija.nimi
and db_haltija.katuosoite == str(asiakas.haltija.osoite)
for db_haltija in db_haltijat
)
if not db_haltijat or (update_contacts and not exists):
print("Haltija changed or not found in db, creating new haltija!")
# Haltija has changed. We must create a new osapuoli. The old
# haltija is still valid for the old data, so we don't want to
# delete them.
jatteenhaltija = Osapuoli(
nimi=asiakas.haltija.nimi,
katuosoite=str(asiakas.haltija.osoite),
postinumero=asiakas.haltija.osoite.postinumero,
postitoimipaikka=asiakas.haltija.osoite.postitoimipaikka,
ytunnus=asiakas.haltija.ytunnus,
tiedontuottaja_tunnus=asiakas.asiakasnumero.jarjestelma
)
if is_asoy(asiakas.haltija.nimi):
jatteenhaltija.osapuolenlaji = codes.osapuolenlajit[
OsapuolenlajiTyyppi.ASOY
]
for sopimus in asiakas.sopimukset:
if sopimus.sopimustyyppi == SopimusTyyppi.kimppasopimus:
if sopimus.asiakas_on_isanta:
if sopimus.jatelaji == Jatelaji.sekajate:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.SEKAJATE_KIMPPAISANTA]
elif sopimus.jatelaji == Jatelaji.bio:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.BIOJATE_KIMPPAISANTA]
elif sopimus.jatelaji == Jatelaji.lasi:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.LASI_KIMPPAISANTA]
elif sopimus.jatelaji == Jatelaji.kartonki:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.KARTONKI_KIMPPAISANTA]
elif sopimus.jatelaji == Jatelaji.metalli:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.METALLI_KIMPPAISANTA]
elif sopimus.jatelaji == Jatelaji.muovi:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.MUOVI_KIMPPAISANTA]
else:
print("Skipping sopimus with unknown jätelaji " + sopimus.jatelaji + " in kimppasopimus")
continue
else:
if sopimus.jatelaji == Jatelaji.sekajate:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.SEKAJATE_KIMPPAOSAKAS]
elif sopimus.jatelaji == Jatelaji.bio:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.BIOJATE_KIMPPAOSAKAS]
elif sopimus.jatelaji == Jatelaji.lasi:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.LASI_KIMPPAOSAKAS]
elif sopimus.jatelaji == Jatelaji.kartonki:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.KARTONKI_KIMPPAOSAKAS]
elif sopimus.jatelaji == Jatelaji.metalli:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.METALLI_KIMPPAOSAKAS]
elif sopimus.jatelaji == Jatelaji.muovi:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.MUOVI_KIMPPAOSAKAS]
else:
print("Skipping sopimus with unknown jätelaji " + sopimus.jatelaji + " in kimppasopimus")
continue
else:
if sopimus.jatelaji == Jatelaji.sekajate:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.SEKAJATE_TILAAJA]
elif sopimus.jatelaji == Jatelaji.bio:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.BIOJATE_TILAAJA]
elif sopimus.jatelaji == Jatelaji.lasi:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.LASI_TILAAJA]
elif sopimus.jatelaji == Jatelaji.kartonki:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.KARTONKI_TILAAJA]
elif sopimus.jatelaji == Jatelaji.liete:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.LIETE_TILAAJA]
elif sopimus.jatelaji == Jatelaji.metalli:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.METALLI_TILAAJA]
elif sopimus.jatelaji == Jatelaji.muovi:
asiakasrooli = codes.osapuolenroolit[OsapuolenrooliTyyppi.MUOVI_TILAAJA]
else:
print("Skipping sopimus with unknown jätelaji " + sopimus.jatelaji + " in sopimus")
continue

kohteen_osapuoli = KohteenOsapuolet(
kohde=kohde, osapuoli=jatteenhaltija, osapuolenrooli=asiakasrooli
# Filter osapuoli by the same tiedontuottaja. This way, we don't
# override data coming from other tiedontuottajat, including DVV.
tiedontuottaja = asiakas.asiakasnumero.jarjestelma
# this is any asiakas from the same source
db_haltijat = [
kohteen_osapuoli.osapuoli
for kohteen_osapuoli in kohde.kohteen_osapuolet_collection
if kohteen_osapuoli.osapuolenrooli == asiakasrooli
and kohteen_osapuoli.osapuoli.tiedontuottaja_tunnus == tiedontuottaja
]

# this is asiakas with the same name and address
exists = any(
db_haltija.nimi == asiakas.haltija.nimi
and db_haltija.katuosoite == str(asiakas.haltija.osoite)
for db_haltija in db_haltijat
)

session.add(kohteen_osapuoli)
if not db_haltijat or (update_contacts and not exists):
print("Haltija changed or not found in db, creating new haltija!")
# Haltija has changed. We must create a new osapuoli. The old
# haltija is still valid for the old data, so we don't want to
# delete them.
jatteenhaltija = Osapuoli(
nimi=asiakas.haltija.nimi,
katuosoite=str(asiakas.haltija.osoite),
postinumero=asiakas.haltija.osoite.postinumero,
postitoimipaikka=asiakas.haltija.osoite.postitoimipaikka,
ytunnus=asiakas.haltija.ytunnus,
tiedontuottaja_tunnus=asiakas.asiakasnumero.jarjestelma,
)
if is_asoy(asiakas.haltija.nimi):
jatteenhaltija.osapuolenlaji = codes.osapuolenlajit[
OsapuolenlajiTyyppi.ASOY
]

kohteen_osapuoli = KohteenOsapuolet(
kohde=kohde, osapuoli=jatteenhaltija, osapuolenrooli=asiakasrooli
)

session.add(kohteen_osapuoli)
6 changes: 2 additions & 4 deletions jkrimporter/providers/lahti/lahtiprovider.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,13 +268,14 @@ def _append_asiakkaat(
alkupvm=row.Pvmalk,
loppupvm=row.Pvmasti,
isannan_asiakasnumero=isannan_asiakasnumero,
asiakas_on_isanta=(row.UrakoitsijankohdeId == row.KimpastaVastaava),
)
else:
sopimus = TyhjennysSopimus(
sopimustyyppi=sopimustyyppi,
jatelaji=jatelaji,
alkupvm=row.Pvmalk,
loppupvm=row.Pvmasti
loppupvm=row.Pvmasti,
)
if row.tyhjennysvali:
# tyhjennysväli is missing from some data
Expand All @@ -286,15 +287,13 @@ def _append_asiakkaat(
)
)
data.asiakkaat[tunnus].sopimukset.append(sopimus)
# print(data.asiakkaat[tunnus].sopimukset)

keraysvaline = Keraysvaline(
maara=row.astiamaara,
tilavuus=row.koko * 1000 if row.koko else None,
tyyppi=KeraysvalineTyyppi.SAILIO,
)
sopimus.keraysvalineet.append(keraysvaline)
# print(sopimus.keraysvalineet)

massa = row.paino * 1000 if row.paino else None
data.asiakkaat[tunnus].tyhjennystapahtumat.append(
Expand All @@ -307,7 +306,6 @@ def _append_asiakkaat(
massa=massa,
)
)
# print(data.asiakkaat[tunnus].tyhjennystapahtumat)
print("------")

return data
1 change: 1 addition & 0 deletions jkrimporter/providers/lahti/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class Asiakas(BaseModel):
Kuntatun: Optional[int] = None
palveluKimppakohdeId: Optional[str] = None
kimpanNimi: Optional[str] = None
KimpastaVastaava: Optional[str] = Field(alias="Kimpasta vastaava")
Kimpankatuosoite: Optional[str] = None
Kimpanposti: Optional[str] = None
# Keskeytysalkaen: Optional[datetime.date] = None,
Expand Down
11 changes: 8 additions & 3 deletions tests/data/test_lahti_siirtotiedosto/kuljetustiedot_csv.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
UrakoitsijaId;x-koordinaatti;y.koordinaattori;Eranro;UrakoitsijankohdeId;Rakennustunnus/Kiinteistotunnus;Kiinteistonkatuosoite;Kiinteistonposti;kimppa;kimppaid;Haltijannimi;Haltijanyhteyshlo;Haltijankatuosoite;Haltijanposti;Haltijanmaakoodi;Haltijanulkomaanpaikkakunta;Pvmalk;Pvmasti;tyyppiIdEWC;tapahtumannimi;COUNT(kaynnit);SUM(astiamaara);koko;SUM(paino);tyhjennysvali;kertaaviikossa;Voimassaoloviikotalkaen;Voimassaoloviikotasti;Voimassapmvalkaen;Voimassapvmasti;Voimassaoloviikotalkaen2;Voimassaoloviikotasti2;tyhjennysvali2;kertaaviikossa2;PalveluKuuluukokimppaan;Kimpanjakoosuus;palveluKimppakohdeId;KimpanNimi;Kimpasta vastaava;Kimpankatuosoite;Kimpanposti;Kuntatun;Keskeytysalkaen;Keskeytysasti
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Sekaj;660 L SEKAJÄTEASTIA TYHJENNYS;123;4;0,66;10;1;2;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;1.2.2023;15.2.2023
0000000-9;;;;01-0000123-01;134567890B;KIRKKOÄYRÄÄNTIE 1D;16200 ARTJÄRVI;;;LINDROTH OY;JOHN LINDROTH;KIRKKOÄYRÄÄNTIE 1D;16200 ARTJÄRVI;FI;;1.1.2023;31.12.2023;Energia;660 L ENERGIAJÄTEASTIA TYHJENNYS;66;2;0,66;8;1;;1;53;1.1.1900;31.12.2099;;;;;;;01-0000999-99;KIRKKOÄYRÄÄN ENERGIAKIMPPA;01-1110999-01;KIRKKOÄYRÄÄNTIE 11;16200 ARTJÄRVI;560;;
0000000-9;;;;01-0000123-02;100456789B;KUVAKALLIONTIE 1;15230 LAHTI;;;RIKU FORSSTRÖM;RIKU FORSSTRÖM;KUVAKALLIONTIE 1;15230 LAHTI;FI;;1.1.2023;31.12.2023;Energia;660 L ENERGIAJÄTEASTIA TYHJENNYS;22;2;0,66;7;1;;1;53;1.1.1900;31.12.2099;;;;;;;01-0000999-99;KIRKKOÄYRÄÄN ENERGIAKIMPPA;01-1110999-01;KIRKKOÄYRÄÄNTIE 11;16200 ARTJÄRVI;560;;
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Sekaj;660 L SEKAJÄTEASTIA TYHJENNYS;123;4;"0,66";10;1;2;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;1.2.2023;15.2.2023
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Lasi;240 L LASIJÄTEASTIA TYHJENNYS;65;2;"0,24";4;6;;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;;
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Metalli;240 L METALLIASTIA TYHJENNYS;57;2;"0,24";6;8;;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;;
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Kartonki;660 L KARTONKIASTIA TYHJENNYS;164;2;"0,66";28;2;;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;;
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Muovi;660 L PAKKAUSMUOVIASTIA TYHJENNYS;147;3;"0,66";23;1;1;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;;
0000000-9;6761402;427353;1234AB;01-0000001-00;123456789A;HARJUKATU 44;15100 LAHTI;;;ASUNTO OY KAHDEN LAULUMUISTO;HEIKKI LEHMUSTO;VESIJÄRVENKATU 8;15100 LAHTI;FI;;1.1.2023;31.12.2023;Bio;240 L BIOJÄTEASTIA TYHJENNYS;114;2;"0,24";5;1;;1;53;1.1.1900;31.12.2099;;;;;;;;;;;;398;;
0000000-9;;;;01-0000123-01;134567890B;KIRKKOÄYRÄÄNTIE 1D;16200 ARTJÄRVI;;;LINDROTH OY;JOHN LINDROTH;KIRKKOÄYRÄÄNTIE 1D;16200 ARTJÄRVI;FI;;1.1.2023;31.12.2023;Sekaj;660 L SEKAJÄTEASTIA TYHJENNYS;66;2;"0,66";8;1;;1;53;1.1.1900;31.12.2099;;;;;;;01-0000999-99;KIRKKOÄYRÄÄN SEKAKIMPPA;01-0000123-01;KIRKKOÄYRÄÄNTIE 11;16200 ARTJÄRVI;560;;
0000000-9;;;;01-0000123-02;100456789B;KUVAKALLIONTIE 1;15230 LAHTI;;;RIKU FORSSTRÖM;RIKU FORSSTRÖM;KUVAKALLIONTIE 1;15230 LAHTI;FI;;1.1.2023;31.12.2023;Sekaj;660 L SEKAJÄTEASTIA TYHJENNYS;22;2;"0,66";7;1;;1;53;1.1.1900;31.12.2099;;;;;;;01-0000999-99;KIRKKOÄYRÄÄN SEKAKIMPPA;01-0000123-01;KIRKKOÄYRÄÄNTIE 11;16200 ARTJÄRVI;560;;
Binary file not shown.
21 changes: 20 additions & 1 deletion tests/test_data_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,26 @@ def engine():
def test_osapuolenrooli(engine):
osapuolenroolit = [(1, 'Omistaja'),
(2, 'Vanhin asukas'),
(3, 'Asiakas')]
(11, 'Tilaaja sekajäte'),
(12, 'Tilaaja biojäte'),
(13, 'Tilaaja muovipakkaus'),
(14, 'Tilaaja kartonkipakkaus'),
(15, 'Tilaaja lasipakkaus'),
(16, 'Tilaaja metalli'),
(17, 'Tilaaja monilokero'),
(18, 'Tilaaja liete'),
(111, 'Kimppaisäntä sekajäte'),
(112, 'Kimppaisäntä biojäte'),
(113, 'Kimppaisäntä muovipakkaus'),
(114, 'Kimppaisäntä kartonkipakkaus'),
(115, 'Kimppaisäntä lasipakkaus'),
(116, 'Kimppaisäntä metalli'),
(211, 'Kimppaosakas sekajäte'),
(212, 'Kimppaosakas biojäte'),
(213, 'Kimppaosakas muovipakkaus'),
(214, 'Kimppaosakas kartonkipakkaus'),
(215, 'Kimppaosakas lasipakkaus'),
(216, 'Kimppaosakas metalli')]
session = Session(engine)
result = session.execute(select([Osapuolenrooli.id, Osapuolenrooli.selite]))
assert [tuple(row) for row in result] == osapuolenroolit
Expand Down
Loading
Loading