importing with image files working

This commit is contained in:
vabene1111
2021-02-07 14:50:43 +01:00
parent 585c31490a
commit e0acd1de83
4 changed files with 28 additions and 8 deletions

View File

@ -1,9 +1,12 @@
import json
import os
import uuid
from io import StringIO, BytesIO
from os.path import basename
from zipfile import ZipFile
from PIL import Image
from django.core.files import File
from django.http import HttpResponse
from rest_framework.renderers import JSONRenderer
@ -38,10 +41,28 @@ class Default(Integration):
response['Content-Disposition'] = 'attachment; filename="export.zip"'
return response
def do_import(self, files):
for f in files:
zip = ZipFile(f.file)
for z in zip.namelist():
self.get_recipe_from_zip(ZipFile(BytesIO(zip.read(z))))
def get_recipe_from_zip(self, recipe_zip):
recipe_string = recipe_zip.read('recipe.json').decode("utf-8")
recipe = self.get_recipe(recipe_string)
for f in recipe_zip.namelist():
if '.png' in f:
recipe.image = File(BytesIO(recipe_zip.read(f)), name=f'{uuid.uuid4()}_{recipe.pk}.png')
recipe.save()
def get_recipe(self, string):
data = json.loads(string)
serialized_recipe = RecipeExportSerializer(data=data, context={'request': self.request})
if serialized_recipe.is_valid():
recipe = serialized_recipe.save()
return recipe
return RecipeExportSerializer(data=data, context={'request': self.request})
return None
def get_export(self, recipe):
export = RecipeExportSerializer(recipe).data

View File

@ -1,7 +1,3 @@
import os
import tempfile
class Integration:
request = None
@ -11,7 +7,7 @@ class Integration:
def do_export(self, recipes):
raise Exception('Method not implemented in storage integration')
def do_import(self):
def do_import(self, files):
raise Exception('Method not implemented in storage integration')
def get_recipe(self, string):

View File

@ -14,7 +14,7 @@
<h2>{% trans 'Import' %}</h2>
<div class="row">
<div class="col col-md-12">
<form action="." method="post">
<form action="." method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-success" type="submit"><i class="fas fa-file-import"></i> {% trans 'Import' %}

View File

@ -491,7 +491,10 @@ def test(request):
return HttpResponseRedirect(reverse('index'))
if request.method == "POST":
form = NewImportForm(request.POST)
form = NewImportForm(request.POST, request.FILES)
if form.is_valid():
integration = Default(request)
return integration.do_import(request.FILES.getlist('files'))
else:
form = NewImportForm()