Fixed all pep8 warnings
This commit is contained in:
		
							
								
								
									
										2
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								app.py
									
									
									
									
									
								
							@@ -14,7 +14,7 @@ def main():
 | 
			
		||||
 | 
			
		||||
    # Set app secret key to sign session cookies
 | 
			
		||||
    secret_key = environ.get("APPSECRET")
 | 
			
		||||
    if secret_key == None:
 | 
			
		||||
    if secret_key is None:
 | 
			
		||||
        # NO Secret Key set!
 | 
			
		||||
        print("No app secret set, please set one before deploying in production")
 | 
			
		||||
        app.secret_key = "DEFAULTKEY"
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ class CategoryController(DatabaseController):
 | 
			
		||||
        )
 | 
			
		||||
        row = cursor.fetchone()
 | 
			
		||||
 | 
			
		||||
        if row == None:
 | 
			
		||||
        if row is None:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        params = dict(zip(self.FIELDS, row))
 | 
			
		||||
@@ -44,7 +44,7 @@ class CategoryController(DatabaseController):
 | 
			
		||||
        )
 | 
			
		||||
        rows = cursor.fetchall()
 | 
			
		||||
 | 
			
		||||
        if rows == None:
 | 
			
		||||
        if rows is None:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        categories = list()
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,8 @@ class DatabaseController(ABC):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self._conn = None
 | 
			
		||||
        try:
 | 
			
		||||
            # Creates a connection and specifies a flag to parse all types back down into
 | 
			
		||||
            # Python declared types e.g. date & time
 | 
			
		||||
            # Creates a connection and specifies a flag to parse all types
 | 
			
		||||
            # back down into Python declared types e.g. date & time
 | 
			
		||||
            self._conn = sqlite3.connect(
 | 
			
		||||
                self.__sqlitefile, detect_types=sqlite3.PARSE_DECLTYPES)
 | 
			
		||||
        except sqlite3.Error as e:
 | 
			
		||||
@@ -28,10 +28,10 @@ class DatabaseController(ABC):
 | 
			
		||||
            print(e)
 | 
			
		||||
 | 
			
		||||
    def __del__(self):
 | 
			
		||||
        if self._conn != None:
 | 
			
		||||
        if self._conn is not None:
 | 
			
		||||
            self._conn.close()
 | 
			
		||||
 | 
			
		||||
    """ Takes a dictionary of fields and returns the object 
 | 
			
		||||
    """ Takes a dictionary of fields and returns the object
 | 
			
		||||
        with those fields populated """
 | 
			
		||||
 | 
			
		||||
    def new_instance(self, of: type, with_fields: Mapping[str, Any]):
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,11 @@ class ProductController(DatabaseController):
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        self._conn.execute(
 | 
			
		||||
            "INSERT INTO Products (name, image, description, cost, categoryID, sellerID, postedDate, quantityAvailable) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
 | 
			
		||||
            """
 | 
			
		||||
            INSERT INTO Products
 | 
			
		||||
            (name, image, description, cost, categoryID,
 | 
			
		||||
            sellerID, postedDate, quantityAvailable)
 | 
			
		||||
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)""",
 | 
			
		||||
            params
 | 
			
		||||
        )
 | 
			
		||||
        self._conn.commit()
 | 
			
		||||
@@ -38,7 +42,7 @@ class ProductController(DatabaseController):
 | 
			
		||||
        )
 | 
			
		||||
        rows = cursor.fetchmany()
 | 
			
		||||
 | 
			
		||||
        if rows == None:
 | 
			
		||||
        if rows is None:
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        products = list()
 | 
			
		||||
@@ -51,16 +55,17 @@ class ProductController(DatabaseController):
 | 
			
		||||
 | 
			
		||||
        return products
 | 
			
		||||
 | 
			
		||||
    def read_all(self, category: str = "", search_term: str = "") -> list[Product] | None:
 | 
			
		||||
    def read_all(self, category: str = "",
 | 
			
		||||
                 search_term: str = "") -> list[Product] | None:
 | 
			
		||||
        params = [
 | 
			
		||||
            "%" + category + "%",
 | 
			
		||||
            "%" + search_term + "%"
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        cursor = self._conn.execute(
 | 
			
		||||
            """SELECT * FROM Products 
 | 
			
		||||
            INNER JOIN Categories ON Products.categoryID = Categories.id 
 | 
			
		||||
            WHERE Categories.name LIKE ? 
 | 
			
		||||
            """SELECT * FROM Products
 | 
			
		||||
            INNER JOIN Categories ON Products.categoryID = Categories.id
 | 
			
		||||
            WHERE Categories.name LIKE ?
 | 
			
		||||
            AND Products.name LIKE ?
 | 
			
		||||
            """,
 | 
			
		||||
            params
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,9 @@ class UserController(DatabaseController):
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        self._conn.execute(
 | 
			
		||||
            "INSERT INTO Users (username, password, first_name, last_name, email, phone, role) VALUES (?, ?, ?, ?, ?, ?, ?)",
 | 
			
		||||
            """INSERT INTO Users
 | 
			
		||||
            (username, password, first_name, last_name, email, phone, role)
 | 
			
		||||
            VALUES (?, ?, ?, ?, ?, ?, ?)""",
 | 
			
		||||
            params
 | 
			
		||||
        )
 | 
			
		||||
        self._conn.commit()
 | 
			
		||||
