]> git.lizzy.rs Git - cheatdb.git/commitdiff
Add package scores and split homepage into new and popular
authorrubenwardy <rw@rubenwardy.com>
Wed, 4 Jul 2018 00:05:32 +0000 (01:05 +0100)
committerrubenwardy <rw@rubenwardy.com>
Wed, 4 Jul 2018 00:08:34 +0000 (01:08 +0100)
app/models.py
app/templates/admin/list.html
app/templates/index.html
app/views/__init__.py
app/views/admin.py
app/views/packages/__init__.py
migrations/versions/11b6ef362f98_.py [new file with mode: 0644]

index b5b48366e54af08caa35830c6b06ac0312820691..338b4f0bf7abc274b281c2a7d2d19a964928bdab 100644 (file)
@@ -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)
index c565fe025b09f567b4136f5a17f79f57e8e1a94a..d3072934b3a5580757714601aeb0bf54f8f22458 100644 (file)
@@ -21,6 +21,7 @@
                                <option value="importscreenshots" selected>Import screenshots from VCS</option>
                                <option value="importdepends">Import dependencies from downloads</option>
                                <option value="modprovides">Set provides to mod name</option>
+                               <option value="recalcscores">Recalc pakage scores</option>
                        </select>
                        <input type="submit" value="Perform" />
                </form>
index 46be684f0744c66fd44c3f798b42ee2e6d66f388..5691f12ee0e9010b0eec6267060db7487d3dc4fd 100644 (file)
@@ -25,6 +25,10 @@ Welcome
 
 <main>
        {% from "macros/packagegridtile.html" import render_pkggrid %}
-       {{ render_pkggrid(packages) }}
+       <h2>Newly Added</h2>
+       {{ render_pkggrid(new) }}
+
+       <h2>Popular</h2>
+       {{ render_pkggrid(popular) }}
 </main>
 {% endblock %}
index 2001a9099cf1ed57113ad7d2ae91e0e3fe19ccf2..3fec29fa22fa990d405a3e21b6ef9b6d07cb996e 100644 (file)
@@ -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
index 92ee43742a8cbb96d4a21ebf6ffffcca49da6802..532b6422cf5510edf958e4e4e6d1d71efaf31ef2 100644 (file)
@@ -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")
index 4d357a64fba8c52a2c4803a1e20592d3f802df5a..2c8d77bd91d3cac09bf6173f678fec80fada7dcd 100644 (file)
@@ -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 (file)
index 0000000..bb3b925
--- /dev/null
@@ -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 ###