Parts Implemented by Gamze Akyol

Homemade Foods

Table

Homemade Food table exists in the server.py file.

CREATE TABLE HOMEMADE_FOOD (
             PRODUCT_ID SERIAL PRIMARY KEY REFERENCES PRODUCTS(PRODUCT_ID) ON DELETE CASCADE,
             PIC TEXT,
             QUANTITY TEXT,
             FOOD_KIND VARCHAR(100) NOT NULL,
             PRICE VARCHAR(10),
             DESCRIPTION TEXT
)

PRODUCT_ID attribute references Products table’s PRODUCT_ID attribute.

Class

class HomemadeFood():
      def __init__(self, pic, quantity, food_kind, price, description):
          self.pic = pic
          self.quantity = quantity
          self.food_kind = food_kind
          self.price = price
          self.description = description

Class Operations

Homemade Food’s class operations exists in foods_store.py.

  • The following database operations are implemented for Homemade Food:

    -Add Operation

def add_food(conf, product, foods):
       with dbapi2.connect(conf) as connection:
             cursor = connection.cursor()
             query = """INSERT INTO PRODUCTS (PNAME, PKIND, USER_ID) VALUES (%s, %s, %s)"""
             cursor.execute(query, (product.name, product.kind, product.seller))

            query2 = """SELECT PRODUCT_ID FROM PRODUCTS WHERE PNAME = %s AND PKIND = %s AND USER_ID = %s"""
            cursor.execute(query2, (product.name, product.kind, product.seller))

            for row in cursor:
                product_id = row

            query2 = """INSERT INTO HOMEMADE_FOOD (PRODUCT_ID, PIC, QUANTITY, FOOD_KIND, PRICE, DESCRIPTION)
            VALUES (%s, %s, %s, %s, %s, %s)"""
            cursor.execute(query2, (product_id, foods.pic, foods.quantity, foods.food_kind, foods.price, foods.description))
            connection.commit()

Adds Homemade Food to both Products and Homemade Food table.

-Delete Operation
def delete_food(conf, product_id):
      with dbapi2.connect(conf) as connection:
           cursor = connection.cursor()
           query = "DELETE FROM HOMEMADE_FOOD WHERE (PRODUCT_ID = %s)"
           cursor.execute(query, (product_id,))
           connection.commit()

Deletes the Homemade Food that has the given product_id as parameter.

-Update Operations
def update_food(conf, product_id, new_food):
      with dbapi2.connect(conf) as connection:
           cursor = connection.cursor()
           query = "UPDATE HOMEMADE_FOOD SET PIC = %s, QUANTITY = %s, FOOD_KIND = %s, PRICE = %s, DESCRIPTION = %s
           WHERE (PRODUCT_ID = %s)"
           cursor.execute(query, (new_food.pic, new_food.quantity, new_food.food_kind, new_food.price, new_food.description,                        product_id))
           connection.commit()

Update an attribute of a homemade food.

-Select Operations
def get_food(conf, product_id):
      with dbapi2.connect(conf) as connection:
           cursor = connection.cursor()
           query = "SELECT PIC, QUANTITY, FOOD_KIND, PRICE, DESCRIPTION FROM HOMEMADE_FOOD WHERE PRODUCT_ID = %s"
           cursor.execute(query, (product_id,))
           (pic, quantity, food_kind, price, description) = cursor.fetchone()
           food = HomemadeFood(pic, quantity, food_kind, price, description)
           return food

Selects Homemade Food by product_id.

def get_foods(conf):
    with dbapi2.connect(conf) as connection:
        cursor = connection.cursor()
        query = """SELECT PRODUCTS.PRODUCT_ID, PNAME, PIC, NICKNAME, PRICE FROM PRODUCTS INNER JOIN HOMEMADE_FOOD ON                             PRODUCTS.PRODUCT_ID = HOMEMADE_FOOD.PRODUCT_ID
        INNER JOIN USERS ON PRODUCTS.USER_ID = USERS.USER_ID"""
        cursor.execute(query,)
        foods = cursor.fetchall()
        return foods

Selects all the Homemade Foods.

Templates

homemade_food_edit.html, homemade_foods.html and list_foods.html update_foods.html are the related templates to Homemade Food.

GET/POST Operations

server.py

@app.route('/add_homemade_foods', methods=['GET', 'POST'])
@login_required
def add_homemade_foods():
       if request.method == 'GET':
              return render_template('homemade_food_edit.html')

       seller_id = Store.get_userid(app.config['dsn'], current_user.nickname)

       product = Product(request.form['name'], "homemade_food", seller_id)
       homemade_food = HomemadeFood(request.form['pic'], request.form['quantity'], request.form['food_kind'],                                   request.form['price'], request.form['description'])
       FoodStore.add_food(app.config['dsn'], product, homemade_food)

       return redirect(url_for('home_page'))

@app.route('/list_foods', methods=['GET', 'POST'])
def list_foods():
       if request.method == 'GET':
              homemade_food = FoodStore.get_foods(app.config['dsn'])
              return render_template('list_foods.html', homemade_food = homemade_food)

Homemade food specific functions are given above with GET/POST operations.

Wooden Crafts

Table

Wooden Craft table exists in the server.py file.