@@ -39,7 +41,7 @@ class UserController(DatabaseController):
 | 
			
		||||
        )
 | 
			
		||||
        row = cursor.fetchone()
 | 
			
		||||
 | 
			
		||||
        if row != None:
 | 
			
		||||
        if row is not None:
 | 
			
		||||
            params = dict(zip(self.FIELDS, row))
 | 
			
		||||
 | 
			
		||||
            # Is user a seller
 | 
			
		||||
@@ -63,7 +65,7 @@ class UserController(DatabaseController):
 | 
			
		||||
        )
 | 
			
		||||
        row = cursor.fetchone()
 | 
			
		||||
 | 
			
		||||
        if row != None:
 | 
			
		||||
        if row is not None:
 | 
			
		||||
            params = dict(zip(self.FIELDS, row))
 | 
			
		||||
 | 
			
		||||
            # Is user a seller
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ blueprint.register_blueprint(user.blueprint)
 | 
			
		||||
blueprint.register_blueprint(product.blueprint)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### CONTEXTS ###
 | 
			
		||||
# CONTEXTS #
 | 
			
		||||
 | 
			
		||||
# Function that returns a given user class based on the ID in the session
 | 
			
		||||
@blueprint.context_processor
 | 
			
		||||
@@ -21,7 +21,7 @@ def get_user() -> dict[User | None]:
 | 
			
		||||
    user_id = session.get('user_id')
 | 
			
		||||
    user = None
 | 
			
		||||
 | 
			
		||||
    if user_id != None:
 | 
			
		||||
    if user_id is not None:
 | 
			
		||||
        db = UserController()
 | 
			
		||||
        user = db.read_id(user_id)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,10 +42,13 @@ def index():
 | 
			
		||||
    products = database.read_all()
 | 
			
		||||
 | 
			
		||||
    # No Products visible
 | 
			
		||||
    if products == None:
 | 
			
		||||
    if products is None:
 | 
			
		||||
        flash("No Products available")
 | 
			
		||||
 | 
			
		||||
    return render_template('index.html', content="content.html", products=products)
 | 
			
		||||
    return render_template('index.html',
 | 
			
		||||
                           content="content.html",
 | 
			
		||||
                           products=products
 | 
			
		||||
                           )
 | 
			
		||||
 | 
			
		||||
# Loads a given product category page
 | 
			
		||||
 | 
			
		||||
@@ -56,17 +59,21 @@ def category(category: str):
 | 
			
		||||
 | 
			
		||||
    # Check to see if there is a custome search term
 | 
			
		||||
    search_term = request.args.get("search", type=str)
 | 
			
		||||
    if search_term != None:
 | 
			
		||||
    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 == None:
 | 
			
		||||
    if products is None:
 | 
			
		||||
        flash(f"No Products available in {category}")
 | 
			
		||||
 | 
			
		||||
    return render_template('index.html', content="content.html", products=products, category=category)
 | 
			
		||||
    return render_template('index.html',
 | 
			
		||||
                           content="content.html",
 | 
			
		||||
                           products=products,
 | 
			
		||||
                           category=category
 | 
			
		||||
                           )
 | 
			
		||||
 | 
			
		||||
# Loads a given product based on ID
 | 
			
		||||
 | 
			
		||||
@@ -82,13 +89,13 @@ def display_add_product():
 | 
			
		||||
    user_id = session.get('user_id')
 | 
			
		||||
 | 
			
		||||
    # User must be logged in to view this page
 | 
			
		||||
    if user_id == None:
 | 
			
		||||
    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 == None or user.role != "Seller":
 | 
			
		||||
    if user is None or user.role != "Seller":
 | 
			
		||||
        flash("You must be logged in as a Seller to view this page")
 | 
			
		||||
        return redirect('/')
 | 
			
		||||
 | 
			
		||||
@@ -101,20 +108,20 @@ def add_product():
 | 
			
		||||
    user_id = session.get('user_id')
 | 
			
		||||
 | 
			
		||||
    # User must be logged in to view this page
 | 
			
		||||
    if user_id == None:
 | 
			
		||||
    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 == None or user.role != "Seller":
 | 
			
		||||
    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 == None or not allowed_file(file.filename):
 | 
			
		||||
    if file is None or not allowed_file(file.filename):
 | 
			
		||||
        flash("Invalid File Uploaded")
 | 
			
		||||
        return redirect("/add")
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ def login():
 | 
			
		||||
    error = None
 | 
			
		||||
 | 
			
		||||
    # No user found
 | 
			
		||||
    if user == None:
 | 
			
		||||
    if user is None:
 | 
			
		||||
        error = "No user found with the username " + request.form['username']
 | 
			
		||||
        flash(error)
 | 
			
		||||
        return redirect("/login")
 | 
			
		||||
