migrating ingredients

This commit is contained in:
vabene1111
2020-02-16 23:12:16 +01:00
parent 81677a74bb
commit f77aa7c8f0
12 changed files with 142 additions and 18 deletions

View File

@ -1,6 +1,6 @@
from dal import autocomplete from dal import autocomplete
from cookbook.models import Keyword, RecipeIngredients, Recipe, Unit from cookbook.models import Keyword, RecipeIngredient, Recipe, Unit
class KeywordAutocomplete(autocomplete.Select2QuerySetView): class KeywordAutocomplete(autocomplete.Select2QuerySetView):
@ -19,9 +19,9 @@ class KeywordAutocomplete(autocomplete.Select2QuerySetView):
class IngredientsAutocomplete(autocomplete.Select2QuerySetView): class IngredientsAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self): def get_queryset(self):
if not self.request.user.is_authenticated: if not self.request.user.is_authenticated:
return RecipeIngredients.objects.none() return RecipeIngredient.objects.none()
qs = RecipeIngredients.objects.all() qs = RecipeIngredient.objects.all()
if self.q: if self.q:
qs = qs.filter(name__istartswith=self.q) qs = qs.filter(name__istartswith=self.q)

View File

@ -5,14 +5,14 @@ from django.db import migrations
def migrate_ingredient_units(apps, schema_editor): def migrate_ingredient_units(apps, schema_editor):
Unit = apps.get_model('cookbook', 'Unit') Unit = apps.get_model('cookbook', 'Unit')
RecipeIngredients = apps.get_model('cookbook', 'RecipeIngredients') RecipeIngredient = apps.get_model('cookbook', 'RecipeIngredient')
for u in RecipeIngredients.objects.values('unit').distinct(): for u in RecipeIngredient.objects.values('unit').distinct():
unit = Unit() unit = Unit()
unit.name = u['unit'] unit.name = u['unit']
unit.save() unit.save()
for i in RecipeIngredients.objects.all(): for i in RecipeIngredient.objects.all():
i.unit_key = Unit.objects.get(name=i.unit) i.unit_key = Unit.objects.get(name=i.unit)
i.save() i.save()

View File

@ -0,0 +1,17 @@
# Generated by Django 3.0.2 on 2020-02-16 22:03
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0017_auto_20200216_2257'),
]
operations = [
migrations.RenameModel(
old_name='RecipeIngredients',
new_name='RecipeIngredient',
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.2 on 2020-02-16 22:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0018_auto_20200216_2303'),
]
operations = [
migrations.CreateModel(
name='Ingredient',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128, unique=True)),
],
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.2 on 2020-02-16 22:08
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0019_ingredient'),
]
operations = [
migrations.AddField(
model_name='recipeingredient',
name='ingredient',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='cookbook.Ingredient'),
),
]

View File

@ -0,0 +1,26 @@
# Generated by Django 3.0.2 on 2020-02-16 22:09
from django.db import migrations
def migrate_ingredients(apps, schema_editor):
Ingredient = apps.get_model('cookbook', 'Ingredient')
RecipeIngredient = apps.get_model('cookbook', 'RecipeIngredient')
for u in RecipeIngredient.objects.values('name').distinct():
ingredient = Ingredient()
ingredient.name = u['name']
ingredient.save()
for i in RecipeIngredient.objects.all():
i.ingredient = Ingredient.objects.get(name=i.name)
i.save()
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0020_recipeingredient_ingredient'),
]
operations = [
migrations.RunPython(migrate_ingredients),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 3.0.2 on 2020-02-16 22:11
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0021_auto_20200216_2309'),
]
operations = [
migrations.RemoveField(
model_name='recipeingredient',
name='name',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.2 on 2020-02-16 22:11
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0022_remove_recipeingredient_name'),
]
operations = [
migrations.RenameField(
model_name='recipeingredient',
old_name='ingredient',
new_name='name',
),
]

View File

@ -95,14 +95,21 @@ class Unit(models.Model):
return self.name return self.name
class RecipeIngredients(models.Model): class Ingredient(models.Model):
name = models.CharField(max_length=128) name = models.CharField(unique=True, max_length=128)
def __str__(self):
return self.name
class RecipeIngredient(models.Model):
name = models.ForeignKey(Ingredient, on_delete=models.PROTECT, null=True)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE) recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
unit = models.ForeignKey(Unit, on_delete=models.PROTECT, null=True) unit = models.ForeignKey(Unit, on_delete=models.PROTECT, null=True)
amount = models.DecimalField(default=0, decimal_places=2, max_digits=16) amount = models.DecimalField(default=0, decimal_places=2, max_digits=16)
def __str__(self): def __str__(self):
return str(self.amount) + ' ' + str(self.unit) + ' ' + self.name return str(self.amount) + ' ' + str(self.unit) + ' ' + str(self.name)
class Comment(models.Model): class Comment(models.Model):

View File

