From 66794d619f8a59588c1053641f4640179656ea49 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 1 Nov 2021 11:10:35 +0100 Subject: [PATCH] improved cookbook app importer --- cookbook/integration/cookbookapp.py | 49 +++++++++++++++-------------- cookbook/integration/integration.py | 3 +- docs/features/import_export.md | 4 +-- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/cookbook/integration/cookbookapp.py b/cookbook/integration/cookbookapp.py index f7dc55d79..c77bd8dc9 100644 --- a/cookbook/integration/cookbookapp.py +++ b/cookbook/integration/cookbookapp.py @@ -4,9 +4,12 @@ import json import re from io import BytesIO +import requests import yaml from cookbook.helper.ingredient_parser import IngredientParser +from cookbook.helper.recipe_html_import import get_recipe_from_source +from cookbook.helper.recipe_url_import import iso_duration_to_minutes from cookbook.integration.integration import Integration from cookbook.models import Recipe, Step, Ingredient, Keyword from gettext import gettext as _ @@ -15,53 +18,51 @@ from gettext import gettext as _ class CookBookApp(Integration): def import_file_name_filter(self, zip_info_object): - return zip_info_object.filename.endswith('.yml') + return zip_info_object.filename.endswith('.html') def get_recipe_from_file(self, file): - recipe_yml = yaml.safe_load(file.getvalue().decode("utf-8")) + recipe_html = file.getvalue().decode("utf-8") + + recipe_json, recipe_tree, html_data, images = get_recipe_from_source(recipe_html, 'CookBookApp', self.request) recipe = Recipe.objects.create( - name=recipe_yml['name'].strip(), + name=recipe_json['name'].strip(), created_by=self.request.user, internal=True, space=self.request.space) try: - recipe.servings = re.findall('([0-9])+', recipe_yml['recipeYield'])[0] + recipe.servings = re.findall('([0-9])+', recipe_json['recipeYield'])[0] except Exception as e: pass try: - recipe.working_time = recipe_yml['prep_time'].replace(' minutes', '') - recipe.waiting_time = recipe_yml['cook_time'].replace(' minutes', '') + recipe.working_time = iso_duration_to_minutes(recipe_json['prep_time']) + recipe.waiting_time = iso_duration_to_minutes(recipe_json['cook_time']) except Exception: pass - if recipe_yml['on_favorites']: - recipe.keywords.add(Keyword.objects.get_or_create(name=_('Favorites'), space=self.request.space)) + step = Step.objects.create(instruction=recipe_json['recipeInstructions'], space=self.request.space, ) - step = Step.objects.create(instruction=recipe_yml['directions'], space=self.request.space, ) - - if 'notes' in recipe_yml and recipe_yml['notes'].strip() != '': - step.instruction = step.instruction + '\n\n' + recipe_yml['notes'] - - if 'nutritional_info' in recipe_yml: - step.instruction = step.instruction + '\n\n' + recipe_yml['nutritional_info'] - - if 'source' in recipe_yml and recipe_yml['source'].strip() != '': - step.instruction = step.instruction + '\n\n' + recipe_yml['source'] + if 'nutrition' in recipe_json: + step.instruction = step.instruction + '\n\n' + recipe_json['nutrition'] step.save() recipe.steps.add(step) ingredient_parser = IngredientParser(self.request, True) - for ingredient in recipe_yml['ingredients'].split('\n'): - if ingredient.strip() != '': - amount, unit, ingredient, note = ingredient_parser.parse(ingredient) - f = ingredient_parser.get_food(ingredient) - u = ingredient_parser.get_unit(unit) + for ingredient in recipe_json['recipeIngredient']: + f = ingredient_parser.get_food(ingredient['ingredient']['text']) + u = ingredient_parser.get_unit(ingredient['unit']['text']) step.ingredients.add(Ingredient.objects.create( - food=f, unit=u, amount=amount, note=note, space=self.request.space, + food=f, unit=u, amount=ingredient['amount'], note=ingredient['note'], space=self.request.space, )) + if len(images) > 0: + try: + response = requests.get(images[0]) + self.import_recipe_image(recipe, BytesIO(response.content)) + except Exception as e: + print('failed to import image ', str(e)) + recipe.save() return recipe diff --git a/cookbook/integration/integration.py b/cookbook/integration/integration.py index fe1c10a60..933cc60ac 100644 --- a/cookbook/integration/integration.py +++ b/cookbook/integration/integration.py @@ -269,7 +269,8 @@ class Integration: """ raise NotImplementedError('Method not implemented in integration') - def handle_exception(self, exception, log=None, message=''): + @staticmethod + def handle_exception(exception, log=None, message=''): if log: if message: log.msg += message diff --git a/docs/features/import_export.md b/docs/features/import_export.md index 9155ba911..0c5e4fe0b 100644 --- a/docs/features/import_export.md +++ b/docs/features/import_export.md @@ -36,7 +36,7 @@ Overview of the capabilities of the different integrations. | RezKonv | ✔️ | ❌ | ❌ | | OpenEats | ✔️ | ❌ | ⌚ | | Plantoeat | ✔️ | ❌ | ✔ | -| CookBookApp | ✔️ | ⌚ | ❌ | +| CookBookApp | ✔️ | ⌚ | ✔️ | ✔ = implemented, ❌ = not implemented and not possible/planned, ⌚ = not yet implemented @@ -217,4 +217,4 @@ Plan to eat allow to export a text file containing all your recipes. Simply uplo ## CookBookApp -CookBookApp can export .zip files containing .yml files. Upload the entire ZIP to Tandoor to import all conluded recipes. \ No newline at end of file +CookBookApp can export .zip files containing .html files. Upload the entire ZIP to Tandoor to import all included recipes. \ No newline at end of file