# HG changeset patch # User Sverre Rabbelier # Date 1235177157 0 # Node ID 5d0f80ad7b9f2a55d4484436455bbb05d75f915d # Parent 50e989482d1bb408dcfafdf8022a4822bdf8846a Add caching to the homepage Homepage is flushed when the home document is changed. Patch by: Sverre Rabbelier diff -r 50e989482d1b -r 5d0f80ad7b9f app/soc/cache/home.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/soc/cache/home.py Sat Feb 21 00:45:57 2009 +0000 @@ -0,0 +1,92 @@ +#!/usr/bin/python2.5 +# +# Copyright 2009 the Melange authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Module contains sidebar memcaching functions. +""" + +__authors__ = [ + '"Sverre Rabbelier" ', + ] + + +import logging + +from google.appengine.api import memcache +from google.appengine.api import users + +import soc.cache.base + + +def key(entity): + """Returns the memcache key for the user's sidebar. + """ + + return 'homepage_for_%s_%s' % (entity.kind(), entity.key().name()) + + +def get(self, *args, **kwargs): + """Retrieves the sidebar for the specified user from the memcache. + """ + + # only cache the page for non-logged-in users + # TODO: figure out how to cache everything but the sidebar + if users.get_current_user(): + return (None, None) + + entity = self._logic.getFromKeyFields(kwargs) + + # if we can't retrieve the entity, leave it to the actual method + if not entity: + return (None, None) + + memcache_key = key(entity) + logging.info("Retrieving %s" % memcache_key) + return memcache.get(memcache_key), memcache_key + +def put(result, memcache_key, *args, **kwargs): + """Sets the sidebar for the specified user in the memcache. + + Args: + sidebar: the sidebar to be cached + """ + + # no sense in storing anything if we won't query it later on + if users.get_current_user(): + return + + # Store sidebar for just ten minutes to force a refresh every so often + retention = 10*60 + + logging.info("Setting %s" % memcache_key) + memcache.add(memcache_key, result, retention) + + +def flush(entity): + """Removes the sidebar for the current user from the memcache. + + Also calls soc.cache.rights.flush for the specified user. + + Args: + id: defaults to the current account if not set + """ + + memcache_key = key(entity) + logging.info("Flushing %s" % memcache_key) + memcache.delete(memcache_key) + + +# define the cache function +cache = soc.cache.base.getCacher(get, put) diff -r 50e989482d1b -r 5d0f80ad7b9f app/soc/logic/models/document.py --- a/app/soc/logic/models/document.py Sat Feb 21 00:45:19 2009 +0000 +++ b/app/soc/logic/models/document.py Sat Feb 21 00:45:57 2009 +0000 @@ -23,6 +23,7 @@ from soc.cache import sidebar +from soc.cache import home from soc.logic.models import work from soc.logic.models import linkable as linkable_logic @@ -67,6 +68,11 @@ if (name == 'is_featured') and (entity.is_featured != value): sidebar.flush() + home_for = entity.home_for + + if (name != 'home_for') and home_for: + home.flush(home_for) + return True diff -r 50e989482d1b -r 5d0f80ad7b9f app/soc/views/models/presence.py --- a/app/soc/views/models/presence.py Sat Feb 21 00:45:19 2009 +0000 +++ b/app/soc/views/models/presence.py Sat Feb 21 00:45:57 2009 +0000 @@ -27,6 +27,7 @@ from django import forms from django.utils.translation import ugettext +from soc.cache import home from soc.logic import cleaning from soc.logic import dicts from soc.logic import validate @@ -93,6 +94,7 @@ super(View, self).__init__(params=params) + @home.cache @decorators.check_access def home(self, request, access_type, page_name=None, params=None, **kwargs):