init
This commit is contained in:
103
recipe_book/models.py
Normal file
103
recipe_book/models.py
Normal file
@@ -0,0 +1,103 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
||||
"""
|
||||
Recipe's creation workflow :
|
||||
|
||||
1. Create recipe with required info, optional preparation
|
||||
2. Create recipe's list of ingredients
|
||||
a. Create new ingredients instances
|
||||
b. Create IngredientWithAmount instances
|
||||
3. Add preparation steps if necessary
|
||||
|
||||
"""
|
||||
|
||||
|
||||
class Recipe(models.Model):
|
||||
name = models.CharField(max_length=512)
|
||||
category = models.CharField(
|
||||
max_length=2,
|
||||
choices=(
|
||||
('0', 'Petit-déjeuner'),
|
||||
('1', 'Entrée'),
|
||||
('2', 'Plat'),
|
||||
('3', 'Dessert'),
|
||||
))
|
||||
ingredients = models.ManyToManyField(
|
||||
'Ingredient',
|
||||
through='IngredientWithAmount'
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return "{}".format(self.name)
|
||||
|
||||
|
||||
class Ingredient(models.Model):
|
||||
name = models.CharField(max_length=256)
|
||||
|
||||
def __str__(self):
|
||||
return "{}".format(self.name)
|
||||
|
||||
|
||||
class IngredientWithAmount(models.Model):
|
||||
""" A recipe-ingredient relation associated with amounts
|
||||
"""
|
||||
|
||||
recipe = models.ForeignKey(
|
||||
'Recipe',
|
||||
models.CASCADE)
|
||||
ingredient = models.ForeignKey(
|
||||
'Ingredient',
|
||||
models.CASCADE )
|
||||
amount = models.DecimalField(
|
||||
max_digits=6,
|
||||
decimal_places=2,
|
||||
)
|
||||
unit = models.CharField(
|
||||
max_length=2,
|
||||
choices=(
|
||||
('gr', 'Grammes'),
|
||||
('u', 'Units'),
|
||||
('l', 'Litres'),
|
||||
))
|
||||
|
||||
def __repr__(self):
|
||||
return "<{}>".format(self.display())
|
||||
|
||||
def display(self):
|
||||
""" Print info in a human friendly way.
|
||||
|
||||
* Correct grammar
|
||||
* Apropriate units according to amount
|
||||
"""
|
||||
# Note: amount has a .is_integer() method :)
|
||||
amount = self.amount
|
||||
name = self.ingredient.name.lower()
|
||||
particule = ""
|
||||
unit = ""
|
||||
if self.unit == 'u':
|
||||
integer = int(amount)
|
||||
fraction = amount - integer
|
||||
# Print subfractions of one as ratio
|
||||
if fraction: #TODO: if is not integer...
|
||||
fraction = "{}/{}".format(
|
||||
*amount.as_integer_ratio()
|
||||
)
|
||||
else:
|
||||
fraction = ""
|
||||
if integer:
|
||||
# Plural
|
||||
if integer >= 2:
|
||||
name += "s"
|
||||
integer = str(integer)
|
||||
else:
|
||||
integer = ""
|
||||
amount = "{}{}".format(integer, fraction)
|
||||
else:
|
||||
particule = "de "
|
||||
unit = self.unit
|
||||
|
||||
return "{}{} {}{}".format(
|
||||
amount, unit, particule, name
|
||||
)
|
||||
Reference in New Issue
Block a user