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

1import json 

2import traceback 

3from io import BytesIO, StringIO 

4from re import match 

5from zipfile import ZipFile 

6 

7from rest_framework.renderers import JSONRenderer 

8 

9from cookbook.helper.image_processing import get_filetype 

10from cookbook.integration.integration import Integration 

11from cookbook.serializer import RecipeExportSerializer 

12 

13 

14class Default(Integration): 

15 

16 def get_recipe_from_file(self, file): 

17 recipe_zip = ZipFile(file) 

18 

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 

28 

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 

35 

36 return None 

37 

38 def get_file_from_recipe(self, recipe): 

39 

40 export = RecipeExportSerializer(recipe).data 

41 

42 return 'recipe.json', JSONRenderer().render(export).decode("utf-8") 

43 

44 def get_files_from_recipes(self, recipes, el, cookie): 

45 export_zip_stream = BytesIO() 

46 export_zip_obj = ZipFile(export_zip_stream, 'w') 

47 

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') 

52 

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() 

58 

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 

63 

64 recipe_zip_obj.close() 

65 

66 export_zip_obj.writestr(str(r.pk) + '.zip', recipe_zip_stream.getvalue()) 

67 

68 el.exported_recipes += 1 

69 el.msg += self.get_recipe_processed_msg(r) 

70 el.save() 

71 

72 export_zip_obj.close() 

73 

74 return [[self.get_export_file_name(), export_zip_stream.getvalue()]]