diff --git a/app/routes/forum/index.py b/app/routes/forum/index.py index c20a4c7..72ee06c 100644 --- a/app/routes/forum/index.py +++ b/app/routes/forum/index.py @@ -3,6 +3,10 @@ from app.models.forum import Forum from app import app @app.route('/forum') -def forum(): +def forum_index(): main_forum = Forum.query.filter_by(parent=None).first() return render('/forum/index.html', main_forum=main_forum) + +@app.route('/forum/') +def forum_page(f): + return render('/forum/forum.html', f=f) diff --git a/app/templates/forum/forum.html b/app/templates/forum/forum.html new file mode 100644 index 0000000..6f675d7 --- /dev/null +++ b/app/templates/forum/forum.html @@ -0,0 +1,11 @@ +{% extends "base/base.html" %} + +{% block title %} +Forum de Planète Casio »

{{ f.name }}

+{% endblock %} + +{% block content %} +
+ {{ f.descr }} +
+{% endblock %} diff --git a/app/utils/converters.py b/app/utils/converters.py index 1f6097f..7ebf4b0 100644 --- a/app/utils/converters.py +++ b/app/utils/converters.py @@ -1,17 +1,38 @@ """ utils.converter: Custom URL converters to match patterns in @app.route() + +The Flask documentation is elusive on this topic. To add a new converter, +proceed as follows: + +1. Define a new converter class. +2. Set the [regex] attribute to decide which portion of the URL will be + considered for conversion (apparently the default is everything until next + slash or end of string). +3. Define the to_python() and to_url() methods to actually convert. +4. Add the class to __all__ at the bottom of this file. +5. In app/__init__.py, add a dictionary entry to [app.url_map.converters]. + +For more information, see the Werkzeug documentation: + """ -from werkzeug.routing import BaseConverter +from werkzeug.routing import BaseConverter, ValidationError from app.models.forum import Forum import re +import sys class ForumConverter(BaseConverter): + # This regex will decide which portion of the URL is matched by the curtom + # converter. By default, slashes are not included, so we must add them. + regex = r'[a-z/]+' + def to_python(self, url): + print(f"ForumConverter url from '{url}'", file=sys.stderr) + url = '/' + url f = Forum.query.filter_by(url=url).first() if f is None: - raise Exception(f"ForumConverter: no forum with url {value}") + raise ValidationError(f"ForumConverter: no forum with url {url}") return f def to_url(self, forum): @@ -19,9 +40,12 @@ class ForumConverter(BaseConverter): class TopicSlugConverter(BaseConverter): + # Only catch integers followed by an optional slug string + regex = r'(\d+)(?:-[\w-]*)?' + def to_python(self, url): """Convert an URL pattern to a Python object, or raise an exception.""" - m = re.fullmatch(r'(\d+)(?:-[\w-]*)?', url) + m = re.fullmatch(TopicSlugConverter.regex, url) if m is None: raise Exception(f"TopicSlugConverter: conversation failed")