def create_page(title, template, language, menu_title=None, slug=None, apphook=None, apphook_namespace=None, redirect=None, meta_description=None, created_by='python-api', parent=None, publication_date=None, publication_end_date=None, in_navigation=False, soft_root=False, reverse_id=None, navigation_extenders=None, published=False, site=None, login_required=False, limit_visibility_in_menu=constants.VISIBILITY_ALL, position="last-child", overwrite_url=None, xframe_options=Page.X_FRAME_OPTIONS_INHERIT): """ Create a CMS Page and it's title for the given language See docs/extending_cms/api_reference.rst for more info """ # validate template if not template == TEMPLATE_INHERITANCE_MAGIC: assert template in [tpl[0] for tpl in get_cms_setting('TEMPLATES')] get_template(template) # validate site if not site: site = get_current_site() else: assert isinstance(site, Site) # validate language: assert language in get_language_list(site), get_cms_setting('LANGUAGES').get(site.pk) # validate parent if parent: assert isinstance(parent, Page) assert parent.publisher_is_draft # validate publication date if publication_date: assert isinstance(publication_date, datetime.date) # validate publication end date if publication_end_date: assert isinstance(publication_end_date, datetime.date) if navigation_extenders: raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) menus = [menu[0] for menu in raw_menus] assert navigation_extenders in menus # validate menu visibility accepted_limitations = (constants.VISIBILITY_ALL, constants.VISIBILITY_USERS, constants.VISIBILITY_ANONYMOUS) assert limit_visibility_in_menu in accepted_limitations # validate position assert position in ('last-child', 'first-child', 'left', 'right') target_node = parent.node if parent else None # validate and normalize apphook if apphook: application_urls = _verify_apphook(apphook, apphook_namespace) else: application_urls = None # ugly permissions hack if created_by and isinstance(created_by, get_user_model()): _thread_locals.user = created_by created_by = getattr(created_by, get_user_model().USERNAME_FIELD) else: _thread_locals.user = None if reverse_id: if Page.objects.drafts().filter(reverse_id=reverse_id, node__site=site).exists(): raise FieldError('A page with the reverse_id="%s" already exist.' % reverse_id) page = Page( created_by=created_by, changed_by=created_by, publication_date=publication_date, publication_end_date=publication_end_date, in_navigation=in_navigation, soft_root=soft_root, reverse_id=reverse_id, navigation_extenders=navigation_extenders, template=template, application_urls=application_urls, application_namespace=apphook_namespace, login_required=login_required, limit_visibility_in_menu=limit_visibility_in_menu, xframe_options=xframe_options, ) page.set_tree_node(site=site, target=target_node, position=position) page.save() page.rescan_placeholders() create_title( language=language, title=title, menu_title=menu_title, slug=slug, redirect=redirect, meta_description=meta_description, page=page, overwrite_url=overwrite_url, ) if published: page.publish(language) if parent and position in ('last-child', 'first-child'): parent._clear_node_cache() del _thread_locals.user return page