diff --git a/cron.yaml b/cron.yaml index 0c3819a..7b27f94 100755 --- a/cron.yaml +++ b/cron.yaml @@ -1,7 +1,7 @@ cron: - description: Keep top news with updated karma url: /tasks/update_top_karma - schedule: every 20 minutes + schedule: every 1 minutes - description: daily session cleanup url: /tasks/cleanup_sessions schedule: every 24 hours diff --git a/crons.py b/crons.py index 73477ee..96efe87 100755 --- a/crons.py +++ b/crons.py @@ -29,12 +29,13 @@ from gaesessions import delete_expired_sessions from models import User, Post, Comment, Vote +from random import choice class TopHandler(webapp.RequestHandler): def get(self): - posts = Post.all().order('-karma').fetch(100) - for post in posts: - post.calculate_karma() + posts = Post.all().order('-karma').fetch(50) + post = choice(posts) + post.calculate_karma() self.response.out.write("ok") class SessionsHandler(webapp.RequestHandler): diff --git a/main.py b/main.py index 985ace8..49a2f79 100755 --- a/main.py +++ b/main.py @@ -28,7 +28,7 @@ from urlparse import urlparse from datetime import datetime -from models import User, Post, Comment, Vote, prefetch_refprops +from models import User, Post, Comment, Vote, prefetch_posts_list template.register_template_library('CustomFilters') @@ -289,7 +289,7 @@ def get(self): if session.has_key('user'): user = session['user'] posts = Post.all().order('-karma').fetch(perPage, realPage * perPage) - prefetch_refprops(posts, Post.user) + prefetch_posts_list(posts) i = perPage * realPage + 1 for post in posts: post.number = i @@ -310,7 +310,7 @@ def get(self): if session.has_key('user'): user = session['user'] posts = Post.all().order('-created').fetch(perPage,perPage * realPage) - prefetch_refprops(posts, Post.user) + prefetch_posts_list(posts) i = perPage * realPage + 1 for post in posts: post.number = i diff --git a/models.py b/models.py index 929c769..299f799 100755 --- a/models.py +++ b/models.py @@ -28,13 +28,42 @@ from datetime import datetime def prefetch_refprops(entities, *props): - fields = [(entity, prop) for entity in entities for prop in props] - ref_keys = [prop.get_value_for_datastore(x) for x, prop in fields] - ref_entities = dict((x.key(), x) for x in db.get(set(ref_keys))) - for (entity, prop), ref_key in zip(fields, ref_keys): - if ref_entities[ref_key]: - prop.__set__(entity, ref_entities[ref_key]) - return entities + fields = [(entity, prop) for entity in entities for prop in props] + ref_keys = [prop.get_value_for_datastore(x) for x, prop in fields] + ref_entities = dict((x.key(), x) for x in db.get(set(ref_keys))) + for (entity, prop), ref_key in zip(fields, ref_keys): + if ref_entities[ref_key]: + prop.__set__(entity, ref_entities[ref_key]) + return entities + +def prefetch_posts_list(posts): + prefetch_refprops(posts, Post.user) + posts_keys = [str(post.key()) for post in posts] + + # get user, if no user, all already_voted = no + session = get_current_session() + if session.has_key('user'): + user = session['user'] + memcache_voted = memcache.get_multi(["vp_" + post_key + "_" + str(user.key()) for post_key in posts_keys]) + memcache_to_add = {} + for post in posts: + logging.info("Got a post") + vote_value = memcache_voted.get(str(post.key())) + if vote_value is not None: + post.prefetched_already_voted = vote_value == 1 + else: + vote = Vote.all().filter("user =", user).filter("post =", post).fetch(1) + memcache_to_add["vp_" + str(post.key()) + "_" + str(user.key())] = len(vote) + post.prefetched_already_voted = len(vote) == 1 + if memcache_to_add.keys(): + memcache.add_multi(memcache_to_add, 3600) + else: + for post in posts: + post.prefetched_already_voted = False + # for voted in memcache_voted: + + # TODO get comment count + # TODO get already voted # Models class User(db.Model): @@ -101,14 +130,11 @@ def already_voted(self): # hit memcache for this memValue = data = memcache.get("vp_" + str(self.key()) + "_" + str(user.key())) if memValue is not None: - return True + return memValue == 1 else: - vote = [v for v in self.votes if v.user.key() == user.key()] - if len(vote) == 0: - return False - else: - memcache.add("vp_" + str(self.key()) + "_" + str(user.key()), 1, 3600) - return True + vote = Vote.all().filter("user =", user).filter("post =", post).fetch(1) + memcache.add("vp_" + str(self.key()) + "_" + str(user.key()), len(vote), 3600) + return len(vote) == 1 else: return False diff --git a/templates/post_bit.html b/templates/post_bit.html index 35ae2a9..521da59 100644 --- a/templates/post_bit.html +++ b/templates/post_bit.html @@ -3,7 +3,7 @@ {% if post.number %} {{post.number}}.- {% endif %} - {% if post.already_voted %} + {% if post.prefetched_already_voted %} ^
{% else %} ^