models
This commit is contained in:
parent
b71e9fe57d
commit
4c03d1eb87
@ -4,13 +4,14 @@ from datetime import date, timedelta
|
|||||||
|
|
||||||
from annoying.fields import AutoOneToOneField
|
from annoying.fields import AutoOneToOneField
|
||||||
from django.contrib import auth
|
from django.contrib import auth
|
||||||
from django.contrib.auth.models import User, Group
|
from django.contrib.auth.models import Group, User
|
||||||
from django.core.validators import MinLengthValidator
|
from django.core.validators import MinLengthValidator
|
||||||
from django.utils.translation import gettext as _
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
from django_random_queryset import RandomManager
|
from django_random_queryset import RandomManager
|
||||||
|
|
||||||
from recipes.settings import COMMENT_PREF_DEFAULT, FRACTION_PREF_DEFAULT, STICKY_NAV_PREF_DEFAULT
|
from recipes.settings import (COMMENT_PREF_DEFAULT, FRACTION_PREF_DEFAULT,
|
||||||
|
STICKY_NAV_PREF_DEFAULT)
|
||||||
|
|
||||||
|
|
||||||
def get_user_name(self):
|
def get_user_name(self):
|
||||||
@ -39,7 +40,12 @@ class UserPreference(models.Model):
|
|||||||
FLATLY = 'FLATLY'
|
FLATLY = 'FLATLY'
|
||||||
SUPERHERO = 'SUPERHERO'
|
SUPERHERO = 'SUPERHERO'
|
||||||
|
|
||||||
THEMES = ((BOOTSTRAP, 'Bootstrap'), (DARKLY, 'Darkly'), (FLATLY, 'Flatly'), (SUPERHERO, 'Superhero'))
|
THEMES = (
|
||||||
|
(BOOTSTRAP, 'Bootstrap'),
|
||||||
|
(DARKLY, 'Darkly'),
|
||||||
|
(FLATLY, 'Flatly'),
|
||||||
|
(SUPERHERO, 'Superhero')
|
||||||
|
)
|
||||||
|
|
||||||
# Nav colors
|
# Nav colors
|
||||||
PRIMARY = 'PRIMARY'
|
PRIMARY = 'PRIMARY'
|
||||||
@ -51,14 +57,26 @@ class UserPreference(models.Model):
|
|||||||
LIGHT = 'LIGHT'
|
LIGHT = 'LIGHT'
|
||||||
DARK = 'DARK'
|
DARK = 'DARK'
|
||||||
|
|
||||||
COLORS = ((PRIMARY, 'Primary'), (SECONDARY, 'Secondary'), (SUCCESS, 'Success'), (INFO, 'Info'), (WARNING, 'Warning'), (DANGER, 'Danger'), (LIGHT, 'Light'), (DARK, 'Dark'))
|
COLORS = (
|
||||||
|
(PRIMARY, 'Primary'),
|
||||||
|
(SECONDARY, 'Secondary'),
|
||||||
|
(SUCCESS, 'Success'), (INFO, 'Info'),
|
||||||
|
(WARNING, 'Warning'),
|
||||||
|
(DANGER, 'Danger'),
|
||||||
|
(LIGHT, 'Light'),
|
||||||
|
(DARK, 'Dark')
|
||||||
|
)
|
||||||
|
|
||||||
# Default Page
|
# Default Page
|
||||||
SEARCH = 'SEARCH'
|
SEARCH = 'SEARCH'
|
||||||
PLAN = 'PLAN'
|
PLAN = 'PLAN'
|
||||||
BOOKS = 'BOOKS'
|
BOOKS = 'BOOKS'
|
||||||
|
|
||||||
PAGES = ((SEARCH, _('Search')), (PLAN, _('Meal-Plan')), (BOOKS, _('Books')),)
|
PAGES = (
|
||||||
|
(SEARCH, _('Search')),
|
||||||
|
(PLAN, _('Meal-Plan')),
|
||||||
|
(BOOKS, _('Books')),
|
||||||
|
)
|
||||||
|
|
||||||
# Search Style
|
# Search Style
|
||||||
SMALL = 'SMALL'
|
SMALL = 'SMALL'
|
||||||
@ -68,13 +86,21 @@ class UserPreference(models.Model):
|
|||||||
|
|
||||||
user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True)
|
user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True)
|
||||||
theme = models.CharField(choices=THEMES, max_length=128, default=FLATLY)
|
theme = models.CharField(choices=THEMES, max_length=128, default=FLATLY)
|
||||||
nav_color = models.CharField(choices=COLORS, max_length=128, default=PRIMARY)
|
nav_color = models.CharField(
|
||||||
|
choices=COLORS, max_length=128, default=PRIMARY
|
||||||
|
)
|
||||||
default_unit = models.CharField(max_length=32, default='g')
|
default_unit = models.CharField(max_length=32, default='g')
|
||||||
use_fractions = models.BooleanField(default=FRACTION_PREF_DEFAULT)
|
use_fractions = models.BooleanField(default=FRACTION_PREF_DEFAULT)
|
||||||
default_page = models.CharField(choices=PAGES, max_length=64, default=SEARCH)
|
default_page = models.CharField(
|
||||||
search_style = models.CharField(choices=SEARCH_STYLE, max_length=64, default=LARGE)
|
choices=PAGES, max_length=64, default=SEARCH
|
||||||
|
)
|
||||||
|
search_style = models.CharField(
|
||||||
|
choices=SEARCH_STYLE, max_length=64, default=LARGE
|
||||||
|
)
|
||||||
show_recent = models.BooleanField(default=True)
|
show_recent = models.BooleanField(default=True)
|
||||||
plan_share = models.ManyToManyField(User, blank=True, related_name='plan_share_default')
|
plan_share = models.ManyToManyField(
|
||||||
|
User, blank=True, related_name='plan_share_default'
|
||||||
|
)
|
||||||
ingredient_decimals = models.IntegerField(default=2)
|
ingredient_decimals = models.IntegerField(default=2)
|
||||||
comments = models.BooleanField(default=COMMENT_PREF_DEFAULT)
|
comments = models.BooleanField(default=COMMENT_PREF_DEFAULT)
|
||||||
shopping_auto_sync = models.IntegerField(default=5)
|
shopping_auto_sync = models.IntegerField(default=5)
|
||||||
@ -90,7 +116,9 @@ class Storage(models.Model):
|
|||||||
STORAGE_TYPES = ((DROPBOX, 'Dropbox'), (NEXTCLOUD, 'Nextcloud'))
|
STORAGE_TYPES = ((DROPBOX, 'Dropbox'), (NEXTCLOUD, 'Nextcloud'))
|
||||||
|
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
method = models.CharField(choices=STORAGE_TYPES, max_length=128, default=DROPBOX)
|
method = models.CharField(
|
||||||
|
choices=STORAGE_TYPES, max_length=128, default=DROPBOX
|
||||||
|
)
|
||||||
username = models.CharField(max_length=128, blank=True, null=True)
|
username = models.CharField(max_length=128, blank=True, null=True)
|
||||||
password = models.CharField(max_length=128, blank=True, null=True)
|
password = models.CharField(max_length=128, blank=True, null=True)
|
||||||
token = models.CharField(max_length=512, blank=True, null=True)
|
token = models.CharField(max_length=512, blank=True, null=True)
|
||||||
@ -138,7 +166,9 @@ class Keyword(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class Unit(models.Model):
|
class Unit(models.Model):
|
||||||
name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)])
|
name = models.CharField(
|
||||||
|
unique=True, max_length=128, validators=[MinLengthValidator(1)]
|
||||||
|
)
|
||||||
description = models.TextField(blank=True, null=True)
|
description = models.TextField(blank=True, null=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@ -146,16 +176,24 @@ class Unit(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class Food(models.Model):
|
class Food(models.Model):
|
||||||
name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)])
|
name = models.CharField(
|
||||||
recipe = models.ForeignKey('Recipe', null=True, blank=True, on_delete=models.SET_NULL)
|
unique=True, max_length=128, validators=[MinLengthValidator(1)]
|
||||||
|
)
|
||||||
|
recipe = models.ForeignKey(
|
||||||
|
'Recipe', null=True, blank=True, on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class Ingredient(models.Model):
|
class Ingredient(models.Model):
|
||||||
food = models.ForeignKey(Food, on_delete=models.PROTECT, null=True, blank=True)
|
food = models.ForeignKey(
|
||||||
unit = models.ForeignKey(Unit, on_delete=models.PROTECT, null=True, blank=True)
|
Food, on_delete=models.PROTECT, null=True, blank=True
|
||||||
|
)
|
||||||
|
unit = models.ForeignKey(
|
||||||
|
Unit, on_delete=models.PROTECT, null=True, blank=True
|
||||||
|
)
|
||||||
amount = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
amount = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
||||||
note = models.CharField(max_length=256, null=True, blank=True)
|
note = models.CharField(max_length=256, null=True, blank=True)
|
||||||
is_header = models.BooleanField(default=False)
|
is_header = models.BooleanField(default=False)
|
||||||
@ -174,7 +212,11 @@ class Step(models.Model):
|
|||||||
TIME = 'TIME'
|
TIME = 'TIME'
|
||||||
|
|
||||||
name = models.CharField(max_length=128, default='', blank=True)
|
name = models.CharField(max_length=128, default='', blank=True)
|
||||||
type = models.CharField(choices=((TEXT, _('Text')), (TIME, _('Time')),), default=TEXT, max_length=16)
|
type = models.CharField(
|
||||||
|
choices=((TEXT, _('Text')), (TIME, _('Time')),),
|
||||||
|
default=TEXT,
|
||||||
|
max_length=16
|
||||||
|
)
|
||||||
instruction = models.TextField(blank=True)
|
instruction = models.TextField(blank=True)
|
||||||
ingredients = models.ManyToManyField(Ingredient, blank=True)
|
ingredients = models.ManyToManyField(Ingredient, blank=True)
|
||||||
time = models.IntegerField(default=0, blank=True)
|
time = models.IntegerField(default=0, blank=True)
|
||||||
@ -191,20 +233,26 @@ class Step(models.Model):
|
|||||||
|
|
||||||
class NutritionInformation(models.Model):
|
class NutritionInformation(models.Model):
|
||||||
fats = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
fats = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
||||||
carbohydrates = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
carbohydrates = models.DecimalField(
|
||||||
|
default=0, decimal_places=16, max_digits=32
|
||||||
|
)
|
||||||
proteins = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
proteins = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
||||||
calories = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
calories = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
||||||
source = models.CharField(max_length=512, default="", null=True, blank=True)
|
source = models.CharField(
|
||||||
|
max_length=512, default="", null=True, blank=True
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'Nutrition'
|
return 'Nutrition'
|
||||||
|
|
||||||
|
|
||||||
class Recipe(models.Model):
|
class Recipe(models.Model):
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
servings = models.IntegerField(default=1)
|
servings = models.IntegerField(default=1)
|
||||||
image = models.ImageField(upload_to='recipes/', blank=True, null=True)
|
image = models.ImageField(upload_to='recipes/', blank=True, null=True)
|
||||||
storage = models.ForeignKey(Storage, on_delete=models.PROTECT, blank=True, null=True)
|
storage = models.ForeignKey(
|
||||||
|
Storage, on_delete=models.PROTECT, blank=True, null=True
|
||||||
|
)
|
||||||
file_uid = models.CharField(max_length=256, default="", blank=True)
|
file_uid = models.CharField(max_length=256, default="", blank=True)
|
||||||
file_path = models.CharField(max_length=512, default="", blank=True)
|
file_path = models.CharField(max_length=512, default="", blank=True)
|
||||||
link = models.CharField(max_length=512, null=True, blank=True)
|
link = models.CharField(max_length=512, null=True, blank=True)
|
||||||
@ -214,7 +262,9 @@ class Recipe(models.Model):
|
|||||||
working_time = models.IntegerField(default=0)
|
working_time = models.IntegerField(default=0)
|
||||||
waiting_time = models.IntegerField(default=0)
|
waiting_time = models.IntegerField(default=0)
|
||||||
internal = models.BooleanField(default=False)
|
internal = models.BooleanField(default=False)
|
||||||
nutrition = models.ForeignKey(NutritionInformation, blank=True, null=True, on_delete=models.CASCADE)
|
nutrition = models.ForeignKey(
|
||||||
|
NutritionInformation, blank=True, null=True, on_delete=models.CASCADE
|
||||||
|
)
|
||||||
created_by = models.ForeignKey(User, on_delete=models.PROTECT)
|
created_by = models.ForeignKey(User, on_delete=models.PROTECT)
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
updated_at = models.DateTimeField(auto_now=True)
|
updated_at = models.DateTimeField(auto_now=True)
|
||||||
@ -251,7 +301,9 @@ class RecipeBook(models.Model):
|
|||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
description = models.TextField(blank=True)
|
description = models.TextField(blank=True)
|
||||||
icon = models.CharField(max_length=16, blank=True, null=True)
|
icon = models.CharField(max_length=16, blank=True, null=True)
|
||||||
shared = models.ManyToManyField(User, blank=True, related_name='shared_with')
|
shared = models.ManyToManyField(
|
||||||
|
User, blank=True, related_name='shared_with'
|
||||||
|
)
|
||||||
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@ -279,11 +331,15 @@ class MealType(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class MealPlan(models.Model):
|
class MealPlan(models.Model):
|
||||||
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, blank=True, null=True)
|
recipe = models.ForeignKey(
|
||||||
|
Recipe, on_delete=models.CASCADE, blank=True, null=True
|
||||||
|
)
|
||||||
servings = models.DecimalField(default=1, max_digits=8, decimal_places=4)
|
servings = models.DecimalField(default=1, max_digits=8, decimal_places=4)
|
||||||
title = models.CharField(max_length=64, blank=True, default='')
|
title = models.CharField(max_length=64, blank=True, default='')
|
||||||
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
shared = models.ManyToManyField(User, blank=True, related_name='plan_share')
|
shared = models.ManyToManyField(
|
||||||
|
User, blank=True, related_name='plan_share'
|
||||||
|
)
|
||||||
meal_type = models.ForeignKey(MealType, on_delete=models.CASCADE)
|
meal_type = models.ForeignKey(MealType, on_delete=models.CASCADE)
|
||||||
note = models.TextField(blank=True)
|
note = models.TextField(blank=True)
|
||||||
date = models.DateField()
|
date = models.DateField()
|
||||||
@ -301,7 +357,9 @@ class MealPlan(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class ShoppingListRecipe(models.Model):
|
class ShoppingListRecipe(models.Model):
|
||||||
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, null=True, blank=True)
|
recipe = models.ForeignKey(
|
||||||
|
Recipe, on_delete=models.CASCADE, null=True, blank=True
|
||||||
|
)
|
||||||
servings = models.DecimalField(default=1, max_digits=8, decimal_places=4)
|
servings = models.DecimalField(default=1, max_digits=8, decimal_places=4)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@ -315,9 +373,13 @@ class ShoppingListRecipe(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class ShoppingListEntry(models.Model):
|
class ShoppingListEntry(models.Model):
|
||||||
list_recipe = models.ForeignKey(ShoppingListRecipe, on_delete=models.CASCADE, null=True, blank=True)
|
list_recipe = models.ForeignKey(
|
||||||
|
ShoppingListRecipe, on_delete=models.CASCADE, null=True, blank=True
|
||||||
|
)
|
||||||
food = models.ForeignKey(Food, on_delete=models.CASCADE)
|
food = models.ForeignKey(Food, on_delete=models.CASCADE)
|
||||||
unit = models.ForeignKey(Unit, on_delete=models.CASCADE, null=True, blank=True)
|
unit = models.ForeignKey(
|
||||||
|
Unit, on_delete=models.CASCADE, null=True, blank=True
|
||||||
|
)
|
||||||
amount = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
amount = models.DecimalField(default=0, decimal_places=16, max_digits=32)
|
||||||
order = models.IntegerField(default=0)
|
order = models.IntegerField(default=0)
|
||||||
checked = models.BooleanField(default=False)
|
checked = models.BooleanField(default=False)
|
||||||
@ -337,7 +399,9 @@ class ShoppingList(models.Model):
|
|||||||
note = models.TextField(blank=True, null=True)
|
note = models.TextField(blank=True, null=True)
|
||||||
recipes = models.ManyToManyField(ShoppingListRecipe, blank=True)
|
recipes = models.ManyToManyField(ShoppingListRecipe, blank=True)
|
||||||
entries = models.ManyToManyField(ShoppingListEntry, blank=True)
|
entries = models.ManyToManyField(ShoppingListEntry, blank=True)
|
||||||
shared = models.ManyToManyField(User, blank=True, related_name='list_share')
|
shared = models.ManyToManyField(
|
||||||
|
User, blank=True, related_name='list_share'
|
||||||
|
)
|
||||||
finished = models.BooleanField(default=False)
|
finished = models.BooleanField(default=False)
|
||||||
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
@ -361,7 +425,9 @@ class InviteLink(models.Model):
|
|||||||
username = models.CharField(blank=True, max_length=64)
|
username = models.CharField(blank=True, max_length=64)
|
||||||
group = models.ForeignKey(Group, on_delete=models.CASCADE)
|
group = models.ForeignKey(Group, on_delete=models.CASCADE)
|
||||||
valid_until = models.DateField(default=date.today() + timedelta(days=14))
|
valid_until = models.DateField(default=date.today() + timedelta(days=14))
|
||||||
used_by = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name='used_by')
|
used_by = models.ForeignKey(
|
||||||
|
User, null=True, on_delete=models.CASCADE, related_name='used_by'
|
||||||
|
)
|
||||||
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user