src/catedit/__init__.py
changeset 45 1506da593f40
parent 42 dac9b1248e0f
child 46 5bd3fb023396
--- a/src/catedit/__init__.py	Tue Feb 17 12:07:08 2015 +0100
+++ b/src/catedit/__init__.py	Fri Feb 20 10:55:54 2015 +0100
@@ -5,9 +5,11 @@
 
 from logging import FileHandler, Formatter
 import os
+import re
 from catedit.version import CURRENT_VERSION
+from requests import request
 
-from flask import Flask, session
+from flask import Flask, session, request, url_for
 from flask_wtf.csrf import CsrfProtect
 from flask.ext.github import GitHub
 from flask.ext.cache import Cache
@@ -18,7 +20,6 @@
 # Set up app
 app = Flask(__name__)
 app.config.from_object(AppSettings)
-cache = Cache(app, config={"CACHE_TYPE": "simple"})
 app_configured = False
 try:
     from catedit.config import AppConfig
@@ -34,6 +35,8 @@
 if not app_configured:
     raise Exception("Catedit not configured")
 
+cache = Cache(app, config=app.config["CACHE_CONFIG"])
+
 # CSRF protection
 CsrfProtect(app)
 
@@ -58,11 +61,76 @@
         # logger.debug("I made an authentified request")
         return session["user_code"]
 
+def log_api_rate(r, *args, **kwargs):
+    """
+        Utility hook function to link to every github call as a kwarg so the
+        app logs how many requests can still be made, after the current request
+    """
+    app.logger.debug(
+        str(r.request.method) + " "
+        + str(r.url) + " - "
+        + "Remaining requests count: "
+        + str(r.headers["X-RateLimit-Remaining"]) + "/"
+        + str(r.headers["X-RateLimit-Limit"])
+    )
+
+def save_links(r, *args, **kwargs):
+    """
+        Utility hook function that stores the links in the header of
+        the response in order to use them for further API requests.
+
+        After that hook, the entry "pagination_links" in session is updated
+        with last page and current_page, as well as the resource to request
+        from for each header link
+    """
+    session["pagination_links"] = {}
+    log_api_rate(r, *args, **kwargs)
+    if r.headers.get("link", None) is not None:
+        session["pagination_links"] = r.links
+        for (key, item) in session["pagination_links"].items():
+            resource = item["url"][len(github.BASE_URL):]
+            item["url"] = resource
+        if session["pagination_links"].get("next", None) is not None:
+            page_arg = re.search(
+                "(\?|&)page=\d",
+                string=session["pagination_links"]["next"]["url"]
+            )
+            session["pagination_links"]["current_page"] = int(
+                page_arg.group(0)[-1]
+            )-1
+            if session["pagination_links"].get("last", None) is not None:
+                last_page_arg = re.search(
+                    "(\?|&)page=\d",
+                    string=session["pagination_links"]["last"]["url"]
+                )
+                session["pagination_links"]["last_page"] = int(
+                    page_arg.group(0)[-1]
+                )
+            else:
+                # We don't know what is the last page (case: github commits
+                # API)
+                session["pagination_links"]["last_page"] = -1
+        elif session["pagination_links"].get("prev", None) is not None:
+            # This means we're at the last page
+            page_arg = re.search(
+                "(\?|&)page=\d",
+                string=session["pagination_links"]["prev"]["url"]
+            )
+            session["pagination_links"]["current_page"] = int(
+                page_arg.group(0)[-1]
+            )+1
+            session["pagination_links"] \
+                   ["last_page"] = session["pagination_links"]["current_page"]
+        else:
+            session["pagination_links"]["current_page"] = 1
+            session["pagination_links"]["last_page"] = 1
+    else:
+        session.pop("pagination_links", None)
+
 # Api
 api = Api(app)
 
 # Version
-
 app.config["CURRENT_VERSION"] = CURRENT_VERSION
 
 # Views and APIs
@@ -82,6 +150,18 @@
                  '/category-changes',
                  endpoint='category_changes')
 
+# Pagination utility functions for templates
+def url_for_other_page(page):
+    args = request.view_args.copy()
+    args['page'] = page
+    return url_for(request.endpoint, **args)
+app.jinja_env.globals['url_for_other_page'] = url_for_other_page
+
+def url_for_other_per_page(per_page):
+    args = request.view_args.copy()
+    args['per_page'] = per_page
+    return url_for(request.endpoint, **args)
+app.jinja_env.globals['url_for_other_per_page'] = url_for_other_per_page
 
 # Set up logging
 if app.config["LOGGING_CONFIG"]["IS_LOGGING"]: