2020-02-19 10:34:17 +01:00
|
|
|
# coding=utf-8
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
from django.db import models
|
2020-02-19 12:37:58 +01:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
|
|
|
|
|
|
MEASUREMENT_UNITS = [('KG', 'kg'),
|
|
|
|
('G', 'g'),
|
|
|
|
('MG', 'mg'),
|
|
|
|
('L', 'l'),
|
|
|
|
('ML', 'ml'),
|
|
|
|
('TEA', _('teaspoon')),
|
|
|
|
('TBL', _('tablespoon')),
|
|
|
|
('PINCH', _('pinch')),
|
|
|
|
('PIECE', _('piece'))]
|
2020-02-19 10:34:17 +01:00
|
|
|
|
|
|
|
|
|
|
|
class Profile(models.Model):
|
|
|
|
user = models.OneToOneField(User, models.CASCADE)
|
2020-02-19 12:37:58 +01:00
|
|
|
daily_fat_demand = models.PositiveIntegerField(_('Daily fat demand'),
|
|
|
|
help_text=_('At most this amount of fat is needed per day'),
|
|
|
|
default=117)
|
|
|
|
daily_carbohydrate_demand = models.PositiveIntegerField(
|
|
|
|
_('Daily carbohydrate demand'),
|
|
|
|
help_text=_('At most this amount of carbohydrates is needed per day'),
|
|
|
|
default=150)
|
|
|
|
daily_sugar_demand = models.PositiveIntegerField(_('Daily sugar demand'),
|
|
|
|
help_text=_('At most this amount of sugar is needed per day'),
|
|
|
|
default=25)
|
|
|
|
daily_roughage_demand = models.PositiveIntegerField(
|
|
|
|
_('Daily roughage demand'),
|
|
|
|
help_text=_('At least this amount of roughage should be eaten per day'),
|
|
|
|
default=30)
|
|
|
|
daily_protein_demand = models.PositiveIntegerField(
|
|
|
|
_('Daily protein demand'),
|
|
|
|
help_text=_('At most this amount of protein should be eaten per day'),
|
|
|
|
default=90)
|
2020-02-19 10:34:17 +01:00
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Profile')
|
|
|
|
verbose_name_plural = _('Profiles')
|
|
|
|
|
2020-02-19 10:34:17 +01:00
|
|
|
def __str__(self):
|
|
|
|
return self.user.username
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
|
|
|
|
class KitchenUtility(models.Model):
|
|
|
|
name = models.CharField(_('Name'), max_length=255)
|
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Kitchen utility')
|
|
|
|
verbose_name_plural = _('Kitchen utilities')
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
class Ingredient(models.Model):
|
|
|
|
name = models.CharField(_('Name'), max_length=255)
|
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Ingredient')
|
|
|
|
verbose_name_plural = _('Ingredients')
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
class Recipe(models.Model):
|
|
|
|
author = models.ForeignKey(User, models.SET_NULL, null=True)
|
|
|
|
kitchen_utilities = models.ManyToManyField(KitchenUtility,
|
2020-02-19 13:34:34 +01:00
|
|
|
through='UsedKitchenUtility')
|
2020-02-19 13:09:25 +01:00
|
|
|
ingredients = models.ManyToManyField(Ingredient, through='UsedIngredient')
|
2020-02-19 12:37:58 +01:00
|
|
|
|
|
|
|
name = models.CharField(_('Name'), max_length=255)
|
|
|
|
image = models.ImageField(_('Image'), blank=True, null=True)
|
|
|
|
experience_level = models.CharField(_('Required cooking experience'), max_length=255,
|
|
|
|
choices=[
|
|
|
|
('NOV', _('Novice')),
|
|
|
|
('INT', _('Intermediate')),
|
|
|
|
('ADV', _('Advanced')),
|
|
|
|
('EXP', _('Expert'))
|
|
|
|
])
|
|
|
|
|
|
|
|
fat = models.PositiveIntegerField(_('Fat'),
|
|
|
|
help_text=_('How much fat does one portion contain?'))
|
|
|
|
carbohydrates = models.PositiveIntegerField(_('Carbohydrates'),
|
|
|
|
help_text=_('How much carbohydrates does one portion contain?'))
|
|
|
|
sugar = models.PositiveIntegerField(_('Sugar'),
|
|
|
|
help_text=_('How much sugar does one portion contain?'))
|
|
|
|
roughage = models.PositiveIntegerField(_('Roughage'),
|
|
|
|
help_text=_('How much roughage does one portion contain?'))
|
|
|
|
protein = models.PositiveIntegerField(_('Protein'),
|
|
|
|
help_text=_('How much protein does one portion contain?'))
|
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Recipe')
|
|
|
|
verbose_name_plural = _('Recipes')
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
class RecipeStep(models.Model):
|
|
|
|
recipe = models.ForeignKey(Recipe, models.CASCADE)
|
|
|
|
image = models.ImageField(_('Image'), blank=True, null=True)
|
|
|
|
description = models.TextField(_('Description'))
|
|
|
|
number_of_step = models.PositiveIntegerField(_('Number of step'))
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
unique_together = ['recipe', 'number_of_step']
|
2020-02-19 13:34:34 +01:00
|
|
|
verbose_name = _('Recipe step')
|
|
|
|
verbose_name_plural = _('Recipe steps')
|
2020-02-19 12:37:58 +01:00
|
|
|
|
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class UsedKitchenUtility(models.Model):
|
2020-02-19 12:37:58 +01:00
|
|
|
recipe = models.ForeignKey(Recipe, models.CASCADE)
|
|
|
|
kitchen_utility = models.ForeignKey(KitchenUtility, models.CASCADE)
|
|
|
|
amount = models.PositiveIntegerField(_('Amount'),
|
|
|
|
help_text=_('How often is this kitchen utility used?'),
|
|
|
|
default=1)
|
2020-02-19 13:34:34 +01:00
|
|
|
|
|
|
|
class Meta:
|
2020-02-19 13:37:18 +01:00
|
|
|
unique_together = ['recipe', 'kitchen_utility']
|
2020-02-19 13:34:34 +01:00
|
|
|
verbose_name = _('Used kitchen utility')
|
|
|
|
verbose_name_plural = _('Used kitchen utilities')
|
2020-02-19 12:37:58 +01:00
|
|
|
|
|
|
|
|
2020-02-19 13:09:25 +01:00
|
|
|
class UsedIngredient(models.Model):
|
2020-02-19 12:37:58 +01:00
|
|
|
recipe = models.ForeignKey(Recipe, models.CASCADE)
|
|
|
|
ingredient = models.ForeignKey(Ingredient, models.CASCADE)
|
|
|
|
amount = models.PositiveIntegerField(_('Amount'),
|
|
|
|
help_text=_('Please specify the used amount of the ingredient'))
|
|
|
|
unit = models.CharField(_('Unit for amount'), max_length=10, choices=MEASUREMENT_UNITS)
|
2020-02-19 13:34:34 +01:00
|
|
|
|
|
|
|
class Meta:
|
2020-02-19 13:37:18 +01:00
|
|
|
unique_together = ['recipe', 'ingredient']
|
2020-02-19 13:34:34 +01:00
|
|
|
verbose_name = _('Used ingredient')
|
|
|
|
verbose_name_plural = _('Used ingredients')
|
2020-02-19 12:37:58 +01:00
|
|
|
|
2020-02-19 12:59:31 +01:00
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
class Vendor(models.Model):
|
|
|
|
name = models.CharField(_('Vendor'), max_length=50)
|
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Vendor')
|
|
|
|
verbose_name_plural = _('Vendors')
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
class Product(models.Model):
|
|
|
|
name = models.CharField(_('Product'), max_length=255)
|
|
|
|
vendor = models.ForeignKey(Vendor, models.CASCADE)
|
|
|
|
ingredient = models.ForeignKey(Ingredient, models.SET_NULL, null=True)
|
|
|
|
amount = models.PositiveIntegerField(_('Amount'),
|
|
|
|
help_text=_('Please specify the provided amount of the ingredient'))
|
|
|
|
unit = models.CharField(_('Unit for amount'), max_length=10,
|
|
|
|
choices=MEASUREMENT_UNITS)
|
|
|
|
price = models.DecimalField(_('Price'), decimal_places=2, max_digits=4,
|
|
|
|
blank=True, default=0.0)
|
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Product')
|
|
|
|
verbose_name_plural = _('Products')
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
|
|
class Pantry(models.Model):
|
|
|
|
owner = models.ForeignKey(User, models.CASCADE)
|
2020-02-19 13:21:06 +01:00
|
|
|
ingredients = models.ManyToManyField(Ingredient, through='StoredIngredient')
|
2020-02-19 12:37:58 +01:00
|
|
|
|
2020-02-19 13:34:34 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Pantry')
|
|
|
|
verbose_name_plural = _('Pantries')
|
|
|
|
|
2020-02-19 12:37:58 +01:00
|
|
|
def __str__(self):
|
2020-02-19 13:24:56 +01:00
|
|
|
return str.format('Pantry of {username}',
|
|
|
|
username=self.owner.username)
|
2020-02-19 12:37:58 +01:00
|
|
|
|
|
|
|
|
2020-02-19 13:21:06 +01:00
|
|
|
class StoredIngredient(models.Model):
|
2020-02-19 12:37:58 +01:00
|
|
|
pantry = models.ForeignKey(Pantry, models.CASCADE)
|
|
|
|
ingredient = models.ForeignKey(Ingredient, models.CASCADE)
|
|
|
|
amount = models.PositiveIntegerField(_('Amount'),
|
|
|
|
help_text=_('Please specify the stored amount of the ingredient'))
|
|
|
|
unit = models.CharField(_('Unit for amount'), max_length=10,
|
|
|
|
choices=MEASUREMENT_UNITS)
|
2020-02-19 13:34:34 +01:00
|
|
|
|
|
|
|
class Meta:
|
2020-02-19 13:37:18 +01:00
|
|
|
unique_together = ['pantry', 'ingredient']
|
2020-02-19 13:34:34 +01:00
|
|
|
verbose_name = _('Stored ingredient')
|
|
|
|
verbose_name_plural = _('Stored ingredients')
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return str.format('{amount} {unit} of {ingredient}',
|
|
|
|
amount=self.amount, unit=self.unit, ingredient=self.ingredient)
|
2020-02-23 12:58:55 +01:00
|
|
|
|
|
|
|
|
|
|
|
class MealPlan(models.Model):
|
|
|
|
author = models.ForeignKey(User, models.SET_NULL, null=True)
|
|
|
|
|
|
|
|
monday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='monday_breakfast')
|
|
|
|
monday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='monday_morning_snack')
|
|
|
|
monday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='monday_lunch')
|
|
|
|
monday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='monday_afternoon_snack')
|
|
|
|
monday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='monday_dinner')
|
|
|
|
|
|
|
|
tuesday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='tuesday_breakfast')
|
|
|
|
tuesday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='tuesday_morning_snack')
|
|
|
|
tuesday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='tuesday_lunch')
|
|
|
|
tuesday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='tuesday_afternoon_snack')
|
|
|
|
tuesday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='tuesday_dinner')
|
|
|
|
|
|
|
|
wednesday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='wednesday_breakfast')
|
|
|
|
wednesday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='wednesday_morning_snack')
|
|
|
|
wednesday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='wednesday_lunch')
|
|
|
|
wednesday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='wednesday_afternoon_snack')
|
|
|
|
wednesday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='wednesday_dinner')
|
|
|
|
|
|
|
|
thursday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='thursday_breakfast')
|
|
|
|
thursday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='thursday_morning_snack')
|
|
|
|
thursday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='thursday_lunch')
|
|
|
|
thursday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='thursday_afternoon_snack')
|
|
|
|
thursday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='thursday_dinner')
|
|
|
|
|
|
|
|
friday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='friday_breakfast')
|
|
|
|
friday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='friday_morning_snack')
|
|
|
|
friday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='friday_lunch')
|
|
|
|
friday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='friday_afternoon_snack')
|
|
|
|
friday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='friday_dinner')
|
|
|
|
|
|
|
|
saturday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='saturday_breakfast')
|
|
|
|
saturday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='saturday_morning_snack')
|
|
|
|
saturday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='saturday_lunch')
|
|
|
|
saturday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='saturday_afternoon_snack')
|
|
|
|
saturday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='saturday_dinner')
|
|
|
|
|
|
|
|
sunday_breakfast = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='sunday_breakfast')
|
|
|
|
sunday_morning_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='sunday_morning_snack')
|
|
|
|
sunday_lunch = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='sunday_lunch')
|
|
|
|
sunday_afternoon_snack = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='sunday_afternoon_snack')
|
|
|
|
sunday_dinner = models.ForeignKey(Recipe, models.SET_NULL, blank=True, null=True,
|
|
|
|
related_name='sunday_dinner')
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = _('Meal plan')
|
|
|
|
verbose_name_plural = _('Meal plans')
|