You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.8 KiB
158 lines
5.8 KiB
#!venv/bin/python3 |
|
|
|
from flask import Flask, render_template, request |
|
from config import DevConfig |
|
from ingredient import Ingredient |
|
from recipe import Recipe |
|
import json |
|
|
|
|
|
def create_app(test_config=None): |
|
app = Flask(__name__) |
|
if test_config is not None: |
|
app.config.from_object(test_config) |
|
else: |
|
app.config.from_object(DevConfig) |
|
|
|
import database |
|
database.init_app(app) |
|
|
|
@app.route('/', methods=['GET']) |
|
def index(): |
|
return render_template("index.html") |
|
|
|
@app.route('/debug', methods=['GET']) |
|
def debug(): |
|
return repr(get_all_recipes()) |
|
|
|
@app.route('/rezepte', methods=['GET']) |
|
def recipes(): |
|
return render_template("recipes.html", recipes=get_all_recipes()) |
|
|
|
@app.route('/neues_rezept', methods=['GET']) |
|
def new_recipe(): |
|
return render_template("new_recipe.html") |
|
|
|
@app.route('/process_recipe', methods=['POST']) |
|
def process_recipe(): |
|
recipe_name = request.form.get("recipe_name").strip() |
|
description = request.form.get("description").strip() |
|
additional_text = request.form.get("additional_text").strip() |
|
servings = request.form.get("servings").strip() |
|
ingredients = request.form.getlist("ingredient[]") |
|
measures = request.form.getlist("measure[]") |
|
amounts = request.form.getlist("amount[]") |
|
preparation = request.form.getlist("preparation[]") |
|
preparation_time = request.form.get("preparation_time") |
|
contains_meat_or_meat_products = request.form.get("contains_meat_or_meatproducts") is not None |
|
contains_fish = request.form.get("contains_fish") is not None |
|
contains_animal_products = request.form.get("contains_animal_products") is not None |
|
source = request.form.get("source").strip() |
|
if recipe_name is None or servings is None \ |
|
or len(ingredients) == 0 or len(amounts) == 0 or len(measures) == 0 \ |
|
or len(ingredients) != len(amounts) != len(measures) \ |
|
or len(preparation) == 0: |
|
# TODO: error |
|
return "error" |
|
amounts, measures, ingredients, preparation = sanitize_lists(amounts, measures, ingredients, preparation) |
|
if len(measures) == 0 or len(amounts) == 0 or len(ingredients) == 0 or len(preparation) == 0: |
|
# TODO: error |
|
return "error after sanitizing" |
|
merged_ingredients = merge_ingredients(amounts, measures, ingredients) |
|
merged_ingredients_json = json.dumps([o.__dict__ for o in merged_ingredients]) |
|
preparation_json = json.dumps(preparation) |
|
db = database.get_db() |
|
# TODO: Injection-safe? |
|
db.execute("""INSERT INTO |
|
recipes(name, description, additional_text, servings, ingredients, preparation, |
|
preparation_time, contains_meat_or_meat_products, contains_fish, |
|
contains_animal_products, source) |
|
VALUES (?,?,?,?,?,?,?,?,?,?,?)""", |
|
(recipe_name, description, additional_text, servings, merged_ingredients_json, |
|
preparation_json, preparation_time, contains_meat_or_meat_products, |
|
contains_fish, contains_animal_products, source)) |
|
db.commit() |
|
database.close_db() |
|
# TODO: change return value |
|
return repr(request.form) |
|
|
|
@app.route('/rezept/<int:id>', methods=['GET']) |
|
def get_recipe(id): |
|
recipe = get_recipe_object_by_id(id) |
|
if recipe is not None: |
|
return render_template("recipe.html", recipe=recipe) |
|
else: |
|
return render_template("error.html", error="Das Rezept existiert (noch) nicht.") |
|
|
|
@app.route('/rezept/<int:id>/bearbeiten', methods=['GET']) |
|
def edit_recipe(id): |
|
pass |
|
|
|
@app.route('/rezept/<int:id>/process_edit', methods=['POST']) |
|
def change_recipe(id): |
|
pass |
|
|
|
return app |
|
|
|
|
|
def sanitize_lists(amounts, measures, ingredients, preparation): |
|
for i in range(len(ingredients)-1, -1, -1): |
|
amounts[i] = amounts[i].strip() |
|
measures[i] = measures[i].strip() |
|
ingredients[i] = ingredients[i].strip() |
|
if amounts[i] == "" and measures[i] == "" and ingredients[i] == "": |
|
del amounts[i] |
|
del measures[i] |
|
del ingredients[i] |
|
for i in range(len(preparation)-1, -1, -1): |
|
preparation[i] = preparation[i].strip() |
|
if preparation[i] == "": |
|
del preparation[i] |
|
return amounts, measures, ingredients, preparation |
|
|
|
|
|
def merge_ingredients(amounts, measures, ingredients): |
|
merged_ingredients = [] |
|
for i in range(len(ingredients)): |
|
merged_ingredients.append(Ingredient(amounts[i], measures[i], ingredients[i])) |
|
return merged_ingredients |
|
|
|
|
|
def get_all_recipes(): |
|
import database |
|
db = database.get_db() |
|
answer = db.execute("SELECT * FROM recipes") |
|
recipes = answer.fetchall() |
|
database.close_db() |
|
return recipes |
|
|
|
|
|
def get_recipe_object_by_id(id): |
|
import database |
|
db = database.get_db() |
|
# TODO: injection safe? |
|
print("trying to query recipe with id: " + str(id)) |
|
answer = db.execute("SELECT * FROM recipes WHERE id=?", (str(id))) |
|
recipe = answer.fetchone() |
|
database.close_db() |
|
if recipe is None: |
|
return None |
|
return Recipe(recipe['name'], |
|
recipe['description'], |
|
recipe['additional_text'], |
|
recipe['servings'], |
|
recipe['ingredients'], |
|
recipe['preparation'], |
|
recipe['preparation_time'], |
|
recipe['upvotes'], |
|
recipe['downvotes'], |
|
recipe['contains_meat_or_meat_products'], |
|
recipe['contains_fish'], |
|
recipe['contains_animal_products'], |
|
recipe['enhancements'], |
|
recipe['source']) |
|
|
|
|
|
if __name__ == '__main__': |
|
redab_app = create_app() |
|
redab_app.run()
|
|
|