|
3 | 3 | # Copyright (C) 2018-2025 rubenwardy <rw@rubenwardy> |
4 | 4 |
|
5 | 5 | from datetime import datetime as dt |
| 6 | +from datetime import timedelta as datetime_timedelta |
6 | 7 | from urllib.parse import urlparse |
7 | 8 |
|
8 | 9 | from flask import request, has_request_context |
9 | 10 | from flask_babel import format_timedelta, gettext, get_locale, format_decimal |
10 | 11 | from flask_login import current_user |
11 | 12 | from markupsafe import Markup |
| 13 | +from sqlalchemy import and_ |
12 | 14 |
|
13 | 15 | from . import app |
14 | 16 | from app.markdown import get_headings |
15 | | -from .models import Permission, Package, PackageState, PackageRelease, ReleaseState |
| 17 | +from app.models import db, Permission, Package, PackageState, PackageRelease, ReleaseState, PackageReview, \ |
| 18 | + PackageReviewVote |
16 | 19 | from app.utils.flask import abs_url_for, url_set_query, url_set_anchor, url_current, abs_url as do_abs_url |
17 | 20 | from app.utils.luanti_hypertext import normalize_whitespace as do_normalize_whitespace |
18 | 21 | from app.utils.misc import format_file_size as format_file_size_impl |
@@ -45,6 +48,31 @@ def inject_todo(): |
45 | 48 | return dict(todo_list_count=todo_list_count) |
46 | 49 |
|
47 | 50 |
|
| 51 | +@app.context_processor |
| 52 | +def inject_bigotry_troll(): |
| 53 | + if not current_user or not current_user.is_authenticated: |
| 54 | + return dict() |
| 55 | + |
| 56 | + sensitive_package_ids = (db.session.query(Package.id) |
| 57 | + .filter_by(sensitive_package=True, state=PackageState.APPROVED) |
| 58 | + .subquery()) |
| 59 | + |
| 60 | + one_hour_ago = dt.utcnow() - datetime_timedelta(hours=1) |
| 61 | + |
| 62 | + count = (PackageReview.query |
| 63 | + .filter(PackageReview.package_id.in_(sensitive_package_ids)) |
| 64 | + .join(PackageReviewVote, |
| 65 | + and_( |
| 66 | + PackageReviewVote.review_id == PackageReview.id, |
| 67 | + PackageReviewVote.user_id == current_user.id, |
| 68 | + PackageReviewVote.is_positive != (PackageReview.rating > 3), |
| 69 | + PackageReviewVote.created_at < one_hour_ago, |
| 70 | + )) |
| 71 | + .count()) |
| 72 | + |
| 73 | + return dict(bigotry_troll=count > 5) |
| 74 | + |
| 75 | + |
48 | 76 | @app.template_filter() |
49 | 77 | def throw(err): |
50 | 78 | raise Exception(err) |
|
0 commit comments