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, )
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
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
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
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
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