From 368d6316027529838096959d16bf88af80e796d8 Mon Sep 17 00:00:00 2001 From: Sebastian Markgraf Date: Thu, 15 Oct 2020 22:03:25 +0200 Subject: [PATCH 1/7] Add nutrition to model. --- cookbook/admin.py | 28 ++++++++++++++++++++++++++++ cookbook/models.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/cookbook/admin.py b/cookbook/admin.py index e667a1614..7a93b08b8 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -172,3 +172,31 @@ class ShareLinkAdmin(admin.ModelAdmin): admin.site.register(ShareLink, ShareLinkAdmin) + + +class NutritionInformationAdmin(admin.ModelAdmin): + list_display = ('recipe', '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 = ('information', 'value', 'type', 'created_by', 'created_at',) + + +admin.site.register(NutritionValue, NutritionValueAdmin) diff --git a/cookbook/models.py b/cookbook/models.py index 2f1309e10..16923c22d 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -361,3 +361,43 @@ class ViewLog(models.Model): def __str__(self): return self.recipe.name + + +class NutritionInformation(models.Model): + recipe = models.ForeignKey(Recipe, 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'Nutrition {self.recipe}' + + +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): + information = models.ForeignKey(NutritionInformation, on_delete=models.CASCADE) + 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}' From 2b1cde2efc533db9bb1238e91e60ace74c74145f Mon Sep 17 00:00:00 2001 From: Sebastian Markgraf Date: Fri, 16 Oct 2020 23:44:18 +0200 Subject: [PATCH 2/7] Add basic output for nutritions. --- cookbook/admin.py | 4 +- cookbook/models.py | 80 ++++++++++++++--------------- cookbook/templates/recipe_view.html | 14 ++++- 3 files changed, 55 insertions(+), 43 deletions(-) diff --git a/cookbook/admin.py b/cookbook/admin.py index 7a93b08b8..7a3c68274 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -175,7 +175,7 @@ admin.site.register(ShareLink, ShareLinkAdmin) class NutritionInformationAdmin(admin.ModelAdmin): - list_display = ('recipe', 'created_by', 'created_at',) + list_display = ('created_by', 'created_at',) admin.site.register(NutritionInformation, NutritionInformationAdmin) @@ -196,7 +196,7 @@ admin.site.register(NutritionType, NutritionTypeAdmin) class NutritionValueAdmin(admin.ModelAdmin): - list_display = ('information', 'value', 'type', 'created_by', 'created_at',) + list_display = ('value', 'type', 'created_by', 'created_at',) admin.site.register(NutritionValue, NutritionValueAdmin) diff --git a/cookbook/models.py b/cookbook/models.py index 16923c22d..fae56f362 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -181,6 +181,45 @@ 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) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f'Nutrition' + + class Recipe(models.Model): name = models.CharField(max_length=128) image = models.ImageField(upload_to='recipes/', blank=True, null=True) @@ -194,6 +233,7 @@ class Recipe(models.Model): working_time = models.IntegerField(default=0) waiting_time = models.IntegerField(default=0) internal = models.BooleanField(default=False) + nutrition = models.ForeignKey(NutritionInformation, blank=True, null=True, on_delete=models.PROTECT) created_by = models.ForeignKey(User, on_delete=models.PROTECT) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) @@ -361,43 +401,3 @@ class ViewLog(models.Model): def __str__(self): return self.recipe.name - - -class NutritionInformation(models.Model): - recipe = models.ForeignKey(Recipe, 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'Nutrition {self.recipe}' - - -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): - information = models.ForeignKey(NutritionInformation, on_delete=models.CASCADE) - 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}' diff --git a/cookbook/templates/recipe_view.html b/cookbook/templates/recipe_view.html index d20d0c69b..f378afcdb 100644 --- a/cookbook/templates/recipe_view.html +++ b/cookbook/templates/recipe_view.html @@ -205,6 +205,17 @@ {% endif %} + {% if recipe.nutrition %} +
+
+

{% trans 'Nutrition' %}

+ {% for n in recipe.nutrition.nutritions.all %} + {{ n.type.type }}: {{ n.value|floatformat:2 }} {{ n.type.unit.short }} + {% endfor %} +
+ {% endif %} + +

{% trans 'Instructions' %}

@@ -472,7 +483,8 @@ this.$http.get("{% url 'api:recipe-detail' recipe.pk %}" {% if share %} + "?share={{ share }}"{% endif %}).then((response) => { this.recipe = response.data; - this.loading = false + console.log(this.recipe); + this.loading = false; for (let step of this.recipe.steps) { if (step.ingredients.length > 0) { From 7a89015ac571c09e837b749e44b3f37efcf89147 Mon Sep 17 00:00:00 2001 From: Sebastian Markgraf Date: Fri, 16 Oct 2020 23:59:19 +0200 Subject: [PATCH 3/7] Add migrations. --- .../migrations/0089_auto_20201016_2358.py | 70 +++++++++++++++++++ cookbook/templates/recipe_view.html | 3 +- 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 cookbook/migrations/0089_auto_20201016_2358.py diff --git a/cookbook/migrations/0089_auto_20201016_2358.py b/cookbook/migrations/0089_auto_20201016_2358.py new file mode 100644 index 000000000..24a55b3ce --- /dev/null +++ b/cookbook/migrations/0089_auto_20201016_2358.py @@ -0,0 +1,70 @@ +# 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/templates/recipe_view.html b/cookbook/templates/recipe_view.html index f378afcdb..25ff3b6f5 100644 --- a/cookbook/templates/recipe_view.html +++ b/cookbook/templates/recipe_view.html @@ -210,7 +210,7 @@

{% trans 'Nutrition' %}

{% for n in recipe.nutrition.nutritions.all %} - {{ n.type.type }}: {{ n.value|floatformat:2 }} {{ n.type.unit.short }} +
{{ n.type.type }}: {{ n.value|floatformat:2 }} {{ n.type.unit.short }}
{% endfor %}
{% endif %} @@ -483,7 +483,6 @@ this.$http.get("{% url 'api:recipe-detail' recipe.pk %}" {% if share %} + "?share={{ share }}"{% endif %}).then((response) => { this.recipe = response.data; - console.log(this.recipe); this.loading = false; for (let step of this.recipe.steps) { From 31dabd4757ea1d1e4c9a954599701159c369da1a Mon Sep 17 00:00:00 2001 From: Sebastian Markgraf Date: Sun, 18 Oct 2020 17:31:56 +0200 Subject: [PATCH 4/7] Add nutritions output --- cookbook/templates/recipe_view.html | 60 ++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/cookbook/templates/recipe_view.html b/cookbook/templates/recipe_view.html index 25ff3b6f5..e94766e05 100644 --- a/cookbook/templates/recipe_view.html +++ b/cookbook/templates/recipe_view.html @@ -96,7 +96,8 @@ {% endif %}
-
+
+
@@ -171,7 +172,9 @@