Skip to content

Commit 3012ff9

Browse files
committed
Add new field name for fdrs and change ingestion logic
1 parent 61ad6b3 commit 3012ff9

File tree

6 files changed

+981
-209
lines changed

6 files changed

+981
-209
lines changed

databank/admin.py

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,33 @@ class CountryOverviewAdmin(admin.ModelAdmin):
7777
_("COUNTRY KEY INDICATORS (SOURCE: FDRS)"),
7878
{
7979
"fields": (
80-
"population",
81-
"urban_population",
82-
"gdp",
83-
"gnipc",
84-
"poverty",
85-
"life_expectancy",
86-
"literacy",
80+
"fdrs_population",
81+
"fdrs_population_data_year",
82+
"fdrs_urban_population",
83+
"fdrs_urban_population_data_year",
84+
"fdrs_gdp",
85+
"fdrs_gdp_data_year",
86+
"fdrs_gnipc",
87+
"fdrs_gnipc_data_year",
88+
"fdrs_poverty",
89+
"fdrs_poverty_data_year",
90+
"fdrs_life_expectancy",
91+
"fdrs_life_expectancy_data_year",
92+
"fdrs_literacy",
93+
"fdrs_literacy_data_year",
8794
)
8895
},
8996
),
9097
(
9198
_("NATIONAL SOCIETY INDICATORS (SOURCE: FDRS)"),
9299
{
93-
"fields": ("income", "expenditures", "volunteers", "trained_in_first_aid", "branches"),
100+
"fields": (
101+
"fdrs_income",
102+
"fdrs_expenditures",
103+
"fdrs_volunteer_total",
104+
"fdrs_trained_in_first_aid",
105+
"fdrs_branches",
106+
),
94107
},
95108
),
96109
(_("KEY CLIMATE EVENT"), {"fields": ("avg_temperature", "avg_rainfall_precipitation", "rainy_season")}),
@@ -99,27 +112,27 @@ class CountryOverviewAdmin(admin.ModelAdmin):
99112
{
100113
"fields": (
101114
"world_bank_population",
102-
"calculated_world_bank_population_year",
115+
"world_bank_population_year",
103116
"world_bank_population_above_age_65",
104-
"calculated_world_bank_population_above_age_65_year",
117+
"world_bank_population_above_age_65_year",
105118
"world_bank_population_age_14",
106-
"calculated_world_bank_population_age_14_year",
119+
"world_bank_population_age_14_year",
107120
"world_bank_urban_population_percentage",
108-
"calculated_world_bank_urban_population_percentage_year",
121+
"world_bank_urban_population_percentage_year",
109122
"world_bank_gdp",
110-
"calculated_world_bank_gdp_year",
123+
"world_bank_gdp_year",
111124
"world_bank_gni",
112-
"calculated_world_bank_gni_year",
125+
"world_bank_gni_year",
113126
"world_bank_gender_equality_index",
114-
"calculated_world_bank_gender_equality_index_year",
127+
"world_bank_gender_equality_index_year",
115128
"world_bank_life_expectancy",
116-
"calculated_world_bank_life_expectancy_year",
129+
"world_bank_life_expectancy_year",
117130
"world_bank_literacy_rate",
118-
"calculated_world_bank_literacy_rate_year",
131+
"world_bank_literacy_rate_year",
119132
"world_bank_poverty_rate",
120-
"calculated_world_bank_poverty_rate_year",
133+
"world_bank_poverty_rate_year",
121134
"world_bank_gni_capita",
122-
"calculated_world_bank_gni_capita_year",
135+
"world_bank_gni_capita_year",
123136
)
124137
},
125138
),

databank/management/commands/ingest_databank.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,11 @@
99
from databank.models import CountryOverview
1010
from main.sentry import SentryMonitor
1111

12-
from .sources import FDRS, FTS_HPC, INFORM, RELIEFWEB, START_NETWORK, WB
12+
from .sources import FDRS
1313

1414
logger = logging.getLogger(__name__)
1515

16-
SOURCES = [
17-
(s, s.__name__.split(".")[-1])
18-
for s in (
19-
FDRS,
20-
FTS_HPC,
21-
INFORM,
22-
RELIEFWEB,
23-
START_NETWORK,
24-
WB,
25-
)
26-
]
16+
SOURCES = [(s, s.__name__.split(".")[-1]) for s in (FDRS,)]
2717

2818

2919
class Command(BaseCommand):

