• Home
  • Module code
  • wte
  • wte.views
  • wte.views.admin

Source code for wte.views.admin

# -*- coding: utf-8 -*-
"""
#############################################
:mod:`wte.views.admin` -- Admin view handlers
#############################################

The :mod:`~wte.views.admin` handles the requests relating to general
administrative functionality.

Routes are defined in :func:`~wte.views.admin.init`.

.. moduleauthor:: Mark Hall <mark.hall@work.room3b.eu>
"""
import transaction

from pyramid.httpexceptions import HTTPSeeOther
from pyramid.view import view_config
from pywebtools.pyramid.auth.decorators import unauthorised_redirect, require_logged_in
from pywebtools.pyramid.auth.views import current_user
from pywebtools.pyramid.util import paginate
from pywebtools.sqlalchemy import DBSession

from wte.models import (Part)
from wte.text_formatter import compile_rst


[docs]def init(config): """Adds the admin-specific routes (route name, URL pattern handler): * ``admin`` -- ``/admin`` -- :func:`~wte.views.admin.admin` * ``admin.content`` -- ``/admin/content`` -- :func:`~wte.views.admin.content_admin` * ``admin.content.regenerate`` -- ``/admin/content/regenerate`` -- :func:`~wte.views.admin.content_regenerate` * ``admin.content.list`` -- ``/admin/content/list`` -- :func:`~wte.views.admin.content_list` """ config.add_route('admin', '/admin') config.add_route('admin.content', '/admin/content') config.add_route('admin.content.list', '/admin/content/list') config.add_route('admin.content.regenerate', '/admin/content/regenerate')
@view_config(route_name='admin', renderer='wte:templates/admin/index.kajiki') @current_user() @require_logged_in()
[docs]def admin(request): """Handles the ``/admin`` URL, displaying all available administrative functions. """ if request.current_user.has_permission('admin'): return {'crumbs': [{'title': 'Administration', 'url': request.current_route_url(), 'current': True}]} else: raise unauthorised_redirect(request)
@view_config(route_name='admin.content', renderer="wte:templates/admin/content/index.kajiki") @current_user() @require_logged_in()
[docs]def content_admin(request): """Handles the ``/admin/content`` URL, displaying all available administrative functions related to the content administrations. """ if request.current_user.has_permission('admin.modules.view'): return {'crumbs': [{'title': 'Administration', 'url': request.route_url('admin')}, {'title': 'Content', 'url': request.current_route_url(), 'current': True}]} else: raise unauthorised_redirect(request)
@view_config(route_name='admin.content.list', renderer="wte:templates/admin/content/list.kajiki") @current_user() @require_logged_in()
[docs]def content_list(request): """Handles the ``/admin/content/list`` URL providing administrative access to all :class:`~wte.models.Part`\ s. """ if request.current_user.has_permission('admin.modules.view'): dbsession = DBSession() modules = dbsession.query(Part).filter(Part.parent_id == None) try: start = int(request.params['start']) except: start = 0 if 'q' in request.params and request.params['q']: modules = modules.filter(Part.title.contains(request.params['q'])) if 'status' in request.params and request.params['status']: modules = modules.filter(Part.status == request.params['status']) pages = paginate(request, 'admin.content.list', modules, start, 25) modules = modules.offset(start).limit(25) return {'modules': modules, 'pages': pages, 'crumbs': [{'title': 'Administration', 'url': request.route_url('admin')}, {'title': 'Content', 'url': request.route_url('admin.content')}, {'title': 'All Modules', 'url': request.current_route_url(), 'current': True}]} else: raise unauthorised_redirect(request)
@view_config(route_name='admin.content.regenerate') @current_user() @require_logged_in()
[docs]def content_regenerate(request): """Handles the ``/admin/content/regenerate`` URL, regenerating the ``compiled_content`` attribute for all :class:`~wte.models.Part`\ s. """ if request.current_user.has_permission('admin.modules.edit'): if request.method == 'POST': dbsession = DBSession() with transaction.manager: for part in dbsession.query(Part): if part.content: part.compiled_content = compile_rst(part.content, request, part) request.session.flash('Regeneration complete', queue='info') raise HTTPSeeOther(request.route_url('admin.content')) else: raise unauthorised_redirect(request)