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 %}
-
+