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) })
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 ) } )
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
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
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) })
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 ) } )
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()
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
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)
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)