Skip to content

Commit 690c1b4

Browse files
authored
Merge pull request #170 from cmu-delphi/staging
Staging
2 parents d0fbd85 + 6e3b5b8 commit 690c1b4

File tree

4 files changed

+89
-16
lines changed

4 files changed

+89
-16
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Generated by Django 5.2.5 on 2025-10-10 20:33
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("base", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name="geography",
15+
options={
16+
"ordering": ["display_order_number"],
17+
"verbose_name": "Geography",
18+
"verbose_name_plural": "Geographies",
19+
},
20+
),
21+
]

src/epiportal/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from sentry_sdk.integrations.django import DjangoIntegration
2525
from sentry_sdk.integrations.redis import RedisIntegration
2626

27-
APP_VERSION = "1.0.11"
27+
APP_VERSION = "1.0.13"
2828

2929

3030
EPIVIS_URL = os.environ.get("EPIVIS_URL", "https://delphi.cmu.edu/epivis/")

src/indicators/resources.py

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ def fix_boolean_fields(row) -> None:
4444
return row
4545

4646

47-
def process_pathogen(row) -> None:
47+
def process_pathogens(row) -> None:
48+
pathogen_ids = []
4849
if row["Pathogen/\nDisease Area"]:
4950
pathogens = row["Pathogen/\nDisease Area"].split(",")
5051
for pathogen in pathogens:
@@ -57,6 +58,21 @@ def process_pathogen(row) -> None:
5758
"used_in": "indicators",
5859
},
5960
)
61+
pathogen_ids.append(pathogen_obj.id)
62+
row["Pathogen/\nDisease Area"] = ",".join(str(el) for el in pathogen_ids)
63+
64+
65+
def process_indicator_set(row, source_type="covidcast") -> None:
66+
if row["Indicator Set"]:
67+
indicator_set_name = row["Indicator Set"].strip()
68+
indicator_set_obj, _ = IndicatorSet.objects.get_or_create(
69+
name=indicator_set_name,
70+
defaults={
71+
"name": indicator_set_name,
72+
"source_type": source_type,
73+
},
74+
)
75+
row["Indicator Set"] = indicator_set_obj.id
6076

6177

