diff --git a/cookbook/admin.py b/cookbook/admin.py index c9d44307..4569404c 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 2a583873..bacf2124 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 00000000..8f5c7f87 --- /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 00000000..4d530fd5 --- /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 2f002105..0363a74b 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 cadf4fb2..dd632ad1 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 8d7cf0e8..82601a52 100644 --- a/cookbook/templates/shopping_list.html +++ b/cookbook/templates/shopping_list.html @@ -305,7 +305,7 @@ {% endblock %} {% block script %} - +