83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
""" The user controller to manage all of the stats related endpoints
|
|
in the web app
|
|
"""
|
|
from flask import Blueprint
|
|
from flask import render_template, request, flash, session, redirect, url_for
|
|
from controllers.database.stats import StatsController
|
|
from controllers.database.product import ProductController
|
|
from controllers.database.category import CategoryController
|
|
from controllers.web.product import is_role
|
|
|
|
from datetime import datetime
|
|
import random
|
|
|
|
# Blueprint to append user endpoints to
|
|
blueprint = Blueprint("stats", __name__, url_prefix='/stats')
|
|
|
|
|
|
@blueprint.route('/')
|
|
def index():
|
|
""" Main page to view all of the statistics for the site """
|
|
db = StatsController()
|
|
data = db.read()
|
|
test = list(map(lambda d: d.productID, data))
|
|
return render_template("index.html", content="stats.html", data=test)
|
|
|
|
|
|
@blueprint.route('/products/<int:id>')
|
|
def view_product_stats(id: int):
|
|
""" Page to view statistics for a given product """
|
|
# Check user is seller
|
|
if not is_role("Seller"):
|
|
flash("You must be logged in as a seller to view this page!", "error")
|
|
return redirect(url_for('main.products.product', id=id))
|
|
|
|
db = ProductController()
|
|
product = db.read_id(id)
|
|
|
|
# Check user owns this product
|
|
if product is None or product.sellerID is not session.get("user_id"):
|
|
flash("This product does not belong to you!", "error")
|
|
return redirect(url_for('main.products.display_own'))
|
|
|
|
db = StatsController()
|
|
|
|
prev_days: int = request.args.get('prev_days', 7, int)
|
|
data = db.read_days(id, prev_days)
|
|
|
|
# Recent Views
|
|
product_view_frequency_data = dict(map(
|
|
# lambda k, v: (k, random.randint(70, 100)),
|
|
lambda k, v: (k, len(v)),
|
|
data.keys(),
|
|
data.values()
|
|
))
|
|
|
|
# Total Views
|
|
total_views = db.read_product_views(id)
|
|
|
|
# Ranking in category
|
|
ranking = db.read_ranking(id)
|
|
|
|
# Category name
|
|
db = CategoryController()
|
|
category = db.read(product.category).name
|
|
|
|
data = {
|
|
"age": datetime.now() - product.postedDate,
|
|
"ranking": ranking,
|
|
"category": category,
|
|
"views": {
|
|
"total": total_views,
|
|
"headings": list(reversed(product_view_frequency_data.keys())),
|
|
"data": list(reversed(product_view_frequency_data.values()))
|
|
},
|
|
"stocklevel": product.quantityAvailable
|
|
}
|
|
|
|
return render_template(
|
|
"index.html",
|
|
content="stats.html",
|
|
data=data
|
|
)
|