diff rhodecode/controllers/summary.py @ 1607:e886f91fcb71 beta

Cached readme generation - cleaned up cache system
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 28 Oct 2011 02:40:22 +0200
parents df59c0503636
children 8384eaabeb19
line wrap: on
line diff
--- a/rhodecode/controllers/summary.py	Thu Oct 27 19:05:37 2011 +0200
+++ b/rhodecode/controllers/summary.py	Fri Oct 28 02:40:22 2011 +0200
@@ -36,7 +36,9 @@
 from pylons import tmpl_context as c, request, url
 from pylons.i18n.translation import _
 
-from rhodecode.model.db import Statistics
+from beaker.cache import cache_region, region_invalidate
+
+from rhodecode.model.db import Statistics, CacheInvalidation
 from rhodecode.lib import ALL_READMES, ALL_EXTS
 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
 from rhodecode.lib.base import BaseRepoController, render
@@ -50,7 +52,7 @@
 
 log = logging.getLogger(__name__)
 
-README_FILES = [''.join([x[0][0], x[1][0]]) for x in 
+README_FILES = [''.join([x[0][0], x[1][0]]) for x in
                     sorted(list(product(ALL_READMES, ALL_EXTS)),
                            key=lambda y:y[0][1] + y[1][1])]
 
@@ -166,32 +168,43 @@
         if c.enable_downloads:
             c.download_options = self._get_download_links(c.rhodecode_repo)
 
-        c.readme_data,c.readme_file = self.__get_readme_data()
+        c.readme_data, c.readme_file = self.__get_readme_data(c.rhodecode_repo)
         return render('summary/summary.html')
 
-    def __get_readme_data(self):
-        readme_data = None
-        readme_file = None
-        
-        try:
-            cs = c.rhodecode_repo.get_changeset('tip')
-            renderer = MarkupRenderer()
-            for f in README_FILES:
-                try:
-                    readme = cs.get_node(f)
-                    readme_file = f
-                    readme_data = renderer.render(readme.content, f)
-                    break
-                except NodeDoesNotExistError:
-                    continue
-        except ChangesetError:
-            pass
-        except EmptyRepositoryError:
-            pass
-        except Exception:
-            log.error(traceback.format_exc())        
+    def __get_readme_data(self, repo):
 
-        return readme_data, readme_file
+        @cache_region('long_term')
+        def _get_readme_from_cache(key):
+            readme_data = None
+            readme_file = None
+            log.debug('Fetching readme file')
+            try:
+                cs = repo.get_changeset('tip')
+                renderer = MarkupRenderer()
+                for f in README_FILES:
+                    try:
+                        readme = cs.get_node(f)
+                        readme_file = f
+                        readme_data = renderer.render(readme.content, f)
+                        log.debug('Found readme %s' % readme_file)
+                        break
+                    except NodeDoesNotExistError:
+                        continue
+            except ChangesetError:
+                pass
+            except EmptyRepositoryError:
+                pass
+            except Exception:
+                log.error(traceback.format_exc())
+
+            return readme_data, readme_file
+
+        key = repo.name + '_README'
+        inv = CacheInvalidation.invalidate(key)
+        if inv is not None:
+            region_invalidate(_get_readme_from_cache, None, key)
+            CacheInvalidation.set_valid(inv.cache_key)
+        return _get_readme_from_cache(key)
 
     def _get_download_links(self, repo):