@ -3,7 +3,7 @@ from django.contrib.auth.models import User
from django.test import TestCase, Client from django.test import TestCase, Client
from django.urls import reverse from django.urls import reverse
from cookbook.models import Recipe, RecipeIngredients from cookbook.models import Recipe, RecipeIngredient
class TestViews(TestCase): class TestViews(TestCase):
@ -69,4 +69,4 @@ class TestViews(TestCase):
r = self.client.post(url, r = self.client.post(url,
{'name': 'Changed', 'working_time': 15, 'waiting_time': 15, 'ingredients': '[{"name":"Tomato","unit__name":"g","amount":100,"delete":false},{"name":"Egg","unit__name":"Piece","amount":2,"delete":false}]'}) {'name': 'Changed', 'working_time': 15, 'waiting_time': 15, 'ingredients': '[{"name":"Tomato","unit__name":"g","amount":100,"delete":false},{"name":"Egg","unit__name":"Piece","amount":2,"delete":false}]'})
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertEqual(2, RecipeIngredients.objects.filter(recipe=recipe).count()) self.assertEqual(2, RecipeIngredient.objects.filter(recipe=recipe).count())

View File

@ -16,7 +16,7 @@ from django.views.generic import UpdateView, DeleteView
from cookbook.forms import ExternalRecipeForm, KeywordForm, StorageForm, SyncForm, InternalRecipeForm, CommentForm, \ from cookbook.forms import ExternalRecipeForm, KeywordForm, StorageForm, SyncForm, InternalRecipeForm, CommentForm, \
MealPlanForm, UnitMergeForm MealPlanForm, UnitMergeForm
from cookbook.models import Recipe, Sync, Keyword, RecipeImport, Storage, Comment, RecipeIngredients, RecipeBook, \ from cookbook.models import Recipe, Sync, Keyword, RecipeImport, Storage, Comment, RecipeIngredient, RecipeBook, \
RecipeBookEntry, MealPlan, Unit RecipeBookEntry, MealPlan, Unit
from cookbook.provider.dropbox import Dropbox from cookbook.provider.dropbox import Dropbox
from cookbook.provider.nextcloud import Nextcloud from cookbook.provider.nextcloud import Nextcloud
@ -75,10 +75,10 @@ def internal_recipe_update(request, pk):
recipe.save() recipe.save()
form_ingredients = json.loads(form.cleaned_data['ingredients']) form_ingredients = json.loads(form.cleaned_data['ingredients'])
RecipeIngredients.objects.filter(recipe=recipe_instance).delete() RecipeIngredient.objects.filter(recipe=recipe_instance).delete()
for i in form_ingredients: for i in form_ingredients:
ingredient = RecipeIngredients() ingredient = RecipeIngredient()
ingredient.recipe = recipe_instance ingredient.recipe = recipe_instance
ingredient.name = i['name'] ingredient.name = i['name']
if isinstance(i['amount'], str): if isinstance(i['amount'], str):
@ -105,7 +105,7 @@ def internal_recipe_update(request, pk):
else: else:
form = InternalRecipeForm(instance=recipe_instance) form = InternalRecipeForm(instance=recipe_instance)
ingredients = RecipeIngredients.objects.select_related('unit__name').filter(recipe=recipe_instance).values('name', ingredients = RecipeIngredient.objects.select_related('unit__name').filter(recipe=recipe_instance).values('name',
'unit__name', 'unit__name',
'amount') 'amount')
@ -300,7 +300,7 @@ def edit_ingredients(request):
if form.is_valid(): if form.is_valid():
new_unit = form.cleaned_data['new_unit'] new_unit = form.cleaned_data['new_unit']
old_unit = form.cleaned_data['old_unit'] old_unit = form.cleaned_data['old_unit']
ingredients = RecipeIngredients.objects.filter(unit=old_unit).all() ingredients = RecipeIngredient.objects.filter(unit=old_unit).all()
for i in ingredients: for i in ingredients:
i.unit = new_unit i.unit = new_unit
i.save() i.save()

View File

@ -28,7 +28,7 @@ def index(request):
@login_required @login_required
def recipe_view(request, pk): def recipe_view(request, pk):
recipe = get_object_or_404(Recipe, pk=pk) recipe = get_object_or_404(Recipe, pk=pk)
ingredients = RecipeIngredients.objects.filter(recipe=recipe) ingredients = RecipeIngredient.objects.filter(recipe=recipe)
comments = Comment.objects.filter(recipe=recipe) comments = Comment.objects.filter(recipe=recipe)
if request.method == "POST": if request.method == "POST":
@ -137,7 +137,7 @@ def shopping_list(request):
ingredients = [] ingredients = []
for r in recipes: for r in recipes:
for i in RecipeIngredients.objects.filter(recipe=r).all(): for i in RecipeIngredient.objects.filter(recipe=r).all():
ingredients.append(i) ingredients.append(i)
return render(request, 'shopping_list.html', {'ingredients': ingredients, 'recipes': recipes, 'form': form}) return render(request, 'shopping_list.html', {'ingredients': ingredients, 'recipes': recipes, 'form': form})