diff --git a/cookbook/forms.py b/cookbook/forms.py
index 69ac558b0..e716c855a 100644
--- a/cookbook/forms.py
+++ b/cookbook/forms.py
@@ -1,4 +1,3 @@
-from dal import autocomplete
from django import forms
from django.forms import widgets
from django.utils.translation import gettext as _
@@ -107,6 +106,10 @@ class ExportForm(forms.Form):
)
+class ImportForm(forms.Form):
+ recipe = forms.CharField(widget=forms.Textarea)
+
+
class UnitMergeForm(forms.Form):
prefix = 'unit'
diff --git a/cookbook/templates/import.html b/cookbook/templates/import.html
index 8d78ca2d0..96a7be708 100644
--- a/cookbook/templates/import.html
+++ b/cookbook/templates/import.html
@@ -6,5 +6,14 @@
{% block title %}{% trans 'Import Recipes' %}{% endblock %}
{% block content %}
-
+
{% endblock %}
\ No newline at end of file
diff --git a/cookbook/views/import_export.py b/cookbook/views/import_export.py
index def140216..1541b29a8 100644
--- a/cookbook/views/import_export.py
+++ b/cookbook/views/import_export.py
@@ -1,41 +1,74 @@
import json
-from django.core import serializers
+from django.contrib import messages
+from django.db import IntegrityError
+from django.http import HttpResponseRedirect
from django.shortcuts import render
-
-from cookbook.forms import ExportForm
-from cookbook.models import Recipe, Ingredient, RecipeIngredient, Unit
+from django.urls import reverse_lazy
+from django.utils.translation import gettext as _
+from cookbook.forms import ExportForm, ImportForm
+from cookbook.models import RecipeIngredient, Recipe, Unit, Ingredient
def import_recipe(request):
- return render(request, 'import.html', {})
+ if request.method == "POST":
+ form = ImportForm(request.POST)
+ if form.is_valid():
+ data = json.loads(form.cleaned_data['recipe'])
+
+ recipe = Recipe.objects.create(name=data['recipe']['name'], instructions=data['recipe']['instructions'],
+ working_time=data['recipe']['working_time'], waiting_time=data['recipe']['waiting_time'],
+ created_by=request.user, internal=True)
+
+ for u in data['units']:
+ try:
+ Unit.objects.create(name=u['name'], description=u['description']).save()
+ except IntegrityError:
+ pass
+
+ for i in data['ingredients']:
+ try:
+ Ingredient.objects.create(name=i['name']).save()
+ except IntegrityError:
+ pass
+
+ for ri in data['recipe_ingredients']:
+ RecipeIngredient.objects.create(recipe=recipe, ingredient=Ingredient.objects.get(name=ri['ingredient']),
+ unit=Unit.objects.get(name=ri['unit']), amount=ri['amount'], note=ri['note'])
+
+ messages.add_message(request, messages.SUCCESS, _('Recipe imported successfully!'))
+ return HttpResponseRedirect(reverse_lazy('view_recipe', args=[recipe.pk]))
+ else:
+ form = ImportForm()
+
+ return render(request, 'import.html', {'form': form})
def export_recipe(request):
- # TODO filter internal only
context = {}
-
if request.method == "POST":
form = ExportForm(request.POST)
if form.is_valid():
recipe = form.cleaned_data['recipe']
+ if recipe.internal:
+ export = {
+ 'recipe': {'name': recipe.name, 'instructions': recipe.instructions, 'working_time': recipe.working_time, 'waiting_time': recipe.working_time},
+ 'units': [],
+ 'ingredients': [],
+ 'recipe_ingredients': []
+ }
- export = {
- 'recipe': {'name': recipe.name, 'instructions': recipe.instructions, 'working_time': recipe.working_time, 'waiting_time': recipe.working_time},
- 'units': [],
- 'ingredients': [],
- 'recipe_ingredients': []
- }
+ for ri in RecipeIngredient.objects.filter(recipe=recipe).all():
+ if ri.unit not in export['units']:
+ export['units'].append({'name': ri.unit.name, 'description': ri.unit.description})
+ if ri.ingredient not in export['ingredients']:
+ export['ingredients'].append({'name': ri.ingredient.name})
- for ri in RecipeIngredient.objects.filter(recipe=recipe).all():
- if ri.unit not in export['units']:
- export['units'].append({'name': ri.unit.name, 'description': ri.unit.description})
- if ri.ingredient not in export['ingredients']:
- export['ingredients'].append({'name': ri.ingredient.name})
+ export['recipe_ingredients'].append({'ingredient': ri.ingredient.name, 'unit': ri.unit.name, 'amount': float(ri.amount), 'note': ri.note})
- export['recipe_ingredients'].append({'ingredient': ri.ingredient.name, 'unit': ri.unit.name, 'amount': float(ri.amount), 'note': ri.note})
-
- context['export'] = json.dumps(export, indent=4)
+ context['export'] = json.dumps(export, indent=4)
+ else:
+ form.add_error('recipe', _('External recipes cannot be exported, please share the file directly or select an internal recipe.'))
else:
form = ExportForm()