From 2d0f074315c857b359aa3fde68f3d49a270fc219 Mon Sep 17 00:00:00 2001 From: Andreas Stephanides Date: Wed, 30 Aug 2017 15:35:25 +0200 Subject: [PATCH] big refactor 1 --- __init__.py | 175 ++++++++++++------------------------------ config.cfg | 4 +- config.cfg.sample | 3 + flatpages.py | 94 +++++++++++++++++++++++ install | 4 +- templates/layout.html | 9 ++- templates/page.html | 10 ++- test_utils.py | 32 ++++++++ utils.py | 33 +++++++- 9 files changed, 226 insertions(+), 138 deletions(-) create mode 100644 config.cfg.sample create mode 100644 flatpages.py create mode 100644 test_utils.py diff --git a/__init__.py b/__init__.py index f82657e..5c21d54 100644 --- a/__init__.py +++ b/__init__.py @@ -1,18 +1,18 @@ import sys -from flask import Flask, render_template, send_from_directory,jsonify +from flask import Flask, Blueprint,render_template, send_from_directory,jsonify, url_for from flask_flatpages import FlatPages, pygments_style_defs +from flatpages import FlatPagesIndex from flask_frozen import Freezer from config import Config import os import re from os.path import isfile, abspath from utils import pjoin2 -from utils import pjoin - +from utils import pjoin, list_dir, path_depth +from functools import partial +from collections import namedtuple package_directory = os.path.dirname(os.path.abspath(__file__)) - -#cfg = Config(file('./config.cfg')) cfg = Config(file(os.path.join(package_directory, 'config.cfg'))) # Loading constants from config file @@ -23,168 +23,93 @@ FLATPAGES_FP_ROOT = abspath(cfg.pages_root) # Initialize application app = Flask(__name__) -flatpages = FlatPages(app) + +flatpages = FlatPagesIndex(app) flatpages.get('index') freezer = Freezer(app) app.config.from_object(__name__) +page_blueprint = Blueprint('intern', __name__) + + # List all non *.md files within the directory -def list_dir_md(mypath): - return [f for f in os.listdir(mypath) if isfile(os.path.join(mypath, f)) and re.match('.*\%s.*' % FLATPAGES_EXTENSION,f) is None] +list_dir_md=partial(list_dir, not_ext=["md","~"]) # List all jpg images within the directory -def list_dir_img(mypath): - return [f for f in os.listdir(mypath) if isfile(os.path.join(mypath, f)) and re.match('.*\.jpg',f) is not None] - -def path_depth(path): - p_split=path.split('/') - if path =="": - cc=0 - else: - cc=len(path.split('/')) - if p_split[-1]=='index' or p_split[-1]=='index.json' : - cc=cc-1 - return cc +list_dir_img=partial(list_dir, ext="jpg") # List all subpages of the current page -def get_sub_pages(path): - return [p for p in flatpages - if (p.path.startswith(path) and # is a subpage - ( re.match('.*index',p.path) is None) and # is no index - path_depth(p.path) [a/index a/b/index] -def get_breadcrumb_paths(path): - elements = path.split('/') - elements2 = ['index'] - for i in range(1,len(elements)): - elements2.append(pjoin2(elements[0:i])+u'/index') - return elements2 - -def get_breadcrumb_pages(paths): - pages=[flatpages.get(p) for p in paths] - return pages - -def get_paths(pages): - paths=[p.path for p in pages] - return paths def get_bc(path): - return get_breadcrumb_pages(get_breadcrumb_paths(path)) - -# load a page from a path information -def get_flatpage(path): - is_index=False - # root index - if path == 'index' or path=='': - is_index=True - path='' - pathi='index' - else: - if path.split('/')[-1]=='index': # last element is "index" ? - is_index=True - path='/'.join(path.split('/')[0:-1]) # remove index from path - pathi = u'{}/{}'.format(path, 'index') # try to add index to the path - page = flatpages.get(pathi) # try to load index page - if not page is None: # if successful it is a index - is_index=True - else: - page=flatpages.get(path) - return (is_index, path, page) + return flatpages.get_pages(FlatPagesIndex.breadcrumbs(path)) +# return get_breadcrumb_pages(get_breadcrumb_paths(path)) - -def misskey(a,key): - if not a.has_key(key): - return True - return a[key] is None - +# completes the meta hash if a configuration is not set def page_defaults(page, is_index, path): - if misskey(page.meta,"title"): - page.meta["title"]=path.split('/')[-1] - if misskey(page.meta, "template"): - page.meta["template"]='page.html' + page.meta["title"]=page.meta.get("title", path.split('/')[-1]) + page.meta["template"]=page.meta.get("template", cfg.default_template) return page - -@app.route('//') -def post(name='index'): - is_index, path, page = get_flatpage(name) - app.logger.info('render '+name) +def load_lists_for_templates(path, is_index): path2 = pjoin(FLATPAGES_ROOT,path) - - if is_index == True and not page is None: + if is_index == True: ld=list_dir_md(path2) il=list_dir_img(path2) - sp=get_sub_pages(path) - spi=get_sub_ipages(path) + sp=list(get_sub_pages(path)) + spi=list(get_sub_ipages(path)) else: ld=[] sp=[] spi=[] il=[] + bc=get_bc(path) + return (ld, il, sp, spi,bc) + +@page_blueprint.route('//') +@page_blueprint.route('/') +def post(name='index'): + is_index, path, page = flatpages.get_flatpage(name) + app.logger.info('render '+name) if not page is None: - page_defaults(page,is_index,path) - app.logger.info("Render Template"+page["template"] +"for "+path) - return render_template(page.meta["template"], ld=ld, post=page, sp=sp, spi=spi, il=il, pth=path, pagebreadcrumbs=get_bc(path)) + page=page_defaults(page, is_index, path) + ld, il, sp, spi, bc = load_lists_for_templates(path,is_index) + return render_template(page.meta["template"], ld=ld, post=page, sp=sp, spi=spi, il=il, pth=path, pagebreadcrumbs=bc) - if os.path.exists(u'{}/{}'.format(FLATPAGES_ROOT,path)): + if os.path.exists(os.path.join(FLATPAGES_ROOT,path)): return send_from_directory(FLATPAGES_ROOT,path) else: return send_from_directory('static',path) - -@app.route('/.json/') -def postjson(name='index'): - is_index, path, page = get_flatpage(name) - app.logger.info('render '+name) - path2 = pjoin(FLATPAGES_ROOT,path) +def json_url_for(paths): + for p in paths: + yield url_for('intern.postjson', name=p) - if is_index == True and not page is None: - ld=list_dir_md(path2) - il=list_dir_img(path2) - sp=get_sub_pages(path) - spi=get_sub_ipages(path) - else: - ld=[] - sp=[] - spi=[] - il=[] +@page_blueprint.route('/.json/') +def postjson(name='index'): + is_index, path, page = flatpages.get_flatpage(name) if not page is None: - page_defaults(page,is_index,path) - app.logger.info("Render Template"+page["template"] +"for "+path) + ld, il, sp, spi, bc = load_lists_for_templates(path, is_index) + page_defaults(page, is_index, path) p=page.meta - bc=get_breadcrumb_paths(path) p["depth"]=path_depth(path) p["path"]=path - p["breadcrumbs"]=bc - p["subfolders"]=get_paths(spi) - p["subpages"]= [u'%s.json' % p1 for p1 in get_paths(sp)] + p["breadcrumbs"]=list(bc) + p["subfolders"]=list(json_url_for(FlatPagesIndex.get_paths(spi))) + p["subpages"]= list(json_url_for(FlatPagesIndex.get_paths(sp))) p["text"]=page.html return jsonify(page=p) - # return render_template(page.meta["template"], ld=ld, post=page, sp=sp, spi=spi, il=il, pth=path, pagebreadcrumbs=get_bc(path,page)) - if os.path.exists(u'{}/{}'.format(FLATPAGES_ROOT,path)): return send_from_directory(FLATPAGES_ROOT,path) else: return send_from_directory('static',path) + + +app.register_blueprint(page_blueprint, url_prefix=cfg.url_prefix,static_folder='static') +app.add_url_rule('%s//' % cfg.url_prefix,'page', post) diff --git a/config.cfg b/config.cfg index 53f7e1d..ee94377 100644 --- a/config.cfg +++ b/config.cfg @@ -1,3 +1,5 @@ pages_root: 'data' pages_reload: True -static_root: 'static' \ No newline at end of file +static_root: 'static' +default_template: 'page.html' +url_prefix: "/int" \ No newline at end of file diff --git a/config.cfg.sample b/config.cfg.sample new file mode 100644 index 0000000..53f7e1d --- /dev/null +++ b/config.cfg.sample @@ -0,0 +1,3 @@ +pages_root: 'data' +pages_reload: True +static_root: 'static' \ No newline at end of file diff --git a/flatpages.py b/flatpages.py new file mode 100644 index 0000000..c8d79df --- /dev/null +++ b/flatpages.py @@ -0,0 +1,94 @@ +from flask_flatpages import FlatPages, pygments_style_defs +import flask_flatpages +import re +from utils import path_depth,pjoin2 +from collections import namedtuple + +FileLists=namedtuple("FileLists", ["list_files", "list_images", "sub_pages", "sub_index_pages", "breadcrumbs"]) + +class FlatPagesIndex(FlatPages): + @staticmethod + def get_breadcrumb_paths(path): + """ + breadcrumbs decompose the path + a/b/index -> [a/index a/b/index] + """ + elements = path.split('/') + elements2 = ['index'] + for i in range(1,len(elements)): + elements2.append(pjoin2(elements[0:i])+u'/index') + return elements2 + + + @staticmethod + def get_paths(pages): + return (p.path for p in pages) + + @staticmethod + def breadcrumbs(page): + "Parse a path or the path of a page into breadcrumbs" + if type(page) is flask_flatpages.Page: + return FlatPagesIndex.get_breadcrumb_paths(page.path) + else: + return FlatPagesIndex.get_breadcrumb_paths(page) + + def get_pages(self, paths): + if paths is None: + raise AttributeError("paths for get_pages can't be None") + return (self.get(p) for p in paths) + + def get_sub_pages(self, path): + def is_subpage(path, root): + return (path.startswith(root) and # is a subpage + ( re.match('.*index',path) is None) and # is no index + path_depth(path) - - + +
{% block content %} diff --git a/templates/page.html b/templates/page.html index db89233..73bb24a 100644 --- a/templates/page.html +++ b/templates/page.html @@ -1,15 +1,16 @@ +{# -*-jinja2-*- #} {% extends "layout.html" %} {% block content %}

{{post.title}}

{{post.date}} -{% if spi|length > 0 %} +{% if spi | length > 0 %}
Unterseiten: