improved property calculator

This commit is contained in:
vabene1111
2023-03-25 07:59:07 +01:00
parent 6d5592c1be
commit 7e350b2f90
3 changed files with 18 additions and 8 deletions

View File

@@ -4,19 +4,24 @@ from cookbook.models import FoodPropertyType
def calculate_recipe_properties(recipe): def calculate_recipe_properties(recipe):
ingredients = [] ingredients = []
computed_properties = {} computed_properties = {}
property_types = FoodPropertyType.objects.filter(space=recipe.space).all()
for s in recipe.steps.all(): for s in recipe.steps.all():
ingredients += s.ingredients.all() ingredients += s.ingredients.all()
for fpt in FoodPropertyType.objects.filter(space=recipe.space).all(): # TODO is this safe or should I require the request context? for fpt in property_types: # TODO is this safe or should I require the request context?
computed_properties[fpt.id] = {'name': fpt.name, 'food_values': {}, 'total_value': 0} computed_properties[fpt.id] = {'name': fpt.name, 'food_values': {}, 'total_value': 0}
# TODO unit conversion support # TODO unit conversion support
for i in ingredients: for i in ingredients:
for p in i.food.foodproperty_set.all(): for pt in property_types:
computed_properties[p.property_type.id]['total_value'] += (i.amount / p.food_amount) * p.property_amount p = i.food.foodproperty_set.filter(property_type=pt).first()
computed_properties[p.property_type.id]['food_values'][i.food.id] = add_or_create(computed_properties[p.property_type.id]['food_values'], i.food.id, (i.amount / p.food_amount) * p.property_amount) if p:
computed_properties[p.property_type.id]['total_value'] += (i.amount / p.food_amount) * p.property_amount
computed_properties[p.property_type.id]['food_values'] = add_or_create(computed_properties[p.property_type.id]['food_values'], i.food.id, (i.amount / p.food_amount) * p.property_amount)
else:
computed_properties[pt.id]['food_values'][i.food.id] = None
return computed_properties return computed_properties

View File

@@ -742,12 +742,14 @@ class FoodPropertyType(models.Model, PermissionModelMixin):
NUTRITION = 'NUTRITION' NUTRITION = 'NUTRITION'
ALLERGEN = 'ALLERGEN' ALLERGEN = 'ALLERGEN'
PRICE = 'PRICE' PRICE = 'PRICE'
GOAL = 'GOAL'
OTHER = 'OTHER'
name = models.CharField(max_length=128) name = models.CharField(max_length=128)
unit = models.CharField(max_length=64, blank=True, null=True) unit = models.CharField(max_length=64, blank=True, null=True)
icon = models.CharField(max_length=16, blank=True, null=True) icon = models.CharField(max_length=16, blank=True, null=True)
description = models.CharField(max_length=512, blank=True, null=True) description = models.CharField(max_length=512, blank=True, null=True)
category = models.CharField(max_length=64, choices=((NUTRITION, _('Nutrition')), (ALLERGEN, _('Allergen')), (PRICE, _('PRICE'))), null=True, blank=True) category = models.CharField(max_length=64, choices=((NUTRITION, _('Nutrition')), (ALLERGEN, _('Allergen')), (PRICE, _('Price')), (GOAL, _('Goal')), (OTHER, _('Other'))), null=True, blank=True)
# TODO show if empty property? # TODO show if empty property?
# TODO formatting property? # TODO formatting property?

View File

@@ -31,12 +31,15 @@ def test_food_property(space_1, u1_s1):
food_2_property_price = FoodProperty.objects.create(food_amount=100, food_unit=unit_gram, food=food_2, property_amount=2.50, property_type=property_price, space=space_1) food_2_property_price = FoodProperty.objects.create(food_amount=100, food_unit=unit_gram, food=food_2, property_amount=2.50, property_type=property_price, space=space_1)
recipe_1 = Recipe.objects.create(name='recipe_1', waiting_time=0, working_time=0, space=space_1, created_by=auth.get_user(u1_s1)) recipe_1 = Recipe.objects.create(name='recipe_1', waiting_time=0, working_time=0, space=space_1, created_by=auth.get_user(u1_s1))
step_1 = Step.objects.create(instruction='instruction_step_1', space=space_1) step_1 = Step.objects.create(instruction='instruction_step_1', space=space_1)
step_1.ingredients.create(amount=500, unit=unit_gram, food=food_1, space=space_1) step_1.ingredients.create(amount=500, unit=unit_gram, food=food_1, space=space_1)
step_1.ingredients.create(amount=1000, unit=unit_gram, food=food_2, space=space_1) step_1.ingredients.create(amount=1000, unit=unit_gram, food=food_2, space=space_1)
recipe_1.steps.add(step_1) recipe_1.steps.add(step_1)
recipe_1.save()
step_2 = Step.objects.create(instruction='instruction_step_1', space=space_1)
step_2.ingredients.create(amount=50, unit=unit_gram, food=food_1, space=space_1)
recipe_1.steps.add(step_2)
property_values = calculate_recipe_properties(recipe_1) property_values = calculate_recipe_properties(recipe_1)
for p in property_values: print(property_values)
print(p)