diff --git a/cookbook/admin.py b/cookbook/admin.py index 7a3c68274..ec06a7baa 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -175,28 +175,7 @@ admin.site.register(ShareLink, ShareLinkAdmin) class NutritionInformationAdmin(admin.ModelAdmin): - list_display = ('created_by', 'created_at',) + list_display = ('id', 'created_by', 'created_at') admin.site.register(NutritionInformation, NutritionInformationAdmin) - - -class NutritionUnitAdmin(admin.ModelAdmin): - list_display = ('name', 'short', 'created_by', 'created_at',) - - -admin.site.register(NutritionUnit, NutritionUnitAdmin) - - -class NutritionTypeAdmin(admin.ModelAdmin): - list_display = ('type', 'unit', 'created_by', 'created_at',) - - -admin.site.register(NutritionType, NutritionTypeAdmin) - - -class NutritionValueAdmin(admin.ModelAdmin): - list_display = ('value', 'type', 'created_by', 'created_at',) - - -admin.site.register(NutritionValue, NutritionValueAdmin) diff --git a/cookbook/migrations/0089_auto_20201016_2358.py b/cookbook/migrations/0089_auto_20201016_2358.py deleted file mode 100644 index 24a55b3ce..000000000 --- a/cookbook/migrations/0089_auto_20201016_2358.py +++ /dev/null @@ -1,70 +0,0 @@ -# Generated by Django 3.1.1 on 2020-10-16 21:58 - -import datetime -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cookbook', '0088_shoppinglist_finished'), - ] - - operations = [ - migrations.CreateModel( - name='NutritionType', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.CharField(max_length=128)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AlterField( - model_name='invitelink', - name='valid_until', - field=models.DateField(default=datetime.date(2020, 10, 30)), - ), - migrations.CreateModel( - name='NutritionValue', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('value', models.DecimalField(decimal_places=16, max_digits=32)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.nutritiontype')), - ], - ), - migrations.CreateModel( - name='NutritionUnit', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=128)), - ('short', models.CharField(max_length=16)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AddField( - model_name='nutritiontype', - name='unit', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.nutritionunit'), - ), - migrations.CreateModel( - name='NutritionInformation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('nutritions', models.ManyToManyField(to='cookbook.NutritionValue')), - ], - ), - migrations.AddField( - model_name='recipe', - name='nutrition', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='cookbook.nutritioninformation'), - ), - ] diff --git a/cookbook/migrations/0089_auto_20201106_1655.py b/cookbook/migrations/0089_auto_20201106_1655.py new file mode 100644 index 000000000..ad8be711c --- /dev/null +++ b/cookbook/migrations/0089_auto_20201106_1655.py @@ -0,0 +1,40 @@ +# Generated by Django 3.1.1 on 2020-11-06 15:55 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0088_shoppinglist_finished'), + ] + + operations = [ + migrations.AlterField( + model_name='invitelink', + name='valid_until', + field=models.DateField(default=datetime.date(2020, 11, 20)), + ), + migrations.CreateModel( + name='NutritionInformation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fats', models.DecimalField(decimal_places=16, default=0, max_digits=32)), + ('carbohydrates', models.DecimalField(decimal_places=16, default=0, max_digits=32)), + ('proteins', models.DecimalField(decimal_places=16, default=0, max_digits=32)), + ('calories', models.DecimalField(decimal_places=16, default=0, max_digits=32)), + ('source', models.CharField(blank=True, default='', max_length=512, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='recipe', + name='nutrition', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='cookbook.nutritioninformation'), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index fae56f362..c8d6f60c7 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -181,38 +181,13 @@ class Step(models.Model): ordering = ['order', 'pk'] -class NutritionUnit(models.Model): - name = models.CharField(max_length=128) - short = models.CharField(max_length=16) - created_by = models.ForeignKey(User, on_delete=models.CASCADE) - created_at = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f'{self.name} ({self.short})' - - -class NutritionType(models.Model): - type = models.CharField(max_length=128) - unit = models.ForeignKey(NutritionUnit, on_delete=models.CASCADE) - created_by = models.ForeignKey(User, on_delete=models.CASCADE) - created_at = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f'{self.type}' - - -class NutritionValue(models.Model): - type = models.ForeignKey(NutritionType, on_delete=models.CASCADE) - value = models.DecimalField(max_digits=32, decimal_places=16) - created_by = models.ForeignKey(User, on_delete=models.CASCADE) - created_at = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f'{self.value} {self.type}' - - class NutritionInformation(models.Model): - nutritions = models.ManyToManyField(NutritionValue) + fats = 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) + calories = models.DecimalField(default=0, decimal_places=16, max_digits=32) + source = models.CharField(max_length=512, default="", null=True, blank=True) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index d37c145d4..9ed0170a2 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -6,7 +6,7 @@ from rest_framework import serializers from rest_framework.exceptions import ValidationError from cookbook.models import MealPlan, MealType, Recipe, ViewLog, UserPreference, Storage, Sync, SyncLog, Keyword, Unit, Ingredient, Comment, RecipeImport, RecipeBook, RecipeBookEntry, ShareLink, CookLog, Food, Step, ShoppingList, \ - ShoppingListEntry, ShoppingListRecipe + ShoppingListEntry, ShoppingListRecipe, NutritionInformation from cookbook.templatetags.custom_tags import markdown @@ -263,3 +263,8 @@ class ViewLogSerializer(serializers.ModelSerializer): class Meta: model = ViewLog fields = '__all__' + +class NutritionInformationSerializer(serializers.ModelSerializer): + class Meta: + model = NutritionInformation + fields = '__all__' \ No newline at end of file diff --git a/cookbook/templates/recipe_view.html b/cookbook/templates/recipe_view.html index e94766e05..5baf672f3 100644 --- a/cookbook/templates/recipe_view.html +++ b/cookbook/templates/recipe_view.html @@ -215,21 +215,46 @@

