Skip to content
This repository was archived by the owner on Jul 11, 2019. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6e0786f
Modify staticpage backend API to consume multiple languages
Apr 28, 2013
fefaeb8
Implement external rest based staticpage backend
Apr 28, 2013
11a61cc
Render navigation using external rest based API
Apr 28, 2013
ce49234
Adhocracy-service: Change API to get single external static page
Feb 22, 2014
d8833e7
Move all_languages and friends to i18n
May 16, 2013
1e83731
adhocracy-service: Allow to specify base path in staticpages API
Feb 22, 2014
8dd8b89
Better error handling for non-existing static pages
May 16, 2013
56c1b66
Allow hierarchical static pages
Jun 3, 2013
a5d07ed
Remove static page sidebar div within main_content
Jun 12, 2013
7eb2aa6
Add second permission level for static page views
Jun 23, 2013
124fb53
Allow to mark external static pages as private
Mar 31, 2014
f864bf9
Fix current external navigation item
Mar 31, 2014
f6ca298
Allow to split mediacenter and staticpages services
Jan 10, 2014
46aa1c1
extended KottStaticPages backend
Mar 31, 2014
91bf8a2
change template for static pages
Jan 13, 2014
ab82fdc
Remove inner template blocks which also exists in inherited template
Jan 15, 2014
aaad64c
Optionally allow unverified staticpages / mediacenter SSL API calls
Jan 15, 2014
61fdba9
extend kotti static pages backend with redirect_url data
joka Jan 15, 2014
cb2e69c
Adapt CHANGES
Mar 31, 2014
6c78837
Deterministic staticpage query strings by using ordereddict
Jan 24, 2014
9b673ef
allow to display full width static pages (w/o sidebar)
Mar 24, 2014
253ab78
Fix database staticpage backend
Mar 31, 2014
3608205
Allow to access all database staticpage edit pages
Mar 31, 2014
4f31443
fix use_external_navigation config option defaults
Mar 31, 2014
f5f99d4
Make database StaticPage model inherit from StaticPageBase
Mar 31, 2014
7d1bd77
Escape external navigation
Mar 31, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Adhocracy Changelog
===================

2.3.0 (unreleased)
------------------

- Add external StaticPage backend which can be used with the adhocracy.kotti
or the adhocracy.plone backend.



2.2.1 (2014-03-21)
------------------

Expand Down
5 changes: 4 additions & 1 deletion etc/adhocracy.ini.in
Original file line number Diff line number Diff line change
Expand Up @@ -396,9 +396,12 @@ adhocracy.startpage.proposals.list_length = 0
# enable displaying of proposal descriptions in the pager
# adhocracy.proposal_pager_inline = True

# Source for imprint, details etc. ("database" or "filesystem" (default))
# Source for imprint, details etc. ("database", "external" or "filesystem" (default))
#adhocracy.staticpage_backend = database

# Use external staticpages API call to render navigation
# adhocracy.use_external_navigation = true

# Configure paths to static content which is inserted

