Example #1
0
    def showEditableBorder(self):
        """Determine if the editable border should be shown
        """
        request = self.request

        if request.has_key("disable_border"):  # short circuit
            return False
        if request.has_key("enable_border"):  # short circuit
            return True

        context = aq_inner(self.context)

        portal_membership = getToolByName(context, "portal_membership")
        checkPerm = portal_membership.checkPermission

        if (
            checkPerm("Modify portal content", context)
            or checkPerm("Add portal content", context)
            or checkPerm("Review portal content", context)
        ):
            return True

        if portal_membership.isAnonymousUser():
            return False

        context_state = getMultiAdapter((context, request), name="plone_context_state")
        actions = context_state.actions()

        if actions.get("workflow", ()):
            return True

        if actions.get("batch", []):
            return True

        for action in actions.get("object", []):
            if action.get("id", "") != "view":
                return True

        template_id = self._data.get("template_id", None)
        if template_id is None and "PUBLISHED" in request:
            if hasattr(request["PUBLISHED"], "getId"):
                template_id = request["PUBLISHED"].getId()

        idActions = {}
        for obj in actions.get("object", ()) + actions.get("folder", ()):
            idActions[obj.get("id", "")] = 1

        if idActions.has_key("edit"):
            if idActions.has_key(template_id) or template_id in [
                "synPropertiesForm",
                "folder_contents",
                "folder_listing",
            ]:
                return True

        # Check to see if the user is able to add content or change workflow state
        if _allowedTypes(request, context):
            return True

        return False
Example #2
0
 def _addableTypesInContext(self, addContext):
     allowed_types = _allowedTypes(self.request, addContext)
     constrain = IConstrainTypes(addContext, None)
     if constrain is None:
         return allowed_types
     locallyAllowed = constrain.getLocallyAllowedTypes()
     return [fti for fti in allowed_types if fti.getId() in locallyAllowed]
Example #3
0
 def _addableTypesInContext(self, addContext):
     allowed_types = _allowedTypes(self.request, addContext)
     constrain = IConstrainTypes(addContext, None)
     if constrain is None:
         return allowed_types
     locallyAllowed = constrain.getLocallyAllowedTypes()
     return [fti for fti in allowed_types if fti.getId() in locallyAllowed]
Example #4
0
    def available(self):
        context = self.context
        usuari = context.portal_membership.getAuthenticatedMember()                                #mirem si lusuari te permis per afegir periodes
        rols = usuari.getRoles()
        if 'Manager' in rols or 'WebMaster' in rols:
        
            context_state = getMultiAdapter((context, self.request), name=u'plone_context_state')  #mirem si estem a carpeta 'osi'
            estem_a_osi = context.getPortalTypeName() == 'Folder' and context.getId() == 'osi'
            portal_types = getToolByName(context, 'portal_types')
            carpeta_unitats = getattr(portal_types, 'unitats', False)
            carpeta_base = getattr(carpeta_unitats, 'osi', False)
            if carpeta_unitats and carpeta_base:
                vista_per_defecte = carpeta_base.getDefaultPage()
                estem_a_vista_per_defecte_osi = vista_per_defecte == context.getId()
                if estem_a_osi or estem_a_vista_per_defecte_osi:

                    factories_view = getMultiAdapter((context, self.request), name='folder_factories') #mirem si podem afegir periodes
                    addContext = factories_view.add_context()
                    allowedTypes = _allowedTypes(self.request, addContext)
                    for item in allowedTypes:
                        item_id = item.getId()
                        if item_id == 'SurveyGenweb':
                            return True

        return False
Example #5
0
 def _contentCanBeAdded(self, addContext, request):
     """Find out if content can be added either by local constraints on the
     context or by allowed_content_types on the FTI.
     """
     constrain = IConstrainTypes(addContext, None)
     if constrain is None:
         return _allowedTypes(request, addContext)
     return constrain.getLocallyAllowedTypes()