{% trans 'Nutrition' %}

- {% for n in recipe.nutrition.nutritions.all %} + + + + + + + + + + + + + + + + + + - - - - {% endfor %} - + + + +
+ {% trans Calories %} + {{ recipe.nutrition.calories|floatformat:2 }}kcal
+ {% trans Carbohydrates %} + {{ recipe.nutrition.carbohydrates|floatformat:2 }}g
+ {% trans Fats %} + {{ recipe.nutrition.fats|floatformat:2 }}g
- {{ n.type.type }} + {% trans Proteins %} {{ n.value|floatformat:2 }}{{ n.type.unit.short }}
{{ recipe.nutrition.proteins|floatformat:2 }}g
+ {% if recipe.nutrition.source %} + Source: {{ recipe.nutrition.source }} + {% endif %}
diff --git a/cookbook/views/api.py b/cookbook/views/api.py index e3a2a154b..70cbda08c 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -28,10 +28,10 @@ from rest_framework.viewsets import ViewSetMixin from cookbook.helper.permission_helper import group_required, CustomIsOwner, CustomIsAdmin, CustomIsUser, CustomIsGuest, CustomIsShare from cookbook.helper.recipe_url_import import get_from_html -from cookbook.models import Recipe, Sync, Storage, CookLog, MealPlan, MealType, ViewLog, UserPreference, RecipeBook, Ingredient, Food, Step, Keyword, Unit, SyncLog, ShoppingListRecipe, ShoppingList, ShoppingListEntry +from cookbook.models import Recipe, Sync, Storage, CookLog, MealPlan, MealType, ViewLog, UserPreference, RecipeBook, Ingredient, Food, Step, Keyword, Unit, SyncLog, ShoppingListRecipe, ShoppingList, ShoppingListEntry, NutritionInformation from cookbook.provider.dropbox import Dropbox from cookbook.provider.nextcloud import Nextcloud -from cookbook.serializer import MealPlanSerializer, MealTypeSerializer, RecipeSerializer, ViewLogSerializer, UserNameSerializer, UserPreferenceSerializer, RecipeBookSerializer, IngredientSerializer, FoodSerializer, StepSerializer, \ +from cookbook.serializer import NutritionInformationSerializer, MealPlanSerializer, MealTypeSerializer, RecipeSerializer, ViewLogSerializer, UserNameSerializer, UserPreferenceSerializer, RecipeBookSerializer, IngredientSerializer, FoodSerializer, StepSerializer, \ KeywordSerializer, RecipeImageSerializer, StorageSerializer, SyncSerializer, SyncLogSerializer, UnitSerializer, ShoppingListSerializer, ShoppingListRecipeSerializer, ShoppingListEntrySerializer, ShoppingListEntryCheckedSerializer, \ ShoppingListAutoSyncSerializer @@ -282,6 +282,10 @@ class ViewLogViewSet(viewsets.ModelViewSet): queryset = ViewLog.objects.filter(created_by=self.request.user).all()[:5] return queryset +class NutritionInformationViewSet(viewsets.ModelViewSet): + queryset = NutritionInformation.objects.all() + serializer_class = NutritionInformationSerializer + # -------------- non django rest api views --------------------