add recompute karma capability

This commit is contained in:
Yusur 2025-06-14 15:24:03 +02:00
parent 8e12714026
commit 803b725671
4 changed files with 32 additions and 5 deletions

View file

@ -1,5 +1,10 @@
# Changelog # Changelog
## 0.3.3
- Fixed bugs in templates introduced in 0.3.2
- Improved karma management
## 0.3.2 ## 0.3.2
- Fixed administrator users not being able to create +guilds - Fixed administrator users not being able to create +guilds

View file

@ -4,22 +4,36 @@ import argparse
import os import os
import subprocess import subprocess
from sqlalchemy import create_engine from sqlalchemy import create_engine, select
from . import __version__ as version from sqlalchemy.orm import Session
from .models import db from . import __version__ as version, app
from .models import User, db
def make_parser(): def make_parser():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('--version', '-v', action='version', version=version) parser.add_argument('--version', '-v', action='version', version=version)
parser.add_argument('--upgrade', '-U', action='store_true', help='create or upgrade schema') parser.add_argument('--upgrade', '-U', action='store_true', help='create or upgrade schema')
parser.add_argument('--flush', '-H', action='store_true', help='recompute karma for all users')
return parser return parser
def main(): def main():
args = make_parser().parse_args() args = make_parser().parse_args()
engine = create_engine(os.getenv('DATABASE_URL'))
if args.upgrade: if args.upgrade:
db.metadata.create_all(create_engine(os.getenv('DATABASE_URL'))) db.metadata.create_all(engine)
subprocess.Popen(['alembic', 'upgrade', 'head']).wait() subprocess.Popen(['alembic', 'upgrade', 'head']).wait()
print('Schema upgraded!') print('Schema upgraded!')
if args.flush:
cnt = 0
with app.app_context():
for u in db.session.execute(select(User)).scalars():
u.recompute_karma()
cnt += 1
db.session.add(u)
db.session.commit()
print(f'Recomputed karma of {cnt} users')
print(f'Visit <https://{os.getenv("DOMAIN_NAME")}>') print(f'Visit <https://{os.getenv("DOMAIN_NAME")}>')

View file

@ -188,6 +188,14 @@ class User(BaseModel):
def not_suspended(cls): def not_suspended(cls):
return or_(User.banned_at == None, User.banned_until <= datetime.datetime.now()) return or_(User.banned_at == None, User.banned_until <= datetime.datetime.now())
def recompute_karma(self):
c = 0
c += db.session.execute(select(func.count('*')).select_from(Post).where(Post.author == self)).scalar()
c += db.session.execute(select(func.count('*')).select_from(PostUpvote).join(Post).where(Post.author == self, PostUpvote.c.is_downvote == False)).scalar()
c -= db.session.execute(select(func.count('*')).select_from(PostUpvote).join(Post).where(Post.author == self, PostUpvote.c.is_downvote == True)).scalar()
self.karma = c
class Topic(BaseModel): class Topic(BaseModel):
__tablename__ = 'freak_topic' __tablename__ = 'freak_topic'

View file

@ -12,7 +12,7 @@
{% endblock %} {% endblock %}
{% block nav %} {% block nav %}
{{ user_nav(user) }} {{ nav_user(user) }}
{% endblock %} {% endblock %}
{% block content %} {% block content %}