diff options
| -rw-r--r-- | app.py | 43 | ||||
| -rw-r--r-- | templates/index.html | 17 |
2 files changed, 35 insertions, 25 deletions
@@ -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> |
