Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/alternative_interface/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
from django.contrib import admin

# Register your models here.
from import_export.admin import ImportExportModelAdmin

from alternative_interface.models import ExpressViewIndicator
from alternative_interface.resources import ExpressViewIndicatorResource


@admin.register(ExpressViewIndicator)
class ExpressViewIndicatorAdmin(ImportExportModelAdmin):
resource_class = ExpressViewIndicatorResource
list_display = ["menu_item", "indicator", "display_name"]
search_fields = ["menu_item", "indicator", "display_name"]
list_filter = ["menu_item", "indicator"]
ordering = ["menu_item", "indicator"]
84 changes: 84 additions & 0 deletions src/alternative_interface/helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
COVIDCAST_FLUVIEW_LOCATIONS_MAPPING = {
"nation:US": "nat",
"hhs:1": "hhs1",
"hhs:2": "hhs2",
"hhs:3": "hhs3",
"hhs:4": "hhs4",
"hhs:5": "hhs5",
"hhs:6": "hhs6",
"hhs:7": "hhs7",
"hhs:8": "hhs8",
"hhs:9": "hhs9",
"hhs:10": "hhs10",
"state:AK": "AK",
"state:AL": "AL",
"state:AR": "AR",
"state:AZ": "AZ",
"state:CA": "CA",
"state:CO": "CO",
"state:CT": "CT",
"state:DC": "DC",
"state:DE": "DE",
"state:FL": "FL",
"state:GA": "GA",
"state:HI": "HI",
"state:IA": "IA",
"state:ID": "ID",
"state:IL": "IL",
"state:IN": "IN",
"state:KS": "KS",
"state:KY": "KY",
"state:LA": "LA",
"state:MA": "MA",
"state:MD": "MD",
"state:ME": "ME",
"state:MI": "MI",
"state:MN": "MN",
"state:MO": "MO",
"state:MS": "MS",
"state:MT": "MT",
"state:NC": "NC",
"state:ND": "ND",
"state:NE": "NE",
"state:NH": "NH",
"state:NJ": "NJ",
"state:NM": "NM",
"state:NV": "NV",
"state:NY": "NY",
"state:OH": "OH",
"state:OK": "OK",
"state:OR": "OR",
"state:PA": "PA",
"state:RI": "RI",
"state:SC": "SC",
"state:SD": "SD",
"state:TN": "TN",
"state:TX": "TX",
"state:UT": "UT",
"state:VA": "VA",
"state:VT": "VT",
"state:WA": "WA",
"state:WI": "WI",
"state:WV": "WV",
"state:WY": "WY",
}

EXPRESS_VIEW_LABELS_MAPPING = {
"smoothed_pct_ed_visits_influenza": "Influenza emergency department visits (NSSP)",
"confirmed_admissions_flu_ew": "Influenza hospital admissions (NHSN)",
"percent_positive": "Test positivity for influenza (ILINet)",
"percent_a": "Test positivity for influenza A (ILINet)",
"percent_b": "Test positivity for influenza B (ILINet)",
"smoothed_flu_from_claims": "Influenza hospital admissions (from claims)",
"deaths_flu_incidence_num": "Influenza deaths (NCHS)",
"smoothed_cli": "Covid related doctor visits (from claims)",
"smoothed_pct_ed_visits_covid": "Covid emergency department visits (NSSP)",
"confirmed_admissions_covid_ew": "Covid hospital admissions (NHNS)",
"smoothed_covid19_from_claims": "Covid hospital admissions (from claims)",
"deaths_covid_incidence_num": "Covid deaths (NCHS)",
"pct_ed_visits_rsv": "RSV emergency department visits (NSSP)",
"confirmed_admissions_rsv_ew": "RSV hospital admissions (NHSN)",
"pct_ed_visits_combined": "Combined emergency department visits (NSSP)",
"wili": "ILI related doctor visits (ILINet)",
"deaths_pneumonia_or_flu_or_covid_incidence_num": "Deaths from flu, Covid or pneumonia (NCHS)",
}
62 changes: 62 additions & 0 deletions src/alternative_interface/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Generated by Django 5.2.5 on 2025-11-28 18:20

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
("indicators", "0008_alter_indicator_source_type"),
]

operations = [
migrations.CreateModel(
name="ExpressViewIndicator",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"menu_item",
models.CharField(max_length=255, verbose_name="Menu Item"),
),
(
"display_name",
models.CharField(max_length=255, verbose_name="Display Name"),
),
(
"indicator",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="indicators.indicator",
verbose_name="Indicator",
),
),
],
options={
"verbose_name": "Express View Indicator",
"verbose_name_plural": "Express View Indicators",
"ordering": ["menu_item", "indicator"],
"indexes": [
models.Index(
fields=["menu_item", "indicator"], name="expr_view_ind_menu_idx"
)
],
"constraints": [
models.UniqueConstraint(
fields=("menu_item", "indicator"),
name="uniq_expr_view_menu_ind",
)
],
},
),
]
36 changes: 35 additions & 1 deletion src/alternative_interface/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,37 @@
from django.db import models

# Create your models here.

class ExpressViewIndicator(models.Model):
menu_item = models.CharField(
verbose_name="Menu Item",
max_length=255,
)
indicator = models.ForeignKey(
"indicators.Indicator",
verbose_name="Indicator",
on_delete=models.PROTECT,
)
display_name = models.CharField(
verbose_name="Display Name",
max_length=255,
)

class Meta:
verbose_name = "Express View Indicator"
verbose_name_plural = "Express View Indicators"
ordering = ["menu_item", "indicator"]
indexes = [
models.Index(
fields=["menu_item", "indicator"],
name="expr_view_ind_menu_idx",
),
]
constraints = [
models.UniqueConstraint(
fields=["menu_item", "indicator"],
name="uniq_expr_view_menu_ind",
),
]

def __str__(self):
return self.display_name
54 changes: 54 additions & 0 deletions src/alternative_interface/resources.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from import_export import resources
from import_export.fields import Field
from import_export.widgets import ForeignKeyWidget
from indicators.models import Indicator

from alternative_interface.models import ExpressViewIndicator


def process_indicator(row):
indicator_source = row.get("Indicator Source")
indicator_name = row.get("Indicator Name")
indicator = None
if indicator_name and indicator_source:
try:
indicator = Indicator.objects.get(
name=indicator_name, source__name=indicator_source
)
except Indicator.DoesNotExist:
indicator = None
if indicator:
row["Indicator Name"] = indicator.id
else:
row["Indicator Name"] = None


class ExpressViewIndicatorResource(resources.ModelResource):
menu_item = Field(attribute="menu_item", column_name="Menu Item")
indicator = Field(
attribute="indicator",
column_name="Indicator Name",
widget=ForeignKeyWidget(Indicator),
)
display_name = Field(
attribute="display_name", column_name="text for display legend"
)

def before_import_row(self, row, **kwargs):
process_indicator(row)

def skip_row(self, instance, original, row, import_validation_errors=None):
if not row["Indicator Name"]:
return True

class Meta:
model = ExpressViewIndicator
fields = (
"menu_item",
"indicator",
"display_name",
)
import_id_fields = ("menu_item", "indicator")
skip_unchanged = True
report_skipped = True
exclude = ("id",)
Loading
Loading