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
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]
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]
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
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 _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
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
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)
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
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
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
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 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] })
def allowed_types(container): return [i.id for i in _allowedTypes(request, container)]
def allowed_types(self): return [translate(i.Title(), domain=i.i18n_domain, context=self.request) for i in _allowedTypes(self.request, self.context)]
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
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] })
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] })