def content_edit(request): item = request.context form = item._get_edit_form(request.POST) if not form.validate(): ct_registry = get_content_type_registry(request.registry) ## FIXME: how can this work? edit_form_view = ct_registry[item]['edit_form_view'] return edit_form_view(request, form) form.populate_obj(item) request.session.flash(u'Your changes have been saved.', 'success') location = request.resource_url(item) + getattr(item, 'admin_view_path', '') return HTTPSeeOther(location)
def content_view(request): ct_registry = get_content_type_registry(request.registry) klass = request.context.__class__ templates = ct_registry[klass]['display_templates'] if not templates: raise ValueError('The default display view is used for the %s ' 'content type but no template has been ' 'provided. It must be customized.' % klass.label) template = _get_display_template( ct_registry, request.context) api = get_template_api(request) return render_to_response(template, {'api': api, 'context': request.context})
def get_addable_types(self, request): """Return content types that can be added as a list of dictionaries that contain the label of the content type and the view name of the add form. """ ct_registry = get_content_type_registry(request.registry) types = [] for klass, info in ct_registry.items(): if not info['addable']: continue types.append({'label': klass.label, 'form': 'add_%s' % klass.meta_type.lower()}) return sorted(types, key=lambda x: x['label'])
def content_add(content_type, request): context = request.context form = content_type._get_add_form(request.POST) form.errors['id'] = [u'Invalid id'] if not form.validate(context): ct_registry = get_content_type_registry(request.registry) add_form_view = ct_registry[content_type]['add_form_view'] return add_form_view(request, form) item = content_type() form.populate_obj(item) context.add(request.registry, form.id.data, item) label = content_type.label msg = (u'%s "%s" has been created and you are ' 'now viewing it.' % (label, form.title.data)) request.session.flash(msg, 'success') location = request.resource_url(item) + getattr(item, 'admin_view_path', '') return HTTPSeeOther(location)
def _register_content_type(config, klass, addable=True, display_view=None, display_templates=(), add_form_view=None, add_template=None, add_view=None, edit_form_view=None, edit_template=None, edit_view=None, extra_views=()): """FIXME: document args""" from petrel.content.base import content_add from petrel.content.base import content_add_form from petrel.content.base import content_edit from petrel.content.base import content_edit_form from petrel.content.base import content_view ## Default views if display_view is None: display_view = content_view if display_templates is None: display_templates = () if add_form_view is None: add_form_view = lambda request, form=None: content_add_form( klass, request, form) if add_template is None: add_template = 'templates/content_edit.pt' if add_view is None: add_view = lambda request: content_add(klass, request) if edit_form_view is None: edit_form_view = content_edit_form if edit_template is None: edit_template = 'templates/content_edit.pt' if edit_view is None: edit_view = content_edit ## Register views if addable: ## The 'renderer' attribute below is needed when the view has ## to redisplay the add form. config.add_view(name='add_%s' % klass.meta_type.lower(), context=IFolderish, request_method='POST', view=add_view, renderer=add_template) config.add_view(name='add_%s' % klass.meta_type.lower(), context=IFolderish, view=add_form_view, renderer=add_template) config.add_view(context=klass, view=display_view) config.add_view(name='edit', context=klass, view=edit_form_view, renderer=edit_template) ## The 'renderer' attribute below is needed when the view has ## to redisplay the edit form. config.add_view(name='edit', context=klass, request_method='POST', view=edit_view, renderer=edit_template) for extra_view in extra_views: config.add_view(**extra_view) ## Register the content type in our content type registry. ct_registry = get_content_type_registry(config.registry) ct_registry[klass] = dict( addable=addable, add_form_view=add_form_view, edit_form_view=edit_form_view, display_templates=display_templates)