view piecrust/admin/views/sources.py @ 960:8101692fdc11

admin: Add a "rebake preview assets" button to the dashboard. Baking preview assets is needed for showing the site preview. Also, add flashed messages.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 07 Oct 2017 12:13:57 -0700
parents 4c69935ca415
children 0d699f04968c
line wrap: on
line source

import re
from flask import g, abort, render_template, url_for
from flask.ext.login import login_required
from piecrust.data.paginator import Paginator
from ..blueprint import foodtruck_bp
from ..views import with_menu_context


@foodtruck_bp.route('/list/<source_name>/', defaults={'page_num': 1})
@foodtruck_bp.route('/list/<source_name>/<int:page_num>')
@login_required
def list_source(source_name, page_num):
    site = g.site.piecrust_app
    source = site.getSource(source_name)
    if source is None:
        abort(400)

    i = 0
    default_author = site.config.get('site/author')
    data = {'title': "List %s" % source_name}
    data['pages'] = []
    pgn = Paginator(source, None, sub_num=page_num, items_per_page=20)
    for p in pgn.items:
        page_data = {
            'title': p.get('title') or _get_first_line_title(p),
            'author': p.get('author') or default_author,
            'timestamp': p.get('timestamp'),
            'tags': p.get('tags', []),
            'category': p.get('category'),
            'source': source_name,
            'url': url_for('.edit_page', url=p['rel_url'])
        }
        data['pages'].append(page_data)

    prev_page_url = None
    if pgn.prev_page_number:
        prev_page_url = url_for(
            '.list_source', source_name=source_name,
            page_num=pgn.prev_page_number)
    next_page_url = None
    if pgn.next_page_number:
        next_page_url = url_for(
            '.list_source', source_name=source_name,
            page_num=pgn.next_page_number)

    page_urls = []
    for i in pgn.all_page_numbers(7):
        url = None
        if i != page_num:
            url = url_for('.list_source', source_name=source_name, page_num=i)
        page_urls.append({'num': i, 'url': url})

    data['pagination'] = {
        'prev_page': prev_page_url,
        'next_page': next_page_url,
        'nums': page_urls
    }

    with_menu_context(data)
    return render_template('list_source.html', **data)


re_first_line_title = re.compile(r'[\n\r\.\!\?;]')


def _get_first_line_title(pagedata):
    content = pagedata.get('raw_content') or ''
    content = content.content.strip()
    if not content:
        return '<empty page>'

    m = re_first_line_title.search(content, 1)
    if m:
        content = content[:m.start()]

    words = content.split(' ')
    title = words[0]
    cur_word_idx = 1
    while len(title) < 60 and cur_word_idx < len(words):
        title += ' ' + words[cur_word_idx]
        cur_word_idx += 1

    return content