def node_create(): """Node creation form. Here, we need to have: * Fields for db.node: * id (0 for creation) * type (hidden) * published * weight * Fields for db.node_version: * id (0 for creation) * revision_id (0 for creation) * language * {created,updated} {date,by} * published (for the version) * is_translation_base -> hidden, locked! * Fields for db.node_base_fields: * id (0 for creation) * title * body * body_format """ if len(request.args) > 0: ## Return creation form for this node type node_type = request.args[0] node_types = cms_settings.list_node_types() if node_type not in node_types.keys(): raise HTTP(404) form = cmsdb.node.form_create(node_type) response.view = 'generic/form.' + request.extension return dict( title=T('Create %s', node_types[node_type]['label']), form=form) else: ## Return selection menu to choose node type to create menu_items = [ (T('Create "%s" node', type_def['label']), False, URL('default','node_create',args=[node_type]), []) for node_type, type_def in cms_settings.list_node_types().items() ] response.view = 'generic/menu_page.%s' % request.extension return dict(title=T('Create content'), menu_items=menu_items)
def node_create(): """Node creation form. Here, we need to have: * Fields for db.node: * id (0 for creation) * type (hidden) * published * weight * Fields for db.node_version: * id (0 for creation) * revision_id (0 for creation) * language * {created,updated} {date,by} * published (for the version) * is_translation_base -> hidden, locked! * Fields for db.node_base_fields: * id (0 for creation) * title * body * body_format """ if len(request.args) > 0: ## Return creation form for this node type node_type = request.args[0] node_types = cms_settings.list_node_types() if node_type not in node_types.keys(): raise HTTP(404) form = cmsdb.node.form_create(node_type) response.view = 'generic/form.' + request.extension return dict(title=T('Create %s', node_types[node_type]['label']), form=form) else: ## Return selection menu to choose node type to create menu_items = [ (T('Create "%s" node', type_def['label']), False, URL('default', 'node_create', args=[node_type]), []) for node_type, type_def in cms_settings.list_node_types().items() ] response.view = 'generic/menu_page.%s' % request.extension return dict(title=T('Create content'), menu_items=menu_items)
def edit_form(self, action, node_type=None, node_id=None, revision_id=None, language=None, defaults=None): """Node manipulation form. :param action: The action to be performed on node: one of ``create|update|translate`` :param node_type: Only for ``create``, the type of node to be created :param node_id: Only for ``update|translate``, the id of node to be updated :param revision_id: Only for ``update|translate``, the id of the revision on which to work. Defaults to latest revision. Must be a valid revision id for this node. :param language: The language in which to write/translate the node. Defaults to current language or 'neutral'. :param defaults: A dict or dict-like of values to be set as defaults for node creation. """ db = self.db T = current.T if not defaults: defaults = {} ## Validate arguments node_types = cms_settings.list_node_types() if action=='create': ## We need only a valid node type if node_type not in node_types.keys(): raise ValueError, "Wrong node type %r must be one of %s" % (node_type, ", ".join(node_types.keys())) elif action=='update': ## node_id must be a valid node ## if specified, revision_id must be a valid revision for this node ## if specified, language must exist node = self.read(node_id=node_id, revision=revision_id, language=language) #revision_id = node.get_revision(revision_id, language) defaults.update(node.values) elif action=='translate': ## We need a language in which to translate plus a language ## to be used as "translation base" to read values from. pass ## To store components of the form _form_components = {} ## Tables to be used to generate form. ## TODO: Load all the db.tables matching node_fields_* and node_<type>_fields_* _component_tables = ['node', 'node_revision', 'node_fields_base'] ## Set defaults -------------------------------------------------------- db.node.type.default = node_type db.node.type.readable = \ db.node.type.writable = False db.node_revision.node.requires = None db.node_revision.node.readable = \ db.node_revision.node.writable = False db.node_fields_base.node_revision.requires = None db.node_fields_base.node_revision.readable = \ db.node_fields_base.node_revision.writable = False ##TODO: set defaults from the `defaults` variable. ## Retrieve components from tables ------------------------------------- for table in _component_tables: ## Prepare default values for fields if defaults.has_key(table): for field in db[table].fields: try: db[table][field].default = defaults[table][field] except KeyError, e: pass ## Create SQLFORM from the table _form_components[table] = SQLFORM.factory(db[table], buttons=[], formstyle='divs' if table not in ['node','node_revision'] else 'table3cols').components ## Change field names by adding ``<tablename>--`` prefix for ilev, comp in descend_tree(_form_components[table]): if isinstance(comp, INPUT) and comp.attributes.has_key('_name'): ## Change field name comp.attributes['_name'] = '%s--%s' % (table, comp.attributes['_name'])
def edit_form(self, action, node_type=None, node_id=None, revision_id=None, language=None, defaults=None): """Node manipulation form. :param action: The action to be performed on node: one of ``create|update|translate`` :param node_type: Only for ``create``, the type of node to be created :param node_id: Only for ``update|translate``, the id of node to be updated :param revision_id: Only for ``update|translate``, the id of the revision on which to work. Defaults to latest revision. Must be a valid revision id for this node. :param language: The language in which to write/translate the node. Defaults to current language or 'neutral'. :param defaults: A dict or dict-like of values to be set as defaults for node creation. """ db = self.db T = current.T if not defaults: defaults = {} ## Validate arguments node_types = cms_settings.list_node_types() if action == 'create': ## We need only a valid node type if node_type not in node_types.keys(): raise ValueError, "Wrong node type %r must be one of %s" % ( node_type, ", ".join(node_types.keys())) elif action == 'update': ## node_id must be a valid node ## if specified, revision_id must be a valid revision for this node ## if specified, language must exist node = self.read(node_id=node_id, revision=revision_id, language=language) #revision_id = node.get_revision(revision_id, language) defaults.update(node.values) elif action == 'translate': ## We need a language in which to translate plus a language ## to be used as "translation base" to read values from. pass ## To store components of the form _form_components = {} ## Tables to be used to generate form. ## TODO: Load all the db.tables matching node_fields_* and node_<type>_fields_* _component_tables = ['node', 'node_revision', 'node_fields_base'] ## Set defaults -------------------------------------------------------- db.node.type.default = node_type db.node.type.readable = \ db.node.type.writable = False db.node_revision.node.requires = None db.node_revision.node.readable = \ db.node_revision.node.writable = False db.node_fields_base.node_revision.requires = None db.node_fields_base.node_revision.readable = \ db.node_fields_base.node_revision.writable = False ##TODO: set defaults from the `defaults` variable. ## Retrieve components from tables ------------------------------------- for table in _component_tables: ## Prepare default values for fields if defaults.has_key(table): for field in db[table].fields: try: db[table][field].default = defaults[table][field] except KeyError, e: pass ## Create SQLFORM from the table _form_components[table] = SQLFORM.factory( db[table], buttons=[], formstyle='divs' if table not in ['node', 'node_revision'] else 'table3cols').components ## Change field names by adding ``<tablename>--`` prefix for ilev, comp in descend_tree(_form_components[table]): if isinstance(comp, INPUT) and comp.attributes.has_key('_name'): ## Change field name comp.attributes['_name'] = '%s--%s' % ( table, comp.attributes['_name'])
######################################################################### ## this is the main application menu add/remove items as required ######################################################################### import cms_settings response.menu = [ (T('Home'), False, URL('default','index'), []), ## Node stuff (T('Content'), False, URL('default','node_list'), [ (T('List content'), False, URL('default','node_list'), []), (T('Add'), False, URL('default','node_create'), [ (T('New %s', type_def['label']), False, URL('default','node_create', args=[node_type])) for node_type, type_def in cms_settings.list_node_types().items() ]), (T('Search'), False, URL('default','node_search'), []), ]), ## Administration panel (T('Admin'), False, URL('admin','index'), []), ] menu_development = (T('Devel'), False, URL('devel','index'), [ (T('Status'), False, URL('devel','status'), [], {'icon':URL('static','images/icons/system-monitor.png')}), (T('Generate'), False, URL('devel','generate'), [], {'icon':URL('static','images/icons/devel.png')}), (T('Appadmin'), False, URL('appadmin','index'), [],