@@ -57,7 +57,7 @@ def signup():
 | 
			
		||||
    database = UserController()
 | 
			
		||||
 | 
			
		||||
    # User already exists
 | 
			
		||||
    if database.read(request.form['username']) != None:
 | 
			
		||||
    if database.read(request.form['username']) is not None:
 | 
			
		||||
        error = "User, " + request.form['username'] + " already exists"
 | 
			
		||||
        flash(error)
 | 
			
		||||
        return redirect("/signup")
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,10 @@ class Product:
 | 
			
		||||
        No additional properties are assigned to the customer
 | 
			
		||||
    '''
 | 
			
		||||
 | 
			
		||||
    def __init__(self, name: str, image: str, description: str, cost: float, category: int,
 | 
			
		||||
                 seller_id: int, posted_date: datetime, quantity_available: int):
 | 
			
		||||
    def __init__(self, name: str, image: str, description: str,
 | 
			
		||||
                 cost: float, category: int, seller_id: int,
 | 
			
		||||
                 posted_date: datetime, quantity_available: int
 | 
			
		||||
                 ):
 | 
			
		||||
        self.id = 0
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.image = image
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,14 @@ from abc import ABC
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class User(ABC):
 | 
			
		||||
    """ Functional Class constructor to initialise all properties in the base object
 | 
			
		||||
        with a value """
 | 
			
		||||
    """ Functional Class constructor to initialise all properties in
 | 
			
		||||
        the base object with a value
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, username: str, password: str, firstname: str,
 | 
			
		||||
                 lastname: str, email: str, phone: str, role: str):
 | 
			
		||||
    def __init__(self, username: str, password: str,
 | 
			
		||||
                 firstname: str, lastname: str,
 | 
			
		||||
                 email: str, phone: str, role: str
 | 
			
		||||
                 ):
 | 
			
		||||
        self.id = 0
 | 
			
		||||
        self.username = username
 | 
			
		||||
        self.password = password
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/products.css') }}">
 | 
			
		||||
 | 
			
		||||
<div class="product-container">
 | 
			
		||||
    {% if products != None %}
 | 
			
		||||
    {% if products is not None %}
 | 
			
		||||
        {% for product in products %}
 | 
			
		||||
            <a href="/products/{{product.id}}" class="product product-link">
 | 
			
		||||
                <div class="product-title">{{product.name}}</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
            <input type="text" name="search" placeholder="Find your favourite products" class="search-bar">
 | 
			
		||||
            <input type="submit" class="search-button">
 | 
			
		||||
        </form>
 | 
			
		||||
        {% if user != None: %}
 | 
			
		||||
        {% if user is not None: %}
 | 
			
		||||
            <a href="/logout">Welcome, {{ user.username }}</a>
 | 
			
		||||
        {% else %}
 | 
			
		||||
            <a href="/login">Login/Signup</a>
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
    </nav>
 | 
			
		||||
    
 | 
			
		||||
    <centre>
 | 
			
		||||
        {% if user != None and user.role == "Seller" %}
 | 
			
		||||
        {% if user is not None and user.role == "Seller" %}
 | 
			
		||||
            <div class="categories">
 | 
			
		||||
                {# List all available seller tools #}
 | 
			
		||||
                <a href="/products/add" class="category">Create Products</a>
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,8 @@ def test_create_product():
 | 
			
		||||
    db = ProductController()
 | 
			
		||||
    db.create(product)
 | 
			
		||||
 | 
			
		||||
# Tests the database maintains integrity when we try and add a product with the same details
 | 
			
		||||
# Tests the database maintains integrity when we try
 | 
			
		||||
# and add a product with the same details
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.skip
 | 
			
		||||
@@ -40,7 +41,7 @@ def test_search_category():
 | 
			
		||||
    # Check each category for correct amount of test products
 | 
			
		||||
    assert len(db.read_all("Car Parts")) == 9 + 1  # Added in previous test
 | 
			
		||||
    assert len(db.read_all("Books")) == 9
 | 
			
		||||
    assert db.read_all("Phones") == None
 | 
			
		||||
    assert db.read_all("Phones") is None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Tests that products can be refined by search term
 | 
			
		||||
@@ -51,7 +52,7 @@ def test_search_term():
 | 
			
		||||
    assert len(db.read_all(search_term="test")) == 33
 | 
			
		||||
    assert len(db.read_all("Car Parts", "test")) == 9
 | 
			
		||||
    assert len(db.read_all(search_term="product")) == 1
 | 
			
		||||
    assert db.read_all(search_term="not_test") == None
 | 
			
		||||
    assert db.read_all(search_term="not_test") is None
 | 
			
		||||
 | 
			
		||||
# Test we the same product details get returned from the database
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,8 @@ def test_create_user():
 | 
			
		||||
    db = UserController()
 | 
			
		||||
    db.create(customer)
 | 
			
		||||
 | 
			
		||||
# Tests the database maintains integrity when we try and add a user with the same details
 | 
			
		||||
# Tests the database maintains integrity when we try
 | 
			
		||||
# and add a user with the same details
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_duplicate_user():
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user