databank/management/commands/ingest_worldbank.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,47 +25,47 @@ class CountryIndicatorData(typing.TypedDict):
2525
WORLD_BANK_INDICATOR_MAP = {
2626
"SP.POP.TOTL": (
2727
CountryOverview.world_bank_population,
28-
CountryOverview.calculated_world_bank_population_year,
28+
CountryOverview.world_bank_population_year,
2929
),
3030
"SP.POP.65UP.TO": (
3131
CountryOverview.world_bank_population_above_age_65,
32-
CountryOverview.calculated_world_bank_population_above_age_65_year,
32+
CountryOverview.world_bank_population_above_age_65_year,
3333
),
3434
"SP.POP.0014.TO": (
3535
CountryOverview.world_bank_population_age_14,
36-
CountryOverview.calculated_world_bank_population_age_14_year,
36+
CountryOverview.world_bank_population_age_14_year,
3737
),
3838
"SP.URB.TOTL.IN.ZS": (
3939
CountryOverview.world_bank_urban_population_percentage,
40-
CountryOverview.calculated_world_bank_urban_population_percentage_year,
40+
CountryOverview.world_bank_urban_population_percentage_year,
4141
),
4242
"NY.GDP.MKTP.CD": (
4343
CountryOverview.world_bank_gdp,
44-
CountryOverview.calculated_world_bank_gdp_year,
44+
CountryOverview.world_bank_gdp_year,
4545
),
4646
"NY.GNP.MKTP.CD": (
4747
CountryOverview.world_bank_gni,
48-
CountryOverview.calculated_world_bank_gni_year,
48+
CountryOverview.world_bank_gni_year,
4949
),
5050
"IQ.CPA.GNDR.XQ": (
5151
CountryOverview.world_bank_gender_equality_index,
52-
CountryOverview.calculated_world_bank_gender_equality_index_year,
52+
CountryOverview.world_bank_gender_equality_index_year,
5353
),
5454
"SP.DYN.LE00.IN": (
5555
CountryOverview.world_bank_life_expectancy,
56-
CountryOverview.calculated_world_bank_life_expectancy_year,
56+
CountryOverview.world_bank_life_expectancy_year,
5757
),
5858
"SE.ADT.LITR.ZS": (
5959
CountryOverview.world_bank_literacy_rate,
60-
CountryOverview.calculated_world_bank_literacy_rate_year,
60+
CountryOverview.world_bank_literacy_rate_year,
6161
),
6262
"SI.POV.NAHC": (
6363
CountryOverview.world_bank_poverty_rate,
64-
CountryOverview.calculated_world_bank_poverty_rate_year,
64+
CountryOverview.world_bank_poverty_rate_year,
6565
),
6666
"NY.GNP.PCAP.CD": (
6767
CountryOverview.world_bank_gni_capita,
68-
CountryOverview.calculated_world_bank_gni_capita_year,
68+
CountryOverview.world_bank_gni_capita_year,
6969
),
7070
}
7171

databank/management/commands/sources/FDRS.py

Lines changed: 98 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -10,76 +10,86 @@
1010
logger = logging.getLogger(__name__)
1111

1212

