From a16ad2c887a00b2f4c52ecfd3b76c012be67bf4c Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 25 Jan 2021 17:24:03 +0100 Subject: [PATCH] added ingredient merging to shopping list --- cookbook/admin.py | 5 +- cookbook/forms.py | 2 +- .../migrations/0102_auto_20210125_1147.py | 46 ++++++++++++ .../migrations/0103_food_ignore_shopping.py | 18 +++++ cookbook/models.py | 31 +++++--- cookbook/serializer.py | 15 +++- cookbook/templates/shopping_list.html | 73 ++++++++----------- 7 files changed, 131 insertions(+), 59 deletions(-) create mode 100644 cookbook/migrations/0102_auto_20210125_1147.py create mode 100644 cookbook/migrations/0103_food_ignore_shopping.py diff --git a/cookbook/admin.py b/cookbook/admin.py index c9d443076..4569404c5 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -5,7 +5,7 @@ from .models import (Comment, CookLog, Food, Ingredient, InviteLink, Keyword, RecipeBook, RecipeBookEntry, RecipeImport, ShareLink, ShoppingList, ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage, Sync, SyncLog, Unit, UserPreference, - ViewLog) + ViewLog, Supermarket, SupermarketCategory) class SpaceAdmin(admin.ModelAdmin): @@ -42,6 +42,9 @@ class SyncAdmin(admin.ModelAdmin): admin.site.register(Sync, SyncAdmin) +admin.site.register(Supermarket) +admin.site.register(SupermarketCategory) + class SyncLogAdmin(admin.ModelAdmin): list_display = ('sync', 'status', 'msg', 'created_at') diff --git a/cookbook/forms.py b/cookbook/forms.py index 2a5838733..bacf21240 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -212,7 +212,7 @@ class KeywordForm(forms.ModelForm): class FoodForm(forms.ModelForm): class Meta: model = Food - fields = ('name', 'recipe') + fields = ('name', 'description', 'ignore_shopping', 'recipe', 'supermarket_category') widgets = {'recipe': SelectWidget} diff --git a/cookbook/migrations/0102_auto_20210125_1147.py b/cookbook/migrations/0102_auto_20210125_1147.py new file mode 100644 index 000000000..8f5c7f872 --- /dev/null +++ b/cookbook/migrations/0102_auto_20210125_1147.py @@ -0,0 +1,46 @@ +# Generated by Django 3.1.5 on 2021-01-25 10:47 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0101_storage_path'), + ] + + operations = [ + migrations.CreateModel( + name='Supermarket', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, unique=True, validators=[django.core.validators.MinLengthValidator(1)])), + ('description', models.TextField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='SupermarketCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, unique=True, validators=[django.core.validators.MinLengthValidator(1)])), + ('description', models.TextField(blank=True, null=True)), + ], + ), + migrations.AddField( + model_name='food', + name='description', + field=models.TextField(blank=True, default=''), + ), + migrations.AlterField( + model_name='storage', + name='method', + field=models.CharField(choices=[('DB', 'Dropbox'), ('NEXTCLOUD', 'Nextcloud'), ('LOCAL', 'Local')], default='DB', max_length=128), + ), + migrations.AddField( + model_name='food', + name='supermarket_category', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cookbook.supermarketcategory'), + ), + ] diff --git a/cookbook/migrations/0103_food_ignore_shopping.py b/cookbook/migrations/0103_food_ignore_shopping.py new file mode 100644 index 000000000..4d530fd52 --- /dev/null +++ b/cookbook/migrations/0103_food_ignore_shopping.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2021-01-25 13:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0102_auto_20210125_1147'), + ] + + operations = [ + migrations.AddField( + model_name='food', + name='ignore_shopping', + field=models.BooleanField(default=False), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 2f0021058..0363a74ba 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -144,6 +144,22 @@ class Sync(models.Model): return self.path +class Supermarket(models.Model): + name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)]) + description = models.TextField(blank=True, null=True) + + def __str__(self): + return self.name + + +class SupermarketCategory(models.Model): + name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)]) + description = models.TextField(blank=True, null=True) + + def __str__(self): + return self.name + + class SyncLog(models.Model): sync = models.ForeignKey(Sync, on_delete=models.CASCADE) status = models.CharField(max_length=32) @@ -169,9 +185,7 @@ class Keyword(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) def __str__(self): @@ -179,12 +193,11 @@ class Unit(models.Model): class Food(models.Model): - name = models.CharField( - unique=True, max_length=128, validators=[MinLengthValidator(1)] - ) - recipe = models.ForeignKey( - 'Recipe', null=True, blank=True, on_delete=models.SET_NULL - ) + name = models.CharField(unique=True, max_length=128, validators=[MinLengthValidator(1)]) + recipe = models.ForeignKey('Recipe', null=True, blank=True, on_delete=models.SET_NULL) + supermarket_category = models.ForeignKey(SupermarketCategory, null=True, blank=True, on_delete=models.SET_NULL) + ignore_shopping = models.BooleanField(default=False) + description = models.TextField(default='', blank=True) def __str__(self): return self.name diff --git a/cookbook/serializer.py b/cookbook/serializer.py index cadf4fb2a..dd632ad1b 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -11,7 +11,7 @@ from cookbook.models import (Comment, CookLog, Food, Ingredient, Keyword, RecipeBook, RecipeBookEntry, RecipeImport, ShareLink, ShoppingList, ShoppingListEntry, ShoppingListRecipe, Step, Storage, Sync, SyncLog, - Unit, UserPreference, ViewLog) + Unit, UserPreference, ViewLog, SupermarketCategory) from cookbook.templatetags.custom_tags import markdown @@ -140,7 +140,14 @@ class UnitSerializer(UniqueFieldsMixin, serializers.ModelSerializer): read_only_fields = ('id',) +class SupermarketCategorySerializer(serializers.ModelSerializer): + class Meta: + model = SupermarketCategory + fields = ('id', 'name') + + class FoodSerializer(UniqueFieldsMixin, serializers.ModelSerializer): + supermarket_category = SupermarketCategorySerializer() def create(self, validated_data): # since multi select tags dont have id's @@ -153,7 +160,7 @@ class FoodSerializer(UniqueFieldsMixin, serializers.ModelSerializer): class Meta: model = Food - fields = ('id', 'name', 'recipe') + fields = ('id', 'name', 'recipe', 'ignore_shopping', 'supermarket_category') read_only_fields = ('id',) @@ -309,8 +316,8 @@ class ShoppingListRecipeSerializer(serializers.ModelSerializer): class ShoppingListEntrySerializer(WritableNestedModelSerializer): - food = FoodSerializer(allow_null=True) - unit = UnitSerializer(allow_null=True) + food = FoodSerializer(allow_null=True, read_only=True) + unit = UnitSerializer(allow_null=True, read_only=True) amount = CustomDecimalField() class Meta: diff --git a/cookbook/templates/shopping_list.html b/cookbook/templates/shopping_list.html index 8d7cf0e86..82601a52a 100644 --- a/cookbook/templates/shopping_list.html +++ b/cookbook/templates/shopping_list.html @@ -305,7 +305,7 @@ {% endblock %} {% block script %} - +