]> git.lizzy.rs Git - cheatdb.git/commitdiff
Add score bonus to reviews
authorrubenwardy <rw@rubenwardy.com>
Thu, 9 Jul 2020 03:32:13 +0000 (04:32 +0100)
committerrubenwardy <rw@rubenwardy.com>
Thu, 9 Jul 2020 03:32:13 +0000 (04:32 +0100)
app/blueprints/admin/admin.py
app/blueprints/api/endpoints.py
app/blueprints/packages/reviews.py
app/flatpages/help/top_packages.md
app/models.py

index ff509f9775b777cc2febe982bf52edaa66be119a..5c63fb256c377bf9a6c69246c1db1160be38d86a 100644 (file)
@@ -87,7 +87,7 @@ def admin_page():
                        return redirect(url_for("admin.admin_page"))
                elif action == "recalcscores":
                        for p in Package.query.all():
-                               p.setStartScore()
+                               p.recalcScore()
 
                        db.session.commit()
                        return redirect(url_for("admin.admin_page"))
index d5ef9d08ae6d3f78da46e4df47540b92db78d840..c12d59bec817cbade15ac921a76d3b3a0f9c9127 100644 (file)
@@ -42,8 +42,7 @@ def package_scores():
        qb    = QueryBuilder(request.args)
        query = qb.buildPackageQuery()
 
-       pkgs = [{ "author": package.author.username, "name": package.name, "score": package.score } \
-                       for package in query.all()]
+       pkgs = [package.getScoreDict() for package in query.all()]
        return jsonify(pkgs)
 
 
index 114afae5e910009f54388c8a689fb0341a097414..74070fc2b0d25f6cfc64295e1c0386f129d1ba44 100644 (file)
@@ -82,6 +82,8 @@ def review(package):
 
                db.session.commit()
 
+               package.recalcScore()
+
                notif_msg = None
                if was_new:
                        notif_msg = "New review '{}' on package {}".format(form.title.data, package.title)
index da3f38a22147bdaade0cc125e0336441b7174c59..33e7d2572e14460b2c0889984b8100f4d9e78324 100644 (file)
@@ -2,8 +2,12 @@ title: Top Packages Algorithm
 
 ## Score
 
-A package's score is currently equal to a pseudo rolling average of downloads.
-In the future, a package will also gain score through reviews.
+A package's score is currently equal to a pseudo rolling average of downloads,
+plus the sum of review scores.
+
+A review score is 100 if positive, -100 if negative.
+
+       score  =  avg_downloads + Σ 100 * (positive ? 1 : -1)
 
 ## Pseudo rolling average of downloads
 
@@ -35,7 +39,8 @@ which was 20% of the above value.
 ## Manual adjustments
 
 The admin occasionally reduces all packages by a set percentage to speed up
-convergence. Convergence is when
+convergence. Convergence is when the pseudo-rolling average matches the actual
+rolling average - the effect of the legacy heuristic is gone.
 
 ## Transparency and Feedback
 
index 7b0730966c2b44ec5952c789c89a85d81de9c596..e026c778676daf089757822f7615ee4f08652239 100644 (file)
@@ -712,28 +712,19 @@ class Package(db.Model):
                else:
                        raise Exception("Permission {} is not related to packages".format(perm.name))
 
-       def setStartScore(self):
-               downloads = self.downloads
-
-               forum_score = 0
-               forum_bonus = 0
-               topic = self.forums and ForumTopic.query.get(self.forums)
-               if topic:
-                       months = (datetime.datetime.now() - topic.created_at).days / 30
-                       years  = months / 12
-                       forum_score = topic.views / max(years, 0.0416) + 80*min(max(months, 0.5), 6)
-                       forum_bonus = topic.views + topic.posts
-
-               self.score = max(downloads, forum_score * 0.6) + forum_bonus
-
-               if self.getMainScreenshotURL() is None:
-                       self.score *= 0.8
-
-               self.recalcScore()
+       def getScoreDict(self):
+               return {
+                       "author": self.author.username,
+                       "name": self.name,
+                       "score": self.score,
+                       "score_downloads": self.score_downloads,
+                       "score_reviews": self.score - self.score_downloads,
+                       "downloads": self.downloads
+               }
 
        def recalcScore(self):
-               self.score_downloads = self.score
-
+               review_scores = [ 100 * r.asSign() for r in self.reviews ]
+               self.score = self.score_downloads + sum(review_scores)
 
 
 class MetaPackage(db.Model):
@@ -1134,6 +1125,9 @@ class PackageReview(db.Model):
 
        thread     = db.relationship("Thread", uselist=False, back_populates="review")
 
+       def asSign(self):
+               return 1 if self.recommends else -1
+
        def getEditURL(self):
                return url_for("packages.edit_review",
                                author=self.package.author.username,