Ejemplo n.º 1
0
def schema():
    '''Creates database schema and fills website with initial data'''

    database = config.database['dbn']

    schema_commands = open('schema/' + database + '.sql', 'r').read()
    for cmd in schema_commands.split(';'):
        if cmd.strip():
            db.query(cmd)

    data = web.storage(json.loads(open('schema/data.json', 'r').read()))
    now = web.db.SQLLiteral('CURRENT_TIMESTAMP')
    user = auth.create_user(**data.user)

    # System root folder
    db.insert(
        'documents',
        user_id=user.id,
        created_at=now,
        **data.documents_root
    )

    for p in data.pages:
        block = p.pop('block')
        page_id = db.insert(
            'pages',
            is_published=False,
            is_navigatable=True,
            user_id=user.id,
            created_at=now,
            **p
        )
        create_tree_branch(
            'blocks',
            block,
            page_id=page_id,
            user_id=user.id,
            is_published=True,
            created_at=now,
            published_at=now,
        )

    for block in data.template_blocks:
        create_tree_branch(
            'blocks',
            block,
            user_id=user.id,
            is_published=True,
            created_at=now,
            published_at=now,
        )
Ejemplo n.º 2
0
def create_tree_branch(table_name, current_obj,
                       parent=None, position=1,
                       func=None,
                       **data):
    """Recursively creates tree branch"""
    obj = web.storage(current_obj.copy())

    children = obj.pop(table_name, [])

    obj.update(data)

    if parent:
        if parent.ids is None:
            obj.ids = str(parent.id)
        else:
            obj.ids = parent.ids + "," + str(parent.id)
        obj.update(
            parent_id=parent.id,
            level=parent.level + 1,
        )
    else:
        obj.update(ids=None, level=0)

    if func is not None:
        obj = func(obj, parent)

    obj.id = db.insert(table_name, position=position, **obj)

    for index, child in enumerate(children):
        create_tree_branch(table_name, child, obj,
                           index + 1, func,
                           **data)
    return obj
Ejemplo n.º 3
0
def create_columns(block, sizes, start_index=0):

    # Basic column data
    column = web.storage(
        created_at=web.SQLLiteral("CURRENT_TIMESTAMP"),
        user_id=auth.get_user().id,
        is_published=True,
        is_system=True,
        page_id=block.page_id,
        parent_id=block.id,
        ids=block.ids + "," + str(block.id),
        level=block.level + 1,
        template="column",
        position=start_index + 1,
    )
    for size in sizes:
        db.insert("blocks",
                  size=size,
                  css_class=column_css_class(size),
                  **column)
        column.position += 1
Ejemplo n.º 4
0
def create_document(document):
    """Creates new document and saves upload"""

    parent = get_document_by_id(document.parent_id)

    document.update(
        ids=(parent.ids or "") + "," + str(parent.id),
        level=parent.level + 1,
        parent_id=int(document.parent_id),
        created_at=web.SQLLiteral("CURRENT_TIMESTAMP"),
        user_id=auth.get_user().id,
        is_published=True,  # True for the new documents
    )

    if document.type == "folder":
        del document["upload"]
        if not document.title:
            document.title = _("Untitled Folder")
    else:
        upload = document.pop("upload")
        try:
            mimetype, encoding = mimetypes.guess_type(upload.filename)
            filename, filesize = save_document(upload.file)
            title, extension = os.path.splitext(upload.filename)
            document.update(
                title=document.title or title,
                filename=filename,
                extension=extension.lower(),
                mimetype=mimetype,
                type="image" if "image" in mimetype else "document",
                filesize=filesize,
            )
        except:
            raise flash.error(_("File upload error."))

    if document.position:
        document.position = int(document.position)
        # Shift positions to free the space to insert document
        expand_tree_siblings("documents", document)
    else:
        document.position = get_last_position("documents", document.parent_id)

    document.id = db.insert("documents", **document)

    # TODO: fix created_at
    return document
Ejemplo n.º 5
0
def create_block(block):
    """Creates block from passed dict and returns it."""

    block.update(
        position=int(block.position),
        created_at=web.SQLLiteral("CURRENT_TIMESTAMP"),
        user_id=auth.get_user().id,
        is_published=True,
    )

    if block.type == "wysiwyg":
        block.content_cached = smarty(sanitize(block.content))
    else:
        block.content_cached = smarty(block.content)

    # TODO: wrap the code below in transaction
    if block.get("parent_id"):
        parent = get_block_by_id(block.parent_id)
        if parent.ids:
            parent_blocks = (parent.ids or "") + "," + str(parent.id)
        else:
            parent_blocks = str(parent.id)
        block.update(
            page_id=parent.page_id,
            ids=parent_blocks,
            level=parent.level + 1,
        )
        # Shift blocks positions to free the place for new block
        expand_tree_siblings("blocks", block)

    else:
        block.level = 0

    sizes = block.pop("sizes")
    block.id = db.insert("blocks", **block)

    # Create columns for row block
    if block.template == "row":
        create_columns(block, sizes)

    # TODO: fix created_at
    return block
Ejemplo n.º 6
0
def create_page(page):
    """Creates new page and pageblock"""

    page.update(unique_path(page))

    page.update(
        user_id=auth.get_user().id,
        created_at=web.SQLLiteral("CURRENT_TIMESTAMP"),
        description_cached=smarty(sanitize(page.description)),
    )

    # Set published_at to NOW
    if page.published_at is None:
        page.published_at = web.SQLLiteral("CURRENT_TIMESTAMP")

    if page.position:
        page.position = int(page.position)
        # Shift positions to free the space to insert page
        expand_tree_siblings("pages", page)
    else:
        page.position = get_last_position("pages", page.parent_id)

    page.id = db.insert("pages", **page)

    # Generate pages initial blocks stucture
    page_block = config.page_types[page.type]["block"]
    create_tree_branch(
        "blocks",
        page_block,
        page_id=page.id,
        user_id=auth.get_user().id,
        is_published=True,
        created_at=web.SQLLiteral("CURRENT_TIMESTAMP"),
        published_at=web.SQLLiteral("CURRENT_TIMESTAMP"),
    )

    return page