diff --git a/toardb/stationmeta/crud.py b/toardb/stationmeta/crud.py index 8691370834fa5aee80643758ddd987c6f388d4b6..481173e18c2a345ae4e953910b5400deb9c9ba7a 100644 --- a/toardb/stationmeta/crud.py +++ b/toardb/stationmeta/crud.py @@ -4,7 +4,7 @@ Create, Read, Update, Delete functionality """ -from sqlalchemy import cast, Text, insert, update, delete +from sqlalchemy import cast, Text, insert, update, delete, select from typing import List from geoalchemy2.types import Geometry from geoalchemy2.elements import WKBElement, WKTElement @@ -19,7 +19,7 @@ from .models import StationmetaCore, StationmetaChangelog, stationmeta_core_stat from toardb.generic.models import RS_enum, RC_enum from .schemas import get_coordinates_from_geom, get_geom_from_coordinates, StationmetaCreate, StationmetaPatch, Coordinates from pydantic import ValidationError -from toardb.utils.utils import get_value_from_str +from toardb.utils.utils import get_value_from_str, get_str_from_value def get_stationmeta_core(db: Session, station_code: str): @@ -62,11 +62,20 @@ def get_all_stationmeta(db: Session, skip : int = 0, limit: int = None): return db_objects +# is this internal, or should this also go to public REST api? +# - get_stationmeta_roles +# - get_stationmeta_changelog +# - get_unique_stationmeta_role +# - get_stationmeta_role_by_id +# - get_unique_stationmeta_annotation +def get_stationmeta_roles(db: Session, station_id: int): + return db.execute(select([stationmeta_core_stationmeta_roles_table]).where(stationmeta_core_stationmeta_roles_table.c.station_id == station_id)) + + def get_stationmeta_changelog(db: Session, station_id: int): return db.query(models.StationmetaChangelog).filter(models.StationmetaChangelog.station_id == station_id).all() -# is this internal, or should this also go to public REST api? def get_unique_stationmeta_role(db: Session, role: int, contact_id: int, status: int): db_object = db.query(models.StationmetaRole).filter(models.StationmetaRole.role == role) \ .filter(models.StationmetaRole.contact_id == contact_id) \ @@ -74,8 +83,10 @@ def get_unique_stationmeta_role(db: Session, role: int, contact_id: int, status: .first() return db_object +def get_stationmeta_role_by_id(db: Session, role_id): + return db.query(models.StationmetaRole).filter(models.StationmetaRole.id == role_id).first() + -# is this internal, or should this also go to public REST api? def get_unique_stationmeta_annotation(db: Session, text: str, contributor_id: int): db_object = db.query(models.StationmetaAnnotation).filter(models.StationmetaAnnotation.text == text) \ .filter(models.StationmetaAnnotation.contributor_id == contributor_id) \ @@ -205,11 +216,11 @@ def patch_stationmeta(db: Session, description: str, station_id: int, stationmet for k, v in stationmeta_dict.items(): if v is not None: # prepare changelog entry/entries - db_changelog = StationmetaChangelog(description=description, station_id=station_id, author_id=1, type_of_change=1) + desc = description + f"; field: {k}" + db_changelog = StationmetaChangelog(description=desc, station_id=station_id, author_id=1, type_of_change=1) db_changelog.old_value=str(getattr(db_stationmeta,k)) setattr(db_stationmeta,k,stationmeta_dict[k]) db_changelog.new_value=str(getattr(db_stationmeta,k)) - db_changelog.description=description + f"; field: {k}" db.add(db_changelog) result = db.commit() db.refresh(db_stationmeta) @@ -217,8 +228,16 @@ def patch_stationmeta(db: Session, description: str, station_id: int, stationmet if roles_data: for r in roles_data: # prepare changelog entry/entries - db_changelog = StationmetaChangelog(description=description, station_id=station_id, author_id=1, type_of_change=1) - db_changelog.old_value=str(getattr(db_stationmeta,"roles")) + desc = description + f"; add role" + db_changelog = StationmetaChangelog(description=desc, station_id=station_id, author_id=1, type_of_change=1) + db_old_roles = get_stationmeta_roles(db, station_id) + oldvalue='' + for oldr in db_old_roles: + old_role = get_stationmeta_role_by_id(db, oldr.role_id) + oldvalue=oldvalue + "{'role': '" + get_str_from_value(RC_enum,old_role.role) + \ + "', 'status': '" + get_str_from_value(RS_enum,old_role.status) + \ + "', 'contact_id': " + str(old_role.contact_id) + '}' + db_changelog.old_value=oldvalue db_role = models.StationmetaRole(**r) db_role.role = get_value_from_str(RC_enum,db_role.role) db_role.status = get_value_from_str(RS_enum,db_role.status) @@ -232,7 +251,7 @@ def patch_stationmeta(db: Session, description: str, station_id: int, stationmet db.refresh(db_role) role_id = db_role.id db.execute(insert(stationmeta_core_stationmeta_roles_table).values(station_id=station_id, role_id=role_id)) - db_changelog.new_value=str(r) + db_changelog.new_value=oldvalue + str(r) db.add(db_changelog) db.commit() # store annotations and update association table