diff --git a/files/helpers/const.py b/files/helpers/const.py index 6c2e08823..b88be8ad5 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -34,6 +34,19 @@ ROLES={} THEMES = {"TheMotte", "dramblr", "reddit", "transparent", "win98", "dark", "light", "coffee", "tron", "4chan", "midnight"} +SORTS_COMMON = { + "top": 'fa-arrow-alt-circle-up', + "bottom": 'fa-arrow-alt-circle-down', + "new": 'fa-sparkles', + "old": 'fa-book', + "controversial": 'fa-bullhorn', + "comments": 'fa-comments' +} +SORTS_POSTS = { + "hot": "fa-fire", + "bump": "fa-arrow-up" +} +SORTS_POSTS.update(SORTS_COMMON) IMGUR_KEY = environ.get("IMGUR_KEY").strip() PUSHER_ID = environ.get("PUSHER_ID", "").strip() diff --git a/files/helpers/contentsorting.py b/files/helpers/contentsorting.py index bdb4fb1db..e4d07bea3 100644 --- a/files/helpers/contentsorting.py +++ b/files/helpers/contentsorting.py @@ -1,10 +1,15 @@ import time +from typing import Union from sqlalchemy.sql import func +from sqlalchemy.orm import Query +from files.classes.comment import Comment +from files.classes.submission import Submission from files.helpers.const import * + def apply_time_filter(objects, t, cls): now = int(time.time()) if t == 'hour': @@ -22,35 +27,37 @@ def apply_time_filter(objects, t, cls): return objects.filter(cls.created_utc >= cutoff) -def sort_objects(objects, sort, cls): +def sort_objects(objects: Query, sort: str, cls: type[Union[Comment, Submission]]): if sort == 'hot': ti = int(time.time()) + 3600 - return objects.order_by( + ordered = objects.order_by( -100000 * (cls.upvotes + 1) - / (func.power((ti - cls.created_utc) / 1000, 1.23)), - cls.created_utc.desc()) - elif sort == 'bump' and cls.__name__ == 'Submission': - return objects.filter(cls.comment_count > 1).order_by( - cls.bump_utc.desc(), cls.created_utc.desc()) - elif sort == 'comments' and cls.__name__ == 'Submission': - return objects.order_by( - cls.comment_count.desc(), cls.created_utc.desc()) + / (func.power((ti - cls.created_utc) / 1000, 1.23))) + elif sort == 'bump' and cls is Submission: + ordered = objects.filter(cls.comment_count > 1).order_by(cls.bump_utc.desc()) + elif sort == 'comments': + if cls is Submission: + ordered = objects.order_by(cls.comment_count.desc()) + elif cls is Comment: + ordered = objects.order_by(cls.descendant_count.desc()) + else: + ordered = objects elif sort == 'controversial': - return objects.order_by( + ordered = objects.order_by( (cls.upvotes + 1) / (cls.downvotes + 1) + (cls.downvotes + 1) / (cls.upvotes + 1), - cls.downvotes.desc(), cls.created_utc.desc()) + cls.downvotes.desc()) elif sort == 'top': - return objects.order_by( - cls.downvotes - cls.upvotes, cls.created_utc.desc()) + ordered = objects.order_by(cls.downvotes - cls.upvotes) elif sort == 'bottom': - return objects.order_by( - cls.upvotes - cls.downvotes, cls.created_utc.desc()) + ordered = objects.order_by(cls.upvotes - cls.downvotes) elif sort == 'old': return objects.order_by(cls.created_utc) - else: # default, or sort == 'new' - return objects.order_by(cls.created_utc.desc()) + else: + ordered = objects + ordered = ordered.order_by(cls.created_utc.desc()) + return ordered # Presently designed around files.helpers.get.get_comment_trees_eager @@ -65,6 +72,8 @@ def sort_comment_results(comments, sort): / (pow(((ti - c.created_utc) / 1000), 1.23)), DESC - c.created_utc ) + elif sort == 'comments': + key_func = lambda c: DESC - c.descendant_count elif sort == 'controversial': key_func = lambda c: ( (c.upvotes + 1) / (c.downvotes + 1) diff --git a/files/routes/settings.py b/files/routes/settings.py index 170719a94..e22d1501d 100644 --- a/files/routes/settings.py +++ b/files/routes/settings.py @@ -215,14 +215,14 @@ def settings_profile_post(v): defaultsortingcomments = request.values.get("defaultsortingcomments") if defaultsortingcomments: - if defaultsortingcomments in {"new", "old", "controversial", "top", "bottom"}: + if defaultsortingcomments in SORTS_ALL: v.defaultsortingcomments = defaultsortingcomments updated = True else: abort(400) defaultsorting = request.values.get("defaultsorting") if defaultsorting: - if defaultsorting in {"hot", "bump", "new", "old", "comments", "controversial", "top", "bottom"}: + if defaultsorting in SORTS_POSTS: v.defaultsorting = defaultsorting updated = True else: abort(400) diff --git a/files/templates/changelog.html b/files/templates/changelog.html index 3da3f88cc..59a046d59 100644 --- a/files/templates/changelog.html +++ b/files/templates/changelog.html @@ -1,4 +1,5 @@ {% extends "settings2.html" %} +{%- import 'component/sorting_time.html' as sorting_time with context -%} {% block pagetitle %}Changelog{% endblock %} @@ -35,27 +36,7 @@
Change how many posts appear on every page.
Change the default sorting for comments.
Change the default sorting for posts.
Change the default time filter for posts.
Change the domain you would like to view reddit posts in.