diff --git a/app.py b/app.py index 52671c4..1edbc3c 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,6 @@ from flask import Flask from os import environ -from controllers.web import blueprint +from controllers.web.endpoints import blueprint ''' Main entrypoint for Flask application. diff --git a/controllers/database/product.py b/controllers/database/product.py new file mode 100644 index 0000000..aa714f4 --- /dev/null +++ b/controllers/database/product.py @@ -0,0 +1,79 @@ +from .database import DatabaseController +from models.products.product import Product + +class ProductController(DatabaseController): + FIELDS = ['id', 'name', 'image', 'description', 'cost', 'category', 'sellerID', 'postedDate', 'quantity'] + + def __init__(self): + super().__init__() + + def create(self, product: Product): + params = [ + product.name, + product.image, + product.description, + product.cost, + product.category, + product.sellerID, + product.postedDate, + product.quantityAvailable + ] + + self._conn.execute( + "INSERT INTO Products (name, cost, image, description, category, sellerID, postedDate, quantityAvailable) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", + params + ) + self._conn.commit() + + + def read(self, name: str = "") -> list[Product] | None: + params = [ + "%" + name + "%" + ] + + cursor = self._conn.execute( + "SELECT * FROM Products WHERE name like ?", + params + ) + rows = cursor.fetchmany() + + if rows == None: + return None + + products = list() + + # Create an object for each row + for product in rows: + params = dict(zip(self.FIELDS, product)) + obj = self.new_instance(Product, params) + print(obj.__dict__) + products.push(obj) + + return products + + + def read_all(self) -> list[Product] | None: + cursor = self._conn.execute( + "SELECT * FROM Products", + ) + rows = cursor.fetchall() + + if len(rows) == 0: + return None + + products = list() + + # Create an object for each row + for product in rows: + params = dict(zip(self.FIELDS, product)) + obj = self.new_instance(Product, params) + print(obj.__dict__) + products.append(obj) + + return products + + def update(self): + print("Doing work") + + def delete(self): + print("Doing work") \ No newline at end of file diff --git a/controllers/web/__init__.py b/controllers/web/__init__.py index a842805..e69de29 100644 --- a/controllers/web/__init__.py +++ b/controllers/web/__init__.py @@ -1,5 +0,0 @@ -from flask import Blueprint - -blueprint = Blueprint('endpoints', __name__) - -from . import endpoints \ No newline at end of file diff --git a/controllers/web/endpoints.py b/controllers/web/endpoints.py index ff3f740..0294af1 100644 --- a/controllers/web/endpoints.py +++ b/controllers/web/endpoints.py @@ -1,81 +1,15 @@ -from . import blueprint -from flask import render_template, redirect, request, session, flash -from controllers.database.user import UserController -from models.users.customer import Customer -from hashlib import sha512 +from flask import redirect +from flask import Blueprint +from . import user +from . import product + +blueprint = Blueprint('main', __name__) + +blueprint.register_blueprint(user.blueprint) +blueprint.register_blueprint(product.blueprint) # Function responsible for displaying the main landing page of the site @blueprint.route('/') -def welcome_page(): - return render_template('index.html', content="content.html", user = session.get('user')) - - - -### LOGIN FUNCTIONALITY -# Function responsible for delivering the Login page for the site -@blueprint.route('/login') -def display_login(): - return render_template('index.html', content="login.html", user = session.get('user')) - -# Function responsible for handling logins to the site -@blueprint.post('/login') -def login(): - database = UserController() - user = database.read(request.form['username']) - error = None - - # No user found - if user == None: - error = "No user found with the username " + request.form['username'] - flash(error) - return redirect("/login") - - # Incorrect Password - if sha512(request.form['password'].encode()).hexdigest() != user.password: - error = "Incorrect Password" - flash(error) - return redirect("/login") - - session['user'] = user.username - return redirect("/") - - -### SIGNUP FUNCTIONALITY -# Function responsible for delivering the Signup page for the site -@blueprint.route('/signup') -def display_signup(): - return render_template('index.html', content="signup.html", user = session.get('user')) - -# Function responsible for handling signups to the site -@blueprint.post('/signup') -def signup(): - database = UserController() - - # User already exists - if database.read(request.form['username']) != None: - error = "User, " + request.form['username'] + " already exists" - flash(error) - return redirect("/signup") - - database.create(Customer( - 0, - request.form['username'], - sha512(request.form['password'].encode()).hexdigest(), # Hashed as soon as it is recieved on the backend - request.form['firstname'], - request.form['lastname'], - request.form['email'], - "123", - "Customer" - )) - - # Code 307 Preserves the original request (POST) - return redirect("/login", code=307) - - -### SIGN OUT FUNCTIONALITY -# Function responsible for handling logouts from the site -@blueprint.route('/logout') -def logout(): - session.pop('user') - return redirect("/") \ No newline at end of file +def index(): + return redirect("/products") diff --git a/controllers/web/product.py b/controllers/web/product.py new file mode 100644 index 0000000..3b1f092 --- /dev/null +++ b/controllers/web/product.py @@ -0,0 +1,17 @@ +from flask import Blueprint + +from flask import render_template, redirect, request, session, flash +from controllers.database.product import ProductController + +blueprint = Blueprint("products", __name__, url_prefix="/products") + +@blueprint.route('/') +def index(): + database = ProductController() + products = database.read_all() + + # No Products visible + if products == None: + flash("No Products available") + + return render_template('index.html', content="content.html", user = session.get('user'), products = products) \ No newline at end of file diff --git a/controllers/web/user.py b/controllers/web/user.py new file mode 100644 index 0000000..0c5458e --- /dev/null +++ b/controllers/web/user.py @@ -0,0 +1,77 @@ +from flask import Blueprint + +from flask import render_template, redirect, request, session, flash +from controllers.database.user import UserController +from models.users.customer import Customer +from hashlib import sha512 + +# Blueprint to append user endpoints to +blueprint = Blueprint("users", __name__) + +### LOGIN FUNCTIONALITY +# Function responsible for delivering the Login page for the site +@blueprint.route('/login') +def display_login(): + return render_template('index.html', content="login.html", user = session.get('user')) + +# Function responsible for handling logins to the site +@blueprint.post('/login') +def login(): + database = UserController() + user = database.read(request.form['username']) + error = None + + # No user found + if user == None: + error = "No user found with the username " + request.form['username'] + flash(error) + return redirect("/login") + + # Incorrect Password + if sha512(request.form['password'].encode()).hexdigest() != user.password: + error = "Incorrect Password" + flash(error) + return redirect("/login") + + session['user'] = user.username + return redirect("/") + + +### SIGNUP FUNCTIONALITY +# Function responsible for delivering the Signup page for the site +@blueprint.route('/signup') +def display_signup(): + return render_template('index.html', content="signup.html", user = session.get('user')) + +# Function responsible for handling signups to the site +@blueprint.post('/signup') +def signup(): + database = UserController() + + # User already exists + if database.read(request.form['username']) != None: + error = "User, " + request.form['username'] + " already exists" + flash(error) + return redirect("/signup") + + database.create(Customer( + 0, + request.form['username'], + sha512(request.form['password'].encode()).hexdigest(), # Hashed as soon as it is recieved on the backend + request.form['firstname'], + request.form['lastname'], + request.form['email'], + "123", + "Customer" + )) + + # Code 307 Preserves the original request (POST) + return redirect("/login", code=307) + + +### SIGN OUT FUNCTIONALITY +# Function responsible for handling logouts from the site +@blueprint.route('/logout') +def logout(): + session.pop('user') + return redirect("/") \ No newline at end of file diff --git a/models/products/product.py b/models/products/product.py index 1232618..34aaea8 100644 --- a/models/products/product.py +++ b/models/products/product.py @@ -1,22 +1,17 @@ -from abc import ABC from datetime import datetime -class Product(ABC): +class Product: ''' Base class for a product ''' def __init__(self): - self.productID = 0 + self.id = 0 self.name = "" + self.image = "/static/assets/wmgzon.png" + self.description = "" self.cost = 0.0 self.category = "" self.sellerID = 0 self.postedDate = datetime.now() self.quantityAvailable = 0 - - def addToBasket(): - pass - - def buyProduct(): - pass - \ No newline at end of file + \ No newline at end of file diff --git a/scripts/create_tables.sql b/scripts/create_tables.sql index efe7afc..8200b6b 100644 --- a/scripts/create_tables.sql +++ b/scripts/create_tables.sql @@ -9,11 +9,13 @@ CREATE TABLE IF NOT EXISTS Users ( role TEXT NOT NULL ); --- INSERT INTO Users (first_name, last_name, email, phone, password) VALUES ("Luke", "Else", "test@test.com", "07498 289321", "test213"); +INSERT INTO Users (first_name, last_name, username, email, phone, password, role) VALUES ("Luke", "Else", "lukejelse04", "test@test.com", "07498 289321", "test213", "Customer"); CREATE TABLE IF NOT EXISTS Products ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, + image TEXT NOT NULL, + description TEXT NOT NULL, cost DECIMAL NOT NULL, sellerID INTEGER NOT NULL REFERENCES Users (id) @@ -22,6 +24,17 @@ CREATE TABLE IF NOT EXISTS Products ( category TEXT NOT NULL ); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); +INSERT INTO Products (name, image, description, cost, sellerID, category) VALUES ("test", "assets/img/wmgzon.png", "this is a product", 20.99, 1, "CarParts"); CREATE TABLE IF NOT EXISTS Orders ( id INTEGER PRIMARY KEY, diff --git a/templates/car_parts.html b/templates/car_parts.html new file mode 100644 index 0000000..f57a6ca --- /dev/null +++ b/templates/car_parts.html @@ -0,0 +1,39 @@ + +
+
+
+ + + + + + +
+ + +
+
+ +
+ {% if products != None %} + {% for product in products %} +
+
{{product.name}}
+
+
+ Brake Disks +
+
+
£{{product.cost}}
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+
+
+
+
+ {% endfor %} + {% endif %} +
diff --git a/templates/content.html b/templates/content.html index ba908cd..5fd24d3 100644 --- a/templates/content.html +++ b/templates/content.html @@ -1,63 +1,19 @@ - -
-
-
- - - - - - -
- - -
-
-
-
-
12" Brake Disks
-
-
- Brake Disks -
-
-
£64.50
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
-
+ {% if products != None %} + {% for product in products %} +
+
{{product.name}}
+
+
+ Brake Disks +
+
+
£{{product.cost}}
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
+
+
+
-
-
- -
-
12" Brake Disks
-
-
- Brake Disks -
-
-
£64.50
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
-
-
-
-
- -
-
12" Brake Disks
-
-
- Brake Disks -
-
-
£64.50
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
-
-
-
-
+ {% endfor %} + {% endif %}
diff --git a/templates/header.html b/templates/header.html index 0558afe..624d63f 100644 --- a/templates/header.html +++ b/templates/header.html @@ -5,9 +5,9 @@ {% if user != None: %} - Welcome, {{ user }} + Welcome, {{ user }} {% else %} - Login/Signup + Login/Signup {% endif %}