Coverage for toardb/data/schemas.py: 100%

52 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-11-03 20:32 +0000

1# SPDX-FileCopyrightText: 2021 Forschungszentrum Jülich GmbH 

2# SPDX-License-Identifier: MIT 

3 

4""" 

5Pydantic schemas for TOAR database 

6 

7""" 

8 

9from typing import List, Any 

10 

11from pydantic import BaseModel, validator, Field, Json 

12import datetime as dt 

13import toardb 

14 

15class DataBase(BaseModel): 

16 datetime: dt.datetime = Field(..., description="date and time of observation") 

17 value: float = Field(..., description="variable value at datetime") 

18 flags: str = Field(..., description="flag (see controlled vocabulary: Data Flag)") 

19 timeseries_id: int = Field(..., description="ID of timeseries") 

20 version: str = Field(..., description="version") 

21 

22 @validator('flags') 

23 def check_flags(cls, v): 

24 try: 

25 return tuple(filter(lambda x: x.value == int(v), toardb.toardb.DF_vocabulary))[0].display_str 

26 except: 

27 return v 

28 

29 @validator('version') 

30 def convert_version(cls, v): 

31 try: 

32 major,minor,micro = v.split('.') 

33 if int(micro) != 0: 

34 return f"{int(major)}.{int(minor)}.{int(micro)}" 

35 else: 

36 return f"{int(major)}.{int(minor)}" 

37 except: 

38 return v 

39 

40 

41class DataPatch(DataBase): 

42 pass 

43 

44 @validator('flags') 

45 def check_flags(cls, v): 

46 return int(v) 

47 

48 @validator('version') 

49 def convert_version(cls, v): 

50 # do not touch version string! 

51 return v 

52 

53 

54class DataCreate(DataBase): 

55 pass 

56 

57 @validator('flags') 

58 def check_flags(cls, v): 

59 return int(v) 

60 

61 

62 @validator('version') 

63 def convert_version(cls, v): 

64 # do not touch version string! 

65 return v 

66 

67 

68class Data(DataBase): 

69 datetime: dt.datetime = None 

70 value: float = None 

71 flags: str = None 

72 timeseries_id: int = None 

73 version: str = None 

74 

75 class Config: 

76 orm_mode = True 

77 

78 

79class Composite(BaseModel): 

80 metadata: Any = Field(..., description="all metadata available to the data") 

81 data: List[Data] = Field(..., description="the data itself") 

82