108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
import re
|
|
import json
|
|
import base64
|
|
import requests
|
|
from io import BytesIO
|
|
from zipfile import ZipFile
|
|
import imghdr
|
|
from django.utils.translation import gettext as _
|
|
|
|
from cookbook.helper.ingredient_parser import parse, get_food, get_unit
|
|
from cookbook.integration.integration import Integration
|
|
from cookbook.models import Recipe, Step, Food, Unit, Ingredient
|
|
|
|
|
|
class RecetteTek(Integration):
|
|
|
|
def import_file_name_filter(self, zip_info_object):
|
|
print("testing", zip_info_object.filename)
|
|
return re.match(r'^recipes_0.json$', zip_info_object.filename)
|
|
|
|
def split_recipe_file(self, file):
|
|
|
|
recipe_json = json.loads(file)
|
|
|
|
recipe_list = [r for r in recipe_json]
|
|
|
|
return recipe_list
|
|
|
|
def get_recipe_from_file(self, file):
|
|
|
|
# Create initial recipe with just a title and a decription
|
|
recipe = Recipe.objects.create(name=file['title'], created_by=self.request.user, internal=True, space=self.request.space, )
|
|
|
|
try:
|
|
if file['description'] != '':
|
|
recipe.description = file['description'].strip()
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to parse recipe description ', str(e))
|
|
|
|
step = Step.objects.create(instruction=file['instructions'])
|
|
|
|
try:
|
|
# Process the ingredients. Assumes 1 ingredient per line.
|
|
for ingredient in file['ingredients'].split('\n'):
|
|
if len(ingredient.strip()) > 0:
|
|
amount, unit, ingredient, note = parse(ingredient)
|
|
f = get_food(ingredient, self.request.space)
|
|
u = get_unit(unit, self.request.space)
|
|
step.ingredients.add(Ingredient.objects.create(
|
|
food=f, unit=u, amount=amount, note=note
|
|
))
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to parse recipe ingredients ', str(e))
|
|
recipe.steps.add(step)
|
|
|
|
# Attempt to import prep/cooking times
|
|
try:
|
|
if file['quantity'] != '':
|
|
recipe.servings = int(file['quantity'])
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to parse quantity ', str(e))
|
|
|
|
try:
|
|
if file['totalTime'] != '':
|
|
recipe.waiting_time = int(file['totalTime'])
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to parse total times ', str(e))
|
|
|
|
try:
|
|
if file['preparationTime'] != '':
|
|
recipe.working_time = int(file['preparationTime'])
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to parse prep time ', str(e))
|
|
|
|
try:
|
|
if file['cookingTime'] != '':
|
|
recipe.waiting_time = int(file['cookingTime'])
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to parse cooking time ', str(e))
|
|
|
|
recipe.save()
|
|
|
|
# Append the original import url if it exists
|
|
try:
|
|
if file['url'] != '':
|
|
step.instruction += '\n\nImported from: ' + file['url']
|
|
step.save()
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to import source url ', str(e))
|
|
|
|
# TODO: Parse Nutritional Information
|
|
|
|
# Grab the original image that was used for the recipe
|
|
try:
|
|
if file['originalPicture']!= '':
|
|
response = requests.get(file['originalPicture'])
|
|
if imghdr.what(BytesIO(response.content)) != None:
|
|
self.import_recipe_image(recipe, BytesIO(response.content))
|
|
else:
|
|
raise Exception("Original image failed to download.")
|
|
except Exception as e:
|
|
print(recipe.name, ': failed to import image ', str(e))
|
|
|
|
return recipe
|
|
|
|
def get_file_from_recipe(self, recipe):
|
|
raise NotImplementedError('Method not implemented in storage integration')
|