From 7c93db95a3fb1f5a974d1a7704ca188a05a47dce Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 1 Feb 2022 21:22:28 +0000 Subject: [PATCH] Add community hub to list game content --- app/blueprints/packages/__init__.py | 2 +- app/blueprints/packages/game_hub.py | 54 ++++++++++++++++++++++++++ app/models/packages.py | 8 ++++ app/querybuilder.py | 7 ++++ app/templates/packages/game_hub.html | 57 ++++++++++++++++++++++++++++ app/templates/packages/view.html | 13 +++++++ 6 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 app/blueprints/packages/game_hub.py create mode 100644 app/templates/packages/game_hub.html diff --git a/app/blueprints/packages/__init__.py b/app/blueprints/packages/__init__.py index 9af6762..47f471c 100644 --- a/app/blueprints/packages/__init__.py +++ b/app/blueprints/packages/__init__.py @@ -65,4 +65,4 @@ def get_package_tabs(user: User, package: Package): ] -from . import packages, screenshots, releases, reviews +from . import packages, screenshots, releases, reviews, game_hub diff --git a/app/blueprints/packages/game_hub.py b/app/blueprints/packages/game_hub.py new file mode 100644 index 0000000..a8c3ac6 --- /dev/null +++ b/app/blueprints/packages/game_hub.py @@ -0,0 +1,54 @@ +# ContentDB +# Copyright (C) 2022 rubenwardy +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from flask import render_template, abort +from sqlalchemy.orm import joinedload + +from . import bp +from app.utils import is_package_page +from ...models import Package, PackageType, PackageState, db, PackageRelease + + +@bp.route("/packages///hub/") +@is_package_page +def game_hub(package: Package): + if package.type != PackageType.GAME: + abort(404) + + def join(query): + return query.options( + joinedload(Package.license), + joinedload(Package.media_license)) + + query = Package.query.filter(Package.supported_games.any(game=package), Package.state==PackageState.APPROVED) + count = query.count() + + new = join(query.order_by(db.desc(Package.approved_at))).limit(4).all() + pop_mod = join(query.filter_by(type=PackageType.MOD).order_by(db.desc(Package.score))).limit(8).all() + pop_gam = join(query.filter_by(type=PackageType.GAME).order_by(db.desc(Package.score))).limit(8).all() + pop_txp = join(query.filter_by(type=PackageType.TXP).order_by(db.desc(Package.score))).limit(8).all() + high_reviewed = join(query.order_by(db.desc(Package.score - Package.score_downloads))) \ + .filter(Package.reviews.any()).limit(4).all() + + updated = db.session.query(Package).select_from(PackageRelease).join(Package) \ + .filter(Package.supported_games.any(game=package), Package.state==PackageState.APPROVED) \ + .order_by(db.desc(PackageRelease.releaseDate)) \ + .limit(20).all() + updated = updated[:4] + + return render_template("packages/game_hub.html", package=package, count=count, + new=new, updated=updated, pop_mod=pop_mod, pop_txp=pop_txp, pop_gam=pop_gam, + high_reviewed=high_reviewed) diff --git a/app/models/packages.py b/app/models/packages.py index 4cf7b8c..d158d62 100644 --- a/app/models/packages.py +++ b/app/models/packages.py @@ -475,6 +475,14 @@ class Package(db.Model): for e in PackagePropertyKey: setattr(self, e.name, getattr(package, e.name)) + @classmethod + def get_by_key(cls, key): + parts = key.split("/") + if len(parts) != 2: + return None + + return Package.query.filter(Package.name == parts[1], Package.author.has(username=parts[0])).first() + def getId(self): return "{}/{}".format(self.author.username, self.name) diff --git a/app/querybuilder.py b/app/querybuilder.py index dc0e970..baae977 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -75,6 +75,10 @@ class QueryBuilder: if self.search is not None and self.search.strip() == "": self.search = None + self.game = args.get("game") + if self.game: + self.game = Package.get_by_key(self.game) + def setSortIfNone(self, name, dir="desc"): if self.order_by is None: self.order_by = name @@ -132,6 +136,9 @@ class QueryBuilder: query = query.filter_by(author=author) + if self.game: + query = query.filter(Package.supported_games.any(game=self.game)) + for tag in self.tags: query = query.filter(Package.tags.any(Tag.id == tag.id)) diff --git a/app/templates/packages/game_hub.html b/app/templates/packages/game_hub.html new file mode 100644 index 0000000..bbf0ff8 --- /dev/null +++ b/app/templates/packages/game_hub.html @@ -0,0 +1,57 @@ +{% extends "base.html" %} + +{% block title %} +{{ _("Community Hub") }} - +{{ _('%(title)s by %(author)s', title=package.title, author=package.author.display_name) }} +{% endblock %} + + +{% block headextra %} + + + + + {% if package.getMainScreenshotURL() %} + + {% endif %} +{% endblock %} + + +{% block content %} + {% from "macros/packagegridtile.html" import render_pkggrid %} + +

+ {{ _("Community Hub") }} - + + {{ _('%(title)s by %(author)s', title=package.title, author=package.author.display_name) }} + +

+ + + {{ _("See more") }} + +

{{ _("Recently Added") }}

+ {{ render_pkggrid(new) }} + + + + {{ _("See more") }} + +

{{ _("Recently Updated") }}

+ {{ render_pkggrid(updated) }} + + + + {{ _("See more") }} + +

{{ _("Top Mods") }}

+ {{ render_pkggrid(pop_mod) }} + + + + {{ _("See more") }} + +

{{ _("Highest Reviewed") }}

+ {{ render_pkggrid(high_reviewed) }} + +{% endblock %} diff --git a/app/templates/packages/view.html b/app/templates/packages/view.html index f27f2f2..50b513c 100644 --- a/app/templates/packages/view.html +++ b/app/templates/packages/view.html @@ -322,6 +322,13 @@ {% from "macros/packagegridtile.html" import render_pkggrid %} {{ render_pkggrid(packages_uses) }} {% endif %} + + {% if package.type == package.type.GAME %} +

{{ _("Content") }}

+ + {{ _("View content for game") }} + + {% endif %}