Files
CS361-Portfolio-Project/main.py
2023-10-12 20:54:02 -07:00

141 lines
3.9 KiB
Python

"""
Portfolio Project for CS361 Spring 2022
Written by Lucas Jensen
Last updated 10-12-2023 for deployment
"""
from flask import Flask, redirect, render_template, request, send_file
from recipe import Recipe, RecipeBook
from time import sleep
import subprocess
import os
app = Flask(__name__)
book = RecipeBook()
@app.route("/")
def home():
return render_template("index.html")
@app.route("/recipes", methods=["GET"])
def recipes_page():
recipes = book.get_recipes()
# recipes is a dictionary of recipe objects
if recipes == {}:
return render_template("empty.html")
return render_template("recipes.html", content=recipes)
@app.route("/recipes/<_id>/email", methods=["GET", "POST"])
def email_page(_id):
recipe = book.find_by_id(str(_id))
if request.method == "POST":
addr = request.form.get("email")
subject = recipe.get_name()
message = f"{subject}; " f"Num loaves: {recipe.get_num_loaves()};"
ingredients = recipe.get_ingredients()
for item in ingredients:
message += f" {item}: {ingredients[item]} grams;"
body = f"$to == {addr}\n" f"$subject == {subject}\n" f"$message == {message}"
with open("mail.txt", "wt") as txt_file:
txt_file.write(body)
subprocess.call(["python", "mailer.py"])
return redirect("/recipes")
return render_template("email.html", content=recipe)
@app.route("/recipes/<_id>", methods=["GET", "POST"])
def recipe_page(_id):
recipe = book.find_by_id(_id)
if request.method == "POST":
# user wants to scale their recipe
if "scale" in request.form:
scale = request.form.get("scale")
new = recipe.scale(scale)
new_id = book.add_recipe(new)
return redirect(f"/recipes/{new_id}")
elif "photo" in request.files:
# user wants to add a photo
f = request.files["photo"]
f.save(os.path.join("static", f"image_{_id}.jpg"))
# return "Success"
elif "convert" in request.form:
# user wants to convert to sourdough
new_recipe = recipe.convert()
book.add_recipe(new_recipe)
return redirect("/recipes")
else:
# user wants to download a pdf
path = write_txt(_id)
sleep(0.5)
return send_file(path, as_attachment=True)
# find all associated images
recipe_photos = []
all_photos = os.listdir("static")
for photo in all_photos:
if "jpg" in photo:
if get_num(photo) == int(_id):
recipe_photos.append(photo)
return render_template("recipe.html", content=recipe, _id=_id, photos=recipe_photos)
def get_num(path: str) -> int:
"""
:param path: must be formatted: "image_XXX.jpg" where XXX is the id of the
recipe with any number of digits
:return: integer of the found id number
"""
num = ""
for i in range(6, len(path)):
if path[i] == ".":
break
num += path[i]
return int(num)
def write_txt(_id):
"""
writes to the txt file to have the microservice make a selected pdf
:return:
"""
print(_id)
with open("recipe.txt", "w") as txt_file:
txt_file.write(_id)
return f"recipe{_id}.pdf"
@app.route("/recipes/<_id>/delete")
def delete_recipe(_id):
book.find_and_delete(_id)
return redirect("/recipes")
@app.route("/add", methods=["GET", "POST"])
def add_recipe():
if request.method == "POST":
new_recipe = Recipe(request.form.get("name"), request.form.get("yield"))
for item in request.form:
if item not in ["name", "yield"]:
new_recipe.add_ingredient(item, int(request.form.get(item)))
book.add_recipe(new_recipe)
return redirect("/recipes")
return render_template("new.html")
if __name__ == "__main__":
app.run(debug=False, port=5001)