2
from random import randrange
3
from random import sample
4
from urllib.parse import urlsplit
6
from jinja2 import Environment
7
from jinja2 import FileSystemLoader
8
from werkzeug.local import Local
9
from werkzeug.local import LocalManager
10
from werkzeug.routing import Map
11
from werkzeug.routing import Rule
12
from werkzeug.utils import cached_property
13
from werkzeug.wrappers import Response
15
TEMPLATE_PATH = path.join(path.dirname(__file__), "templates")
16
STATIC_PATH = path.join(path.dirname(__file__), "static")
17
ALLOWED_SCHEMES = frozenset(["http", "https", "ftp", "ftps"])
18
URL_CHARS = "abcdefghijkmpqrstuvwxyzABCDEFGHIJKLMNPQRST23456789"
21
local_manager = LocalManager([local])
22
application = local("application")
24
url_map = Map([Rule("/static/<file>", endpoint="static", build_only=True)])
26
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_PATH))
29
def expose(rule, **kw):
31
kw["endpoint"] = f.__name__
32
url_map.add(Rule(rule, **kw))
38
def url_for(endpoint, _external=False, **values):
39
return local.url_adapter.build(endpoint, values, force_external=_external)
42
jinja_env.globals["url_for"] = url_for
45
def render_template(template, **context):
47
jinja_env.get_template(template).render(**context), mimetype="text/html"
52
return urlsplit(url)[0] in ALLOWED_SCHEMES
56
return "".join(sample(URL_CHARS, randrange(3, 9)))
60
def __init__(self, results, per_page, page, endpoint):
61
self.results = results
62
self.per_page = per_page
64
self.endpoint = endpoint
68
return len(self.results)
73
((self.page - 1) * self.per_page) : (
74
((self.page - 1) * self.per_page) + self.per_page
79
def has_previous(self):
80
"""Return True if there are pages before the current one."""
85
"""Return True if there are pages after the current one."""
86
return self.page < self.pages
90
"""Return the URL for the previous page."""
91
return url_for(self.endpoint, page=self.page - 1)
95
"""Return the URL for the next page."""
96
return url_for(self.endpoint, page=self.page + 1)
100
"""Return the number of pages."""
101
return max(0, self.count - 1) // self.per_page + 1