Skip to content
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Ignore virtual environment folder
.venv/*
107 changes: 102 additions & 5 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# BEGIN CODE HERE
from flask import Flask
from flask import Flask, request, jsonify
from flask_pymongo import PyMongo
from flask_cors import CORS
from pymongo import TEXT
from numpy import dot
from numpy.linalg import norm
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# END CODE HERE

app = Flask(__name__)
Expand All @@ -15,26 +21,117 @@
@app.route("/search", methods=["GET"])
def search():
# BEGIN CODE HERE
return ""
query = request.args.get("name")
if not query:
return jsonify({"error": "No query provided"}), 400
result = list(mongo.db.products.find({"name": query}).sort("price", -1))

if not result:
return jsonify({"error": "Product not found"}), 404

for product in result:
product["_id"] = str(product["_id"])

return jsonify(result)

# END CODE HERE


@app.route("/add-product", methods=["POST"])
def add_product():
# BEGIN CODE HERE
return ""
data = request.json

def check_price(price):
parts = price.split(".")
if len(parts) != 2:
return False
return parts[0].isnumeric() and parts[1].isnumeric()

if (
not data
or not data["name"].strip()
or not data.get("production_year").isdigit()
or not check_price(data.get("price"))
):
return jsonify({"error": "Wrong JSON data provided"}), 400

# Check valid values for color and size
valid_colors = ["1", "2", "3"]
valid_sizes = ["1", "2", "3", "4"]
if data["color"] not in valid_colors or data["size"] not in valid_sizes:
return jsonify({"error": "Invalid color or size provided"}), 400

existing_product = mongo.db.products.find_one({"name": data["name"]})
if existing_product:
# Ενημέρωση των πεδίων του υπάρχοντος προϊόντος
mongo.db.products.update_one(
{"_id": existing_product["_id"]},
{"$set": data},
)
return jsonify({"message": "Product updated successfully"}), 200

# Προσθήκη νέου προϊόντος στη βάση
mongo.db.products.insert_one(data)

return jsonify({"message": "Product added successfully"}), 201

# END CODE HERE


@app.route("/content-based-filtering", methods=["POST"])
def content_based_filtering():
# BEGIN CODE HERE
return ""
def calculate_similarity(product1, product2):
cosine_similarity = dot(product1, product2) / (norm(product1) * norm(product2))
return cosine_similarity

given_product = request.get_json()
given_product_features = [
given_product.get("production_year"),
given_product.get("price"),
given_product.get("color"),
given_product.get("size"),
]
similar_products = []
all_products = mongo.db.products.find(
{},
{"name": 1, "production_year": 1, "price": 1, "color": 1, "size": 1},
)
for product in all_products:
product_features = [
product["production_year"],
product["price"],
product["color"],
product["size"],
]
similarity = calculate_similarity(given_product_features, product_features)
if similarity > 0.7:
similar_products.append(product["name"])

return jsonify(similar_products)
# END CODE HERE


@app.route("/crawler", methods=["GET"])
def crawler():
# BEGIN CODE HERE
return ""
url = "https:qa.auth.gr/el/x/studyguide/600000438/current"
options = Options()
options.headless = True
driver = webdriver.Chrome(options=options)
semester = request.args.get("semester")
driver.get(url)
print(semester)
section = driver.find_element(By.ID, "exam" + semester)
elements = section.find_elements(By.TAG_NAME, "a")
res = []
for element in elements:
res.append(element.text)
driver.quit()
return jsonify(res)
# END CODE HERE


if __name__ == "__main__":
app.run(debug=True)
98 changes: 98 additions & 0 deletions homepage.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,104 @@
</head>
<body>
<!-- BEGIN CODE HERE -->

<!-- HEADER BEGINS HERE -->
<header class="container-fluid bg-white py-3">
<div class="row align-items-center">
<div class="col p-3">
<img src="logo.png" alt="Logo" height="58px"/>
</div>
<div class="col text-end">
<nav>
<ul class="list-unstyled d-inline">
<li class="d-inline me-3">
<a
href="#"
class="text-light text-decoration-none bg-primary px-3 py-2 rounded"
>Home</a>
</li>
<li class="d-inline">
<a href="products.html" class="text-primary text-decoration-none">
Products</a>
</li>
</ul>
</nav>
</div>
</div>
</header>
<!-- HEADER ENDS HERE -->

<hr class="my-0 pb-4" />

<!-- FRAME-1 BEGINS HERE -->
<div class="container-xxl mb-4">
<div class="row">
<div class="col">
<h2>Heading</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</div>
<div class="col">
<img src="image-1.jpg" alt="Image 1" class="img-fluid">
</div>
</div>
</div>
<!-- FRAME-1 ENDS HERE -->

<!-- FRAME-2 BEGINS HERE-->
<div class="container-xxl text-center mb-4">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-4">
<div class="col">
<p class="container-xxl text-start">&bull; Lorem ipsum</p>
<p class="container-xxl text-start">&bull; Lorem ipsum</p>
<p class="container-xxl text-start">&bull; Lorem ipsum</p>
<p class="container-xxl text-start">&bull; Lorem ipsum</p>
<p class="container-xxl text-start">&bull; Lorem ipsum</p>
<p class="container-xxl text-start">&bull; Lorem ipsum</p>
</div>
<div class="col">
<h2>Heading</h2>
<p style="text-align: start;">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed</p>
</div>
<div class="col">
<img src="image-2.jpg" alt="image-2" height="200px" width="300px" >
<img src="image-3.jpg" alt="image-3" height="200px">
</div>
<div class="col">
<div class="row align-items-end" style="height: 200px;">
<p class="container-xxl text-end">Lorem ipsum dolor</p>
</div>
<div class="row align-items-center" style="height: 200px;">
<p class="container-xxl text-start">Lorem ipsum dolor</p>
</div>
</div>
</div>
</div>
<!--FRAME-2 ENDS HERE-->

<!-- FRAME-3 BEGINS HERE -->
<div class="container-xxl">
<div class="ratio ratio-16x9">
<iframe src=https://www.csd.auth.gr/ title="Informatics AUTh" style="height: 600px; padding-left: 15px;"></iframe>
</div>
</div>
<!-- FRAME-3 ENDS HERE -->
<hr class="my-0" />
<!-- FOOTER BEGINS HERE -->
<footer class="container-fluid py-3 bg-white text-muted text-center">
<div class="row">
<div class="col">Ανδρουλάκη Μαρία Σταυρούλα - 4074</div>
</div>
<div class="row">
<div class="col">Γαλανός Ορφέας - 3497</div>
</div>
<div class="row">
<div class="col">Ροδινός Ελευθέριος - 4146</div>
</div>
<div class="row">
<div class="col">Σελήνης Κωνσταντίνος - 3507</div>
</div>
</footer>
<!-- FOOTER ENDS HERE -->

<!-- END CODE HERE -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script>
Expand Down
12 changes: 11 additions & 1 deletion products.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
/* BEGIN CODE HERE */
header.container-fluid img {
width: 250px;
height: 58px;
}

/* END CODE HERE */
label.form-label {
display: inline-block;
width: 100px;
text-align: left;
}

/* END CODE HERE */
Loading