@@ -155,9 +155,14 @@ def process_available_geographies(row) -> None:
155
155
"display_order_number" : max_display_order_number + 1 ,
156
156
},
157
157
)
158
- signal = Signal .objects .get (
159
- name = row ["Indicator" ], source = row ["Source Subdivision" ]
160
- )
158
+ try :
159
+ signal = Signal .objects .get (
160
+ name = row ["Indicator" ], source = row ["Source Subdivision" ]
161
+ )
162
+ except KeyError :
163
+ signal = Signal .objects .get (
164
+ name = row ["Signal" ], source = row ["Source Subdivision" ]
165
+ )
161
166
signal_geography , _ = SignalGeography .objects .get_or_create (
162
167
geography = geography_instance , signal = signal
163
168
)
@@ -167,20 +172,20 @@ def process_available_geographies(row) -> None:
167
172
168
173
169
174
def process_base (row ) -> None :
170
- if row ["Indicator BaseName" ]:
175
+ if row ["Signal BaseName" ]:
171
176
source : SourceSubdivision = SourceSubdivision .objects .get (
172
177
name = row ["Source Subdivision" ]
173
178
)
174
179
base_signal : Signal = Signal .objects .get (
175
- name = row ["Indicator BaseName" ], source = source
180
+ name = row ["Signal BaseName" ], source = source
176
181
)
177
182
row ["base" ] = base_signal .id
178
183
179
184
180
185
class ModelResource (resources .ModelResource ):
181
186
def get_field_names (self ):
182
187
names = []
183
- for field in self .get_fields ( ):
188
+ for field in list ( self .fields . values () ):
184
189
names .append (self .get_field_name (field ))
185
190
return names
186
191
@@ -213,7 +218,7 @@ class SignalBaseResource(ModelResource):
213
218
Resource class for importing Signals base.
214
219
"""
215
220
216
- name = Field (attribute = "name" , column_name = "Indicator " )
221
+ name = Field (attribute = "name" , column_name = "Signal " )
217
222
display_name = Field (attribute = "display_name" , column_name = "Name" )
218
223
base = Field (
219
224
attribute = "base" ,
@@ -241,6 +246,200 @@ class SignalResource(ModelResource):
241
246
Resource class for importing and exporting Signal models
242
247
"""
243
248
249
+ name = Field (attribute = "name" , column_name = "Signal" )
250
+ display_name = Field (attribute = "display_name" , column_name = "Name" )
251
+ member_name = Field (attribute = "member_name" , column_name = "Member API Name" )
252
+ member_short_name = Field (
253
+ attribute = "member_short_name" , column_name = "Member Short Name"
254
+ )
255
+ member_description = Field (
256
+ attribute = "member_description" , column_name = "Member Description"
257
+ )
258
+ pathogen = Field (
259
+ attribute = "pathogen" ,
260
+ column_name = "Pathogen/\n Disease Area" ,
261
+ widget = widgets .ManyToManyWidget (Pathogen , field = "name" , separator = "," ),
262
+ )
263
+ signal_type = Field (
264
+ attribute = "signal_type" ,
265
+ column_name = "Indicator Type" ,
266
+ widget = widgets .ForeignKeyWidget (SignalType , field = "name" ),
267
+ )
268
+ active = Field (attribute = "active" , column_name = "Active" )
269
+ description = Field (attribute = "description" , column_name = "Description" )
270
+ short_description = Field (
271
+ attribute = "short_description" , column_name = "Short Description"
272
+ )
273
+ format_type = Field (
274
+ attribute = "format_type" ,
275
+ column_name = "Format" ,
276
+ widget = widgets .ForeignKeyWidget (FormatType , field = "name" ),
277
+ )
278
+ time_type = Field (attribute = "time_type" , column_name = "Time Type" )
279
+ time_label = Field (attribute = "time_label" , column_name = "Time Label" )
280
+ reporting_cadence = Field (
281
+ attribute = "reporting_cadence" , column_name = "Reporting Cadence"
282
+ )
283
+ typical_reporting_lag = Field (
284
+ attribute = "typical_reporting_lag" , column_name = "Typical Reporting Lag"
285
+ )
286
+ typical_revision_cadence = Field (
287
+ attribute = "typical_revision_cadence" , column_name = "Typical Revision Cadence"
288
+ )
289
+ demographic_scope = Field (
290
+ attribute = "demographic_scope" , column_name = "Population"
291
+ )
292
+ severity_pyramid_rung = Field (
293
+ attribute = "severity_pyramid_rung" ,
294
+ column_name = "Surveillance Categories" ,
295
+ widget = widgets .ForeignKeyWidget (SeverityPyramidRung ),
296
+ )
297
+ category = Field (
298
+ attribute = "category" ,
299
+ column_name = "Category" ,
300
+ widget = widgets .ForeignKeyWidget (Category , "name" ),
301
+ )
302
+ geographic_scope = Field (
303
+ attribute = "geographic_scope" ,
304
+ column_name = "Geographic Coverage" ,
305
+ widget = widgets .ForeignKeyWidget (GeographicScope ),
306
+ )
307
+ available_geographies = Field (
308
+ attribute = "available_geography" ,
309
+ column_name = "Geographic Levels" ,
310
+ widget = widgets .ManyToManyWidget (Geography , field = "name" , separator = "," ),
311
+ )
312
+ temporal_scope_start = Field (
313
+ attribute = "temporal_scope_start" , column_name = "Temporal Scope Start"
314
+ )
315
+ temporal_scope_start_note = Field (
316
+ attribute = "temporal_scope_start_note" , column_name = "Temporal Scope Start Note"
317
+ )
318
+ temporal_scope_end = Field (
319
+ attribute = "temporal_scope_end" , column_name = "Temporal Scope End"
320
+ )
321
+ temporal_scope_end_note = Field (
322
+ attribute = "temporal_scope_end_note" , column_name = "Temporal Scope End Note"
323
+ )
324
+ is_smoothed = Field (attribute = "is_smoothed" , column_name = "Is Smoothed" )
325
+ is_weighted = Field (attribute = "is_weighted" , column_name = "Is Weighted" )
326
+ is_cumulative = Field (attribute = "is_cumulative" , column_name = "Is Cumulative" )
327
+ has_stderr = Field (attribute = "has_stderr" , column_name = "Has StdErr" )
328
+ has_sample_size = Field (attribute = "has_sample_size" , column_name = "Has Sample Size" )
329
+ high_values_are = Field (attribute = "high_values_are" , column_name = "High Values Are" )
330
+ source = Field (
331
+ attribute = "source" ,
332
+ column_name = "Source Subdivision" ,
333
+ widget = widgets .ForeignKeyWidget (SourceSubdivision , field = "name" ),
334
+ )
335
+ data_censoring = Field (attribute = "data_censoring" , column_name = "Data Censoring" )
336
+ missingness = Field (attribute = "missingness" , column_name = "Missingness" )
337
+ organization_access_list = Field (
338
+ attribute = "organization_access_list" , column_name = "Who may access this indicator?"
339
+ )
340
+ organization_sharing_list = Field (
341
+ attribute = "organization_sharing_list" ,
342
+ column_name = "Who may be told about this indicator?" ,
343
+ )
344
+ license = Field (attribute = "license" , column_name = "Data Use Terms" )
345
+ restrictions = Field (attribute = "restrictions" , column_name = "Use Restrictions" )
346
+ signal_set = Field (
347
+ attribute = "signal_set" ,
348
+ column_name = "Indicator Set" ,
349
+ widget = widgets .ForeignKeyWidget (SignalSet , field = "name" ),
350
+ )
351
+
352
+ class Meta :
353
+ model = Signal
354
+ fields : list [str ] = [
355
+ "name" ,
356
+ "display_name" ,
357
+ "member_name" ,
358
+ "member_short_name" ,
359
+ "member_description" ,
360
+ "pathogen" ,
361
+ "signal_type" ,
362
+ "active" ,
363
+ "description" ,
364
+ "short_description" ,
365
+ "time_label" ,
366
+ "reporting_cadence" ,
367
+ "typical_reporting_lag" ,
368
+ "typical_revision_cadence" ,
369
+ "demographic_scope" ,
370
+ "category" ,
371
+ "geographic_scope" ,
372
+ "available_geographies" ,
373
+ "temporal_scope_start" ,
374
+ "temporal_scope_start_note" ,
375
+ "temporal_scope_end" ,
376
+ "temporal_scope_end_note" ,
377
+ "is_smoothed" ,
378
+ "is_weighted" ,
379
+ "is_cumulative" ,
380
+ "has_stderr" ,
381
+ "has_sample_size" ,
382
+ "high_values_are" ,
383
+ "source" ,
384
+ "data_censoring" ,
385
+ "missingness" ,
386
+ "organization_access_list" ,
387
+ "organization_sharing_list" ,
388
+ "license" ,
389
+ "restrictions" ,
390
+ "time_type" ,
391
+ "signal_set" ,
392
+ "format_type" ,
393
+ "severity_pyramid_rung" ,
394
+ ]
395
+ import_id_fields : list [str ] = ["name" , "source" ]
396
+ store_instance = True
397
+ skip_unchanged = True
398
+
399
+ def before_import_row (self , row , ** kwargs ) -> None :
400
+ fix_boolean_fields (row )
401
+ process_pathogen (row )
402
+ process_signal_type (row )
403
+ process_format_type (row )
404
+ process_severity_pyramid_rungs (row )
405
+ process_category (row )
406
+ process_geographic_scope (row )
407
+ process_source (row )
408
+ process_links (row , dua_column_name = "Link to DUA" , link_column_name = "Link" )
409
+ if not row .get ("Indicator Set" ):
410
+ row ["Indicator Set" ] = None
411
+ if not row .get ("Source Subdivision" ):
412
+ row ["Source Subdivision" ] = None
413
+
414
+ def skip_row (self , instance , original , row , import_validation_errors = None ):
415
+ if not row ["Include in indicator app" ]:
416
+ try :
417
+ signal = Signal .objects .get (
418
+ name = row ["Signal" ], source = row ["Source Subdivision" ]
419
+ )
420
+ signal .delete ()
421
+ except Signal .DoesNotExist :
422
+ pass
423
+ return True
424
+
425
+ def after_import_row (self , row , row_result , ** kwargs ):
426
+ try :
427
+ signal_obj = Signal .objects .get (id = row_result .object_id )
428
+ for link in row ["Links" ]:
429
+ signal_obj .related_links .add (link )
430
+ process_available_geographies (row )
431
+ signal_obj .severity_pyramid_rung = SeverityPyramidRung .objects .get (id = row ["Surveillance Categories" ])
432
+ signal_obj .format_type = row ["Format" ]
433
+ signal_obj .save ()
434
+ except Signal .DoesNotExist as e :
435
+ print (f"Signal.DoesNotExist: { e } " )
436
+
437
+
438
+ class OtherEndpointSignalResource (ModelResource ):
439
+ """
440
+ Resource class for importing and exporting Signal models
441
+ """
442
+
244
443
name = Field (attribute = "name" , column_name = "Indicator" )
245
444
display_name = Field (attribute = "display_name" , column_name = "Name" )
246
445
member_name = Field (attribute = "member_name" , column_name = "Member API Name" )
0 commit comments