# Static content path for start page (default: index)
Expand Down
1 change: 1 addition & 0 deletions src/adhocracy/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
'adhocracy.tagcloud_facet': False,
'adhocracy.themed': False,
'adhocracy.use_avatars': True,
'adhocracy.use_external_navigation': False,
'adhocracy.use_feedback_instance': False,
'adhocracy.use_test_instance': True,
'adhocracy.user.display_name.allow_change': True,
Expand Down
6 changes: 3 additions & 3 deletions src/adhocracy/config/routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -519,13 +519,13 @@ def make_map(config):
map.connect('/static{.format}', controller='static', action='make_new',
conditions=dict(method=['POST']))
map.connect('/static/new{.format}', controller='static', action='new')
map.connect('/static/{key}_{lang}',
map.connect('/static/edit/{lang}/*key',
controller='static', action='edit',
conditions=dict(method=['GET', 'HEAD']))
map.connect('/static/{key}_{lang}{.format}',
map.connect('/static/edit/{lang}/*(key){.format}',
controller='static', action='update',
conditions=dict(method=['POST']))
map.connect('/static/{key}{.format}', controller='static',
map.connect('/static/*(key){.format}', controller='static',
action='serve')
map.connect('/outgoing_link/{url_enc}', controller='redirect',
action='outgoing_link',
Expand Down
16 changes: 9 additions & 7 deletions src/adhocracy/controllers/static.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
from pylons.i18n import _

from adhocracy import forms
from adhocracy import i18n
from adhocracy.lib import helpers
from adhocracy.lib.auth import guard, csrf
from adhocracy.lib.base import BaseController
from adhocracy.lib.staticpage import (get_static_page, get_backend,
all_languages, all_language_infos,
render_body)
from adhocracy.lib.templating import render, ret_abort

Expand All @@ -30,7 +30,7 @@ class EditForm(formencode.Schema):

class NewForm(EditForm):
key = forms.StaticPageKey()
lang = validators.OneOf(set(all_languages()))
lang = validators.OneOf(set(i18n.all_languages()))


class StaticController(BaseController):
Expand All @@ -50,7 +50,7 @@ def index(self):
@guard_perms
def new(self, errors=None, format=u'html'):
data = {
'all_language_infos': list(all_language_infos())
'all_language_infos': list(i18n.all_language_infos())
}
defaults = dict(request.params)
defaults['_tok'] = csrf.token_id()
Expand All @@ -77,15 +77,15 @@ def make_new(self):

backend.create(key,
lang,
form_result.get('title'),
form_result.get('body'))
form_result.get('body'),
form_result.get('title'))
helpers.flash(_('Page updated'), 'notice')
return redirect(helpers.base_url('/static'))

@guard_perms
def edit(self, key, lang, errors=None, format=u'html'):
backend = get_backend()
sp = backend.get(key, lang)
sp = backend.get(key, [lang])
if not sp:
return ret_abort(_('Cannot find static page to edit'), code=404)
data = {'staticpage': sp}
Expand All @@ -103,7 +103,7 @@ def edit(self, key, lang, errors=None, format=u'html'):
@csrf.RequireInternalRequest(methods=['POST'])
def update(self, key, lang):
backend = get_backend()
sp = backend.get(key, lang)
sp = backend.get(key, [lang])
if not sp:
return ret_abort(_('Cannot find static page to edit'), code=404)

Expand All @@ -124,6 +124,8 @@ def serve(self, key, format='html'):
if page is None:
return abort(404, _('The requested page was not found'))
c.body_css_classes += page.css_classes
if page.redirect_url != u'':
return redirect(page.redirect_url)
data = {
'static': page,
'body_html': render_body(page.body),
Expand Down
28 changes: 28 additions & 0 deletions src/adhocracy/i18n/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,34 @@ def get_default_locale():
return babel.Locale.parse('en_US')


def all_locales(include_preferences=False):

def all_locales_mult():
if include_preferences:
yield c.locale
yield get_default_locale()
for l in LOCALES:
yield l

done = set()

for value in all_locales_mult():
if value in done:
continue
else:
done.add(value)
yield value


def all_languages(include_preferences=False):
return (l.language for l in all_locales(include_preferences))


def all_language_infos(include_preferences=False):
return ({'id': l.language, 'name': l.language_name}
for l in all_locales(include_preferences))


def handle_request():
"""
Given a request, try to determine the appropriate locale to use for the
Expand Down
60 changes: 60 additions & 0 deletions src/adhocracy/lib/helpers/adhocracy_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import requests
from collections import OrderedDict

from adhocracy import config
from adhocracy import i18n


class RESTAPI(object):
"""Helper to work with the adhocarcy_service rest api
(adhocracy_kotti.mediacenter, adhocracy_kotti.staticpages, plone).
"""

session = requests.Session()

def __init__(self):
self.staticpages_api_token = config.get(
'adhocracy_service.staticpages.rest_api_token',
config.get('adhocracy_service.rest_api_token', ''))
self.staticpages_api_address = config.get(
'adhocracy_service.staticpages.rest_api_address',
config.get('adhocracy_service.rest_api_address', ''))
self.staticpages_verify = config.get_bool(
'adhocracy_service.staticpages.verify_ssl',
config.get_bool('adhocracy_service.verify_ssl', True))
self.staticpages_headers = {"X-API-Token": self.staticpages_api_token}

def staticpages_get(self, base=None, languages=None):
if languages is None:
languages = i18n.all_languages(include_preferences=True)
params = OrderedDict({
'lang': languages
})
if base is not None:
params['base'] = base
request = requests.Request("GET",
url='%s%s' % (
self.staticpages_api_address,
"staticpages",
),
params=params,
headers=self.staticpages_headers)
return self.session.send(request.prepare(),
verify=self.staticpages_verify)

def staticpage_get(self, path, languages=None):
if languages is None:
languages = i18n.all_languages(include_preferences=True)
request = requests.Request("GET",
url='%s%s' % (
self.staticpages_api_address,
'staticpages/single',
),
params=OrderedDict({
'path': path,
'lang': languages,
}),
headers=self.staticpages_headers)

return self.session.send(request.prepare(),
verify=self.staticpages_verify)
51 changes: 51 additions & 0 deletions src/adhocracy/lib/helpers/staticpage_helper.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
from itertools import izip
import logging
import babel.core

from adhocracy import config
from adhocracy.lib import cache, staticpage
from adhocracy.lib.helpers import url as _url
from adhocracy.lib.helpers.adhocracy_service import RESTAPI

log = logging.getLogger(__name__)


@cache.memoize('staticpage_url')
Expand Down Expand Up @@ -43,3 +48,49 @@ def render_footer_column(instance, column):

def breadcrumbs(staticpage):
return _url.root() + _url.link(staticpage.title, url(staticpage))


def use_external_navigation():
return config.get_bool('adhocracy.use_external_navigation', False)


def render_external_navigation(current_key):
api = RESTAPI()
base = config.get('adhocracy.kotti_navigation_base', None)
result = api.staticpages_get(base=base)
nav = result.json()
if nav is None or not nav.get('children'):
log.error('External navigation not found for configured languages')
return ''

def render_navigation_item(item, path='', toplevel=False):
from adhocracy.lib.templating import render_def

if path != '':
path = '%s/%s' % (path, item['name'])
else:
path = item['name']

url = '/static/%s.html' % path

contains_current = (path == current_key)
if item['children']:
children, contained_list = izip(
*map(lambda child: render_navigation_item(child, path),
item['children']))
contains_current = contains_current or any(contained_list)
else:
children = []

html = render_def('static/tiles.html', 'navigation_item',
href=url,
title=item['title'],
current=toplevel and contains_current,
children=children)

return (html, contains_current)

html_list, _ = izip(
*map(lambda child: render_navigation_item(child, toplevel=True),
nav['children']))
return '\n'.join(html_list)
1 change: 1 addition & 0 deletions src/adhocracy/lib/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ def included_groups(groups):
u'proposal.view': [anonymous],
u'proposal.message': [moderator],
u'static.show': [anonymous],
u'static.show_private': [admins],
u'tag.create': [advisor],
u'tag.delete': [advisor],
u'tag.show': [anonymous],
Expand Down
Loading