--- 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"]: