view piecrust/admin/siteinfo.py @ 888:2b0fa2e4c12f

admin: Make the admin panel work under a non-rooted URL.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 02 Jul 2017 22:14:51 -0700
parents dcdec4b951a1
children 7ecb946bfafd
line wrap: on
line source

import os
import os.path
import sys
import copy
import logging
import threading
import subprocess
from piecrust.app import PieCrustFactory


logger = logging.getLogger(__name__)


class UnauthorizedSiteAccessError(Exception):
    pass


class InvalidSiteError(Exception):
    pass


class SiteInfo:
    def __init__(self, root_dir, url_prefix, *, debug=False):
        self.root_dir = root_dir
        self.url_prefix = url_prefix
        self.debug = debug
        self._piecrust_factory = None
        self._piecrust_app = None
        self._scm = None

    @property
    def piecrust_factory(self):
        if self._piecrust_factory is None:
            self._piecrust_factory = PieCrustFactory(
                self.root_dir,
                cache_key='admin',
                debug=self.debug,
                config_values=[
                    ('site/root', '%s/preview/' % self.url_prefix),
                    ('site/asset_url_format',
                     self.url_prefix + '/preview/_asset/%path%')
                ])
        return self._piecrust_factory

    @property
    def piecrust_app(self):
        if self._piecrust_app is None:
            logger.debug("Creating PieCrust admin app: %s" % self.root_dir)
            self._piecrust_app = self.piecrust_factory.create()
        return self._piecrust_app

    @property
    def scm(self):
        if self._scm is None:
            cfg = copy.deepcopy(self.piecrust_app.config.get('scm', {}))

            if os.path.isdir(os.path.join(self.root_dir, '.hg')):
                from .scm.mercurial import MercurialSourceControl
                self._scm = MercurialSourceControl(self.root_dir, cfg)
            elif os.path.isdir(os.path.join(self.root_dir, '.git')):
                from .scm.git import GitSourceControl
                self._scm = GitSourceControl(self.root_dir, cfg)
            else:
                self._scm = False

        return self._scm

    @property
    def publish_pid_file(self):
        return os.path.join(self.piecrust_app.cache_dir, 'publish.pid')

    @property
    def publish_log_file(self):
        return os.path.join(self.piecrust_app.cache_dir, 'publish.log')

    def publish(self, target):
        args = [
            sys.executable, sys.argv[0],
            '--pid-file', self.publish_pid_file,
            'publish',
            '--log-publisher', self.publish_log_file,
            target]
        logger.debug("Running publishing command: %s" % args)
        proc = subprocess.Popen(args, cwd=self.root_dir)

        def _comm():
            proc.communicate()

        t = threading.Thread(target=_comm, daemon=True)
        t.start()