project_banjo_app/cookbook/app/views.py

75 lines
2.4 KiB
Python

from app.models import Recipe, Ingredient, Step, Note
from banjo.http import BadRequest
from banjo.urls import route_get, route_post
from scrape_schema_recipe import scrape_url
@route_get('recipes/all')
def show_all_recipes(params):
"""
Returns all recipes.
"""
recipes = Recipe.objects.all()
return {'recipes': [r.to_dict() for r in recipes]}
@route_get('recipes/search', args={'query': str})
def search_for_recipe(params):
"""
Searches for recipes (by name).
"""
recipes = Recipe.objects.filter(name__icontains=params['query'])
return {'recipes': [r.to_dict() for r in recipes]}
@route_get('recipes/search-ingredient', args={'query': str})
def search_for_recipe_by_ingredient(params):
"""
Searches for recipes (by name).
"""
recipes = Recipe.objects.filter(ingredients__text__icontains=params['query'])
return {'recipes': [r.to_dict() for r in recipes]}
@route_post('recipes/import', args={'url': str})
def import_recipe(params):
"""
Tries to import a recipe from a URL.
If something goes wrong, returns a 400 error with an explanation.
"""
url = params['url']
if Recipe.objects.filter(url=url).exists():
raise BadRequest(f"{url} has already been imported.")
try:
recipes = scrape_url(url)
except:
raise BadRequest(f"Error reading {url}")
if len(recipes) == 0:
raise BadRequest(f"No recipes found at {url}")
try:
recipes_created = []
for r in recipes:
recipe = Recipe(name=r['name'])
ingredients = r['recipeIngredient']
steps = [step['text'] for step in r['recipeInstructions']]
recipe.save()
for i in ingredients:
ingredient = Ingredient(recipe=recipe, text=i)
ingredient.save()
for s in steps:
order = recipe.steps.count() + 1
step = Step(recipe=recipe, text=s, order=order)
step.save()
recipes_created.append(recipe.to_dict())
return {'recipes': recipes_created}
except KeyError:
raise BadRequest(f"Found a recipe at {url}, but it had an unexpected format.")
@route_post("recipes/add-note", args={'recipe_id': int, 'note': str})
def add_note(params):
"""Adds a note to a recipe
"""
recipe = Recipe.objects.get(id=params['recipe_id'])
note = Note(recipe=recipe, text=params['note'])
note.save()
return recipe.to_dict()