diff --git a/app/models.py b/app/models.py index b5b4836..338b4f0 100644 --- a/app/models.py +++ b/app/models.py @@ -339,6 +339,8 @@ class Package(db.Model): approved = db.Column(db.Boolean, nullable=False, default=False) soft_deleted = db.Column(db.Boolean, nullable=False, default=False) + score = db.Column(db.Float, nullable=False, default=0) + review_thread_id = db.Column(db.Integer, db.ForeignKey("thread.id"), nullable=True, default=None) review_thread = db.relationship("Thread", foreign_keys=[review_thread_id]) @@ -385,7 +387,8 @@ class Package(db.Model): "shortDesc": self.shortDesc, "type": self.type.toName(), "release": self.getDownloadRelease().id if self.getDownloadRelease() is not None else None, - "thumbnail": (base_url + tnurl) if tnurl is not None else None + "thumbnail": (base_url + tnurl) if tnurl is not None else None, + "score": round(self.score * 10) / 10 } def getAsDictionary(self, base_url): @@ -412,7 +415,9 @@ class Package(db.Model): "screenshots": [base_url + ss.url for ss in self.screenshots], "url": base_url + self.getDownloadURL(), - "release": self.getDownloadRelease().id if self.getDownloadRelease() is not None else None + "release": self.getDownloadRelease().id if self.getDownloadRelease() is not None else None, + + "score": round(self.score * 10) / 10 } def getThumbnailURL(self): @@ -498,6 +503,21 @@ class Package(db.Model): else: raise Exception("Permission {} is not related to packages".format(perm.name)) + def recalcScore(self): + import datetime + + self.score = 0 + + if self.forums is None: + return + + topic = ForumTopic.query.get(self.forums) + if topic: + days = (datetime.datetime.now() - topic.created_at).days + months = days / 30 + years = days / 365 + self.score = topic.views / years + 80*min(6, months) + class MetaPackage(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), unique=True, nullable=False) diff --git a/app/templates/admin/list.html b/app/templates/admin/list.html index c565fe0..d307293 100644 --- a/app/templates/admin/list.html +++ b/app/templates/admin/list.html @@ -21,6 +21,7 @@ + diff --git a/app/templates/index.html b/app/templates/index.html index 46be684..5691f12 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -25,6 +25,10 @@ Welcome
{% from "macros/packagegridtile.html" import render_pkggrid %} - {{ render_pkggrid(packages) }} +

Newly Added

+ {{ render_pkggrid(new) }} + +

Popular

+ {{ render_pkggrid(popular) }}
{% endblock %} diff --git a/app/views/__init__.py b/app/views/__init__.py index 2001a90..3fec29f 100644 --- a/app/views/__init__.py +++ b/app/views/__init__.py @@ -48,8 +48,9 @@ def send_upload(path): def home_page(): query = Package.query.filter_by(approved=True, soft_deleted=False) count = query.count() - packages = query.order_by(db.desc(Package.created_at)).limit(15).all() - return render_template("index.html", packages=packages, count=count) + new = query.order_by(db.desc(Package.created_at)).limit(3).all() + popular = query.order_by(db.desc(Package.score)).limit(15).all() + return render_template("index.html", new=new, popular=popular, count=count) from . import users, githublogin, packages, meta, threads, api from . import sass, tasks, admin, notifications, tagseditor, thumbnails diff --git a/app/views/admin.py b/app/views/admin.py index 92ee437..532b642 100644 --- a/app/views/admin.py +++ b/app/views/admin.py @@ -64,6 +64,12 @@ def admin_page(): db.session.commit() return redirect(url_for("admin_page")) + elif action == "recalcscores": + for p in Package.query.all(): + p.recalcScore() + + db.session.commit() + return redirect(url_for("admin_page")) else: flash("Unknown action: " + action, "error") diff --git a/app/views/packages/__init__.py b/app/views/packages/__init__.py index 4d357a6..2c8d77b 100644 --- a/app/views/packages/__init__.py +++ b/app/views/packages/__init__.py @@ -47,6 +47,8 @@ def build_packages_query(): if search is not None and search.strip() != "": query = query.filter(Package.title.ilike('%' + search + '%')) + query = query.order_by(db.desc(Package.score)) + return query, title @menu.register_menu(app, ".mods", "Mods", order=11, endpoint_arguments_constructor=lambda: { 'type': 'mod' }) diff --git a/migrations/versions/11b6ef362f98_.py b/migrations/versions/11b6ef362f98_.py new file mode 100644 index 0000000..bb3b925 --- /dev/null +++ b/migrations/versions/11b6ef362f98_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 11b6ef362f98 +Revises: 9fc23495713b +Create Date: 2018-07-04 01:01:45.440662 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '11b6ef362f98' +down_revision = '9fc23495713b' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('package', sa.Column('score', sa.Float(), nullable=False, server_default="0.0")) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('package', 'score') + # ### end Alembic commands ###