tutorial.cgi 2.3 KB
#!/usr/bin/env python

'''
Initiate a tutorial session.

Author:     Goran Topic
            Sampo Pyysalo
            Pontus Stenetorp
Version:    2012-11-12
'''

from sys import path as sys_path
from os.path import join as path_join
from os.path import dirname, isdir
from shutil import copytree, rmtree
from os import environ, makedirs, errno
from cgi import FieldStorage
import re

sys_path.append(path_join(dirname(__file__), 'server/src'))
from session import init_session, get_session

from config import DATA_DIR

# Tutorials have to be enabled explicitly since it modifies the disk
try:
    from config import TUTORIALS
except ImportError:
    TUTORIALS = False

if not TUTORIALS:
    print 'Content-Type: text/plain'
    print ''
    print 'Tutorials disabled on this server, please enable it in config.py'
    print ''
    print ''
    exit(0)

TUTORIAL_BASE = '.tutorials'
TUTORIAL_START = '000-introduction'
TUTORIAL_DATA_DIR = DATA_DIR
TUTORIAL_SKELETON = 'example-data/tutorials/'
DEFAULT_TUTORIAL_TYPE = 'news'

def mkdir_p(path):
    try:
        makedirs(path)
    except OSError, x:
        if x.errno == errno.EEXIST and isdir(path):
            pass
        else:
            raise

try:
    remote_addr = environ['REMOTE_ADDR']
except KeyError:
    remote_addr = None
try:
    cookie_data = environ['HTTP_COOKIE']
except KeyError:
    cookie_data = None

params = FieldStorage()

if 'type' in params:
    tutorial_type = unicode(params.getvalue('type'))
else:
    tutorial_type = DEFAULT_TUTORIAL_TYPE
if 'overwrite' in params:
    overwrite = unicode(params.getvalue('overwrite'))
else:
    overwrite = False
# security check; don't allow arbitrary path specs for copytree
assert re.match(r'^[a-zA-Z0-9_-]+$', tutorial_type)

init_session(remote_addr, cookie_data=cookie_data)
_id = str(abs(hash(get_session().get_sid())))
reldir = path_join(TUTORIAL_BASE, '.' + _id)
userdir = path_join(TUTORIAL_DATA_DIR, reldir)
tutorial_dir = path_join(userdir, tutorial_type)

if not isdir(tutorial_dir) or overwrite:
    mkdir_p(userdir)
    if isdir(tutorial_dir) and overwrite:
        rmtree(tutorial_dir)
    copytree(path_join(TUTORIAL_SKELETON, tutorial_type), tutorial_dir)

start = path_join(reldir, tutorial_type, TUTORIAL_START)

print 'Content-Type: text/plain'
print 'Refresh: 0; url=index.xhtml#/%s' % start
print ''
print ''