6278
def process_indicator_type(row) -> None:
@@ -246,7 +262,7 @@ class IndicatorBaseResource(ModelResource):
246262
base = Field(
247263
attribute="base",
248264
column_name="base",
249-
widget=PermissiveForeignKeyWidget(Indicator, field="id"),
265+
widget=PermissiveForeignKeyWidget(Indicator),
250266
)
251267
source = Field(
252268
attribute="source",
@@ -281,7 +297,7 @@ class IndicatorResource(ModelResource):
281297
pathogens = Field(
282298
attribute="pathogens",
283299
column_name="Pathogen/\nDisease Area",
284-
widget=ManyToManyWidget(Pathogen, field="name", separator=","),
300+
widget=ManyToManyWidget(Pathogen),
285301
)
286302
indicator_type = Field(
287303
attribute="indicator_type",
@@ -364,7 +380,7 @@ class IndicatorResource(ModelResource):
364380
indicator_set = Field(
365381
attribute="indicator_set",
366382
column_name="Indicator Set",
367-
widget=PermissiveForeignKeyWidget(IndicatorSet, field="name"),
383+
widget=PermissiveForeignKeyWidget(IndicatorSet),
368384
)
369385

370386
class Meta:
@@ -410,20 +426,44 @@ class Meta:
410426
"restrictions",
411427
"indicator_set",
412428
]
413-
import_id_fields: list[str] = ["name", "source"]
429+
import_id_fields: list[str] = ["name", "indicator_set", "source"]
414430
skip_unchanged = True
415431

432+
def get_instance(self, instance_loader, row):
433+
name = row.get("Signal")
434+
source = row.get("Source Subdivision")
435+
indicator_set = row.get("Indicator Set")
436+
437+
# Try to match by (name, source)
438+
if name and source:
439+
try:
440+
return self._meta.model.objects.get(name=name, source__id=source)
441+
except self._meta.model.DoesNotExist:
442+
pass
443+
444+
# Try to match by (name, indicator_set)
445+
if name and indicator_set:
446+
try:
447+
return self._meta.model.objects.get(
448+
name=name, indicator_set__id=indicator_set
449+
)
450+
except self._meta.model.DoesNotExist:
451+
pass
452+
453+
return None
454+
416455
def before_import_row(self, row, **kwargs) -> None:
417456
"""Post-processes each row after importing."""
418457
fix_boolean_fields(row)
419-
process_pathogen(row)
458+
process_pathogens(row)
420459
process_indicator_type(row)
421460
process_format_type(row)
422461
process_category(row)
423462
process_geographic_scope(row)
424463
process_source(row)
425464
process_severity_pyramid_rungs(row)
426465
process_available_geographies(row)
466+
process_indicator_set(row)
427467

428468
def after_import_row(self, row, row_result, **kwargs):
429469
process_indicator_geography(row)
@@ -537,7 +577,7 @@ class OtherEndpointIndicatorResource(ModelResource):
537577
indicator_set = Field(
538578
attribute="indicator_set",
539579
column_name="Indicator Set",
540-
widget=PermissiveForeignKeyWidget(IndicatorSet, field="name"),
580+
widget=PermissiveForeignKeyWidget(IndicatorSet),
541581
)
542582

543583
class Meta:
@@ -590,13 +630,14 @@ def before_import_row(self, row, **kwargs) -> None:
590630
"""Post-processes each row after importing."""
591631
fix_boolean_fields(row)
592632
process_source(row)
593-
process_pathogen(row)
633+
process_pathogens(row)
594634
process_indicator_type(row)
595635
process_format_type(row)
596636
process_category(row)
597637
process_geographic_scope(row)
598638
process_severity_pyramid_rungs(row)
599639
process_available_geographies(row)
640+
process_indicator_set(row, source_type="other_endpoint")
600641

601642
def skip_row(self, instance, original, row, import_validation_errors=None):
602643
if not row["Include in indicator app"]:
@@ -619,7 +660,7 @@ class NonDelphiIndicatorResource(resources.ModelResource):
619660
indicator_set = Field(
620661
attribute="indicator_set",
621662
column_name="Indicator Set",
622-
widget=PermissiveForeignKeyWidget(NonDelphiIndicatorSet, field="name"),
663+
widget=PermissiveForeignKeyWidget(NonDelphiIndicatorSet),
623664
)
624665

625666
class Meta:
@@ -637,6 +678,7 @@ class Meta:
637678
def before_import_row(self, row, **kwargs) -> None:
638679
"""Post-processes each row after importing."""
639680
fix_boolean_fields(row)
681+
process_indicator_set(row, source_type="non_delphi")
640682

641683
def skip_row(self, instance, original, row, import_validation_errors=None):
642684
if not row["Include in indicator app"]:

src/indicatorsets/resources.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def process_geographic_scope(row) -> None:
2222

2323

2424
def process_severity_pyramid_rungs(row) -> None:
25+
severity_pyramid_rung_ids = []
2526
if row["Surveillance Categories"]:
2627
severity_pyramid_rungs = row["Surveillance Categories"].split(",")
2728
for spr in severity_pyramid_rungs:
@@ -31,9 +32,12 @@ def process_severity_pyramid_rungs(row) -> None:
3132
used_in="indicatorsets",
3233
defaults={"display_name": spr_name.capitalize()},
3334
)
35+
severity_pyramid_rung_ids.append(severity_pyramid_rung_obj.id)
36+
row["Surveillance Categories"] = ",".join(map(str, severity_pyramid_rung_ids))
3437

3538

3639
def process_pathogens(row) -> None:
40+
pathogen_ids = []
3741
if row["Pathogen(s)/Syndrome(s)"]:
3842
pathogens = row["Pathogen(s)/Syndrome(s)"].split(",")
3943
for pathogen in pathogens:
@@ -46,10 +50,13 @@ def process_pathogens(row) -> None:
4650
"used_in": "indicatorsets",
4751
},
4852
)
53+
pathogen_ids.append(pathogen_obj.id)
54+
row["Pathogen(s)/Syndrome(s)"] = ",".join(map(str, pathogen_ids))
4955

5056

5157
def process_available_geographies(row) -> None:
5258
available_geographies = []
59+
available_geographies_ids = []
5360
try:
5461
if row["Geographic Granularity - Delphi"]:
5562
available_geographies = row["Geographic Granularity - Delphi"].split(",")
@@ -71,6 +78,9 @@ def process_available_geographies(row) -> None:
7178
used_in="indicatorsets",
7279
defaults=default_params,
7380
)
81+
available_geographies_ids.append(geography_obj.id)
82+
row["Geographic Levels"] = ",".join(map(str, available_geographies_ids))
83+
row["Geographic Granularity - Delphi"] = row["Geographic Levels"]
7484

7585

7686
def fix_boolean_fields(row) -> None:
@@ -120,7 +130,7 @@ class IndicatorSetResource(resources.ModelResource):
120130
pathogens = Field(
121131
attribute="pathogens",
122132
column_name="Pathogen(s)/Syndrome(s)",
123-
widget=ManyToManyWidget(Pathogen, field="name", separator=","),
133+
widget=ManyToManyWidget(Pathogen),
124134
)
125135
data_type = Field(attribute="data_type", column_name="Type(s) of Data*")
126136
geographic_scope = Field(
@@ -131,7 +141,7 @@ class IndicatorSetResource(resources.ModelResource):
131141
geographic_levels = Field(
132142
attribute="geographic_levels",
133143
column_name="Geographic Granularity - Delphi",
134-
widget=ManyToManyWidget(Geography, field="name", separator=","),
144+
widget=ManyToManyWidget(Geography),
135145
)
136146
preprocessing_description = Field(
137147
attribute="preprocessing_description",
@@ -172,7 +182,7 @@ class IndicatorSetResource(resources.ModelResource):
172182
severity_pyramid_rungs = Field(
173183
attribute="severity_pyramid_rungs",
174184
column_name="Surveillance Categories",
175-
widget=ManyToManyWidget(SeverityPyramidRung, field="name", separator=","),
185+
widget=ManyToManyWidget(SeverityPyramidRung),
176186
)
177187

178188
class Meta:
@@ -260,7 +270,7 @@ class NonDelphiIndicatorSetResource(resources.ModelResource):
260270
pathogens = Field(
261271
attribute="pathogens",
262272
column_name="Pathogen(s)/Syndrome(s)",
263-
widget=ManyToManyWidget(Pathogen, field="name", separator=","),
273+
widget=ManyToManyWidget(Pathogen),
264274
)
265275
data_type = Field(attribute="data_type", column_name="Type(s) of Data*")
266276
geographic_scope = Field(
@@ -271,7 +281,7 @@ class NonDelphiIndicatorSetResource(resources.ModelResource):
271281
geographic_levels = Field(
272282
attribute="geographic_levels",
273283
column_name="Geographic Levels",
274-
widget=ManyToManyWidget(Geography, field="name", separator=","),
284+
widget=ManyToManyWidget(Geography),
275285
)
276286
preprocessing_description = Field(
277287
attribute="preprocessing_description",
@@ -312,7 +322,7 @@ class NonDelphiIndicatorSetResource(resources.ModelResource):
312322
severity_pyramid_rungs = Field(
313323
attribute="severity_pyramid_rungs",
314324
column_name="Surveillance Categories",
315-
widget=ManyToManyWidget(SeverityPyramidRung, field="name", separator=","),
325+
widget=ManyToManyWidget(SeverityPyramidRung),
316326
)
317327

318328
class Meta:

0 commit comments

Comments
 (0)