13-
FDRS_INDICATORS_FIELD_MAP = (
13+
FDRS_INDICATORS_FIELD_MAP = {
1414
# INFORM API Indicator, Databank Field
1515
# Country Key Indicators
16-
("Population", CO.population),
17-
("UrbPop", CO.urban_population),
18-
("GDP", CO.gdp),
19-
("GNIPC", CO.gnipc),
20-
("Poverty", CO.poverty),
21-
("LifeExp", CO.life_expectancy),
22-
("Literacy", CO.literacy),
16+
"Population": (CO.fdrs_population, CO.fdrs_population_data_year),
17+
"UrbPop": (CO.fdrs_urban_population, CO.fdrs_urban_population_data_year),
18+
"GDP": (CO.fdrs_gdp, CO.fdrs_gdp_data_year),
19+
"GNIPC": (CO.fdrs_gnipc, CO.fdrs_gnipc_data_year),
20+
"Poverty": (CO.fdrs_poverty, CO.fdrs_poverty_data_year),
21+
"LifeExp": (CO.fdrs_life_expectancy, CO.fdrs_life_expectancy_data_year),
22+
"Literacy": (CO.fdrs_literacy, CO.fdrs_literacy_data_year),
2323
# National Society Indicators (Using Script: FDRS API)
24-
("KPI_IncomeLC_CHF", CO.income),
25-
("KPI_expenditureLC_CHF", CO.expenditures),
26-
("KPI_PeopleVol_Tot", CO.volunteers),
27-
("KPI_TrainFA_Tot", CO.trained_in_first_aid),
28-
("KPI_noBranches", CO.branches),
24+
"KPI_IncomeLC_CHF": (CO.fdrs_income, CO.fdrs_income_data_year),
25+
"KPI_expenditureLC_CHF": (CO.fdrs_expenditures, CO.fdrs_expenditures_data_year),
26+
"KPI_TrainFA_Tot": (CO.fdrs_trained_in_first_aid, CO.fdrs_trained_in_first_aid_data_year),
27+
"KPI_noBranches": (CO.fdrs_branches, CO.fdrs_branches_data_year),
28+
}
29+
30+
FDRS_VOLUNTEERS_DISAGGREGATION_INDICATORS_FIELD_MAP = (
2931
# volunteers
30-
("KPI_PeopleVol_M_age_13_17", CO.male_volunteer_age_13_17),
31-
("KPI_PeopleVol_M_age_18_29", CO.male_volunteer_age_18_29),
32-
("KPI_PeopleVol_M_age_18_49", CO.male_volunteer_age_18_49),
33-
("KPI_PeopleVol_M_age_30_39", CO.male_volunteer_age_30_39),
34-
("KPI_PeopleVol_M_age_40_49", CO.male_volunteer_age_40_49),
35-
("KPI_PeopleVol_M_age_50_59", CO.male_volunteer_age_50_59),
36-
("KPI_PeopleVol_M_age_6_12", CO.male_volunteer_age_6_12),
37-
("KPI_PeopleVol_M_age_60_69", CO.male_volunteer_age_60_69),
38-
("KPI_PeopleVol_M_age_70_79", CO.male_volunteer_age_70_79),
39-
("KPI_PeopleVol_M_age_80", CO.male_volunteer_age_80),
40-
("KPI_PeopleVol_M_age_Other", CO.male_volunteer_age_other),
41-
("KPI_PeopleVol_Tot_M", CO.male_volunteer_total),
42-
("KPI_PeopleVol_F_age_13_17", CO.female_volunteer_age_13_17),
43-
("KPI_PeopleVol_F_age_18_29", CO.female_volunteer_age_18_29),
44-
("KPI_PeopleVol_F_age_18_49", CO.female_volunteer_age_18_49),
45-
("KPI_PeopleVol_F_age_30_39", CO.female_volunteer_age_30_39),
46-
("KPI_PeopleVol_F_age_40_49", CO.female_volunteer_age_40_49),
47-
("KPI_PeopleVol_F_age_50_59", CO.female_volunteer_age_50_59),
48-
("KPI_PeopleVol_F_age_6_12", CO.female_volunteer_age_6_12),
49-
("KPI_PeopleVol_F_age_60_69", CO.female_volunteer_age_60_69),
50-
("KPI_PeopleVol_F_age_70_79", CO.female_volunteer_age_70_79),
51-
("KPI_PeopleVol_F_age_80", CO.female_volunteer_age_80),
52-
("KPI_PeopleVol_F_age_Other", CO.female_volunteer_age_other),
53-
("KPI_PeopleVol_Tot_F", CO.female_volunteer_total),
54-
("KPI_PeopleVol_Tot", CO.volunteer_total),
55-
("KPI_PeopleVol_Tot_age_6_12", CO.volunteer_age_6_12),
56-
("KPI_PeopleVol_Tot_age_13_17", CO.volunteer_age_13_17),
57-
("KPI_PeopleVol_Tot_age_18_29", CO.volunteer_age_18_29),
32+
("KPI_PeopleVol_M_age_13_17", CO.fdrs_male_volunteer_age_13_17),
33+
("KPI_PeopleVol_M_age_18_29", CO.fdrs_male_volunteer_age_18_29),
34+
("KPI_PeopleVol_M_age_18_49", CO.fdrs_male_volunteer_age_18_49),
35+
("KPI_PeopleVol_M_age_30_39", CO.fdrs_male_volunteer_age_30_39),
36+
("KPI_PeopleVol_M_age_40_49", CO.fdrs_male_volunteer_age_40_49),
37+
("KPI_PeopleVol_M_age_50_59", CO.fdrs_male_volunteer_age_50_59),
38+
("KPI_PeopleVol_M_age_6_12", CO.fdrs_male_volunteer_age_6_12),
39+
("KPI_PeopleVol_M_age_60_69", CO.fdrs_male_volunteer_age_60_69),
40+
("KPI_PeopleVol_M_age_70_79", CO.fdrs_male_volunteer_age_70_79),
41+
("KPI_PeopleVol_M_age_80", CO.fdrs_male_volunteer_age_80),
42+
("KPI_PeopleVol_M_age_Other", CO.fdrs_male_volunteer_age_other),
43+
("KPI_PeopleVol_Tot_M", CO.fdrs_male_volunteer_total),
44+
("KPI_PeopleVol_F_age_13_17", CO.fdrs_female_volunteer_age_13_17),
45+
("KPI_PeopleVol_F_age_18_29", CO.fdrs_female_volunteer_age_18_29),
46+
("KPI_PeopleVol_F_age_18_49", CO.fdrs_female_volunteer_age_18_49),
47+
("KPI_PeopleVol_F_age_30_39", CO.fdrs_female_volunteer_age_30_39),
48+
("KPI_PeopleVol_F_age_40_49", CO.fdrs_female_volunteer_age_40_49),
49+
("KPI_PeopleVol_F_age_50_59", CO.fdrs_female_volunteer_age_50_59),
50+
("KPI_PeopleVol_F_age_6_12", CO.fdrs_female_volunteer_age_6_12),
51+
("KPI_PeopleVol_F_age_60_69", CO.fdrs_female_volunteer_age_60_69),
52+
("KPI_PeopleVol_F_age_70_79", CO.fdrs_female_volunteer_age_70_79),
53+
("KPI_PeopleVol_F_age_80", CO.fdrs_female_volunteer_age_80),
54+
("KPI_PeopleVol_F_age_Other", CO.fdrs_female_volunteer_age_other),
55+
("KPI_PeopleVol_Tot_F", CO.fdrs_female_volunteer_total),
56+
("KPI_PeopleVol_Tot", CO.fdrs_volunteer_total),
57+
("KPI_PeopleVol_Tot_age_6_12", CO.fdrs_volunteer_age_6_12),
58+
("KPI_PeopleVol_Tot_age_13_17", CO.fdrs_volunteer_age_13_17),
59+
("KPI_PeopleVol_Tot_age_18_29", CO.fdrs_volunteer_age_18_29),
60+
)
61+
62+
FDRS_STAFF_DISAGGREGATION_INDICATORS_FIELD_MAP = (
5863
# Staff
59-
("KPI_PStaff_M_age_18_29", CO.male_staff_age_18_29),
60-
("KPI_PStaff_M_age_18_49", CO.male_staff_age_18_49),
61-
("KPI_PStaff_M_age_30_39", CO.male_staff_age_30_39),
62-
("KPI_PStaff_M_age_40_49", CO.male_staff_age_40_49),
63-
("KPI_PStaff_M_age_50_59", CO.male_staff_age_50_59),
64-
("KPI_PStaff_M_age_60_69", CO.male_staff_age_60_69),
65-
("KPI_PStaff_M_age_70_79", CO.male_staff_age_70_79),
66-
("KPI_PStaff_M_age_80", CO.male_staff_age_80),
67-
("KPI_PStaff_M_age_Other", CO.male_staff_age_other),
68-
("KPI_PStaff_Tot_M", CO.male_staff_total),
69-
("KPI_PStaff_F_age_18_29", CO.female_staff_age_18_29),
70-
("KPI_PStaff_F_age_18_49", CO.female_staff_age_18_49),
71-
("KPI_PStaff_F_age_30_39", CO.female_staff_age_30_39),
72-
("KPI_PStaff_F_age_40_49", CO.female_staff_age_40_49),
73-
("KPI_PStaff_F_age_50_59", CO.female_staff_age_50_59),
74-
("KPI_PStaff_F_age_60_69", CO.female_staff_age_60_69),
75-
("KPI_PStaff_F_age_70_79", CO.female_staff_age_70_79),
76-
("KPI_PStaff_F_age_80", CO.female_staff_age_80),
77-
("KPI_PStaff_F_age_Other", CO.female_staff_age_other),
78-
("KPI_PStaff_Tot_F", CO.female_staff_total),
79-
("KPI_PStaff_Tot", CO.staff_total),
80-
("KPI_PStaff_Tot_age_18_29", CO.staff_age_18_29),
64+
("KPI_PStaff_M_age_18_29", CO.fdrs_male_staff_age_18_29),
65+
("KPI_PStaff_M_age_18_49", CO.fdrs_male_staff_age_18_49),
66+
("KPI_PStaff_M_age_30_39", CO.fdrs_male_staff_age_30_39),
67+
("KPI_PStaff_M_age_40_49", CO.fdrs_male_staff_age_40_49),
68+
("KPI_PStaff_M_age_50_59", CO.fdrs_male_staff_age_50_59),
69+
("KPI_PStaff_M_age_60_69", CO.fdrs_male_staff_age_60_69),
70+
("KPI_PStaff_M_age_70_79", CO.fdrs_male_staff_age_70_79),
71+
("KPI_PStaff_M_age_80", CO.fdrs_male_staff_age_80),
72+
("KPI_PStaff_M_age_Other", CO.fdrs_male_staff_age_other),
73+
("KPI_PStaff_Tot_M", CO.fdrs_male_staff_total),
74+
("KPI_PStaff_F_age_18_29", CO.fdrs_female_staff_age_18_29),
75+
("KPI_PStaff_F_age_18_49", CO.fdrs_female_staff_age_18_49),
76+
("KPI_PStaff_F_age_30_39", CO.fdrs_female_staff_age_30_39),
77+
("KPI_PStaff_F_age_40_49", CO.fdrs_female_staff_age_40_49),
78+
("KPI_PStaff_F_age_50_59", CO.fdrs_female_staff_age_50_59),
79+
("KPI_PStaff_F_age_60_69", CO.fdrs_female_staff_age_60_69),
80+
("KPI_PStaff_F_age_70_79", CO.fdrs_female_staff_age_70_79),
81+
("KPI_PStaff_F_age_80", CO.fdrs_female_staff_age_80),
82+
("KPI_PStaff_F_age_Other", CO.fdrs_female_staff_age_other),
83+
("KPI_PStaff_Tot_F", CO.fdrs_female_staff_total),
84+
("KPI_PStaff_Tot", CO.fdrs_staff_total),
85+
("KPI_PStaff_Tot_age_18_29", CO.fdrs_staff_age_18_29),
8186
)
82-
FDRS_INDICATORS = [indicator for indicator, _ in FDRS_INDICATORS_FIELD_MAP]
87+
FDRS_INDICATORS = (
88+
[indicator for indicator in FDRS_INDICATORS_FIELD_MAP.keys()]
89+
+ [indicator for indicator, _ in FDRS_VOLUNTEERS_DISAGGREGATION_INDICATORS_FIELD_MAP]
90+
+ [indicator for indicator, _ in FDRS_STAFF_DISAGGREGATION_INDICATORS_FIELD_MAP]
91+
)
92+
8393

8494
# To fetch NS ID
8595
FDRS_NS_API_ENDPOINT = f"https://data-api.ifrc.org/api/entities/ns?apiKey={settings.FDRS_APIKEY}"
@@ -124,16 +134,29 @@ def load(country, overview, fdrs_data):
124134
if country.iso is None or fdrs_data is None:
125135
return
126136

127-
fdrs_data_fetched_year = max(
128-
int(item["year"]) for item in fdrs_data.values() if item is not None and item.get("year") is not None
129-
)
137+
for indicator, (field, year_field) in FDRS_INDICATORS_FIELD_MAP.items():
138+
data = fdrs_data.get(f"{country.iso.upper()}-{indicator}")
139+
if data:
140+
setattr(overview, field.field.name, data.get("value"))
141+
setattr(overview, year_field.field.name, data.get("year"))
142+
143+
def set_disaggregation_data(disaggregation_map, data_year_field):
144+
"""
145+
Set disaggregation data for volunteers or staff for the latest year
146+
"""
147+
latest_year = None
148+
for indicator, field in disaggregation_map:
149+
data = fdrs_data.get(f"{country.iso.upper()}-{indicator}")
150+
if data:
151+
year = data.get("year")
152+
if latest_year is None or (year and int(year) > latest_year):
153+
latest_year = int(year)
154+
setattr(overview, field.field.name, data.get("value"))
155+
setattr(overview, data_year_field.field.name, latest_year)
156+
157+
# Volunteer disaggregation
158+
set_disaggregation_data(FDRS_VOLUNTEERS_DISAGGREGATION_INDICATORS_FIELD_MAP, CO.fdrs_volunteer_data_year)
159+
# Staff disaggregation
160+
set_disaggregation_data(FDRS_STAFF_DISAGGREGATION_INDICATORS_FIELD_MAP, CO.fdrs_staff_data_year)
130161

131-
# NOTE: We are getting the only latest year specific data
132-
for fdrs_indicator, field in FDRS_INDICATORS_FIELD_MAP:
133-
data = fdrs_data.get(f"{country.iso.upper()}-{fdrs_indicator}")
134-
value = None
135-
if data and int(data.get("year")) == fdrs_data_fetched_year:
136-
value = data.get("value")
137-
setattr(overview, field.field.name, value)
138-
overview.fdrs_data_fetched_year = str(fdrs_data_fetched_year)
139162
overview.save()

0 commit comments

Comments
 (0)