From 0a468b4b0bcf69f8b6aa255c8d8aeb12791a9026 Mon Sep 17 00:00:00 2001 From: atrc445 Date: Sat, 28 Aug 2021 14:46:34 +0200 Subject: [PATCH 1/3] optimize paypigs route by making the code less readable --- files/routes/static.py | 22 ++++++++++++++++++++-- files/templates/patrons.html | 12 ++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/files/routes/static.py b/files/routes/static.py index 99b36584db..f1a2ada4cb 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -1,6 +1,8 @@ from files.mail import * from files.__main__ import app, limiter from files.helpers.alerts import * +from files.classes.award import AWARDS +from sqlalchemy import func site = environ.get("DOMAIN").strip() site_name = environ.get("SITE_NAME").strip() @@ -43,9 +45,25 @@ def participation_stats(v): @app.get("/paypigs") @auth_desired def patrons(v): + query = g.db.query( + User.id, User.username, User.patron, User.namecolor, + AwardRelationship.kind.label('last_award_kind'), func.count(AwardRelationship.id).label('last_award_count') + ).filter(AwardRelationship.submission_id==None, AwardRelationship.comment_id==None) \ + .group_by(User.username, User.patron, User.id, User.namecolor, AwardRelationship.kind) \ + .order_by(User.patron.desc(), AwardRelationship.kind.asc()) \ + .join(User).all() - users = g.db.query(User).options(lazyload('*')).filter(User.patron > 0).order_by(User.patron.desc()).all() - return render_template("patrons.html", v=v, users=users) + result = {} + for row in (r._asdict() for r in query): + user_id = row['id'] + if user_id not in result: + result[user_id] = row + result[user_id]['awards'] = {} + + result[user_id]['awards'][row['last_award_kind']] = (AWARDS[row['last_award_kind']], + row['last_award_count']) + + return render_template("patrons.html", v=v, result=result) @app.get("/admins") @auth_desired diff --git a/files/templates/patrons.html b/files/templates/patrons.html index fc18b5f381..0eebd73ca6 100644 --- a/files/templates/patrons.html +++ b/files/templates/patrons.html @@ -10,18 +10,18 @@ Awards -{% for user in users %} +{% for uid,row in result.items() %} - {{users.index(user)+1}} - {{user.username}} + {{loop.index}} + {{row['username']}} - + - {% for a in user.display_awards %} + {% for (a,count) in row['awards'].values() %} - {{a['count']}} + {{count}} {% endfor %} From 7fab1287cc680fa8efa45ce1dd95df0700108246 Mon Sep 17 00:00:00 2001 From: atrc445 Date: Sat, 28 Aug 2021 14:55:13 +0200 Subject: [PATCH 2/3] ignore unknown awards --- files/routes/static.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/files/routes/static.py b/files/routes/static.py index f1a2ada4cb..01e9a9df54 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -45,6 +45,8 @@ def participation_stats(v): @app.get("/paypigs") @auth_desired def patrons(v): + import time + s = time.time() query = g.db.query( User.id, User.username, User.patron, User.namecolor, AwardRelationship.kind.label('last_award_kind'), func.count(AwardRelationship.id).label('last_award_count') @@ -60,10 +62,13 @@ def patrons(v): result[user_id] = row result[user_id]['awards'] = {} - result[user_id]['awards'][row['last_award_kind']] = (AWARDS[row['last_award_kind']], - row['last_award_count']) + kind = row['last_award_kind'] + if kind in AWARDS.keys(): + result[user_id]['awards'][kind] = (AWARDS[kind], row['last_award_count']) - return render_template("patrons.html", v=v, result=result) + r = render_template("patrons.html", v=v, result=result) + print((time.time()-s)*1000, flush=True) + return r @app.get("/admins") @auth_desired From eef02d358a986ee3625fa9d0c3de568260dde393 Mon Sep 17 00:00:00 2001 From: atrc445 Date: Sat, 28 Aug 2021 14:58:59 +0200 Subject: [PATCH 3/3] remove time measurements, sort awards --- files/routes/static.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/files/routes/static.py b/files/routes/static.py index 01e9a9df54..43fd269aa7 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -45,14 +45,12 @@ def participation_stats(v): @app.get("/paypigs") @auth_desired def patrons(v): - import time - s = time.time() query = g.db.query( User.id, User.username, User.patron, User.namecolor, AwardRelationship.kind.label('last_award_kind'), func.count(AwardRelationship.id).label('last_award_count') - ).filter(AwardRelationship.submission_id==None, AwardRelationship.comment_id==None) \ + ).filter(AwardRelationship.submission_id==None, AwardRelationship.comment_id==None, User.patron > 0) \ .group_by(User.username, User.patron, User.id, User.namecolor, AwardRelationship.kind) \ - .order_by(User.patron.desc(), AwardRelationship.kind.asc()) \ + .order_by(User.patron.desc(), AwardRelationship.kind.desc()) \ .join(User).all() result = {} @@ -66,9 +64,7 @@ def patrons(v): if kind in AWARDS.keys(): result[user_id]['awards'][kind] = (AWARDS[kind], row['last_award_count']) - r = render_template("patrons.html", v=v, result=result) - print((time.time()-s)*1000, flush=True) - return r + return render_template("patrons.html", v=v, result=result) @app.get("/admins") @auth_desired