Overhaul flatpages

* move contents of main.py to __init__.py
* update documentation in README
* change the key/value configuration specification
* added a recipe for passing values from the url to the template
* removed some unused code
This commit is contained in:
Will Kahn-Greene 2012-07-12 19:18:15 -04:00
parent 8815541c26
commit 54b42ee564
3 changed files with 108 additions and 93 deletions

View File

@ -44,27 +44,24 @@ First, let's talk about the route.
A route is a key/value in your configuration file. A route is a key/value in your configuration file.
The key starts with ``path`` and then has a number after that. For The key for the route is the route name You can use this with `url()`
example: ``path1``, ``path2``, ... ``path15``, ... in templates to have MediaGoblin automatically build the urls for
you. It's very handy.
The value has three parts separated by commas: It should be "unique" and it should be alphanumeric characters and
hyphens. I wouldn't put spaces in there.
1. **route name**: You can use this with `url()` in templates to have Examples: ``flatpages-about``, ``about-view``, ``contact-view``, ...
MediaGoblin automatically build the urls for you. It's very handy.
It should be "unique" and it should be alphanumeric characters and The value has two parts separated by commas:
hyphens. I wouldn't put spaces in there.
Examples: ``flatpages-about``, ``about-view``, ``contact-view``, ... 1. **route path**: This is the url that this route matches.
2. **route path**: This is the url that this route matches.
Examples: ``/about``, ``/contact``, ``/pages/about``, ... Examples: ``/about``, ``/contact``, ``/pages/about``, ...
Technically, this is a regular expression and you can do anything You can do anything with this that you can do with the routepath
with this that you can do with the routepath parameter of parameter of `routes.Route`. For more details, see `the routes
`routes.Route`. For more details, see `the routes documentation documentation <http://routes.readthedocs.org/en/latest/>`_.
<http://routes.readthedocs.org/en/latest/>`_.
Example: ``/siteadmin/{adminname:\w+}`` Example: ``/siteadmin/{adminname:\w+}``
@ -75,7 +72,7 @@ The value has three parts separated by commas:
For example: ``'/siteadmin/{adminname:\w+}'`` For example: ``'/siteadmin/{adminname:\w+}'``
3. **template**: The template to use for this url. The template is in 2. **template**: The template to use for this url. The template is in
the flatpagesfile template directory, so you just need to specify the flatpagesfile template directory, so you just need to specify
the file name. the file name.
@ -89,8 +86,14 @@ Here's an example configuration that adds two flat pages: one for an
"About this site" page and one for a "Terms of service" page:: "About this site" page and one for a "Terms of service" page::
[[mediagoblin.plugins.flatpagesfile]] [[mediagoblin.plugins.flatpagesfile]]
page1 = about-view, '/about', about.html about-view = '/about', about.html
page2 = terms-view, '/terms', terms.html terms-view = '/terms', terms.html
.. Note::
The order in which you define the routes in the config file is the
order in which they're checked for incoming requests.
Templates Templates
@ -130,3 +133,29 @@ template::
another, take advantage of Jinja2 template extending and create a another, take advantage of Jinja2 template extending and create a
base template that the others extend. base template that the others extend.
Recipes
=======
Url variables
-------------
You can handle urls like ``/about/{name}`` and access the name that's
passed in in the template.
Sample route::
about-page = '/about/{name}', about.html
Sample template::
{% extends "flatpagesfile/base.html" %}
{% block mediagoblin_content %}
<h1>About page for {{ request.matchdict['name'] }}</h1>
{% endblock %}
See the `the routes documentation
<http://routes.readthedocs.org/en/latest/>`_ for syntax details for
the route. Values will end up in the ``request.matchdict`` dict.

View File

@ -15,6 +15,65 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# This imports the main module which has the FlatPagesPlugin class import logging
# which does all the work. import os
import mediagoblin.plugins.flatpagesfile.main
import jinja2
from routes.route import Route
from mediagoblin.tools import pluginapi
from mediagoblin.tools.response import render_to_response
PLUGIN_DIR = os.path.dirname(__file__)
_log = logging.getLogger(__name__)
@jinja2.contextfunction
def print_context(c):
s = []
for key, val in c.items():
s.append('%s: %s' % (key, repr(val)))
return '\n'.join(s)
def flatpage_handler_builder(template):
"""Flatpage view generator
Given a template, generates the controller function for handling that
route.
"""
def _flatpage_handler_builder(request):
return render_to_response(
request, 'flatpagesfile/%s' % template,
{'request': request})
return _flatpage_handler_builder
class FlatpagesFilePlugin(pluginapi.Plugin):
"""
This is the flatpages plugin class. See the README for how to use
flatpages.
"""
def setup_plugin(self):
self.config = pluginapi.get_config('mediagoblin.plugins.flatpagesfile')
_log.info('Setting up flatpagesfile....')
# Register the template path.
pluginapi.register_template_path(os.path.join(PLUGIN_DIR, 'templates'))
pages = self.config.items()
routes = []
for name, (url, template) in pages:
name = 'flatpagesfile.%s' % name.strip()
controller = flatpage_handler_builder(template)
routes.append(
Route(name, url, controller=controller))
pluginapi.register_routes(routes)
_log.info('Done setting up flatpagesfile!')

View File

@ -1,73 +0,0 @@
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
import os
from routes.route import Route
from mediagoblin.tools import pluginapi
from mediagoblin.tools.response import render_to_response
PLUGIN_DIR = os.path.dirname(__file__)
_log = logging.getLogger(__name__)
def flatpage_handler(template):
"""Flatpage view generator
Given a template, generates the controller function for handling that
route.
"""
def _flatpage_handler(request, *args, **kwargs):
return render_to_response(
request, 'flatpagesfile/%s' % template,
{'args': args, 'kwargs': kwargs})
return _flatpage_handler
class FlatpagesFilePlugin(pluginapi.Plugin):
"""
This is the flatpages plugin class. See the README for how to use
flatpages.
"""
def setup_plugin(self):
self.config = pluginapi.get_config('mediagoblin.plugins.flatpagesfile')
_log.info('Setting up flatpagesfile....')
# Register the template path.
pluginapi.register_template_path(os.path.join(PLUGIN_DIR, 'templates'))
# Set up and register routes.
pages = [(int(key.replace('page', '')), val)
for key, val in self.config.items()
if key.startswith('page')]
pages = [mapping for index, mapping in sorted(pages)]
routes = []
for name, url, template in pages:
name = 'flatpagesfile.%s' % name.strip()
controller = flatpage_handler(template)
routes.append(
Route(name, url, controller=controller))
pluginapi.register_routes(routes)
_log.info('Done setting up flatpagesfile!')