File size: 5,667 Bytes
d25db6b
09ecaf7
 
1686de5
09ecaf7
d25db6b
82ff6c1
 
09ecaf7
82ff6c1
d25db6b
82ff6c1
 
 
 
 
 
 
 
 
 
 
 
 
09ecaf7
394963a
 
1686de5
394963a
 
 
f503159
82ff6c1
 
 
 
 
 
 
 
 
 
 
 
 
394963a
f503159
 
 
 
 
 
 
 
 
 
 
 
 
351d460
f503159
 
 
 
 
 
d25db6b
 
09ecaf7
 
0f31229
 
 
 
 
 
82ff6c1
1686de5
 
d25db6b
 
d9e6017
f503159
 
 
 
 
65933cd
 
 
 
 
 
1686de5
 
 
 
 
 
82ff6c1
84aedaf
 
 
82ff6c1
 
 
 
 
 
 
 
 
 
 
 
351d460
 
 
 
09ecaf7
 
1686de5
09ecaf7
 
fe5d98f
 
d25db6b
 
 
fe5d98f
f503159
 
 
 
 
 
 
 
 
 
 
 
fe5d98f
 
 
 
4f6cbcc
 
fe5d98f
 
 
d25db6b
4f6cbcc
 
 
 
 
 
 
872dec2
 
 
4f6cbcc
 
872dec2
d25db6b
 
 
 
 
1686de5
d25db6b
 
 
 
 
 
1686de5
d25db6b
 
 
 
 
 
1686de5
d25db6b
 
 
 
 
 
 
 
1686de5
d25db6b
 
 
 
 
 
1686de5
d25db6b
394963a
 
 
 
 
 
1686de5
394963a
d7291ef
 
 
d25db6b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
from pydantic import BaseModel
from typing import List, Optional
from uuid import UUID
from datetime import datetime

class ImageCreate(BaseModel):
    source: Optional[str] = None
    event_type: str = "OTHER"
    countries: List[str] = []
    epsg: str = "OTHER"
    image_type: str
    
    # Drone-specific fields (optional)
    center_lon: Optional[float] = None
    center_lat: Optional[float] = None
    amsl_m: Optional[float] = None
    agl_m: Optional[float] = None
    heading_deg: Optional[float] = None
    yaw_deg: Optional[float] = None
    pitch_deg: Optional[float] = None
    roll_deg: Optional[float] = None
    rtk_fix: Optional[bool] = None
    std_h_m: Optional[float] = None
    std_v_m: Optional[float] = None

class ImageMetadataUpdate(BaseModel):
    source: Optional[str] = None
    event_type: Optional[str] = None
    countries: Optional[List[str]] = None
    epsg: Optional[str] = None
    image_type: Optional[str] = None
    starred: Optional[bool] = None  # Backward compatibility - updates first caption
    
    # Drone-specific fields (optional)
    center_lon: Optional[float] = None
    center_lat: Optional[float] = None
    amsl_m: Optional[float] = None
    agl_m: Optional[float] = None
    heading_deg: Optional[float] = None
    yaw_deg: Optional[float] = None
    pitch_deg: Optional[float] = None
    roll_deg: Optional[float] = None
    rtk_fix: Optional[bool] = None
    std_h_m: Optional[float] = None
    std_v_m: Optional[float] = None

class CaptionOut(BaseModel):
    caption_id: UUID
    title: Optional[str] = None
    prompt: Optional[str] = None
    model: Optional[str] = None
    schema_id: Optional[str] = None
    raw_json: Optional[dict] = None
    generated: Optional[str] = None
    edited: Optional[str] = None
    accuracy: Optional[int] = None
    context: Optional[int] = None
    usability: Optional[int] = None
    starred: bool = False
    image_count: Optional[int] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None

    class Config:
        from_attributes = True

class ImageOut(BaseModel):
    image_id: UUID
    file_key: str
    sha256: str
    thumbnail_key: Optional[str] = None
    thumbnail_sha256: Optional[str] = None
    thumbnail_url: Optional[str] = None  # Generated URL for frontend
    detail_key: Optional[str] = None
    detail_sha256: Optional[str] = None
    detail_url: Optional[str] = None  # Generated URL for frontend
    source: Optional[str] = None
    event_type: str
    epsg: Optional[str] = None
    image_type: str
    image_url: str
    countries: List["CountryOut"] = []
    captions: List[CaptionOut] = []
    starred: bool = False  # Backward compatibility - from first caption
    captured_at: Optional[datetime] = None
    
    # Backward compatibility fields for legacy frontend
    title: Optional[str] = None
    prompt: Optional[str] = None
    model: Optional[str] = None
    schema_id: Optional[str] = None
    raw_json: Optional[dict] = None
    generated: Optional[str] = None
    edited: Optional[str] = None
    accuracy: Optional[int] = None
    context: Optional[int] = None
    usability: Optional[int] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None
    
    # Preprocessing information
    preprocessing_info: Optional[dict] = None
    
    # Drone-specific fields
    center_lon: Optional[float] = None
    center_lat: Optional[float] = None
    amsl_m: Optional[float] = None
    agl_m: Optional[float] = None
    heading_deg: Optional[float] = None
    yaw_deg: Optional[float] = None
    pitch_deg: Optional[float] = None
    roll_deg: Optional[float] = None
    rtk_fix: Optional[bool] = None
    std_h_m: Optional[float] = None
    std_v_m: Optional[float] = None
    
    # Multi-upload fields
    all_image_ids: Optional[List[str]] = None
    image_count: Optional[int] = None

    class Config:
        from_attributes = True

class CaptionUpdate(BaseModel):
    title: str
    edited: str
    accuracy: Optional[int] = None
    context: Optional[int] = None
    usability: Optional[int] = None

class CaptionCreate(BaseModel):
    title: str
    prompt: str
    model: str
    raw_json: dict
    generated: str
    edited: str
    accuracy: Optional[int] = None
    context: Optional[int] = None
    usability: Optional[int] = None
    starred: bool = False

class PromptOut(BaseModel):
    p_code: str
    label: str
    metadata_instructions: str | None = None
    image_type: str
    is_active: bool
    
    class Config:
        from_attributes = True

class PromptCreate(BaseModel):
    p_code: str
    label: str
    metadata_instructions: str | None = None
    image_type: str
    is_active: bool

class PromptUpdate(BaseModel):
    label: str
    metadata_instructions: str | None = None
    image_type: str
    is_active: bool

class SourceOut(BaseModel):
    s_code: str
    label: str

    class Config:
        from_attributes = True

class RegionOut(BaseModel):
    r_code: str
    label: str

    class Config:
        from_attributes = True

class TypeOut(BaseModel):
    t_code: str
    label: str

    class Config:
        from_attributes = True

class SpatialReferenceOut(BaseModel):
    epsg: str
    srid: str
    proj4: str
    wkt: str

    class Config:
        from_attributes = True

class ImageTypeOut(BaseModel):
    image_type: str
    label: str

    class Config:
        from_attributes = True

class CountryOut(BaseModel):
    c_code: str
    label: str
    r_code: str

    class Config:
        from_attributes = True

class ModelToggleRequest(BaseModel):
    is_available: bool

ImageOut.update_forward_refs()