rrdweb/html.py
author Tero Marttila <terom@fixme.fi>
Tue, 02 Nov 2010 05:36:16 +0200
changeset 25 9fa9d881fd87
parent 22 809686edcd4c
parent 13 30f866582b46
permissions -rw-r--r--
Merge with previous bin/rrdweb development, and fix up merge bugs

"""
    HTML output
"""

import os.path

def urljoin (*parts) :
    url = ""

    for part in parts :
        if part :
            if url :
                url += "/" + part
            else :
                url += part

    return url

class BaseFormatter (object) :
    """
        Trivial HTML template formatter.
    """

    def __init__ (self, basedir, encoding = 'utf-8') :
        """
                basedir     - directory containing the required .html files
                encoding    - unicode encoding of file content (default: utf-8)
        """

        self.basedir = os.path.abspath(basedir)
        self.encoding = encoding

    def render (self, name, **vars) :
        """
            Format and return given template.

                name        - basename of template without .html
                **vars      - template context

            The template is rendered and returned as unicode.
        """

        path = os.path.join(self.basedir, name) + '.html'
        
        # read contents
        data = open(path).read().decode(self.encoding)

        # format
        return data % vars


# XXX: legacy
class Formatter (BaseFormatter) :

    TEMPLATE_DIR = 'etc/templates'

    IMG_URL = '%(prefix)s?t=%(target)s&s=%(style)&i=%(interval)s'
    TARGET_URL = '%(prefix)s?t=%(target)s'

    def __init__ (self, template_dir=TEMPLATE_DIR, url_prefix='', img_url=IMG_URL, target_url=TARGET_URL) :
        BaseFormatter.__init__(self, template_dir, 'utf-8')

        self.url_prefix = url_prefix
        self.img_url = img_url
        self.target_url = target_url

    def page (self, content) :
        """
            Format page contents
        """

        return self.render('layout', 
                title       = 'MRTG',
                breadcrumb  = '',   # XXX: not supported
                content     = content
        )

    def fmt_img_url (self, style, interval, target) :
        return self.img_url % dict(
            prefix      = self.url_prefix,
            target      = target,
            style       = style,
            interval    = interval,
        )

    def fmt_target_url (self, target) :
        return self.target_url % dict(
            prefix      = self.url_prefix,
            target      = target,
        )

    def overview (self, dirname, targets) :
        """
            Format target listing for given list of (target, title) pairs
        """

        return self.page(self.render('overview', 
            dir                 = dirname,
            overview_subdirs    = '',   # XXX: not supported
            overview_graphs     = '\n'.join(
                self.render('overview-target',
                    title               = title,
                    daily_overview_img  = self.fmt_img_url('overview', 'daily', target),
                    target_url          = self.fmt_target_url(target),

                ) for target, title in targets
            ),
        ))

    def target (self, target, title) :
        """
            Format a specific target
        """
        
        return self.page(self.render('target',
            title               = title,
            daily_img           = self.fmt_img_url('detail', 'daily', target),
            weekly_img          = self.fmt_img_url('detail', 'weekly', target),
            yearly_img          = self.fmt_img_url('detail', 'yearly', target),
        ))