Skip to content

Commit c020ae5

Browse files
authored
Merge pull request #199 from American-Institutes-for-Research/HEA-811/SO14-error-wild-foods-instances
Add guardrails to prevent type TypeError: can't multiply sequence by …
2 parents e03aa88 + ea500cc commit c020ae5

6 files changed

Lines changed: 61 additions & 9 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 5.2.7 on 2025-12-29 07:04
2+
3+
from django.db import migrations, models
4+
5+
import common.models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("baseline", "0022_alter_wealthgroup_options"),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name="wealthgroup",
17+
name="average_household_size",
18+
field=models.FloatField(
19+
blank=True,
20+
help_text="Average number of people per household in this Wealth Group",
21+
null=True,
22+
validators=[common.models.validate_positive],
23+
verbose_name="Average household size",
24+
),
25+
),
26+
]

apps/baseline/models.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,8 +517,12 @@ class WealthGroup(common_models.Model):
517517
verbose_name=_("Percentage of households"),
518518
help_text=_("Percentage of households in the Community or Livelihood Zone that are in this Wealth Group"),
519519
)
520-
average_household_size = models.PositiveSmallIntegerField(
521-
blank=True, null=True, verbose_name=_("Average household size")
520+
average_household_size = models.FloatField(
521+
blank=True,
522+
null=True,
523+
validators=[common_models.validate_positive],
524+
verbose_name=_("Average household size"),
525+
help_text=_("Average number of people per household in this Wealth Group"),
522526
)
523527

524528
objects = WealthGroupManager()

apps/baseline/serializers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ def get_livelihood_zone_baseline_label(self, obj):
582582
wealth_group_percentage_of_households = serializers.IntegerField(
583583
source="wealth_group.percentage_of_households", read_only=True
584584
)
585-
wealth_group_average_household_size = serializers.IntegerField(
585+
wealth_group_average_household_size = serializers.FloatField(
586586
source="wealth_group.average_household_size", read_only=True
587587
)
588588
wealth_group_category = serializers.CharField(source="wealth_group.wealth_group_category.pk", read_only=True)
@@ -1337,7 +1337,7 @@ def get_livelihood_zone_baseline_label(self, obj):
13371337
wealth_group_percentage_of_households = serializers.IntegerField(
13381338
source="wealth_group.percentage_of_households", read_only=True
13391339
)
1340-
wealth_group_average_household_size = serializers.IntegerField(
1340+
wealth_group_average_household_size = serializers.FloatField(
13411341
source="wealth_group.average_household_size", read_only=True
13421342
)
13431343
wealth_group_category = serializers.CharField(source="wealth_group.wealth_group_category.pk", read_only=True)
@@ -1453,7 +1453,7 @@ def get_livelihood_zone_baseline_label(self, obj):
14531453
wealth_group_percentage_of_households = serializers.IntegerField(
14541454
source="wealth_group.percentage_of_households", read_only=True
14551455
)
1456-
wealth_group_average_household_size = serializers.IntegerField(
1456+
wealth_group_average_household_size = serializers.FloatField(
14571457
source="wealth_group.average_household_size", read_only=True
14581458
)
14591459
wealth_group_category = serializers.CharField(source="wealth_group.wealth_group_category.pk", read_only=True)

apps/baseline/tests/factories.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ class Meta:
155155
)
156156
wealth_group_category = factory.SubFactory(WealthGroupCategoryFactory)
157157
percentage_of_households = fuzzy.FuzzyInteger(10, 91)
158-
average_household_size = fuzzy.FuzzyInteger(2, 31)
158+
average_household_size = fuzzy.FuzzyDecimal(2.0, 31.0, precision=2)
159159

160160

161161
class BaselineWealthGroupFactory(WealthGroupFactory):

pipelines/assets/livelihood_activity.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -847,9 +847,27 @@ def get_instances_from_dataframe(
847847
# worksheets
848848
column = df.columns[i + 1]
849849
household_size = df.iloc[3, i + 1]
850+
851+
# Convert to numeric to handle string values (e.g., "6" instead of 6)
852+
try:
853+
percentage_kcals = (
854+
float(livelihood_activity["percentage_kcals"])
855+
if livelihood_activity.get("percentage_kcals")
856+
else None
857+
)
858+
except (ValueError, TypeError):
859+
percentage_kcals = None
860+
861+
try:
862+
household_size_numeric = (
863+
float(household_size) if household_size not in ("", None) else None
864+
)
865+
except (ValueError, TypeError):
866+
household_size_numeric = None
867+
850868
livelihood_activity["kcals_consumed"] = (
851-
livelihood_activity["percentage_kcals"] * 2100 * 365 * household_size
852-
if livelihood_activity["percentage_kcals"] and household_size
869+
percentage_kcals * 2100 * 365 * household_size_numeric
870+
if percentage_kcals and household_size_numeric
853871
else None
854872
)
855873

pipelines/assets/wealth_characteristic.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,10 +490,14 @@ def wealth_characteristic_instances(
490490
# Calculate the kcals_consumed
491491
# Derive it by multiplying percentage_kcals by:
492492
# 2100 (kcals per person per day) * 365 (days per year) * average_household_size
493+
# Convert columns to numeric to handle string values from the dataframe
494+
wealth_group_df["percentage_kcals"] = pd.to_numeric(wealth_group_df["percentage_kcals"], errors="coerce")
495+
wealth_group_df["average_household_size"] = pd.to_numeric(
496+
wealth_group_df["average_household_size"], errors="coerce"
497+
)
493498
wealth_group_df["kcals_consumed"] = (
494499
wealth_group_df["percentage_kcals"] * 2100 * 365 * wealth_group_df["average_household_size"]
495500
)
496-
497501
result = {
498502
"WealthGroup": wealth_group_df.to_dict(orient="records"),
499503
"WealthGroupCharacteristicValue": wealth_group_characteristic_values,

0 commit comments

Comments
 (0)