diff --git a/controllers/database/database.py b/controllers/database/database.py index 523d9b6..f133281 100644 --- a/controllers/database/database.py +++ b/controllers/database/database.py @@ -46,7 +46,7 @@ class DatabaseController(ABC): for attr, value in with_fields.items(): try: setattr(obj, attr, value) - except KeyError: + except AttributeError: return of(value) return obj diff --git a/controllers/database/stats.py b/controllers/database/stats.py index fb08d2d..9c09ce2 100644 --- a/controllers/database/stats.py +++ b/controllers/database/stats.py @@ -1,6 +1,6 @@ from .database import DatabaseController from models.stats import Stats -from datetime import datetime +from datetime import datetime, timedelta from utils.general_utils import is_within_x_days @@ -52,7 +52,7 @@ class StatsController(DatabaseController): return self.get_many(query, params) def read_days(self, product_id: int, prev_days: int = 7 - ) -> dict[int, list[Stats]] | None: + ) -> dict[datetime, list[Stats]] | None: """ Returns data from within the given number of days """ data = self.read_product(product_id) @@ -64,16 +64,19 @@ class StatsController(DatabaseController): data )) - day_views: dict[int, list[Stats]] = dict() + day_views: dict[str, list[Stats]] = dict() for i in range(0, prev_days): - day_views[i] = list() + key = datetime.today() - timedelta(days=i) + day_views[key.strftime('%b-%d')] = list() + print(list(day_views)) # Organise data into distinct for view in filtered_data: - diff = datetime.now()-view.viewDate - day_views[diff.days].append(view) + key = datetime.today() - (datetime.today() - view.viewDate) + day_views[key.strftime('%b-%d')].append(view) + print(list(day_views)) return day_views def read_product_views(self, id: int): diff --git a/controllers/web/stats.py b/controllers/web/stats.py index f8d22da..ad9663b 100644 --- a/controllers/web/stats.py +++ b/controllers/web/stats.py @@ -31,14 +31,16 @@ def view_product_stats(id: int): 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(0, 100)), + lambda k, v: (k, random.randint(70, 100)), # lambda k, v: (k, len(v)), data.keys(), data.values() )) - print(db.read_product_views(id)) + # Total Views + total_views = db.read_product_views(id) db = ProductController() product = db.read_id(id) @@ -62,7 +64,7 @@ def view_product_stats(id: int): "age": time_since_posted, "ranking": 0, "views": { - "total": 0, + "total": total_views, "headings": list(reversed(product_view_frequency_data.keys())), "data": list(reversed(product_view_frequency_data.values())) }, @@ -72,8 +74,7 @@ def view_product_stats(id: int): return render_template( "index.html", content="stats.html", - headings=list(reversed(product_view_frequency_data.keys())), - data=list(reversed(product_view_frequency_data.values())) + data=data ) diff --git a/scripts/create_tables.sql b/scripts/create_tables.sql index 865d29e..1d7cca8 100644 --- a/scripts/create_tables.sql +++ b/scripts/create_tables.sql @@ -57,11 +57,11 @@ CREATE TABLE IF NOT EXISTS Views ( id INTEGER PRIMARY KEY, userID INTEGER REFERENCES Users (id) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION, productID INTEGER NOT NULL REFERENCES Users (id) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION, viewDate TIMESTAMP NOT NULL ) diff --git a/static/css/stats.css b/static/css/stats.css new file mode 100644 index 0000000..9609f35 --- /dev/null +++ b/static/css/stats.css @@ -0,0 +1,6 @@ +.stats { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; +} \ No newline at end of file diff --git a/templates/stats.html b/templates/stats.html index 5e79016..a7752a2 100644 --- a/templates/stats.html +++ b/templates/stats.html @@ -1,10 +1,30 @@ + - -
- +
+
+ +
+
+ +
+ +
+ + + +
+
+
+

Age: {{data['age']}}

+

Ranking: {{data['ranking']}}

+

Stock Level: {{data['stocklevel']}}

+

Total Views: {{data['views']['total']}}

+
+ + - -
- {% if data != None %} - {% for stat in data %} - {% endfor %} - {% endif %} -
+ \ No newline at end of file