def get_options(self): registry = queryUtility(IRegistry) adapted = IMosaicRegistryAdapter(registry) pt = self.obtainType() kwargs = { 'type': pt, 'context': self.context, 'request': self.request, } result = adapted(**kwargs) result['canChangeLayout'] = checkPermission( 'plone.CustomizeContentLayouts', self.context) result['context_url'] = self.context.absolute_url() result['tinymce'] = get_tinymce_options(self.context, self.field, self.request) if 'pattern_options' in result['tinymce']: # BBB Plone 4.3.x result['tinymce'] = result['tinymce']['pattern_options'] result['customContentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace('.', '-')) result['contentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace('.', '-').replace('-content', '-contentLayout')) result['customContentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name) result['contentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name.replace('.content', '.contentLayout')) result['available_layouts'] = getContentLayoutsForType(pt) result['user_layouts'] = getUserContentLayoutsForType(pt) return {'data': result}
def save(self): form = self.request.form layout_dir_name = 'custom' layout_resources = queryResourceDirectory(CONTENT_LAYOUT_RESOURCE_NAME, layout_dir_name) if form.get('global', '').lower() not in ('y', 't', 'true', '1'): # get/create layout directory for user user_id = api.user.get_current().getId() try: users_directory = layout_resources['user-layouts'] except NotFound: layout_resources.makeDirectory('user-layouts') users_directory = layout_resources['user-layouts'] try: user_directory = users_directory[user_id] except NotFound: users_directory.makeDirectory(user_id) user_directory = users_directory[user_id] layout_dir_name = 'custom/user-layouts/' + user_id layout_resources = user_directory normalizer = getUtility(IIDNormalizer) layout_filename = normalizer.normalize(form['name']) + '.html' count = 0 while layout_filename in layout_resources.listDirectory(): count += 1 layout_filename = normalizer.normalize(form['name'] + '-' + str(count)) + '.html' layout_resources.writeFile(layout_filename, form['layout']) # need to read manifest and add to it dynamically here for the new layout if MANIFEST_FILENAME in layout_resources.listDirectory(): manifest = loadManifest( layout_resources.readFile(MANIFEST_FILENAME)) else: manifest = loadManifest('') sections = manifest.sections() manifest.add_section('new') # section name is a bit indeterminate when the multidict implementation section_name = list(set(manifest.sections()) - set(sections))[0] manifest.set(section_name, 'title', form['name']) manifest.set(section_name, 'file', layout_filename) manifest.set(section_name, 'for', self.context.portal_type) layout_resources.writeFile(MANIFEST_FILENAME, dumpManifest(manifest)) return json.dumps({ 'success': True, 'layout': '++contentlayout++%s/%s' % (layout_dir_name, layout_filename), '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') # 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/{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 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 save(self): form = self.request.form layout_dir_name = 'custom' layout_resources = queryResourceDirectory( CONTENT_LAYOUT_RESOURCE_NAME, layout_dir_name) if form.get('global', '').lower() not in ('y', 't', 'true', '1'): # get/create layout directory for user user_id = api.user.get_current().getId() try: users_directory = layout_resources['user-layouts'] except NotFound: layout_resources.makeDirectory('user-layouts') users_directory = layout_resources['user-layouts'] try: user_directory = users_directory[user_id] except NotFound: users_directory.makeDirectory(user_id) user_directory = users_directory[user_id] layout_dir_name = 'custom/user-layouts/' + user_id layout_resources = user_directory normalizer = getUtility(IIDNormalizer) layout_filename = normalizer.normalize(form['name']) + '.html' count = 0 while layout_filename in layout_resources.listDirectory(): count += 1 layout_filename = normalizer.normalize(form['name'] + '-' + str(count)) + '.html' layout_resources.writeFile(layout_filename, form['layout']) # need to read manifest and add to it dynamically here for the new layout if MANIFEST_FILENAME in layout_resources.listDirectory(): manifest = loadManifest(layout_resources.readFile(MANIFEST_FILENAME)) else: manifest = loadManifest('') sections = manifest.sections() manifest.add_section('new') # section name is a bit indeterminate when the multidict implementation section_name = list(set(manifest.sections()) - set(sections))[0] manifest.set(section_name, 'title', form['name']) manifest.set(section_name, 'file', layout_filename) manifest.set(section_name, 'for', self.context.portal_type) layout_resources.writeFile(MANIFEST_FILENAME, dumpManifest(manifest)) return json.dumps({ 'success': True, 'layout': '++contentlayout++%s/%s' % (layout_dir_name, layout_filename), 'user_layouts': getUserContentLayoutsForType(self.context.portal_type), 'available_layouts': getContentLayoutsForType(self.context.portal_type) })
def get_options(self): registry = queryUtility(IRegistry) adapted = IMosaicRegistryAdapter(registry) pt = self.obtainType() kwargs = { 'type': pt, 'context': self.context, 'request': self.request, } result = adapted(**kwargs) sm = getSecurityManager() result['canChangeLayout'] = sm.checkPermission( 'Plone: Customize Content Layouts', self.context) # This is a site permission... # you can either manage layouts globally or not result['canManageLayouts'] = sm.checkPermission( 'Plone: Manage Content Layouts', api.portal.get()) result['context_url'] = self.context.absolute_url() result['tinymce'] = get_tinymce_options( self.context, self.field, self.request ) if 'pattern_options' in result['tinymce']: # BBB Plone 4.3.x result['tinymce'] = result['tinymce']['pattern_options'] result['customContentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace('.', '-') ) result['contentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace( '.', '-' ).replace( '-customContentLayout', '-contentLayout' ) ) result['customContentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name ) result['contentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name.replace('.customContentLayout', '.contentLayout') ) result['available_layouts'] = getContentLayoutsForType(pt) result['user_layouts'] = getUserContentLayoutsForType(pt) return {'data': result}
def get_options(self): registry = queryUtility(IRegistry) adapted = IMosaicRegistryAdapter(registry) pt = self.obtainType() kwargs = { 'type': pt, 'context': self.context, 'request': self.request, } result = adapted(**kwargs) result['canChangeLayout'] = checkPermission( 'plone.CustomizeContentLayouts', self.context) result['context_url'] = self.context.absolute_url() result['tinymce'] = get_tinymce_options( self.context, self.field, self.request ) if 'pattern_options' in result['tinymce']: # BBB Plone 4.3.x result['tinymce'] = result['tinymce']['pattern_options'] result['customContentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace('.', '-') ) result['contentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace( '.', '-' ).replace( '-content', '-contentLayout' ) ) result['customContentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name ) result['contentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name.replace('.content', '.contentLayout') ) result['available_layouts'] = getContentLayoutsForType(pt) result['user_layouts'] = getUserContentLayoutsForType(pt) return {'data': result}
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 get_options(self): registry = queryUtility(IRegistry) adapted = IMosaicRegistryAdapter(registry) pt = self.obtainType() kwargs = { 'type': pt, 'context': self.context, 'request': self.request, } result = adapted(**kwargs) sm = getSecurityManager() result['canChangeLayout'] = sm.checkPermission( 'Plone: Customize Content Layouts', self.context) # This is a site permission... # you can either manage layouts globally or not result['canManageLayouts'] = sm.checkPermission( 'Plone: Manage Content Layouts', api.portal.get()) result['context_url'] = self.context.absolute_url() result['tinymce'] = get_tinymce_options(self.context, self.field, self.request) if 'pattern_options' in result['tinymce']: # BBB Plone 4.3.x result['tinymce'] = result['tinymce']['pattern_options'] result['customContentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace('.', '-')) result['contentLayout_selector'] = '#formfield-{0:s}'.format( self.name.replace('.', '-').replace('-customContentLayout', '-contentLayout')) result['customContentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name) result['contentLayout_field_selector'] = '[name="{0:s}"]'.format( self.name.replace('.customContentLayout', '.contentLayout')) result['available_layouts'] = getContentLayoutsForType( pt, self.context) # noqa result['user_layouts'] = getUserContentLayoutsForType(pt) return {'data': result}