CREATE TABLE WOODEN_CRAFT (
                          PRODUCT_ID SERIAL PRIMARY KEY REFERENCES PRODUCTS(PRODUCT_ID) ON DELETE CASCADE,
                          PIC TEXT,
                          CSIZE TEXT,
                          COLOUR CHARACTER(40),
                          CRAFT_KIND VARCHAR(100) NOT NULL,
                          PRICE VARCHAR(10),
                          DESCRIPTION TEXT
                          )

PRODUCT_ID attribute references Products table’s PRODUCT_ID attribute.

Class

class WoodenCraft():
   def __init__(self, pic, size, colour, craft_kind, price, description):
       self.pic = pic
       self.size = size
       self.colour = colour
       self.craft_kind = craft_kind
       self.price = price
       self.description = description

Class Operations

Wooden Craft’s class operations exists in wood_store.py.

  • The following database operations are implemented for Wooden Craft:

    -Add Operation

def add_woodencraft(conf, product, wooden_craft):
    with dbapi2.connect(conf) as connection:
         cursor = connection.cursor()
         query = """INSERT INTO PRODUCTS (PNAME, PKIND, USER_ID) VALUES (%s, %s, %s)"""
         cursor.execute(query, (product.name, product.kind, product.seller))

         query2 = """SELECT PRODUCT_ID FROM PRODUCTS WHERE PNAME = %s AND PKIND = %s AND USER_ID = %s"""
         cursor.execute(query2, (product.name, product.kind, product.seller))

         for row in cursor:
             product_id = row

         query2 = """INSERT INTO WOODEN_CRAFT (PRODUCT_ID, PIC, CSIZE, COLOUR, CRAFT_KIND, PRICE, DESCRIPTION) VALUES (%s, %s,                    %s, %s, %s, %s, %s)"""
         cursor.execute(query2, (product_id, wooden_craft.pic, wooden_craft.size, wooden_craft.colour,                                            wooden_craft.craft_kind, wooden_craft.price, wooden_craft.description))
         connection.commit()

Adds Wooden Craft to both Products and Wooden Craft table.

-Delete Operation
def delete_woodencraft(conf, product_id):
   with dbapi2.connect(conf) as connection:
        cursor = connection.cursor()
        query = "DELETE FROM WOODEN_CRAFT WHERE (PRODUCT_ID = %s)"
        cursor.execute(query, (product_id,))
        connection.commit()

Deletes the Wooden Craft that has the given product_id as parameter.

-Update Operations
def update_woodencraft(conf, product_id, new_craft):
    with dbapi2.connect(conf) as connection:
        cursor = connection.cursor()
        query = "UPDATE WOODEN_CRAFT SET PIC = %s, CSIZE = %s, COLOUR = %s, CRAFT_KIND = %s, PRICE = %s, DESCRIPTION = %s WHERE                (PRODUCT_ID = %s)"
        cursor.execute(query, (new_craft.pic, new_craft.size, new_craft.colour, new_craft.craft_kind, new_craft.price,                           new_craft.description, product_id))
        connection.commit()

Update an attribute of a Wooden Craft.

-Select Operations
def get_woodencraft(conf, product_id):
       with dbapi2.connect(conf) as connection:
            cursor = connection.cursor()
            query = "SELECT PIC, CSIZE, COLOUR, CRAFT_KIND, PRICE, DESCRIPTION FROM WOODEN_CRAFT WHERE PRODUCT_ID = %s"
            cursor.execute(query, (product_id,))
            (pic, size, colour, craft_kind, price, description) = cursor.fetchone()
            craft = WoodenCraft(pic, size, colour, craft_kind, price, description)
            return craft

Selects Wooden Craft by product_id.

def get_woodencrafts(conf):
    with dbapi2.connect(conf) as connection:
        cursor = connection.cursor()
        query = """SELECT PRODUCTS.PRODUCT_ID, PNAME, PIC, NICKNAME, PRICE FROM PRODUCTS INNER JOIN WOODEN_CRAFT ON                             PRODUCTS.PRODUCT_ID = WOODEN_CRAFT.PRODUCT_ID
        INNER JOIN USERS ON PRODUCTS.USER_ID = USERS.USER_ID"""
        cursor.execute(query, )
        crafts = cursor.fetchall()
    return crafts

Selects all the Wooden Crafts.

Templates

add_woodencraft.html, wooden_crafts.html and list_wooden_crafts.html update_craft.html are the related templates to Wooden Craft.

GET/POST Operations

server.py

@app.route('/add_wooden_crafts', methods=['GET', 'POST'])
@login_required
def add_wooden_crafts():
       if request.method == 'GET':
              return render_template('add_woodencraft.html')

       seller_id = Store.get_userid(app.config['dsn'], current_user.nickname)

       product = Product(request.form['name'], "wooden_craft", seller_id)
       wooden_craft = WoodenCraft(request.form['pic'], request.form['size'], request.form['colour'], request.form['craft_kind'],               request.form['price'], request.form['description'])
       WoodStore.add_woodencraft(app.config['dsn'], product, wooden_craft)

       return redirect(url_for('home_page'))

@app.route('/list_wooden_crafts', methods=['GET', 'POST'])
def list_wooden_crafts():
    if request.method == 'GET':
        wooden_craft = WoodStore.get_woodencrafts(app.config['dsn'])
        return render_template('list_wooden_crafts.html', wooden_craft = wooden_craft)

Wooden craft specific functions are given above with GET/POST operations.

Accessories

Accesories table’s operations are similar to the previous operations.