From 836caf0fe0707e01eb4e9afbcf39aa42c6c8963e Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 18 Jul 2020 01:22:52 +0100 Subject: [PATCH] Add last updated section to homepage --- app/blueprints/homepage/__init__.py | 12 +++++++++- app/blueprints/packages/packages.py | 3 ++- app/flatpages/help/api.md | 2 +- app/models.py | 1 + app/querybuilder.py | 9 +++++++- app/templates/index.html | 27 ++++++++++++++--------- migrations/versions/dff4b87e4a76_.py | 33 ++++++++++++++++++++++++++++ 7 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 migrations/versions/dff4b87e4a76_.py diff --git a/app/blueprints/homepage/__init__.py b/app/blueprints/homepage/__init__.py index 37c1800..063aa92 100644 --- a/app/blueprints/homepage/__init__.py +++ b/app/blueprints/homepage/__init__.py @@ -17,12 +17,22 @@ def home(): query = Package.query.filter_by(approved=True, soft_deleted=False) count = query.count() + new = join(query.order_by(db.desc(Package.created_at))).limit(8).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(4).all() pop_txp = join(query.filter_by(type=PackageType.TXP).order_by(db.desc(Package.score))).limit(4).all() + + updated = db.session.query(Package).select_from(PackageRelease).join(Package) \ + .filter_by(soft_deleted=False, approved=True) \ + .order_by(db.desc(PackageRelease.releaseDate)) \ + .limit(8).all() + updated = updated[:4] + reviews = PackageReview.query.filter_by(recommends=True).order_by(db.desc(PackageReview.created_at)).limit(5).all() + downloads_result = db.session.query(func.sum(Package.downloads)).one_or_none() downloads = 0 if not downloads_result or not downloads_result[0] else downloads_result[0] + return render_template("index.html", count=count, downloads=downloads, \ - new=new, pop_mod=pop_mod, pop_txp=pop_txp, pop_gam=pop_gam, reviews=reviews) + new=new, updated=updated, pop_mod=pop_mod, pop_txp=pop_txp, pop_gam=pop_gam, reviews=reviews) diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py index 3b9ca4a..6ff6623 100644 --- a/app/blueprints/packages/packages.py +++ b/app/blueprints/packages/packages.py @@ -301,7 +301,7 @@ def create_edit(author=None, name=None): form.populate_obj(package) # copy to row - if package.type== PackageType.TXP: + if package.type == PackageType.TXP: package.license = package.media_license mpackage_cache = {} @@ -367,6 +367,7 @@ def approve(package): else: package.approved = True + package.approved_at = datetime.datetime.now() screenshots = PackageScreenshot.query.filter_by(package=package, approved=False).all() for s in screenshots: diff --git a/app/flatpages/help/api.md b/app/flatpages/help/api.md index fd00693..755902e 100644 --- a/app/flatpages/help/api.md +++ b/app/flatpages/help/api.md @@ -66,7 +66,7 @@ Supported query parameters: * `random` - When present, enable random ordering and ignore `sort`. * `limit` - Return at most `limit` packages. * `hide` - Hide content based on [Content Flags](/help/content_flags/). -* `sort` - Sort by (`name`, `title`, `score`, `downloads`, `created_at`). +* `sort` - Sort by (`name`, `title`, `score`, `downloads`, `created_at`, `last_release`). * `order` - Sort ascending (`asc`) or descending (`desc`). * `protocol_version` - Only show packages supported by this Minetest protocol version. * `engine_version` - Only show packages supported by this Minetest engine version, eg: `5.3.0`. diff --git a/app/models.py b/app/models.py index 6b7d067..1674d15 100644 --- a/app/models.py +++ b/app/models.py @@ -457,6 +457,7 @@ class Package(db.Model): desc = db.Column(db.UnicodeText, nullable=True) type = db.Column(db.Enum(PackageType)) created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow) + approved_at = db.Column(db.DateTime, nullable=True, default=None) name_valid = db.CheckConstraint("name ~* '^[a-z0-9_]+$'") diff --git a/app/querybuilder.py b/app/querybuilder.py index 922438e..be7af32 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -69,7 +69,12 @@ class QueryBuilder: return MinetestRelease.get(self.minetest_version, self.protocol_version) def buildPackageQuery(self): - query = Package.query.filter_by(soft_deleted=False, approved=True) + query = None + if self.order_by == "last_release": + query = db.session.query(Package).select_from(PackageRelease).join(Package) \ + .filter_by(soft_deleted=False, approved=True) + else: + query = Package.query.filter_by(soft_deleted=False, approved=True) if len(self.types) > 0: query = query.filter(Package.type.in_(self.types)) @@ -93,6 +98,8 @@ class QueryBuilder: to_order = Package.downloads elif self.order_by == "created_at" or self.order_by == "date": to_order = Package.created_at + elif self.order_by == "last_release": + to_order = PackageRelease.releaseDate else: abort(400) diff --git a/app/templates/index.html b/app/templates/index.html index febda18..3a80f8c 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -23,18 +23,11 @@ {% from "macros/packagegridtile.html" import render_pkggrid %} - + {{ _("See more") }} -

{{ _("Recently Added") }}

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

{{ _("Top Mods") }}

- {{ render_pkggrid(pop_mod) }} +

{{ _("Recently Updated") }}

+ {{ render_pkggrid(updated) }} @@ -44,6 +37,13 @@ {{ render_pkggrid(pop_gam) }} + + {{ _("See more") }} + +

{{ _("Top Mods") }}

+ {{ render_pkggrid(pop_mod) }} + + {{ _("See more") }} @@ -51,6 +51,13 @@ {{ render_pkggrid(pop_txp) }} + + {{ _("See more") }} + +

{{ _("Recently Added") }}

+ {{ render_pkggrid(new) }} + + {{ _("See more") }} diff --git a/migrations/versions/dff4b87e4a76_.py b/migrations/versions/dff4b87e4a76_.py new file mode 100644 index 0000000..c21c6b5 --- /dev/null +++ b/migrations/versions/dff4b87e4a76_.py @@ -0,0 +1,33 @@ +"""empty message + +Revision ID: dff4b87e4a76 +Revises: 3a24fc02365e +Create Date: 2020-07-17 23:47:51.096874 + +""" +from alembic import op +import sqlalchemy as sa +import datetime + + +# revision identifiers, used by Alembic. +revision = 'dff4b87e4a76' +down_revision = '3a24fc02365e' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('package', sa.Column('approved_at', sa.DateTime(), nullable=True, server_default=None)) + + op.execute(""" + UPDATE package SET approved_at=created_at WHERE approved; + """) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('package', 'approved_at') + # ### end Alembic commands ###