Skip to content

Commit 4e65594

Browse files
authored
Merge pull request #9 from MickeyJ/dev
major refactor, fix aggregation endpoints, db update (a few more reference data tables)
2 parents cfe714e + 641eda6 commit 4e65594

File tree

212 files changed

+82728
-39876
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

212 files changed

+82728
-39876
lines changed

fao/all_model_imports.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
from fao.src.db.pipelines.donors.donors_model import Donors
1919
from fao.src.db.pipelines.food_groups.food_groups_model import FoodGroups
2020
from fao.src.db.pipelines.geographic_levels.geographic_levels_model import GeographicLevels
21+
from fao.src.db.pipelines.food_values.food_values_model import FoodValues
22+
from fao.src.db.pipelines.industries.industries_model import Industries
23+
from fao.src.db.pipelines.factors.factors_model import Factors
2124
from fao.src.db.pipelines.aquastat.aquastat_model import Aquastat
2225
from fao.src.db.pipelines.asti_expenditures.asti_expenditures_model import AstiExpenditures
2326
from fao.src.db.pipelines.asti_researchers.asti_researchers_model import AstiResearchers

fao/src/api/__main__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import uvicorn
1010
from . import api_map
1111
from fao.src.core import settings
12-
from ..core.middleware import add_version_headers
12+
from fao.src.core.middleware import add_version_headers, QueryStringFlatteningMiddleware
1313
from fao.src.core.exceptions import FAOAPIError
1414
from fao.src.core.error_handlers import (
1515
fao_exception_handler,
@@ -71,6 +71,7 @@
7171

7272
# Custom middleware
7373
app.middleware("http")(add_version_headers)
74+
app.add_middleware(QueryStringFlatteningMiddleware)
7475

7576

7677
# CORS middleware

fao/src/api/routers/asti/asti_expenditures.py

Lines changed: 801 additions & 494 deletions
Large diffs are not rendered by default.
Lines changed: 315 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,315 @@
1+
# Template: templates/config.py.jinja2
2+
# Generated as: fao/src/api/routers/asti_expenditures_config.py
3+
4+
from dataclasses import dataclass, field
5+
from typing import List, Dict, Any
6+
from fao.src.db.pipelines.asti_expenditures.asti_expenditures_model import AstiExpenditures
7+
from fao.src.db.pipelines.area_codes.area_codes_model import AreaCodes
8+
from fao.src.db.pipelines.item_codes.item_codes_model import ItemCodes
9+
from fao.src.db.pipelines.elements.elements_model import Elements
10+
from fao.src.db.pipelines.flags.flags_model import Flags
11+
12+
from fao.src.core.validation import (
13+
is_valid_area_code,
14+
is_valid_element_code,
15+
is_valid_flag,
16+
is_valid_item_code,
17+
)
18+
from fao.src.core.exceptions import (
19+
invalid_area_code,
20+
invalid_element_code,
21+
invalid_flag,
22+
invalid_item_code,
23+
)
24+
25+
@dataclass
26+
class AstiExpendituresConfig:
27+
"""Configuration for asti_expenditures API"""
28+
29+
# Basic info
30+
name: str = "asti_expenditures"
31+
model_name: str = "AstiExpenditures"
32+
table_name: str = "asti_expenditures"
33+
34+
# Columns
35+
all_data_fields: List[str] = field(default_factory=lambda: [
36+
"area_code",
37+
"area_code_m49",
38+
"area",
39+
"item_code",
40+
"item",
41+
"element_code",
42+
"element",
43+
"year_code",
44+
"year",
45+
"unit",
46+
"value",
47+
"flag",
48+
"note",
49+
])
50+
51+
all_parameter_fields: List[str] = field(default_factory=lambda: [
52+
"area_code",
53+
"area",
54+
"item_code",
55+
"item",
56+
"element_code",
57+
"element",
58+
"flag",
59+
"description",
60+
"year_code",
61+
"year",
62+
"year_min",
63+
"year_max",
64+
"unit",
65+
"value",
66+
"value_min",
67+
"value_max",
68+
"note",
69+
])
70+
71+
# Foreign keys
72+
foreign_keys: List[Dict[str, Any]] = field(default_factory=lambda: [
73+
{
74+
"table_name": "area_codes",
75+
"model_name": "AreaCodes",
76+
"join_column": "area_code_id",
77+
"columns": ["area_code", "area"],
78+
},
79+
{
80+
"table_name": "item_codes",
81+
"model_name": "ItemCodes",
82+
"join_column": "item_code_id",
83+
"columns": ["item_code", "item"],
84+
},
85+
{
86+
"table_name": "elements",
87+
"model_name": "Elements",
88+
"join_column": "element_code_id",
89+
"columns": ["element_code", "element"],
90+
},
91+
{
92+
"table_name": "flags",
93+
"model_name": "Flags",
94+
"join_column": "flag_id",
95+
"columns": ["flag", "description"],
96+
},
97+
])
98+
99+
filter_configs: List[Dict[str, Any]] = field(default_factory=lambda: [
100+
{
101+
"name": "area_code",
102+
"filter_type": "multi",
103+
"filter_model": AreaCodes, # <-- Actual model class
104+
"filter_column": "area_code",
105+
"validation_func": is_valid_area_code,
106+
"exception_func": invalid_area_code,
107+
"joins_table": "area_code_id",
108+
"join_model": AreaCodes, # <-- Actual model class
109+
"join_condition": AstiExpenditures.area_code_id,
110+
},
111+
{
112+
"name": "area",
113+
"filter_type": "like",
114+
"filter_model": AreaCodes, # <-- Actual model class
115+
"filter_column": "area",
116+
"joins_table": "area_code_id",
117+
"join_model": AreaCodes, # <-- Actual model class
118+
"join_condition": AstiExpenditures.area_code_id,
119+
},
120+
{
121+
"name": "item_code",
122+
"filter_type": "multi",
123+
"filter_model": ItemCodes, # <-- Actual model class
124+
"filter_column": "item_code",
125+
"validation_func": is_valid_item_code,
126+
"exception_func": invalid_item_code,
127+
"joins_table": "item_code_id",
128+
"join_model": ItemCodes, # <-- Actual model class
129+
"join_condition": AstiExpenditures.item_code_id,
130+
},
131+
{
132+
"name": "item",
133+
"filter_type": "like",
134+
"filter_model": ItemCodes, # <-- Actual model class
135+
"filter_column": "item",
136+
"joins_table": "item_code_id",
137+
"join_model": ItemCodes, # <-- Actual model class
138+
"join_condition": AstiExpenditures.item_code_id,
139+
},
140+
{
141+
"name": "element_code",
142+
"filter_type": "multi",
143+
"filter_model": Elements, # <-- Actual model class
144+
"filter_column": "element_code",
145+
"validation_func": is_valid_element_code,
146+
"exception_func": invalid_element_code,
147+
"joins_table": "element_code_id",
148+
"join_model": Elements, # <-- Actual model class
149+
"join_condition": AstiExpenditures.element_code_id,
150+
},
151+
{
152+
"name": "element",
153+
"filter_type": "like",
154+
"filter_model": Elements, # <-- Actual model class
155+
"filter_column": "element",
156+
"joins_table": "element_code_id",
157+
"join_model": Elements, # <-- Actual model class
158+
"join_condition": AstiExpenditures.element_code_id,
159+
},
160+
{
161+
"name": "flag",
162+
"filter_type": "multi",
163+
"filter_model": Flags, # <-- Actual model class
164+
"filter_column": "flag",
165+
"validation_func": is_valid_flag,
166+
"exception_func": invalid_flag,
167+
"joins_table": "flag_id",
168+
"join_model": Flags, # <-- Actual model class
169+
"join_condition": AstiExpenditures.flag_id,
170+
},
171+
{
172+
"name": "description",
173+
"filter_type": "like",
174+
"filter_model": Flags, # <-- Actual model class
175+
"filter_column": "description",
176+
"joins_table": "flag_id",
177+
"join_model": Flags, # <-- Actual model class
178+
"join_condition": AstiExpenditures.flag_id,
179+
},
180+
{
181+
"name": "year_code",
182+
"filter_type": "like",
183+
"filter_model": AstiExpenditures, # <-- Actual model class
184+
"filter_column": "year_code",
185+
},
186+
{
187+
"name": "year",
188+
"filter_type": "exact",
189+
"filter_model": AstiExpenditures, # <-- Actual model class
190+
"filter_column": "year",
191+
},
192+
{
193+
"name": "year_min",
194+
"filter_type": "range_min",
195+
"filter_model": AstiExpenditures, # <-- Actual model class
196+
"filter_column": "year",
197+
},
198+
{
199+
"name": "year_max",
200+
"filter_type": "range_max",
201+
"filter_model": AstiExpenditures, # <-- Actual model class
202+
"filter_column": "year",
203+
},
204+
{
205+
"name": "unit",
206+
"filter_type": "like",
207+
"filter_model": AstiExpenditures, # <-- Actual model class
208+
"filter_column": "unit",
209+
},
210+
{
211+
"name": "value",
212+
"filter_type": "exact",
213+
"filter_model": AstiExpenditures, # <-- Actual model class
214+
"filter_column": "value",
215+
},
216+
{
217+
"name": "value_min",
218+
"filter_type": "range_min",
219+
"filter_model": AstiExpenditures, # <-- Actual model class
220+
"filter_column": "value",
221+
},
222+
{
223+
"name": "value_max",
224+
"filter_type": "range_max",
225+
"filter_model": AstiExpenditures, # <-- Actual model class
226+
"filter_column": "value",
227+
},
228+
{
229+
"name": "note",
230+
"filter_type": "like",
231+
"filter_model": AstiExpenditures, # <-- Actual model class
232+
"filter_column": "note",
233+
},
234+
])
235+
236+
range_configs: List[Dict[str, Any]] = field(default_factory=lambda: [
237+
{
238+
"param_name": "year",
239+
"filter_model": AstiExpenditures,
240+
"filter_column": "year",
241+
},
242+
{
243+
"param_name": "value",
244+
"filter_model": AstiExpenditures,
245+
"filter_column": "value",
246+
},
247+
])
248+
249+
field_metadata: Dict[str, Dict[str, Any]] = field(default_factory=lambda: {
250+
"area_code": {
251+
"type": "String",
252+
"is_numeric": False,
253+
"nullable": False,
254+
},
255+
"area_code_m49": {
256+
"type": "String",
257+
"is_numeric": False,
258+
"nullable": False,
259+
},
260+
"area": {
261+
"type": "String",
262+
"is_numeric": False,
263+
"nullable": False,
264+
},
265+
"item_code": {
266+
"type": "String",
267+
"is_numeric": False,
268+
"nullable": False,
269+
},
270+
"item": {
271+
"type": "String",
272+
"is_numeric": False,
273+
"nullable": False,
274+
},
275+
"element_code": {
276+
"type": "String",
277+
"is_numeric": False,
278+
"nullable": False,
279+
},
280+
"element": {
281+
"type": "String",
282+
"is_numeric": False,
283+
"nullable": False,
284+
},
285+
"year_code": {
286+
"type": "String",
287+
"is_numeric": False,
288+
"nullable": False,
289+
},
290+
"year": {
291+
"type": "SmallInteger",
292+
"is_numeric": True,
293+
"nullable": False,
294+
},
295+
"unit": {
296+
"type": "String",
297+
"is_numeric": False,
298+
"nullable": False,
299+
},
300+
"value": {
301+
"type": "Float",
302+
"is_numeric": True,
303+
"nullable": False,
304+
},
305+
"flag": {
306+
"type": "String",
307+
"is_numeric": False,
308+
"nullable": False,
309+
},
310+
"note": {
311+
"type": "String",
312+
"is_numeric": False,
313+
"nullable": False,
314+
},
315+
})

0 commit comments

Comments
 (0)