Coverage for cookbook/integration/default.py: 26%
54 statements
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
« prev ^ index » next coverage.py v7.4.0, created at 2023-12-29 00:47 +0100
1import json
2import traceback
3from io import BytesIO, StringIO
4from re import match
5from zipfile import ZipFile
7from rest_framework.renderers import JSONRenderer
9from cookbook.helper.image_processing import get_filetype
10from cookbook.integration.integration import Integration
11from cookbook.serializer import RecipeExportSerializer
14class Default(Integration):
16 def get_recipe_from_file(self, file):
17 recipe_zip = ZipFile(file)
19 recipe_string = recipe_zip.read('recipe.json').decode("utf-8")
20 recipe = self.decode_recipe(recipe_string)
21 images = list(filter(lambda v: match('image.*', v), recipe_zip.namelist()))
22 if images:
23 try:
24 self.import_recipe_image(recipe, BytesIO(recipe_zip.read(images[0])), filetype=get_filetype(images[0]))
25 except AttributeError:
26 traceback.print_exc()
27 return recipe
29 def decode_recipe(self, string):
30 data = json.loads(string)
31 serialized_recipe = RecipeExportSerializer(data=data, context={'request': self.request})
32 if serialized_recipe.is_valid():
33 recipe = serialized_recipe.save()
34 return recipe
36 return None
38 def get_file_from_recipe(self, recipe):
40 export = RecipeExportSerializer(recipe).data
42 return 'recipe.json', JSONRenderer().render(export).decode("utf-8")
44 def get_files_from_recipes(self, recipes, el, cookie):
45 export_zip_stream = BytesIO()
46 export_zip_obj = ZipFile(export_zip_stream, 'w')
48 for r in recipes:
49 if r.internal and r.space == self.request.space:
50 recipe_zip_stream = BytesIO()
51 recipe_zip_obj = ZipFile(recipe_zip_stream, 'w')
53 recipe_stream = StringIO()
54 filename, data = self.get_file_from_recipe(r)
55 recipe_stream.write(data)
56 recipe_zip_obj.writestr(filename, recipe_stream.getvalue())
57 recipe_stream.close()
59 try:
60 recipe_zip_obj.writestr(f'image{get_filetype(r.image.file.name)}', r.image.file.read())
61 except (ValueError, FileNotFoundError):
62 pass
64 recipe_zip_obj.close()
66 export_zip_obj.writestr(str(r.pk) + '.zip', recipe_zip_stream.getvalue())
68 el.exported_recipes += 1
69 el.msg += self.get_recipe_processed_msg(r)
70 el.save()
72 export_zip_obj.close()
74 return [[self.get_export_file_name(), export_zip_stream.getvalue()]]