qmsk_www_pages/pages.py
author Tero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 01:07:54 +0300
changeset 61 308b2e3dfd6a
parent 60 bd9cea0b5b11
child 62 a2f29d787bea
permissions -rw-r--r--
page breadcrumb
from django.conf import settings

import codecs
import logging; log = logging.getLogger('qmsk_www_pages.pages')
import os, os.path

class Page (object):
    ENCODING = 'utf-8'

    @classmethod
    def lookup (cls, page):
        """
            Lookup a Page from disk.

            Returns None if there is no such page.
        """
        
        log.info("page=%r", page)

        root = settings.QMSK_WWW_PAGES_DIR

        if page:
            parts = page.split('/')
        else:
            parts = [ ]
            
        if parts:
            page_name = parts.pop(-1)
        else:
            page_name = ''

        if not page_name:
            page_name = 'index'

        # scan dir
        dirpath = root

        for part in parts:
            if part.startswith('.'):
                # evil
                return None
            
            if not part:
                continue
        
            dirpath = os.path.join(dirpath, part)

            if not os.path.exists(dirpath):
                return None
            
            if not os.path.isdir(dirpath):
                return None

        # scan for page
        page_type = None

        for filename in os.listdir(dirpath):
            if filename.startswith('.'):
                continue
            
            if '.' not in filename:
                continue

            file_name, file_type = filename.rsplit('.', 1)
            page_path = os.path.join(dirpath, filename)

            if not file_name:
                continue

            if file_name != page_name:
                continue
            
            # page_name matches
            page_type = TYPES.get(file_type)

            if page_type:
                break

        if not page_type:
            return None

        return page_type(
            path    = page_path,
            name    = page_name,
            parents = parts,
        )

    def __init__ (self, path, name, parents, encoding=ENCODING):
        self.path = path
        self.name = name
        self.parents = parents
        self.encoding = encoding

    def open (self):
        return codecs.open(self.path, encoding=self.encoding)

    def breadcrumb (self):
        path = []

        for parent in self.parents + [ self.name ]:
            path.append(parent)

            yield '/'.join(path), parent

    def render (self, request):
        raise NotImplementedError()

class HTML_Page (Page):
    def render (self, request):
        return self.open().read()

TYPES = {
    'html':         HTML_Page,
}