Example #6
0
 def _contentCanBeAdded(self, addContext, request):
     """Find out if content can be added either by local constraints on the
     context or by allowed_content_types on the FTI.
     """
     constrain = IConstrainTypes(addContext, None)
     if constrain is None:
         return _allowedTypes(request, addContext)
     return constrain.getLocallyAllowedTypes()
    def showEditableBorder(self):
        """Determine if the editable border should be shown
        """
        request = self.request
        if 'disable_border' in request:
            return False
        if 'enable_border' in request:
            return True

        context = aq_inner(self.context)

        portal_membership = getToolByName(context, 'portal_membership')
        checkPerm = portal_membership.checkPermission

        if checkPerm('Modify portal content', context) or \
               checkPerm('Add portal content', context) or \
               checkPerm('Review portal content', context):
            return True

        if portal_membership.isAnonymousUser():
            return False

        context_state = getMultiAdapter((context, request),
                                        name="plone_context_state")
        actions = context_state.actions

        if actions('workflow', max=1):
            return True

        if actions('batch', max=1):
            return True

        for action in actions('object'):
            if action.get('id', '') != 'view':
                return True

        template_id = None
        if 'PUBLISHED' in request:
            if getattr(request['PUBLISHED'], 'getId', None):
                template_id = request['PUBLISHED'].getId()

        idActions = {}
        for obj in actions('object') + actions('folder'):
            idActions[obj.get('id', '')] = 1

        if 'edit' in idActions:
            if (template_id in idActions or template_id in [
                    'synPropertiesForm', 'folder_contents', 'folder_listing',
                    'listing_view'
            ]):
                return True

        # Check to see if the user is able to add content
        allowedTypes = [fti for fti in _allowedTypes(request, context)]
        if allowedTypes:
            return True

        return False
    def showEditableBorder(self):
        """Determine if the editable border should be shown
        """
        request = self.request
        if 'disable_border' in request:
            return False
        if 'enable_border' in request:
            return True

        context = aq_inner(self.context)

        portal_membership = getToolByName(context, 'portal_membership')
        checkPerm = portal_membership.checkPermission

        if checkPerm('Modify portal content', context) or \
               checkPerm('Add portal content', context) or \
               checkPerm('Review portal content', context):
            return True

        if portal_membership.isAnonymousUser():
            return False

        context_state = getMultiAdapter((context, request),
                                        name="plone_context_state")
        actions = context_state.actions

        if actions('workflow', max=1):
            return True

        if actions('batch', max=1):
            return True

        for action in actions('object'):
            if action.get('id', '') != 'view':
                return True

        template_id = None
        if 'PUBLISHED' in request:
            if getattr(request['PUBLISHED'], 'getId', None):
                template_id = request['PUBLISHED'].getId()

        idActions = {}
        for obj in actions('object') + actions('folder'):
            idActions[obj.get('id', '')] = 1

        if 'edit' in idActions:
            if (template_id in idActions or \
                template_id in ['synPropertiesForm', 'folder_contents',
                                'folder_listing']):
                return True

        # Check to see if the user is able to add content
        allowedTypes = [fti for fti in _allowedTypes(request, context)]
        if allowedTypes:
            return True

        return False
Example #9
0
    def addable_types(self, include=None):
        context = aq_inner(self.context)
        request = self.request
        results = []

        portal_state = getMultiAdapter((context, request), name="plone_portal_state")
        portal_url = portal_state.portal_url()
        addContext = self.add_context()
        baseUrl = addContext.absolute_url()

        allowedTypes = plone._allowedTypes(request, addContext)
        exclude = addContext.getNotAddableTypes()

        addingview = queryMultiAdapter((addContext, request), name="+")
        idnormalizer = queryUtility(IIDNormalizer)
        for t in allowedTypes:
            url = None
            typeId = t.getId()
            if typeId not in exclude and (include is None or typeId in include):
                cssId = idnormalizer.normalize(typeId)
                cssClass = "contenttype-%s" % cssId
                factory_name = t.factory
                if addingview is not None and not t.product:
                    factory = queryMultiAdapter((addingview, self.request), name=factory_name)
                    if factory is not None:
                        url = "+/%s" % factory_name
                    else:
                        workshop = queryUtility(IFactory, factory_name)
                        url = workshop and "+spear/%s=%s" % (workshop.addform, t.factory) or None

                if url is None:
                    url = "createObject?type_name=%s" % quote_plus(typeId)

                icon = t.getIcon()
                if icon:
                    icon = "%s/%s" % (portal_url, icon)

                results.append(
                    {
                        "id": typeId,
                        "title": t.Title(),
                        "description": t.Description(),
                        "action": "%s/%s" % (baseUrl, url),
                        "selected": False,
                        "icon": icon,
                        "extra": {"id": cssId, "separator": None, "class": cssClass},
                        "submenu": None,
                    }
                )

        # Sort the addable content types based on their translated title
        results = [(translate(ctype["title"], context=request), ctype) for ctype in results]
        results.sort()
        results = [ctype[-1] for ctype in results]

        return results
Example #10
0
    def __call__(self, context):
        context = getattr(context, 'context', context)
        request = context.REQUEST
        
        factories_view = getMultiAdapter((context, request), name='folder_factories')

        addContext = factories_view.add_context()
        allowedTypes = _allowedTypes(request, addContext)
        items = [SimpleTerm(i.id, i.id, i.Title()) for i in allowedTypes]
        return SimpleVocabulary(items)
Example #11
0
    def _locallyAllowedTypes(self, addContext):
        addContext = addContext or self.context

        allowed_types = _allowedTypes(self.request, addContext)
        constrain = IConstrainTypes(addContext, None)
        if constrain is None:
            return allowed_types
        locallyAllowed = constrain.getLocallyAllowedTypes()
        # logger.info("locallyAllowed: {}".format(locallyAllowed))
        return locallyAllowed
Example #12
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        factories_view = getMultiAdapter((context, request), name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.add_context()
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results = factories_view.addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(),)
            results.append({ 'title'       : _(u'folder_add_more', default=u'More\u2026'),
                             'description' : _(u'Show all available content types'),
                             'action'      : url,
                             'selected'    : False,
                             'icon'        : None,
                             'extra'       : {'id': 'more', 'separator': None, 'class': ''},
                             'submenu'     : None,
                            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes() and constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (addContext.absolute_url(),)
                results.append({'title'       : _(u'folder_add_settings', default=u'Restrictions\u2026'),
                                'description' : _(u'title_configure_addable_content_types', default=u'Configure which content types can be added here'),
                                'action'      : url,
                                'selected'    : False,
                                'icon'        : None,
                                'extra'       : {'id': 'settings', 'separator': None, 'class': ''},
                                'submenu'     : None,
                                })

        return results
Example #13
0
    def guards(self):
        immediately_addable = True
        context_state = getMultiAdapter((self.context.aq_inner, self.request),
                                        name='plone_context_state')
        container = context_state.folder()
        try:
            constraint = ISelectableConstrainTypes(container)
            immediately_addable = 'File' in constraint.getImmediatelyAddableTypes(
            )
        except TypeError:
            pass

        return [
            api.user.has_permission('Add portal content', obj=self.context),
            api.user.has_permission('plone.app.contenttypes: Add File',
                                    obj=self.context), immediately_addable,
            [
                i for i in _allowedTypes(self.request, self.context)
                if i.id in ('Image', 'File')
            ]
        ]
    def default_page_addable_types(self, include=None):
        """Return menu item entries in a TAL-friendly form.

        Pass a list of type ids to 'include' to explicitly allow a list of
        types.
        """
        context = aq_inner(self.context)
        request = self.request

        results = []

        portal_state = getMultiAdapter((context, request), name="plone_portal_state")
        portal_url = portal_state.portal_url()

        addContext = self.default_page_add_context()
        if not addContext:
            return results
        baseUrl = addContext.absolute_url()

        allowedTypes = _allowedTypes(request, addContext)

        # XXX: This is calling a pyscript (which we encourage people to customise TTW)
        exclude = addContext.getNotAddableTypes()

        # If there is an add view available, use that instead of createObject
        # Note: that this depends on the convention that the add view and the
        # factory have the same name, and it still only applies where there
        # is an FTI in portal_types to begin with. Alas, FTI-less content
        # is pretty much a no-go in CMF.
        addingview = queryMultiAdapter((addContext, request), name="+")
        idnormalizer = queryUtility(IIDNormalizer)
        for t in allowedTypes:
            typeId = t.getId()
            if typeId not in exclude and (include is None or typeId in include):
                cssId = idnormalizer.normalize(typeId)
                cssClass = "contenttype-%s" % cssId
                factory = t.factory
                if addingview is not None and queryMultiAdapter((addingview, self.request), name=factory) is not None:
                    url = "%s/+/%s" % (baseUrl, factory)
                else:
                    url = "%s/createObject?type_name=%s" % (baseUrl, quote_plus(typeId))
                icon = t.getIcon()
                if icon:
                    icon = "%s/%s" % (portal_url, icon)

                results.append(
                    {
                        "id": typeId,
                        "title": t.Title(),
                        "description": t.Description(),
                        "action": url,
                        "selected": False,
                        "icon": icon,
                        "extra": {"id": cssId, "separator": None, "class": cssClass},
                        "submenu": None,
                    }
                )

        # Sort the addable content types based on their translated title
        results = [(translate(ctype["title"], context=request), ctype) for ctype in results]
        results.sort()
        results = [ctype[-1] for ctype in results]

        return results
Example #15
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        factories_view = getMultiAdapter((context, request),
                                         name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.add_context()
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results = factories_view.addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(),)
            results.append({
                'title': _(u'folder_add_more', default=u'More\u2026'),
                'description': _(u'Show all available content types'),
                'action': url,
                'selected': False,
                'icon': None,
                'extra': {
                    'id': 'plone-contentmenu-more',
                    'separator': None,
                    'class': ''},
                'submenu': None,
            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes() and \
                    constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (
                    addContext.absolute_url(),)
                results.append({
                    'title': _(u'folder_add_settings',
                               default=u'Restrictions\u2026'),
                    'description': _(
                        u'title_configure_addable_content_types',
                        default=u'Configure which content types can be '
                                u'added here'),
                    'action': url,
                    'selected': False,
                    'icon': None,
                    'extra': {
                        'id': 'plone-contentmenu-settings',
                        'separator': None,
                        'class': ''},
                    'submenu': None,
                    })

        # Also add a menu item to add items to the default page
        context_state = getMultiAdapter((context, request),
                                        name='plone_context_state')
        if context_state.is_structural_folder() and \
                context_state.is_default_page() and \
                self._contentCanBeAdded(context, request):
            results.append({
                'title': _(u'default_page_folder',
                           default=u'Add item to default page'),
                'description': _(
                    u'desc_default_page_folder',
                    default=u'If the default page is also a folder, '
                            u'add items to it from here.'),
                'action': context.absolute_url() + '/@@folder_factories',
                'selected': False,
                'icon': None,
                'extra': {
                    'id': 'plone-contentmenu-add-to-default-page',
                    'separator': None,
                    'class': 'pat-plone-modal'},
                'submenu': None,
                })

        return results
Example #16
0
def jupload__call__(self):
    authenticator = getMultiAdapter((self.context, self.request),
                                    name=u"authenticator")
    if not authenticator.verify() or \
            self.request['REQUEST_METHOD'] != 'POST':
        raise Unauthorized
    filedata = self.request.form.get("files[]", None)
    if filedata is None:
        return
    filename = filedata.filename
    content_type = mimetypes.guess_type(filename)[0] or ""

    if not filedata:
        return

    ctr = getToolByName(self.context, 'content_type_registry')
    type_ = ctr.findTypeName(filename.lower(), '', '') or 'File'

    # Determine if the default file/image types are DX or AT based
    DX_BASED = False
    context_state = getMultiAdapter((self.context, self.request), name=u'plone_context_state')
    if HAS_DEXTERITY:
        pt = getToolByName(self.context, 'portal_types')
        if IDexterityFTI.providedBy(getattr(pt, type_)):
            factory = IDXFileFactory(self.context)
            DX_BASED = True
        else:
            factory = IATCTFileFactory(self.context)
        # if the container is a DX type, get the available types from the behavior
        if IDexterityFTI.providedBy(getattr(pt, self.context.portal_type)):
            addable_types = ISelectableConstrainTypes(
                self.context).getLocallyAllowedTypes()
        elif context_state.is_portal_root():
            allowed_types = _allowedTypes(self.request, self.context)
            addable_types = [fti.getId() for fti in allowed_types]
        else:
            addable_types = self.context.getLocallyAllowedTypes()
    else:
        factory = IATCTFileFactory(self.context)
        if context_state.is_portal_root():
            allowed_types = _allowedTypes(self.request, self.context)
            addable_types = [fti.getId() for fti in allowed_types]
        else:
            addable_types = self.context.getLocallyAllowedTypes()

    # if the type_ is disallowed in this folder, return an error
    if type_ not in addable_types:
        msg = translate(
            _WF('disallowed_type_error',
                default='${filename}: adding of "${type}" \
                         type is disabled in this folder',
                mapping={'filename': filename, 'type': type_}),
            context=self.request
        )
        return json.dumps({'files': [{'error': msg}]})

    obj = factory(filename, content_type, filedata)

    if DX_BASED:
        if 'File' in obj.portal_type:
            size = obj.file.getSize()
            content_type = obj.file.contentType
        elif 'Image' in obj.portal_type:
            size = obj.image.getSize()
            content_type = obj.image.contentType

        result = {
            "url": obj.absolute_url(),
            "name": obj.getId(),
            "type": content_type,
            "size": size
        }
    else:
        try:
            size = obj.getSize()
        except AttributeError:
            size = obj.getObjSize()

        result = {
            "url": obj.absolute_url(),
            "name": obj.getId(),
            "type": obj.getContentType(),
            "size": size
        }

    if 'Image' in obj.portal_type:
        result['thumbnail_url'] = result['url'] + '/@@images/image/tile'

    return json.dumps({
        'files': [result]
    })
Example #17
0
 def allowed_types(container):
     return [i.id for i in _allowedTypes(request, container)]
Example #18
0
 def allowed_types(self):
     return [translate(i.Title(), domain=i.i18n_domain, context=self.request)
             for i in _allowedTypes(self.request, self.context)]
Example #19
0
def checkPermissionCreateObject(self, context, objectID):
    if checkPermission('cmf.AddPortalContent', context):
        for item in _allowedTypes(self.request, context):
            if item.id == objectID:
                return True
    return False
Example #20
0
def jupload__call__(self):
    authenticator = getMultiAdapter((self.context, self.request),
                                    name=u"authenticator")
    if not authenticator.verify() or \
            self.request['REQUEST_METHOD'] != 'POST':
        raise Unauthorized
    filedata = self.request.form.get("files[]", None)
    if filedata is None:
        return
    filename = filedata.filename
    content_type = mimetypes.guess_type(filename)[0] or ""

    if not filedata:
        return

    ctr = getToolByName(self.context, 'content_type_registry')
    type_ = ctr.findTypeName(filename.lower(), '', '') or 'File'

    # Determine if the default file/image types are DX or AT based
    DX_BASED = False
    context_state = getMultiAdapter((self.context, self.request), name=u'plone_context_state')
    if HAS_DEXTERITY:
        pt = getToolByName(self.context, 'portal_types')
        if IDexterityFTI.providedBy(getattr(pt, type_)):
            factory = IDXFileFactory(self.context)
            DX_BASED = True
        else:
            factory = IATCTFileFactory(self.context)
        # if the container is a DX type, get the available types from the behavior
        if IDexterityFTI.providedBy(getattr(pt, self.context.portal_type)):
            addable_types = ISelectableConstrainTypes(
                self.context).getLocallyAllowedTypes()
        elif context_state.is_portal_root():
            allowed_types = _allowedTypes(self.request, self.context)
            addable_types = [fti.getId() for fti in allowed_types]
        else:
            addable_types = self.context.getLocallyAllowedTypes()
    else:
        factory = IATCTFileFactory(self.context)
        if context_state.is_portal_root():
            allowed_types = _allowedTypes(self.request, self.context)
            addable_types = [fti.getId() for fti in allowed_types]
        else:
            addable_types = self.context.getLocallyAllowedTypes()

    # if the type_ is disallowed in this folder, return an error
    if type_ not in addable_types:
        msg = translate(
            _WF('disallowed_type_error',
                default='${filename}: adding of "${type}" \
                         type is disabled in this folder',
                mapping={'filename': filename, 'type': type_}),
            context=self.request
        )
        return json.dumps({'files': [{'error': msg}]})

    obj = factory(filename, content_type, filedata)

    if DX_BASED:
        if 'File' in obj.portal_type:
            size = obj.file.getSize()
            content_type = obj.file.contentType
        elif 'Image' in obj.portal_type:
            size = obj.image.getSize()
            content_type = obj.image.contentType

        result = {
            "url": obj.absolute_url(),
            "name": obj.getId(),
            "type": content_type,
            "size": size
        }
    else:
        try:
            size = obj.getSize()
        except AttributeError:
            size = obj.getObjSize()

        result = {
            "url": obj.absolute_url(),
            "name": obj.getId(),
            "type": obj.getContentType(),
            "size": size
        }

    if 'Image' in obj.portal_type:
        result['thumbnail_url'] = result['url'] + '/@@images/image/tile'

    return json.dumps({
        'files': [result]
    })
Example #21
0
    def getMenuItems(self, context, request):
        """Return menu item entries in a TAL-friendly form."""
        factories_view = getMultiAdapter((context, request),
                                         name='folder_factories')

        haveMore = False
        include = None

        addContext = factories_view.add_context()
        allowedTypes = _allowedTypes(request, addContext)

        constraints = IConstrainTypes(addContext, None)
        if constraints is not None:
            include = constraints.getImmediatelyAddableTypes()
            if len(include) < len(allowedTypes):
                haveMore = True

        results = factories_view.addable_types(include=include)

        if haveMore:
            url = '%s/folder_factories' % (addContext.absolute_url(), )
            results.append({
                'title':
                _(u'folder_add_more', default=u'More\u2026'),
                'description':
                _(u'Show all available content types'),
                'action':
                url,
                'selected':
                False,
                'icon':
                None,
                'extra': {
                    'id': 'plone-contentmenu-more',
                    'separator': None,
                    'class': ''
                },
                'submenu':
                None,
            })

        constraints = ISelectableConstrainTypes(addContext, None)
        if constraints is not None:
            if constraints.canSetConstrainTypes() and \
                    constraints.getDefaultAddableTypes():
                url = '%s/folder_constraintypes_form' % (
                    addContext.absolute_url(), )
                results.append({
                    'title':
                    _(u'folder_add_settings', default=u'Restrictions\u2026'),
                    'description':
                    _(u'title_configure_addable_content_types',
                      default=u'Configure which content types can be '
                      u'added here'),
                    'action':
                    url,
                    'selected':
                    False,
                    'icon':
                    None,
                    'extra': {
                        'id': 'plone-contentmenu-settings',
                        'separator': None,
                        'class': ''
                    },
                    'submenu':
                    None,
                })

        # Also add a menu item to add items to the default page
        context_state = getMultiAdapter((context, request),
                                        name='plone_context_state')
        if context_state.is_structural_folder() and \
                context_state.is_default_page() and \
                self._contentCanBeAdded(context, request):
            results.append({
                'title':
                _(u'default_page_folder', default=u'Add item to default page'),
                'description':
                _(u'desc_default_page_folder',
                  default=u'If the default page is also a folder, '
                  u'add items to it from here.'),
                'action':
                context.absolute_url() + '/@@folder_factories',
                'selected':
                False,
                'icon':
                None,
                'extra': {
                    'id': 'plone-contentmenu-add-to-default-page',
                    'separator': None,
                    'class': 'pat-plone-modal'
                },
                'submenu':
                None,
            })

        return results
    def default_page_addable_types(self, include=None):
        """Return menu item entries in a TAL-friendly form.

        Pass a list of type ids to 'include' to explicitly allow a list of
        types.
        """
        context = aq_inner(self.context)
        request = self.request

        results = []

        portal_state = getMultiAdapter((context, request), name='plone_portal_state')
        portal_url = portal_state.portal_url()

        addContext = self.default_page_add_context()
        if not addContext:
            return results
        baseUrl = addContext.absolute_url()

        allowedTypes = _allowedTypes(request, addContext)

        # XXX: This is calling a pyscript (which we encourage people to customise TTW)
        exclude = addContext.getNotAddableTypes()

        # If there is an add view available, use that instead of createObject
        # Note: that this depends on the convention that the add view and the
        # factory have the same name, and it still only applies where there
        # is an FTI in portal_types to begin with. Alas, FTI-less content
        # is pretty much a no-go in CMF.
        addingview = queryMultiAdapter((addContext, request), name='+')
        idnormalizer = queryUtility(IIDNormalizer)
        for t in allowedTypes:
            typeId = t.getId()
            if typeId not in exclude and (include is None or typeId in include):
                cssId = idnormalizer.normalize(typeId)
                cssClass = 'contenttype-%s' % cssId
                factory = t.factory
                if addingview is not None and \
                   queryMultiAdapter((addingview, self.request), name=factory) is not None:
                    url = '%s/+/%s' % (baseUrl, factory,)
                else:
                    url = '%s/createObject?type_name=%s' % (baseUrl, quote_plus(typeId),)
                icon = t.getIconExprObject()
                if icon:
                    icon = '%s/%s' % (portal_url, icon)

                results.append({
                    'id': typeId,
                    'title': t.Title(),
                    'description': t.Description(),
                    'action': url,
                    'selected': False,
                    'icon': icon,
                    'extra': {
                        'id': cssId,
                        'separator': None,
                        'class': cssClass,
                    },
                    'submenu': None,
                })

        # Sort the addable content types based on their translated title
        results = [(translate(ctype['title'], context=request), ctype) for ctype in results]
        results.sort()
        results = [ctype[-1] for ctype in results]

        return results
    def create_content(self, filedata, filename, chunker=None):
        if not filedata:
            return
        ctr = getToolByName(self.context, 'content_type_registry')
        type_ = ctr.findTypeName(filename.lower(), '', '') or 'File'

        # Determine if the default file/image types are DX or AT based
        DX_BASED = False
        context_state = getMultiAdapter((self.context, self.request),
                                        name=u'plone_context_state')
        if HAS_DEXTERITY:
            pt = getToolByName(self.context, 'portal_types')
            if IDexterityFTI.providedBy(getattr(pt, type_)):
                factory = IDXFileFactory(self.context)
                DX_BASED = True
            else:
                factory = IATCTFileFactory(self.context)
            # if the container is a DX type, get the available types from the behavior
            if IDexterityFTI.providedBy(getattr(pt, self.context.portal_type)):
                addable_types = ISelectableConstrainTypes(
                    self.context).getImmediatelyAddableTypes()
            elif context_state.is_portal_root():
                allowed_types = _allowedTypes(self.request, self.context)
                addable_types = [fti.getId() for fti in allowed_types]
            else:
                addable_types = self.context.getImmediatelyAddableTypes()
        else:
            factory = IATCTFileFactory(self.context)
            if context_state.is_portal_root():
                allowed_types = _allowedTypes(self.request, self.context)
                addable_types = [fti.getId() for fti in allowed_types]
            else:
                addable_types = self.context.getImmediatelyAddableTypes()

        # if the type_ is disallowed in this folder, return an error
        if type_ not in addable_types:
            msg = translate(
                _('disallowed_type_error',
                    default='${filename}: adding of "${type}" \
                             type is disabled in this folder',
                    mapping={'filename': filename, 'type': type_}),
                context=self.request
            )
            return json.dumps({'files': [{'error': msg}]})

        obj = factory(filename, self.get_content_type(filename), filedata)

        if DX_BASED:
            if 'File' in obj.portal_type:
                size = obj.file.getSize()
                content_type = obj.file.contentType
            elif 'Image' in obj.portal_type:
                size = obj.image.getSize()
                content_type = obj.image.contentType

            result = self.get_upload_data(
                url=obj.absolute_url(),
                name=obj.getId(),
                size=size,
                content_type=content_type)
        else:
            try:
                size = obj.getSize()
            except AttributeError:
                size = obj.getObjSize()

            result = self.get_upload_data(
                url=obj.absolute_url(),
                name=obj.getId(),
                type=obj.getContentType(),
                size=size)

        if 'Image' in obj.portal_type:
            result['thumbnail_url'] = result['url'] + '/@@images/image/tile'

        # cleanup!
        if chunker:
            chunker.cleanup_file()

        return json.dumps({
            'files': [result]
        })