aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fietsboek/pages.py45
1 files changed, 17 insertions, 28 deletions
diff --git a/fietsboek/pages.py b/fietsboek/pages.py
index f11b126..8baf02b 100644
--- a/fietsboek/pages.py
+++ b/fietsboek/pages.py
@@ -1,9 +1,11 @@
"""Module containing logic to support "static" pages."""
import enum
import re
+from pathlib import Path
from typing import List, Optional
import markdown
+from pyramid.request import Request
class PageException(Exception):
@@ -34,7 +36,7 @@ class Page:
:vartype link_name: str
:ivar locale_filter: An (optional) pattern that determines whether the page
should be shown to certain locales only.
- :vartype locale_filter: list[re.Pattern]
+ :vartype locale_filter: Optional[List[re.Pattern]]
:ivar user_filter: A filter that determines if the page should be shown to
certain users only.
:vartype user_filter: UserFilter
@@ -44,13 +46,13 @@ class Page:
def __init__(
self,
- slug,
- title,
- content,
- link_name,
- locale_filter=None,
- user_filter=UserFilter.EVERYONE,
- menu_index=0,
+ slug: str,
+ title: str,
+ content: str,
+ link_name: str,
+ locale_filter: Optional[List[re.Pattern]] = None,
+ user_filter: UserFilter = UserFilter.EVERYONE,
+ menu_index: int = 0,
):
# pylint: disable=too-many-arguments
self.slug = slug
@@ -61,14 +63,12 @@ class Page:
self.user_filter = user_filter
self.menu_index = menu_index
- def matches(self, request):
+ def matches(self, request: Request) -> bool:
"""Checks whether the page matches the given request regarding the
locale and user filters.
:param request: The request to check against.
- :type request: pyramid.request.Request
:return: Whether the page matches the user.
- :rtype: bool
"""
if self.user_filter == UserFilter.LOGGED_IN and not request.identity:
return False
@@ -83,16 +83,14 @@ class Page:
return True
@classmethod
- def parse(cls, text):
+ def parse(cls, text: str) -> "Page":
"""Parses a :class:`Page` from the given textual source.
This populates all metadata with the metadata from the file.
:raises PageException: If there are missing metadata fields.
:param text: Source to parse.
- :type text: str
:return: The parsed page.
- :rtype: Page
"""
# Pylint doesn't know about the Markdown extensions:
# pylint: disable=no-member
@@ -145,11 +143,10 @@ class Pages:
def __init__(self):
self.collection = []
- def load_file(self, path):
+ def load_file(self, path: Path):
"""Load a page from a file.
:param path: The path of the file to load.
- :type path: pathlib.Path
:raises PageException: If the page is malformed.
"""
source = path.read_text()
@@ -166,19 +163,18 @@ class Pages:
self.collection.append(page)
self.collection.sort(key=lambda page: page.menu_index)
- def load_directory(self, path):
+ def load_directory(self, path: Path):
"""Load a directory full of pages.
This attemps to load and file in the given directory ending with ".md".
:param path: The path of the directory to load.
- :type path: pathlib.Path
:raises PageException: If a page is malformed.
"""
for child in path.glob("*.md"):
self.load_file(child)
- def find(self, slug, request=None):
+ def find(self, slug: str, request: Optional[Request] = None) -> Optional[Page]:
"""Finds the page matching the given slug.
If a request is given, the filtering based on locale/logged in state is applied.
@@ -187,33 +183,26 @@ class Pages:
page is found, ``None`` is returned.
:param slug: The slug of the page:
- :type slug: str
:param request: The request to filter against.
- :type request: pyramid.request.Request
:return: The page, if any is found.
- :rtype: Page
"""
for page in self.collection:
if page.slug == slug and (request is None or page.matches(request)):
return page
return None
- def pre_menu_items(self, request):
+ def pre_menu_items(self, request: Request) -> List[Page]:
"""Return all items that should appear before Fietsboek's main menu.
:param request: The request to filter against.
- :type request: pyramid.request.Request
:return: A list of menu entries to show.
- :rtype: list[Page]
"""
return [page for page in self.collection if page.menu_index < 0 and page.matches(request)]
- def post_menu_items(self, request):
+ def post_menu_items(self, request: Request) -> List[Page]:
"""Return all items that should appear after Fietsboek's main menu.
:param request: The request to filter against.
- :type request: pyramid.request.Request
:return: A list of menu entries to show.
- :rtype: list[Page]
"""
return [page for page in self.collection if page.menu_index > 0 and page.matches(request)]