1- from pydantic import BaseModel
2- from typing import Optional , Literal
31from datetime import datetime
42from enum import Enum
3+ from typing import Literal , Optional
4+
5+ from pydantic import BaseModel
6+
57
68class Location (BaseModel ):
79 """
810 Location model representing a geographical location with latitude and longitude.
911 """
12+
1013 latitude : float
1114 longitude : float
1215 elevation : Optional [float ] = None
@@ -20,49 +23,59 @@ class Location(BaseModel):
2023class IdentifiedModel (BaseModel ):
2124 id : int
2225
26+
2327class Photo (IdentifiedModel ):
2428 """
2529 A photo.
2630 """
31+
2732 # URL at which the photo should be fetchable
2833 url : str
2934 width : int
3035 height : int
3136 checksum : str
3237
38+
3339class BeddingFacing (Enum ):
3440 upright = "upright"
3541 overturned = "overturned"
3642 unknown = "unknown"
3743
44+
3845class PlanarOrientation (BaseModel ):
3946 strike : float
4047 dip : float
4148 facing : BeddingFacing = BeddingFacing .upright
4249 notes : Optional [str ] = None
4350 associated : list ["Orientation" ] = []
4451
52+
4553class LinearOrientation (BaseModel ):
4654 plunge : float
4755 trend : float
4856 notes : Optional [str ] = None
4957
58+
5059class Texture (BaseModel ):
5160 name : str
5261
62+
5363Orientation = PlanarOrientation | LinearOrientation
5464
65+
5566class GeologicAgeInterval (IdentifiedModel ):
5667 name : str
5768 t_age : Optional [float ] = None
5869 b_age : Optional [float ] = None
5970
71+
6072class Lithology (IdentifiedModel ):
6173 name : str
6274 parents : Optional [list [int ]] = None
6375 color : Optional [str ] = None
6476 pattern : Optional [str ] = None
6577
78+
6679class LithodemeType (Enum ):
6780 Formation = "formation"
6881 Member = "member"
@@ -76,30 +89,37 @@ class LithodemeType(Enum):
7689 Intrusion = "intrusion"
7790 ...
7891
92+
7993class LithodemeName (GeologicAgeInterval ):
80- """A lithodeme or stratigraphic unit name """
94+ """A lithodeme or stratigraphic unit name"""
95+
8196 parent : Optional [int ] = None
8297 type : LithodemeType
8398 t_interval : Optional [float ] = None
8499 b_interval : Optional [float ] = None
85100
101+
86102class RockUnit (IdentifiedModel ):
87103 name : str
88104 abbreviation : Optional [str ] = None
89105 liths : list [Lithology ] = []
90106 age : Optional [GeologicAgeInterval ] = None
91107 entity : Optional [LithodemeName ] = None
92108
109+
93110class Fossil (IdentifiedModel ):
94111 description : str
95112 taxa : Optional [str ] = None
96113
114+
97115AnyData = Orientation | Photo | RockUnit | Texture | Lithology | Fossil
98116
117+
99118class Observation (BaseModel ):
100119 notes : Optional [str ] = None
101120 data : AnyData
102121
122+
103123class Person (IdentifiedModel ):
104124 name : str
105125 email : Optional [str ] = None
@@ -112,22 +132,26 @@ class Sample(IdentifiedModel):
112132 """
113133 A sample of a rock or sediment
114134 """
135+
115136 name : str
116137 description : Optional [str ] = None
117138 sample_type : Literal ["rock" , "sediment" , "soil" , "water" ]
118139 igsn : Optional [str ] = None
119140 collected : datetime
120141
142+
121143class SocialInfo (BaseModel ):
122144 likes : int
123145 comments : int
124146 rating : Optional [int ] = None
125147
148+
126149class FieldSite (BaseModel ):
127150 """
128151 A site of with associated field observations
129152 """
130- id : int | str
153+
154+ id : int | str
131155 name : Optional [str ] = None
132156 location : Location
133157 created : datetime
@@ -139,4 +163,3 @@ class FieldSite(BaseModel):
139163 social : Optional [SocialInfo ] = None
140164 children : Optional [list ["FieldSite" ]] = None
141165 contributors : Optional [list [Person ]] = None
142-
0 commit comments