from flask import Blueprint from flask import render_template, session, flash, request, redirect from models.products.product import Product from controllers.database.product import ProductController from controllers.database.category import CategoryController from controllers.database.user import UserController from datetime import datetime from werkzeug.utils import secure_filename import os import uuid import pathlib ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS blueprint = Blueprint("products", __name__, url_prefix="/products") # Global context to enable the categories to be accessed # from any view @blueprint.context_processor def category_list(): database = CategoryController() categories = database.read_all() return dict(categories=categories) # Loads the front product page @blueprint.route('/') def index(): database = ProductController() products = database.read_all() # No Products visible if products is None: flash("No Products available") return render_template('index.html', content="content.html", products=products ) # Loads a given product category page @blueprint.route('/') def category(category: str): database = ProductController() # Check to see if there is a custome search term search_term = request.args.get("search", type=str) if search_term is not None: print(f"Search Term {search_term}") products = database.read_all(category, search_term) else: products = database.read_all(category) # No Products visible if products is None: flash(f"No Products available in {category}") return render_template('index.html', content="content.html", products=products, category=category ) # Loads a given product based on ID @blueprint.route('/') def id(id: int): return "ID: " + str(id) # Launches the page to add a new product to the site @blueprint.route('/add') def display_add_product(): user_id = session.get('user_id') # User must be logged in to view this page if user_id is None: flash("Please Login to view this page") return redirect('/login') db = UserController() user = db.read_id(user_id) if user is None or user.role != "Seller": flash("You must be logged in as a Seller to view this page") return redirect('/') return render_template('index.html', content='new_product.html') # Processes a request to add a new product to the site @blueprint.post('/add') def add_product(): user_id = session.get('user_id') # User must be logged in to view this page if user_id is None: flash("Please Login to view this page") return redirect('/login', code=302) db = UserController() user = db.read_id(user_id) if user is None or user.role != "Seller": flash("You must be logged in as a Seller to perform this action") return redirect('/', code=302) file = request.files.get('image') # Ensure that the correct file type is uploaded if file is None or not allowed_file(file.filename): flash("Invalid File Uploaded") return redirect("/add") # Create the product object and push to database filename = str(uuid.uuid4()) + pathlib.Path(file.filename).suffix file.save(os.path.join('static/assets/img/products/', filename)) product = Product( request.form.get('name'), filename, request.form.get('description'), request.form.get('cost'), request.form.get('category'), user.id, datetime.now(), request.form.get('quantity') ) db = ProductController() db.create(product) return render_template('index.html', content='new_product.html')