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}
Example #2
0
    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)
        })
Example #3
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)
        })
Example #4
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
                )
            }
        )
Example #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/{}'.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
                )
            }
        )
Example #6
0
    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)
        })
Example #7
0
    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}
Example #8
0
    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
                )
            }
        )
Example #10
0
    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}