diff --git a/toardb/stationmeta/models_core.py b/toardb/stationmeta/models_core.py index 4383d7a26b47749d1670dea58531dc9843c21fa9..c4d5420999aa618b64c7a19b04635ab08270dc7d 100644 --- a/toardb/stationmeta/models_core.py +++ b/toardb/stationmeta/models_core.py @@ -13,7 +13,11 @@ from toardb.auth_user.models import AuthUser from toardb.base import Base STATIONMETA_CORE_ID_SEQ = Sequence('stationmeta_core_id_seq') # define sequence explicitly -class StationmetaCore(Base): +# coordinates are giving problems in nested views (from timeseries -- now try this approach) +# ==> unfortunately, there will be no coordinates shown in timeseries nested views +# still to be investigated! +# ValueError: [ValueError('dictionary update sequence element #0 has length 1; 2 is required',), TypeError('vars() argument must have __dict__ attribute',)] +class StationmetaCore_WithoutCoords(Base): """ Table "public.stationmeta_core" +------------------------------+--------------------------+-----------+----------+----------------------------------------------+ @@ -84,14 +88,12 @@ class StationmetaCore(Base): id = Column(Integer, STATIONMETA_CORE_ID_SEQ, primary_key=True, server_default=STATIONMETA_CORE_ID_SEQ.next_value()) codes = Column(ARRAY(String(16))) name = Column(String(128), nullable=False) - coordinates = Column(Geometry('POINTZ', 4326)) country = Column(String(128), nullable=False, index=True) state = Column(String(128), nullable=False, index=True) coordinate_validation_status = Column(ForeignKey('cv_vocabulary.enum_val'), nullable=False) coordinate_validation_date = Column(DateTime(True), nullable=False) type_of_environment = Column(ForeignKey('st_vocabulary.enum_val'), nullable=False) type_of_area = Column(ForeignKey('ta_vocabulary.enum_val'), nullable=False) - category = Column(String(128), nullable=False) timezone = Column(String(64), nullable=False) additional_metadata = Column(JSONB(astext_type=Text()), nullable=True) coordinate_validator_id = Column(ForeignKey(AuthUser.id, deferrable=True, initially='DEFERRED'), nullable=False, index=True) @@ -110,3 +112,6 @@ class StationmetaCore(Base): # cv_vocabulary = relationship('CvVocabulary') # ta_vocabulary = relationship('TaVocabulary') # st_vocabulary = relationship('StVocabulary') + +class StationmetaCore(StationmetaCore_WithoutCoords): + coordinates = Column(Geometry('POINTZ', 4326)) diff --git a/toardb/stationmeta/schemas.py b/toardb/stationmeta/schemas.py index f43df11becaffd526c448eaeda2276a3080734f7..db229819b14074108a1e79e2f75d2d2fbe30532c 100644 --- a/toardb/stationmeta/schemas.py +++ b/toardb/stationmeta/schemas.py @@ -23,6 +23,11 @@ class Coordinates(BaseModel): # ======== StationmetaCore ========= +class StationmetaCoreStub(BaseModel): + id: int = None + name: str + + class StationmetaCoreBase(BaseModel): id: int = None codes: List[str] = [] @@ -34,7 +39,6 @@ class StationmetaCoreBase(BaseModel): coordinate_validation_date: dt.datetime type_of_environment: str type_of_area: str - category: str timezone: str additional_metadata: Json coordinate_validator_id: int diff --git a/toardb/timeseries/models_core.py b/toardb/timeseries/models_core.py index ab54806e75d1abbd0fe2e369cbe6308240859c4b..b9ab1c96ad0032c3d51c75e902d7269b300cab44 100644 --- a/toardb/timeseries/models_core.py +++ b/toardb/timeseries/models_core.py @@ -112,7 +112,8 @@ class Timeseries(Base): programme_id = Column(ForeignKey(TimeseriesProgramme.id)) # for the nested view - station = relationship('StationmetaCore') + # problems with station and coordinates in nested views!!! + station = relationship('StationmetaCore_WithoutCoords') variable = relationship('Variable') programme = relationship('TimeseriesProgramme') diff --git a/toardb/timeseries/schemas.py b/toardb/timeseries/schemas.py index 85cb310208e5a1b22a7cd3f87d94cf938cebf914..46d2498512173abb17b3db016c461d1b55b01e7a 100644 --- a/toardb/timeseries/schemas.py +++ b/toardb/timeseries/schemas.py @@ -4,7 +4,7 @@ Pydantic schemas for TOAR database """ -from typing import List +from typing import List, Any from pydantic import BaseModel, Json, validator import datetime as dt @@ -12,10 +12,16 @@ from toardb.generic.models import RS_enum, RC_enum from .models import DA_enum, SF_enum, AT_enum, DS_enum, MM_enum from toardb.variables.schemas import Variable #from toardb.stationmeta.schemas import StationmetaCoreCreate +#from toardb.stationmeta.schemas import StationmetaCoreBase +#from toardb.stationmeta.schemas import StationmetaCore +#from toardb.stationmeta.schemas import StationmetaCreate +#from toardb.stationmeta.schemas import StationmetaBase +#from toardb.stationmeta.schemas import Stationmeta +from toardb.stationmeta.schemas import StationmetaCoreStub # ======== Timeseries ========= -class TimeseriesCoreBase(BaseModel): +class TimeseriesCoreBaseStub(BaseModel): id: int = None label: str order: int @@ -29,9 +35,6 @@ class TimeseriesCoreBase(BaseModel): sampling_height: float date_added: dt.datetime date_modified: dt.datetime - station_id: int - variable_id: int - programme_id: int additional_metadata: Json @validator('access_rights') @@ -55,6 +58,12 @@ class TimeseriesCoreBase(BaseModel): return tuple(filter(lambda x: x.value == int(v), MM_enum))[0].string +class TimeseriesCoreBase(TimeseriesCoreBaseStub): + station_id: int + variable_id: int + programme_id: int + + class TimeseriesCoreCreate(TimeseriesCoreBase): pass @@ -185,11 +194,22 @@ class TimeseriesProgramme(TimeseriesProgrammeBase): # ======== for nested view/upload ========= -class TimeseriesBase(TimeseriesCoreBase): +class TimeseriesBase(TimeseriesCoreBaseStub): roles: List[TimeseriesRole] = None annotations: List[TimeseriesAnnotation] = None variable: Variable # station: StationmetaCoreCreate +# station: StationmetaCoreBase +# station: StationmetaCore +# station: StationmetaCreate +# station: StationmetaBase +# station: Stationmeta +# station: StationmetaCoreStub +# None of the above is working for station +# ==> therefore now go with Any! +# (which means not showing human readable controlled vocabulary!) +# ==> still to be investigated! + station: Any programme: TimeseriesProgramme class Config: