示例#1
0
    def deletelayout(self):
        layout_resources = queryResourceDirectory(
            CONTENT_LAYOUT_RESOURCE_NAME, 'custom')

        # find directory
        layout_path = self.request.form.get('layout')
        filename = layout_path.split('/')[-1]
        directory = layout_resources
        for part in layout_path.replace('custom/', '').split('/')[:-1]:
            directory = directory[part]
        del directory[filename]

        # now to modify manifest to not include
        if MANIFEST_FILENAME in directory.listDirectory():
            manifest = loadManifest(directory.readFile(MANIFEST_FILENAME))
            removeLayout(manifest, filename)
            directory.writeFile(MANIFEST_FILENAME, dumpManifest(manifest))

        # now reassign if provided
        replacement = self.request.form.get('replacement')
        if replacement:
            replacement = self._get_layout_path(replacement)
            catalog = api.portal.get_tool('portal_catalog')
            for brain in catalog(layout=self._get_layout_path(layout_path)):
                obj = brain.getObject()
                layout_data = ILayoutAware(obj, None)
                if layout_data:
                    layout_data.contentLayout = replacement
                    obj.reindexObject(idxs=['layout'])

        return json.dumps({
            'success': True,
            'user_layouts': getUserContentLayoutsForType(self.context.portal_type),
            'available_layouts': getContentLayoutsForType(self.context.portal_type)
        })
示例#2
0
    def deletelayout(self):
        layout_resources = queryResourceDirectory(
            CONTENT_LAYOUT_RESOURCE_NAME, 'custom')
        layout_path = self.request.form.get('layout')

        if len(layout_path.split('/')) <= 2:
            sm = getSecurityManager()
            # this is a global layout, need to check permissions
            if not sm.checkPermission('Plone: Manage Content Layouts',
                                      api.portal.get()):
                raise Unauthorized("User not allowed to delete global layout")
        else:
            # check this user is allowed to delete this template
            user_dir = 'custom/user-layouts/{}'.format(
                api.user.get_current().getId())
            if not layout_path.startswith(user_dir):
                raise Unauthorized("You are not allowed to delete this layout")

        # find directory
        filename = layout_path.split('/')[-1]
        directory = layout_resources
        for part in layout_path.replace('custom/', '').split('/')[:-1]:
            directory = directory[part]
        del directory[filename]

        # now to modify manifest to not include
        if MANIFEST_FILENAME in directory.listDirectory():
            manifest = loadManifest(directory.readFile(MANIFEST_FILENAME))
            removeLayout(manifest, filename)
            directory.writeFile(MANIFEST_FILENAME, dumpManifest(manifest))

        # now reassign if provided
        replacement = self.request.form.get('replacement')
        if replacement:
            replacement = self._get_layout_path(replacement)
            catalog = api.portal.get_tool('portal_catalog')
            for brain in catalog(layout=self._get_layout_path(layout_path)):
                obj = brain.getObject()
                layout_data = ILayoutAware(obj, None)
                if layout_data:
                    layout_data.contentLayout = replacement
                    obj.reindexObject(idxs=['layout'])

        return json.dumps(
            {
                'success': True,
                'user_layouts': getUserContentLayoutsForType(
                    self.context.portal_type
                ),
                'available_layouts': getContentLayoutsForType(
                    self.context.portal_type
                )
            }
        )
示例#3
0
 def create_plain_folder(self, id, container):
     logger.info("Creating plain Folder (no __folder__ file found), %s" %
                 id)
     folder = api.content.create(type='Folder',
                                 id=id,
                                 title=id.capitalize(),
                                 container=container)
     bdata = ILayoutAware(folder)
     bdata.contentLayout = '++contentlayout++castle/folder-query.html'
     if not args.skip_transitioning:
         api.content.transition(folder, to_state='published')
     return folder
示例#4
0
def recursive_create_path(path):
    if path in ('/', ''):
        folder = site
    else:
        path = path.lstrip('/')
        folder = traverse(path)
        if folder is not None and not IFolder.providedBy(folder):
            api.content.delete(folder)
            folder = None
        if folder is None:
            # Need to create folders up to where we want content
            # we'll walk it up create folders as needed
            folder = site
            for part in path.split('/'):
                try:
                    ob = folder[part]
                    if not IFolder.providedBy(ob):
                        api.content.delete(ob)
                        raise KeyError()
                    else:
                        folder = ob
                except (KeyError, AttributeError):
                    fpath = os.path.join(args.export_directory,
                                         relpath(folder), part, '__folder__')

                    if os.path.exists(fpath):
                        fi = open(fpath)
                        data = mjson.loads(fi.read())
                        fi.close()
                        importtype = getImportType(
                            data, fpath[len(args.export_directory):], None)
                        creation_data = importtype.get_data()
                        creation_data['container'] = folder
                        creation_data['id'] = part
                        folder = api.content.create(**creation_data)
                        importtype.post_creation(folder)
                        if data['state']:
                            try:
                                api.content.transition(folder,
                                                       to_state=data['state'])
                            except:
                                # maybe workflows do not match up
                                pass
                        folder.reindexObject()
                    else:
                        folder = api.content.create(type='Folder',
                                                    id=part,
                                                    title=part.capitalize(),
                                                    container=folder)
                        bdata = ILayoutAware(folder)
                        bdata.contentLayout = '++contentlayout++castle/folder-query.html'
    return folder
示例#5
0
    def deletelayout(self):
        layout_resources = queryResourceDirectory(CONTENT_LAYOUT_RESOURCE_NAME,
                                                  'custom')
        layout_path = self.request.form.get('layout')

        if len(layout_path.split('/')) <= 2:
            sm = getSecurityManager()
            # this is a global layout, need to check permissions
            if not sm.checkPermission('Plone: Manage Content Layouts',
                                      api.portal.get()):
                raise Unauthorized("User not allowed to delete global layout")
        else:
            # check this user is allowed to delete this template
            user_dir = 'custom/user-layouts/{0:s}'.format(
                api.user.get_current().getId())
            if not layout_path.startswith(user_dir):
                raise Unauthorized("You are not allowed to delete this layout")

        # find directory
        filename = layout_path.split('/')[-1]
        directory = layout_resources
        for part in layout_path.replace('custom/', '').split('/')[:-1]:
            directory = directory[part]
        del directory[filename]

        # now to modify manifest to not include
        if MANIFEST_FILENAME in directory.listDirectory():
            manifest = loadManifest(directory.readFile(MANIFEST_FILENAME))
            removeLayout(manifest, filename)
            directory.writeFile(MANIFEST_FILENAME, dumpManifest(manifest))

        # now reassign if provided
        replacement = self.request.form.get('replacement')
        if replacement:
            replacement = self._get_layout_path(replacement)
            catalog = api.portal.get_tool('portal_catalog')
            for brain in catalog(layout=self._get_layout_path(layout_path)):
                obj = brain.getObject()
                layout_data = ILayoutAware(obj, None)
                if layout_data:
                    layout_data.contentLayout = replacement
                    obj.reindexObject(idxs=['layout'])

        return json.dumps({
            'success':
            True,
            'user_layouts':
            getUserContentLayoutsForType(self.context.portal_type),
            'available_layouts':
            getContentLayoutsForType(self.context.portal_type, self.context)
        })
示例#6
0
def recursive_create_path(path):
    if path in ('/', ''):
        folder = site
    else:
        path = path.lstrip('/')
        folder = traverse(path)
        if folder is not None and not IFolder.providedBy(folder):
            api.content.delete(folder)
            folder = None
        if folder is None:
            # Need to create folders up to where we want content
            # we'll walk it up create folders as needed
            folder = site
            for part in path.split('/'):
                try:
                    ob = folder[part]
                    if not IFolder.providedBy(ob):
                        logger.warn(
                            'Existing object in traversal path is not folderish. Removing it.'
                        )
                        api.content.delete(ob)
                        raise KeyError()
                    else:
                        folder = ob
                except (KeyError, AttributeError):
                    fpath = os.path.join(args.export_directory,
                                         relpath(folder), part, '__folder__')
                    imported = False
                    if os.path.exists(fpath):
                        imported = import_object(fpath)
                    if not imported:
                        logger.info(
                            "Creating plain Folder (no __folder__ file found), %s"
                            % part)
                        folder = api.content.create(type='Folder',
                                                    id=part,
                                                    title=part.capitalize(),
                                                    container=folder)
                        bdata = ILayoutAware(folder)
                        bdata.contentLayout = '++contentlayout++castle/folder-query.html'
                        if not args.skip_transitioning:
                            api.content.transition(folder,
                                                   to_state='published')
    return folder
    def deletelayout(self):
        layout_resources = queryResourceDirectory(
            CONTENT_LAYOUT_RESOURCE_NAME, 'custom')

        # find directory
        layout_path = self.request.form.get('layout')
        filename = layout_path.split('/')[-1]
        directory = layout_resources
        for part in layout_path.replace('custom/', '').split('/')[:-1]:
            directory = directory[part]
        del directory[filename]

        # now to modify manifest to not include
        if MANIFEST_FILENAME in directory.listDirectory():
            manifest = loadManifest(directory.readFile(MANIFEST_FILENAME))
            removeLayout(manifest, filename)
            directory.writeFile(MANIFEST_FILENAME, dumpManifest(manifest))

        # now reassign if provided
        replacement = self.request.form.get('replacement')
        if replacement:
            replacement = self._get_layout_path(replacement)
            catalog = api.portal.get_tool('portal_catalog')
            for brain in catalog(layout=self._get_layout_path(layout_path)):
                obj = brain.getObject()
                layout_data = ILayoutAware(obj, None)
                if layout_data:
                    layout_data.contentLayout = replacement
                    obj.reindexObject(idxs=['layout'])

        return json.dumps(
            {
                'success': True,
                'user_layouts': getUserContentLayoutsForType(
                    self.context.portal_type
                ),
                'available_layouts': getContentLayoutsForType(
                    self.context.portal_type
                )
            }
        )
示例#8
0
def on_content_created(obj, event):
    if obj.portal_type == 'Dashboard':
        return
    metadata = IPublication(obj, None)
    if metadata is not None:
        if metadata.effective is None:
            metadata.effective = localized_now(obj)
    _touch_contributors(obj)

    if obj.portal_type == 'Collection':
        # enable syndication on type by default
        settings = FeedSettings(obj)
        settings.enabled = True

    adapted = ILayoutAware(obj, None)
    if adapted:
        if not adapted.content and not adapted.contentLayout:
            registry = getUtility(IRegistry)
            try:
                default_layout = registry['%s.%s' %
                                          (DEFAULT_CONTENT_LAYOUT_REGISTRY_KEY,
                                           obj.portal_type.replace(' ', '-'))]
                adapted.contentLayout = default_layout
            except (KeyError, AttributeError):
                pass
            try:
                default_layout = registry['%s.%s' %
                                          (DEFAULT_SITE_LAYOUT_REGISTRY_KEY,
                                           obj.portal_type.replace(' ', '-'))]
                adapted.pageSiteLayout = default_layout
            except (KeyError, AttributeError):
                pass

    try:
        tasks.scan_links.delay('/'.join(obj.getPhysicalPath()))
    except CannotGetPortalError:
        pass

    obj.reindexObject()
示例#9
0
def tiles(site, req, tiles_data=_tiles_data):

    alsoProvides(req, ICastleLayer)

    # Sitewide slot tiles
    for meta_id, tiles in tiles_data.items():
        meta_tile = MetaTile(site, req)
        alsoProvides(meta_tile, IGlobalTile)
        meta_tile.id = 'meta-' + meta_id
        meta_tile.__name__ = 'castle.cms.meta'
        meta_data_manager = ITileDataManager(meta_tile)
        meta_data = meta_data_manager.get()
        meta_tiles = []

        for tile_data in tiles:
            meta_tiles.append(tile_data['meta'])
            tile = getMultiAdapter((site, req), name=tile_data['meta']['type'])
            alsoProvides(tile, IPersistentTile)
            tile.id = tile_data['meta']['id']
            tile.__name__ = tile_data['meta']['type']
            data_manager = ITileDataManager(tile)
            data_manager.set(tile_data['data'])

        meta_data['tiles'] = meta_tiles
        meta_data_manager.set(meta_data)

    frontpage = site['front-page']
    adapted = ILayoutAware(frontpage, None)
    if adapted:
        adapted.pageSiteLayout = 'frontpage.html'

    # Tiles only for the front-page
    frontpage_tiles = getTileData()

    for tile in frontpage_tiles:
        fp_tile = getMultiAdapter((frontpage, req), name=tile['meta']['type'])

        meta = tile['meta']
        fp_tile.id = meta['id']
        alsoProvides(fp_tile, IPersistentTile)
        data_manager = ITileDataManager(fp_tile)
        data_manager.set(tile['data'])

        if 'slot' in tile:
            meta_tile = MetaTile(frontpage, req)
            alsoProvides(meta_tile, IGlobalTile)
            meta_tile.id = 'meta-' + tile['slot']
            meta_tile.__name__ = 'castle.cms.meta'
            meta_data_manager = ITileDataManager(meta_tile)
            meta_data = meta_data_manager.get()

            existing_tiles = meta_data.get('tiles') or []
            new_tile_id = tile['meta']['id']

            if new_tile_id in [x['id'] for x in existing_tiles]:
                # check if the tile we're trying to install is already there.
                continue

            existing_tiles.append(meta)
            meta_data['tiles'] = existing_tiles
            meta_data['mode'] = 'show'

            meta_data_manager.set(meta_data)

    frontpageLayout = ILayoutAware(frontpage, None)
    if frontpageLayout:
        frontpageLayout.contentLayout = '/++contentlayout++castle/frontpage-layout.html'  # noqa
示例#10
0
    def post_creation(self,
                      obj,
                      pdb_if_exception=False,
                      post_creation_data=None):
        if obj is None:
            return
        field_data = self.field_data
        bdata = ILayoutAware(obj, None)
        if bdata:
            try:
                bdata.contentLayout = self.layout
            except Exception:
                bdata.contentLayout = '++contentlayout++default/document.html'
        bdata = IRichText(obj, None)
        if bdata:
            try:
                bdata.text = RichTextValue(field_data['text'], 'text/html',
                                           'text/html')
            except Exception:
                try:
                    bdata.text = RichTextValue(
                        field_data[
                            'plone.app.contenttypes.behaviors.richtext.IRichText']
                        ['text'],  # noqa
                        'text/html',
                        'text/html').raw
                except Exception:
                    bdata.text = ''

        bdata = IBasic(obj, None)
        if bdata:
            try:
                bdata.title = field_data['title']
            except Exception:
                try:
                    bdata.title = field_data[
                        'plone.app.content.interfaces.INameFromTitle']['title']
                except Exception:
                    bdata.description = field_data[dublin]['title']
            try:
                bdata.description = field_data['description']
            except Exception:
                try:
                    bdata.description = field_data[dublin]['description']
                except Exception:
                    bdata.description = field_data[basic]['description']
        else:
            try:
                obj.title = field_data['title']
                obj.description = field_data['description']
            except Exception:
                obj.title = field_data[dublin]['title']
                obj.description = field_data[dublin]['description']

        bdata = ICategorization(obj, None)
        if bdata:
            try:
                bdata.subjects = field_data['subject']
            except Exception:
                try:
                    bdata.subjects = self.field_data[dublin]['subjects']
                except Exception:
                    try:
                        bdata.subjects = self.field_data[categorization][
                            'subjects']
                    except Exception:
                        pass  # no keywords found

            bdata = IPublication(obj)
            try:
                if field_data['effectiveDate']:
                    bdata.effective = pydt(field_data['effectiveDate'])
            except Exception:
                try:
                    if field_data[dublin]['effective']:
                        bdata.effective = pydt(field_data[dublin]['effective'])
                except Exception:
                    try:
                        if field_data[publication]['effective']:
                            bdata.effective = pydt(
                                field_data[publication]['effective'])
                    except Exception:
                        bdata.effective = None

        ldata = ILocation(obj, None)
        if ldata:
            if field_data.get('location'):
                ldata.locations = [field_data['location']]

            if field_data.get('newsLocation'):
                if ldata.locations:
                    ldata.locations.append(field_data['newsLocation'])
                else:
                    ldata.locations = [field_data['newsLocation']]

        try:
            obj.modification_date = field_data['modification_date']
        except Exception:
            try:
                obj.modification_date = obj.modified()
            except Exception:
                obj.modification_date = None
        try:
            obj.creation_date = field_data['creation_date']
        except Exception:
            try:
                obj.creation_date = obj.created()
            except Exception:
                obj.creation_date = None

        bdata = IDublinCore(obj, None)
        if bdata:
            if IDublinCore.__identifier__ in field_data:
                dublin_core = field_data[IDublinCore.__identifier__]
                bdata.expires = dublin_core['expires']
                bdata.rights = dublin_core['rights']
                bdata.creators = tuple(dublin_core['creators'])
                bdata.language = dublin_core['language']
                bdata.effective = pydt(dublin_core['effective'])
                bdata.subjects = dublin_core['subjects']
                bdata.contributors = tuple(dublin_core['contributors'])
            else:
                bdata.expires = pydt(field_data.get('expirationDate'))
                bdata.rights = field_data.get('rights')
                creators = field_data.get('creators')
                bdata.creators = tuple(creators) if creators else ()
                language = field_data.get('language')
                bdata.language = language if language is not None else ""
                bdata.effective = pydt(field_data.get('effectiveDate'))
                bdata.subjects = field_data.get('subject')
                contributors = field_data.get('contributors')
                bdata.contributors = tuple(contributors) if contributors else (
                )

        bdata = ILayoutAware(obj, None)
        if bdata:
            if self.data['portal_type'] == 'Folder' and (
                    self.field_data.get('text') or '').strip():
                bdata.content = FOLDER_DEFAULT_PAGE_LAYOUT % self.field_data[
                    'text']
                # need to explicitly reset contentLayout value because this data
                # could be overwritten
                bdata.contentLayout = None
            elif self.layout:
                if layoutaware in field_data and 'contentLayout' in field_data[
                        layoutaware]:
                    bdata.contentLayout = field_data[layoutaware][
                        'contentLayout']
                if layoutaware in field_data and 'content' in field_data[
                        layoutaware]:
                    bdata.content = field_data[
                        'plone.app.blocks.layoutbehavior.ILayoutAware'][
                            'content']
                if 'rendered_layout' in self.data['data']:
                    bdata.rendered_layout = self.data['data'][
                        'rendered_layout']

        inv_field_mapping = {v: k for k, v in self.fields_mapping.iteritems()}
        for IBehavior, field_name in self.behavior_data_mappers:

            original_field_name = inv_field_mapping.get(field_name, field_name)

            if original_field_name not in self.field_data:
                # data not here...
                continue

            behavior = IBehavior(obj, None)
            if behavior is None:
                # behavior not valid for obj type
                continue

            val = self.field_data[original_field_name]

            if field_name in self.data_converters:
                val = self.data_converters[field_name](val)

            setattr(behavior, field_name, val)

        # handle lead images
        for field_name in self.lead_image_field_names:
            if self.field_data.get(field_name):
                if field_name == 'plone.app.contenttypes.behaviors.leadimage.ILeadImage':
                    im_obj = self.field_data.get(field_name)['image']
                else:
                    im_obj = self.field_data.get(field_name)
                if hasattr(im_obj, 'read'):
                    im_data = im_obj.read()
                else:
                    im_data = im_obj

                if not im_data:
                    continue

                filename = self.field_data.get('image_filename')
                if not filename:
                    if hasattr(im_obj, 'filename'):
                        filename = im_obj.filename
                    else:
                        filename = self.field_data['id']
                obj.image = im_data

                if not isinstance(obj.image, NamedBlobImage):
                    is_stringio = isinstance(im_obj, StringIO)
                    if is_stringio:
                        namedblobimage_data = im_data
                    elif isinstance(im_obj, Image):
                        namedblobimage_data = im_data.data
                    else:
                        if pdb_if_exception:
                            pdb.set_trace()
                        logger.info("    lead image is type %s" % type(im_obj))
                    obj.image = NamedBlobImage(data=namedblobimage_data,
                                               contentType='',
                                               filename=filename)

                if hasattr(obj.image, 'contentType') and isinstance(
                        obj.image.contentType, unicode):
                    obj.image.contentType = obj.image.contentType.encode(
                        'ascii')
                else:
                    if isinstance(im_obj, Image):
                        data = im_obj.data
                    elif hasattr(im_obj, 'buf'):
                        data = im_obj.buf
                    elif hasattr(im_obj, '_blob'):
                        if hasattr(im_obj._blob, '_p_blob_uncommitted'):
                            f = open(im_obj._blob._p_blob_uncommitted, 'r')
                            data = f.read()
                            f.close()
                        else:
                            raise Exception(
                                "no _p_blob_uncommitted attr in im_obj._blob")
                    else:
                        raise Exception("no _blob attr in im_obj")

                    if data == '' or data is None:
                        data = base64.b64decode(
                            'R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='
                        )

                    image_type = what('', h=data)
                    if image_type in [
                            'png', 'bmp', 'jpeg', 'xbm', 'tiff', 'gif'
                    ]:
                        obj.image.contentType = 'image/%s' % image_type
                    elif image_type == 'rast':
                        obj.image.contentType = 'image/cmu-raster'
                    elif image_type == 'ppm':
                        obj.image.contentType = 'image/x-portable-pixmap'
                    elif image_type == 'pgm':
                        obj.image.contentType = 'image/x-portable-greymap'
                    elif image_type == 'pbm':
                        obj.image.contentType = 'image/x-portable-bitmap'
                    elif image_type == 'rgb':
                        obj.image.contentType = 'image/x-rgb'
                    else:
                        # look at filename extension
                        contentType, encoding = guess_type(obj.image.filename,
                                                           strict=False)
                        if contentType:
                            obj.image.contentType = contentType
                        else:
                            logger.info(
                                "Unknown image type {};"
                                " defaulting to jpeg".format(image_type))
                            pdb.set_trace()
                            obj.image.contentType = 'image/jpeg'  # default
                for caption_field_name in self.lead_image_caption_field_names:
                    if caption_field_name in self.field_data:
                        obj.imageCaption = self.field_data.get(
                            caption_field_name)
示例#11
0
    def post_creation(self, obj):
        field_data = self.field_data
        bdata = ILayoutAware(obj, None)
        if bdata:
            bdata.contentLayout = '++contentlayout++default/document.html'
        bdata = IRichText(obj, None)
        if bdata:
            bdata.text = RichTextValue(field_data['text'], 'text/html',
                                       'text/html')

        bdata = IBasic(obj, None)
        if bdata:
            bdata.title = field_data['title']
            bdata.description = field_data['description']
        else:
            obj.title = field_data['title']
            obj.description = field_data['description']

        bdata = ICategorization(obj, None)
        if bdata:
            bdata.subjects = field_data['subject']

            bdata = IPublication(obj)
            if field_data['effectiveDate']:
                bdata.effective = pydt(field_data['effectiveDate'])

        ldata = ILocation(obj, None)
        if ldata:
            if field_data.get('location'):
                ldata.locations = [field_data['location']]

            if field_data.get('newsLocation'):
                if ldata.locations:
                    ldata.locations.append(field_data['newsLocation'])
                else:
                    ldata.locations = [field_data['newsLocation']]

        obj.modification_date = field_data['modification_date']
        obj.creation_date = field_data['creation_date']

        bdata = ILayoutAware(obj, None)
        if bdata:
            if self.data[
                    'portal_type'] == 'Folder' and 'text' in self.field_data:
                bdata.content = FOLDER_DEFAULT_PAGE_LAYOUT % self.field_data[
                    'text']
                # need to explicitly reset contentLayout value because this data
                # could be overwritten
                bdata.contentLayout = None
            elif self.layout:
                bdata.contentLayout = self.layout

        inv_field_mapping = {v: k for k, v in self.fields_mapping.iteritems()}
        for IBehavior, field_name in self.behavior_data_mappers:

            original_field_name = inv_field_mapping.get(field_name, field_name)

            if original_field_name not in self.field_data:
                # data not here...
                continue

            behavior = IBehavior(obj, None)
            if behavior is None:
                # behavior not valid for obj type
                continue

            val = self.field_data[original_field_name]

            if field_name in self.data_converters:
                val = self.data_converters[field_name](val)

            setattr(behavior, field_name, val)

        # handle lead images
        for field_name in self.lead_image_field_names:
            if self.field_data.get(field_name):
                im_obj = self.field_data.get(field_name)
                if hasattr(im_obj, 'read'):
                    im_data = im_obj.read()
                else:
                    im_data = im_obj

                if not im_data:
                    continue

                filename = self.field_data.get('image_filename')
                if not filename:
                    if hasattr(im_obj, 'filename'):
                        filename = im_obj.filename
                    else:
                        filename = self.field_data['id']
                obj.image = NamedBlobImage(data=decode_file_data(im_data),
                                           filename=to_unicode(filename))
                if not obj.image.contentType:
                    obj.image.contentType = 'image/jpeg'
                for caption_field_name in self.lead_image_caption_field_names:
                    if caption_field_name in self.field_data:
                        obj.imageCaption = self.field_data.get(
                            caption_field_name)