summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2016-06-04 17:09:05 +0200
committerschneefux <schneefux+commit@schneefux.xyz>2016-06-04 17:09:05 +0200
commit9a01a6bca94df2550aabd5ac75f05f7adbbea66f (patch)
tree7b4078bba88ec896644fb70a7c526fb0955896d1
parentad3438e065d64d582fca2c5ade8b773fe99352ee (diff)
downloadjokevote-9a01a6bca94df2550aabd5ac75f05f7adbbea66f.tar.gz
jokevote-9a01a6bca94df2550aabd5ac75f05f7adbbea66f.zip
rework scoring
-rw-r--r--app.py43
-rw-r--r--templates/index.html17
2 files changed, 35 insertions, 25 deletions
diff --git a/app.py b/app.py
index cf427a5..26d93dc 100644
--- a/app.py
+++ b/app.py
@@ -132,12 +132,6 @@ class dbProxy(object):
d[col[0]] = row[idx]
return d
- def sort(self, joke):
- #interactions = joke["reports"]*5 + joke["upvotes"] + joke["downvotes"] + 1
- #score = 1/interactions * (joke["upvotes"]+1)/interactions
- score = joke["upvotes"] - joke["downvotes"] - joke["reports"]*5
- return score
-
def getPages(self, perpage):
l = len(self.getJokes())-1
return int(l/perpage)+1
@@ -145,33 +139,46 @@ class dbProxy(object):
def getJokes(self, perpage=None, page=None, user=None):
ret_jokes = []
jokes = self.c.execute("SELECT * FROM " + self.prefix + "_jokes").fetchall()
+ votewhere = "SELECT COUNT(*) FROM " + self.prefix + "_votes WHERE "
+ users = self.c.execute("SELECT id FROM " + self.prefix + "_users WHERE role='user'").fetchall()
+ users = [u['id'] for u in users]
for joke in jokes:
+ # skip jokes marked as deleted
if not self.c.execute("SELECT COUNT(*) FROM " + self.prefix + "_votes WHERE type='delete' AND joke=?", (joke['id'],)).fetchone()['COUNT(*)'] == 0:
continue
ret_joke = {
- 'id': joke['id'],
+ 'id': joke['id']
}
- ret_joke['upvoted'] = not self.c.execute("SELECT COUNT(*) FROM " + self.prefix + "_votes WHERE joke=? AND user=? AND type='up'", (joke['id'], user)).fetchone()['COUNT(*)'] == 0
- ret_joke['downvoted'] = not self.c.execute("SELECT COUNT(*) FROM " + self.prefix + "_votes WHERE joke=? AND user=? AND type='down'", (joke['id'], user)).fetchone()['COUNT(*)'] == 0
- ret_joke['reported'] = not self.c.execute("SELECT COUNT(*) FROM " + self.prefix + "_votes WHERE joke=? AND user=? AND type='report'", (joke['id'], user)).fetchone()['COUNT(*)'] == 0
+ # mark jokes the user has already interacted with
+ ret_joke['upvoted'] = not self.c.execute(votewhere + "joke=? AND user=? AND type='up'", (joke['id'], user)).fetchone()['COUNT(*)'] == 0
+ ret_joke['downvoted'] = not self.c.execute(votewhere + "joke=? AND user=? AND type='down'", (joke['id'], user)).fetchone()['COUNT(*)'] == 0
+ ret_joke['reported'] = not self.c.execute(votewhere + "joke=? AND user=? AND type='report'", (joke['id'], user)).fetchone()['COUNT(*)'] == 0
+ # allow deletion
ret_joke['mine'] = joke['user'] == user
+ # convert md->html if needed
if joke['format'] == 'markdown':
ret_joke['text'] = Markup(markdown.markdown(joke['text'], extensions=['markdown.extensions.nl2br'], output_format="html5", safe_mode="remove")) # TODO safe_mode deprecated
if joke['format'] == 'html':
ret_joke['text'] = joke['text']
- typemap = (
- ("up", "upvotes"),
- ("down", "downvotes"),
- ("report", "reports")
- )
- for key, tag in typemap:
- ret_joke[tag] = self.c.execute("SELECT COUNT(*) FROM " + self.prefix + "_votes WHERE joke=? AND type=?", (joke['id'], key)).fetchone()['COUNT(*)']
+ ret_joke['reports'] = self.c.execute(votewhere + "joke=? AND type='report'", (joke['id'],)).fetchone()['COUNT(*)']
+ # actual scoring
+ # TODO optimize queries
+ score = 0
+ score += self.c.execute(votewhere + "joke=? AND type='up'", (joke['id'],)).fetchone()['COUNT(*)']
+ score -= self.c.execute(votewhere + "joke=? AND type='down'", (joke['id'],)).fetchone()['COUNT(*)']
+ score -= self.c.execute(votewhere + "joke=? AND type='report'", (joke['id'],)).fetchone()['COUNT(*)'] * 5
+ for u in users:
+ # user's scores count 10 times more
+ score += self.c.execute(votewhere + "joke=? AND type='up' AND user=?", (joke['id'], u)).fetchone()['COUNT(*)'] * 10
+ score -= self.c.execute(votewhere + "joke=? AND type='down' AND user=?", (joke['id'], u)).fetchone()['COUNT(*)'] * 10
+ score -= self.c.execute(votewhere + "joke=? AND type='report' AND user=?", (joke['id'], u)).fetchone()['COUNT(*)'] * 50
+ ret_joke['score'] = score
ret_jokes.append(ret_joke)
- ret_jokes = sorted(ret_jokes, key=self.sort, reverse=True)
+ ret_jokes = sorted(ret_jokes, key=lambda j: j['score'], reverse=True)
if page != None and perpage != None:
return ret_jokes[page*perpage:(page+1)*perpage]
return ret_jokes
diff --git a/templates/index.html b/templates/index.html
index 78d5685..44dfe87 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -50,19 +50,22 @@
<ul class="collection">
{% for joke in jokes %}
<li class="collection-item row valign-wrapper">
- <div class="col s3 m2 valign">
+ <div class="col s2 m1 valign">
+ <div class="center-align">
+ <i class="material-icons left">whatshot</i><span class="right">{{ joke.score }}</span>
+ </div>
<form action="/upvote" method="post">
<input type="hidden" name="id" value="{{ joke.id }}">
<input type="hidden" name="redirpage" value="{{ currentpage }}">
- <button class="col s12 btn{% if joke.reports>0 %}-flat{% endif %}{% if joke.upvoted %} disabled{% endif %}" type="submit">
- <i class="material-icons">thumb_up</i> <span class="btnval" data-original="{% if joke.upvoted %}{{ joke.upvotes-1 }}{% else %}{{ joke.upvotes }}{% endif %}">{{ joke.upvotes }}</span>
+ <button class="btn{% if joke.reports>0 %}-flat{% endif %}{% if joke.upvoted %} disabled{% endif %}" type="submit">
+ <i class="material-icons">thumb_up</i>
</button>
</form>
<form action="/downvote" method="post">
<input type="hidden" name="id" value="{{ joke.id }}">
<input type="hidden" name="redirpage" value="{{ currentpage }}">
- <button class="col s12 btn{% if joke.reports>0 %}-flat{% endif %}{% if joke.downvoted %} disabled{% endif %}" type="submit">
- <i class="material-icons">thumb_down</i> <span class="btnval" data-original="{% if joke.downvoted %}{{ joke.downvotes-1 }}{% else %}{{ joke.downvotes }}{% endif %}">{{ joke.downvotes }}</span>
+ <button class="btn{% if joke.reports>0 %}-flat{% endif %}{% if joke.downvoted %} disabled{% endif %}" type="submit">
+ <i class="material-icons">thumb_down</i>
</button>
</form>
<form action="/report" method="post">
@@ -70,7 +73,7 @@
<input type="hidden" name="redirpage" value="{{ currentpage }}">
<button class="col s12 btn-flat{% if joke.reported %} disabled{% endif %}" type="submit">
<i class="material-icons left">report_problem</i>
- <span class="btnval red-text" data-original="{% if joke.reported %}{{ joke.reports-1 }}{% else %}{{ joke.reports }}{% endif %}">{{ joke.reports }}</span>
+ <span class="red-text">{{ joke.reports }}</span>
</button>
</form>
{% if joke.mine %}
@@ -81,7 +84,7 @@
</form>
{% endif %}
</div>
- <div class="flow-text col s9 m10 {% if joke.reports>0 %}grey-text{% endif %}" style="line-height: 1.5">
+ <div class="flow-text col s10 m11 {% if joke.reports>0 %}grey-text{% endif %}" style="line-height: 1.5">
{{ joke.text|safe }}
</div>
</li>