changeset 298:b7ab1b503510

data: Fix incorrect next/previous page URLs in pagination data. Consolidate splitting an URL between its first URL and its sub page number. Be careful about the index page's URL not losing its slash.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 11 Mar 2015 23:46:42 -0700
parents 2823ea40cfac
children 88bffd469b04
files piecrust/data/builder.py piecrust/data/paginator.py piecrust/serving.py piecrust/templating/jinjaengine.py piecrust/uriutil.py
diffstat 5 files changed, 13 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/piecrust/data/builder.py	Tue Mar 10 08:34:45 2015 -0700
+++ b/piecrust/data/builder.py	Wed Mar 11 23:46:42 2015 -0700
@@ -7,7 +7,7 @@
 from piecrust.data.debug import build_debug_info
 from piecrust.data.linker import PageLinkerData
 from piecrust.data.paginator import Paginator
-from piecrust.uriutil import get_slug, get_first_sub_uri
+from piecrust.uriutil import get_slug, split_sub_uri
 
 
 logger = logging.getLogger(__name__)
@@ -29,7 +29,7 @@
 def build_page_data(ctx):
     page = ctx.page
     app = page.app
-    first_uri = get_first_sub_uri(app, ctx.uri)
+    first_uri, _ = split_sub_uri(app, ctx.uri)
 
     pc_data = PieCrustData()
     pgn_source = ctx.pagination_source or get_default_pagination_source(page)
--- a/piecrust/data/paginator.py	Tue Mar 10 08:34:45 2015 -0700
+++ b/piecrust/data/paginator.py	Wed Mar 11 23:46:42 2015 -0700
@@ -212,7 +212,7 @@
     def _getPageUri(self, index):
         uri = self._uri
         if index > 1:
-            if uri != '':
+            if not uri.endswith('/'):
                 uri += '/'
             uri += str(index)
         return uri
--- a/piecrust/serving.py	Tue Mar 10 08:34:45 2015 -0700
+++ b/piecrust/serving.py	Wed Mar 11 23:46:42 2015 -0700
@@ -23,6 +23,7 @@
 from piecrust.processing.base import ProcessorPipeline
 from piecrust.rendering import PageRenderingContext, render_page
 from piecrust.sources.base import PageFactory, MODE_PARSING
+from piecrust.uriutil import split_sub_uri
 
 
 logger = logging.getLogger(__name__)
@@ -222,13 +223,7 @@
 
     def _try_serve_page(self, app, environ, request):
         # Try to find what matches the requested URL.
-        req_path = request.path
-        page_num = 1
-        pgn_suffix_re = app.config.get('__cache/pagination_suffix_re')
-        pgn_suffix_m = re.search(pgn_suffix_re, request.path)
-        if pgn_suffix_m:
-            req_path = request.path[:pgn_suffix_m.start()]
-            page_num = int(pgn_suffix_m.group('num'))
+        req_path, page_num = split_sub_uri(app, request.path)
 
         routes = find_routes(app.routes, req_path)
         if len(routes) == 0:
--- a/piecrust/templating/jinjaengine.py	Tue Mar 10 08:34:45 2015 -0700
+++ b/piecrust/templating/jinjaengine.py	Wed Mar 11 23:46:42 2015 -0700
@@ -18,7 +18,7 @@
 from piecrust.routing import CompositeRouteFunction
 from piecrust.templating.base import (TemplateEngine, TemplateNotFoundError,
                                       TemplatingError)
-from piecrust.uriutil import multi_replace, get_first_sub_uri
+from piecrust.uriutil import multi_replace, split_sub_uri
 
 
 logger = logging.getLogger(__name__)
@@ -176,7 +176,7 @@
         if cpi is None or cpi.page is None or cpi.render_ctx is None:
             raise Exception("Can't paginate when no page has been pushed "
                             "on the execution stack.")
-        first_uri = get_first_sub_uri(self.app, cpi.render_ctx.uri)
+        first_uri, _ = split_sub_uri(self.app, cpi.render_ctx.uri)
         return Paginator(cpi.page, value, first_uri,
                 page_num=cpi.render_ctx.page_num,
                 items_per_page=items_per_page)
--- a/piecrust/uriutil.py	Tue Mar 10 08:34:45 2015 -0700
+++ b/piecrust/uriutil.py	Wed Mar 11 23:46:42 2015 -0700
@@ -80,18 +80,22 @@
     return uri.lstrip('/')
 
 
-def get_first_sub_uri(app, uri):
+def split_sub_uri(app, uri):
     pretty_urls = app.config.get('site/pretty_urls')
     if not pretty_urls:
         uri, ext = os.path.splitext(uri)
 
+    page_num = 1
     pgn_suffix_re = app.config.get('__cache/pagination_suffix_re')
     m = re.search(pgn_suffix_re, uri)
     if m:
         uri = uri[:m.start()]
+        if uri == '':
+            uri = '/'
+        page_num = int(m.group('num'))
 
     if not pretty_urls:
         uri += ext
 
-    return uri
+    return (uri, page_num)