@@ -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/\n Disease Area" ]:
4950 pathogens = row ["Pathogen/\n Disease 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/\n Disease 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
6278def 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/\n Disease 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" ]:
0 commit comments