def get_tinymce_options(context, field, request): args = {'pattern_options': {}} folder = context if not IFolderish.providedBy(context): folder = aq_parent(context) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) portal_url = get_portal_url(context) current_path = folder.absolute_url()[len(portal_url):] utility = getToolByName(aq_inner(context), 'portal_tinymce', None) if utility: # Plone 4.3 config = utility.getConfiguration(context=context, field=field, request=request) config['content_css'] = config['portal_url'] + '/base.css' del config['customplugins'] del config['plugins'] del config['theme'] config[ 'content_css'] = '++resource++plone.app.widgets-tinymce-content.css' args['pattern_options'] = { 'relatedItems': { 'vocabularyUrl': config['portal_url'] + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, 'upload': { 'initialFolder': initial, 'currentPath': current_path, 'baseUrl': config['document_base_url'], 'relativePath': '@@fileUpload', 'uploadMultiple': False, 'maxFiles': 1, 'showTitle': False }, 'tiny': config, # This is for loading the languages on tinymce 'loadingBaseUrl': '++resource++plone.app.widgets.tinymce', 'prependToUrl': 'resolveuid/', 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image/', 'folderTypes': utility.containsobjects.replace('\n', ','), 'imageTypes': utility.imageobjects.replace('\n', ','), 'anchorSelector': utility.anchor_selector, 'linkableTypes': utility.linkable.replace('\n', ',') } else: # Plone 5 # They are set on the body pattern_options = getMultiAdapter( (context, request, field), name="tinymce_settings")()['data-pat-tinymce'] args['pattern_options'] = json.loads(pattern_options) return args
def __call__(self, **kwargs): settings = self.parseRegistry() config = {} config = self.mapFormatCategories(settings, config) config = self.mapFormats(settings, config) config = self.mapActions(settings, config) config = self.mapTilesCategories(settings, config) for tile_category in ['structure_tiles', 'app_tiles']: config = self.mapTiles(settings, config, tile_category) config = self.mapFieldTiles(settings, config, kwargs) args = { 'type': None, 'context': None, 'request': None, } args.update(kwargs) if IFolderish.providedBy(args['context']): config['parent'] = args['context'].absolute_url() + "/" elif args['context']: config['parent'] = getattr(args['context'].aq_inner, 'aq_parent', None).absolute_url() + "/" else: # context can be None, at least in tests. Do nothing # then. See test_config in test_mosaicregistry.py pass return config
def __call__(self, **kwargs): settings = self.parseRegistry() config = {} config = self.mapFormatCategories(settings, config) config = self.mapFormats(settings, config) config = self.mapTinyMCEActionCategories(settings, config) config = self.mapTinyMCEToolbarFormats(settings, config) config = self.mapTinyMCEContextMenuFormats(settings, config) config = self.mapActions(settings, config) config = self.mapTilesCategories(settings, config) for tile_category in ["structure_tiles", "app_tiles"]: config = self.mapTiles(settings, config, tile_category) config = self.mapFieldTiles(settings, config, kwargs) args = {"type": None, "context": None, "request": None} args.update(kwargs) if IFolderish.providedBy(args["context"]): config["parent"] = args["context"].absolute_url() + "/" elif args["context"]: config["parent"] = getattr(args["context"].aq_inner, "aq_parent", None).absolute_url() + "/" else: # context can be None, at least in tests. Do nothing # then. See test_config in test_mosaicregistry.py pass return config
def __call__(self, **kwargs): settings = self.parseRegistry() config = {} config = self.mapFormatCategories(settings, config) config = self.mapFormats(settings, config) config = self.mapTinyMCEActionCategories(settings, config) config = self.mapTinyMCEToolbarFormats(settings, config) config = self.mapTinyMCEContextMenuFormats(settings, config) config = self.mapActions(settings, config) config = self.mapTilesCategories(settings, config) for tile_category in ['structure_tiles', 'app_tiles']: config = self.mapTiles(settings, config, tile_category) config = self.mapFieldTiles(settings, config, kwargs) args = { 'type': None, 'context': None, 'request': None, } args.update(kwargs) if IFolderish.providedBy(args['context']): config['parent'] = args['context'].absolute_url() + "/" elif args['context']: config['parent'] = getattr(args['context'].aq_inner, 'aq_parent', None).absolute_url() + "/" else: # context can be None, at least in tests. Do nothing # then. See test_config in test_mosaicregistry.py pass return config
def getBreadcrumbs(self, path=None): """ Get breadcrumbs """ result = [] root_url = getNavigationRoot(self.obj) root = aq_inner(self.obj.restrictedTraverse(root_url)) root_url = root.absolute_url() if path is not None: root_abs_url = root.absolute_url() path = path.replace(root_abs_url, '', 1) path = path.strip('/') root = aq_inner(root.restrictedTraverse(path)) relative = aq_inner( self.obj).getPhysicalPath()[len(root.getPhysicalPath()):] if path is None: # Add siteroot result.append({ 'title': root.title_or_id(), 'url': '/'.join(root.getPhysicalPath()) }) for i in range(len(relative)): now = relative[:i + 1] obj = aq_inner(root.restrictedTraverse(now)) if IFolderish.providedBy(obj): if not now[-1] == 'talkback': result.append({ 'title': obj.title_or_id(), 'url': root_url + '/' + '/'.join(now) }) return result
def getBreadcrumbs(self, path=None): """Get breadcrumbs""" result = [] root_url = getNavigationRoot(self.context) root = aq_inner(self.context.restrictedTraverse(root_url)) root_url = root.absolute_url() if path is not None: root_abs_url = root.absolute_url() path = path.replace(root_abs_url, '', 1) path = path.strip('/') root = aq_inner(root.restrictedTraverse(path)) relative = aq_inner(self.context).getPhysicalPath()[len(root.getPhysicalPath()):] if path is None: # Add siteroot result.append({'title': root.title_or_id(), 'url': '/'.join(root.getPhysicalPath())}) for i in range(len(relative)): now = relative[:i + 1] obj = aq_inner(root.restrictedTraverse(now)) if IFolderish.providedBy(obj): if not now[-1] == 'talkback': result.append({'title': obj.title_or_id(), 'url': root_url + '/' + '/'.join(now)}) return result
def tinymce(self): """ data-pat-tinymce : JSON.stringify({ relatedItems: { vocabularyUrl: config.portal_url + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, tiny: config, prependToUrl: 'resolveuid/', linkAttribute: 'UID', prependToScalePart: '/@@images/image/' }) """ generator = TinyMCESettingsGenerator(self.context, self.request) settings = generator.settings folder = aq_inner(self.context) # Test if we are currently creating an Archetype object if IFactoryTempFolder.providedBy(aq_parent(folder)): folder = aq_parent(aq_parent(aq_parent(folder))) if not IFolderish.providedBy(folder): folder = aq_parent(folder) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) current_path = folder.absolute_url()[len(generator.portal_url):] image_types = settings.image_objects or [] folder_types = settings.contains_objects or [] configuration = { 'relatedItems': { 'vocabularyUrl': '%s/@@getVocabulary?name=plone.app.vocabularies.Catalog' % ( generator.portal_url) }, 'upload': { 'initialFolder': initial, 'currentPath': current_path, 'baseUrl': generator.portal_url, 'relativePath': '@@fileUpload', 'uploadMultiple': False, 'maxFiles': 1, 'showTitle': False }, 'base_url': self.context.absolute_url(), 'tiny': generator.get_tiny_config(), # This is for loading the languages on tinymce 'loadingBaseUrl': '%s/++plone++static/components/tinymce-builded/js/tinymce' % generator.portal_url, # noqa 'prependToUrl': '{0}/resolveuid/'.format(generator.portal_url), 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image/', 'folderTypes': folder_types, 'imageTypes': image_types # 'anchorSelector': utility.anchor_selector, } return {'data-pat-tinymce': json.dumps(configuration)}
def tinymce(self): """ data-pat-tinymce : JSON.stringify({ relatedItems: { vocabularyUrl: config.portal_url + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, tiny: config, prependToUrl: 'resolveuid/', linkAttribute: 'UID', prependToScalePart: '/@@images/image/' }) """ generator = TinyMCESettingsGenerator(self.context, self.request) settings = generator.settings folder = aq_inner(self.context) # Test if we are currently creating an Archetype object if IFactoryTempFolder.providedBy(aq_parent(folder)): folder = aq_parent(aq_parent(aq_parent(folder))) if not IFolderish.providedBy(folder): folder = aq_parent(folder) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) current_path = folder.absolute_url()[len(generator.portal_url):] image_types = settings.image_objects or [] folder_types = settings.contains_objects or [] configuration = { 'relatedItems': { 'vocabularyUrl': '%s/@@getVocabulary?name=plone.app.vocabularies.Catalog' % ( generator.portal_url), 'folderTypes': folder_types }, 'upload': { 'initialFolder': initial, 'currentPath': current_path, 'baseUrl': generator.portal_url, 'relativePath': '@@fileUpload', 'uploadMultiple': False, 'maxFiles': 1, 'showTitle': False }, 'base_url': self.context.absolute_url(), 'tiny': generator.get_tiny_config(), # This is for loading the languages on tinymce 'loadingBaseUrl': '%s/++plone++static/components/tinymce-builded/js/tinymce' % generator.portal_url, # noqa 'prependToUrl': '{0}/resolveuid/'.format(generator.portal_url), 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image/', 'imageTypes': image_types # 'anchorSelector': utility.anchor_selector, } return {'data-pat-tinymce': json.dumps(configuration)}
def getListing(self, filter_portal_types, rooted, document_base_url, upload_type=None): """Returns the actual listing""" catalog_results = [] results = {} object = aq_inner(self.context) portal_catalog = getToolByName(object, 'portal_catalog') normalizer = getUtility(IIDNormalizer) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(object): object = object.getParentNode() if INavigationRoot.providedBy(object) or (rooted == "True" and document_base_url[:-1] == object.absolute_url()): results['parent_url'] = '' else: results['parent_url'] = object.getParentNode().absolute_url() if rooted == "True": results['path'] = self.getBreadcrumbs(results['parent_url']) else: # get all items from siteroot to context (title and url) results['path'] = self.getBreadcrumbs() # get all portal types and get information from brains path = '/'.join(object.getPhysicalPath()) for brain in portal_catalog(portal_type=filter_portal_types, sort_on='getObjPositionInParent', path={'query': path, 'depth': 1}): if brain.is_folderish: icon = self.folder_icon else: icon = self.picture_icon catalog_results.append({ 'id': brain.getId, 'uid': brain.UID or None, # Maybe Missing.Value 'url': brain.getURL(), 'portal_type': brain.portal_type, 'normalized_type': normalizer.normalize(brain.portal_type), 'title': brain.Title == "" and brain.id or brain.Title, 'icon': icon, 'description': brain.Description, 'is_folderish': brain.is_folderish, }) # add catalog_ressults results['items'] = catalog_results # decide whether to show the upload new button results['upload_allowed'] = False if upload_type: portal_types = getToolByName(object, 'portal_types') fti = getattr(portal_types, upload_type, None) if fti is not None: results['upload_allowed'] = fti.isConstructionAllowed(object) # return results in JSON format self.context.REQUEST.response.setHeader("Content-type", "application/json") return json.dumps(results)
def __call__(self): """ data-pat-tinymce : JSON.stringify({ relatedItems: { vocabularyUrl: config.portal_url + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, rel_upload_path: '@@fileUpload', folder_url: config.document_base_url, tiny: config, prependToUrl: 'resolveuid/', linkAttribute: 'UID', prependToScalePart: '/@@images/image/' }) """ folder = self.context if not IFolderish.providedBy(self.context): folder = aq_parent(self.context) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) current_path = folder.absolute_url()[len(self.config['portal_url']):] configuration = { 'relatedItems': format_pattern_settings( self.settings.relatedItems, self.config), 'upload': { 'initialFolder': initial, 'currentPath': current_path, 'baseUrl': self.config['document_base_url'], 'relativePath': format_pattern_settings( self.settings.rel_upload_path, self.config), 'uploadMultiple': False, 'maxFiles': 1, 'showTitle': False }, 'base_url': self.config['document_base_url'], 'tiny': { 'content_css': self.settings.content_css, }, # This is for loading the languages on tinymce 'loadingBaseUrl': '++plone++static/components/tinymce-builded/js/tinymce', 'prependToUrl': 'resolveuid/', 'linkAttribute': format_pattern_settings( self.settings.linkAttribute, self.config), 'prependToScalePart': format_pattern_settings( self.settings.prependToScalePart, self.config), # XXX need to get this from somewhere... 'folderTypes': ','.join(['Folder']), 'imageTypes': ','.join(['Image']), #'anchorSelector': utility.anchor_selector, #'linkableTypes': utility.linkable.replace('\n', ',') } return {'data-pat-tinymce': json.dumps(configuration)}
def _reindex_children(obj, indices=None): for childId in obj.objectIds(): if indices: obj[childId].reindexObject(idxs=indices) else: obj[childId].reindexObject() if IFolderish.providedBy(obj[childId]): reindex_children.delay(obj[childId], indices)
def render(self, search_for='', path='', media_type='video', folders=True): """ """ results = [] normalizer = getUtility(IIDNormalizer) object = aq_inner(self.context) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(object): object = aq_parent(object) path = '/'.join(object.getPhysicalPath()) catalog = getToolByName(self.context, 'portal_catalog') medias = {'video': IVideo, 'audio': IAudio} iface = medias[media_type] media_results = catalog(object_provides=iface.__identifier__, sort_on='created', Title=search_for, path={ 'query': path, 'depth': 1 }) utility = getUtility(ITinyMCE) folder_portal_types = [] if folders and not search_for: folder_portal_types.extend(utility.containsobjects.split('\n')) folders_results = catalog(portal_type=folder_portal_types, sort_on='getObjPositionInParent', path={ 'query': path, 'depth': 1 }) media_results = folders_results + media_results for brain in media_results: results.append({ 'id': brain.getId, 'uid': brain.UID or None, # Maybe Missing.Value 'url': brain.getURL(), 'portal_type': brain.portal_type, 'normalized_type': normalizer.normalize(brain.portal_type), 'title': brain.Title == '' and brain.id or brain.Title, 'icon': brain.getIcon, 'is_folderish': brain.is_folderish, 'itype': 'folder' if brain.is_folderish else media_type }) return json.dumps(results)
def get_tinymce_options(context, field, request): args = {'pattern_options': {}} folder = context if not IFolderish.providedBy(context): folder = aq_parent(context) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) portal_url = get_portal_url(context) current_path = folder.absolute_url()[len(portal_url):] utility = getToolByName(aq_inner(context), 'portal_tinymce', None) if utility: # Plone 4.3 config = utility.getConfiguration(context=context, field=field, request=request) config['content_css'] = config['portal_url'] + '/base.css' del config['customplugins'] del config['plugins'] del config['theme'] config['content_css'] = '++resource++plone.app.widgets-tinymce-content.css' args['pattern_options'] = { 'relatedItems': { 'vocabularyUrl': config['portal_url'] + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, 'upload': { 'initialFolder': initial, 'currentPath': current_path, 'baseUrl': config['document_base_url'], 'relativePath': '@@fileUpload', 'uploadMultiple': False, 'maxFiles': 1, 'showTitle': False }, 'tiny': config, # This is for loading the languages on tinymce 'loadingBaseUrl': '++plone++static/components/tinymce-builded/js/tinymce', 'prependToUrl': 'resolveuid/', 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image', 'folderTypes': utility.containsobjects.replace('\n', ','), 'imageTypes': utility.imageobjects.replace('\n', ','), 'anchorSelector': utility.anchor_selector, 'linkableTypes': utility.linkable.replace('\n', ',') } else: # Plone 5 # They are setted on the body pattern_options = getMultiAdapter( (context, request, field), name="tinymce_settings")()['data-pat-tinymce'] args['pattern_options'] = json.loads(pattern_options) return args
def tinymce(self): generator = CastleTinyMCESettingsGenerator(self.context, self.request) settings = generator.settings folder = aq_inner(self.context) # Test if we are currently creating an Archetype object if IFactoryTempFolder.providedBy(aq_parent(folder)): folder = aq_parent(aq_parent(aq_parent(folder))) if not IFolderish.providedBy(folder): folder = aq_parent(folder) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) current_path = folder.absolute_url()[len(generator.portal_url):] scales = [] for name, info in sorted(getAllowedSizes().items(), key=lambda x: x[1][0]): scales.append({ 'part': name, 'name': name, 'label': '{} ({}x{})'.format( name.capitalize(), info[0], info[1]) }) image_types = settings.image_objects or [] folder_types = settings.contains_objects or [] configuration = { 'relatedItems': { 'vocabularyUrl': '%s/@@getVocabulary?name=plone.app.vocabularies.Catalog' % ( generator.portal_url) }, 'upload': { 'initialFolder': initial, 'currentPath': current_path, 'baseUrl': generator.portal_url, 'relativePath': '@@fileUpload', 'uploadMultiple': False, 'maxFiles': 1, 'showTitle': False }, 'base_url': self.context.absolute_url(), 'tiny': generator.get_tiny_config(), # This is for loading the languages on tinymce 'loadingBaseUrl': '%s/++plone++static/components/tinymce-builded/js/tinymce' % generator.portal_url, # noqa 'prependToUrl': 'resolveuid/', 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image/', 'folderTypes': folder_types, 'imageTypes': image_types, 'scales': scales } return {'data-pat-tinymce': json.dumps(configuration)}
def remove(self): super(AjaxFavoriteActions, self).remove() if IFolderish.providedBy(self.context): msg = _("The folder has been removed from your favorites") else: msg = _("The document has been removed from your favorites") return {'status': 'favorite-off', 'msg': translate(msg, context=self.request)}
def self_or_child_has_title_description_and_image(obj): if (IFolderish.providedBy(obj)): contents = obj.getFolderContents() for item in contents: if item.get('self_or_child_has_title_description_and_image', False): return True return bool(getattr(aq_base(obj), 'title', False)) and \ bool(getattr(aq_base(obj), 'description', False)) and \ bool(getattr(aq_base(obj), 'image', False))
def update(self): portal_state = getView(self.context, self.request, "plone_portal_state") self.portal_url = portal_state.portal_url() # Create <base href=""> directive of <head> if IFolderish.providedBy(self.context): # Folderish URLs must end to slash self.base = self.context.absolute_url() + "/" else: self.base = self.context.absolute_url()
def update(self): portal_state = getView(self.context, self.request, "plone_portal_state") self.portal_url = portal_state.portal_url() # Create <base href=""> directive of <head> if IFolderish.providedBy(self.context): # Folderish URLs must end to slash self.base = self.context.absolute_url() + '/' else: self.base = self.context.absolute_url()
def get_tinymce_options(context, field, request): args = {'pattern_options': {}} utility = getToolByName(aq_inner(context), 'portal_tinymce', None) if utility: config = utility.getConfiguration(context=context, field=field, request=request) config['content_css'] = config['portal_url'] + '/base.css' del config['customplugins'] del config['plugins'] del config['theme'] args['pattern_options'] = { 'relatedItems': { 'vocabularyUrl': config['portal_url'] + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, 'rel_upload_path': '@@fileUpload', 'folder_url': config['document_base_url'], 'tiny': config, 'prependToUrl': 'resolveuid/', 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image/', 'folderTypes': utility.containsobjects.replace('\n', ','), 'imageTypes': utility.imageobjects.replace('\n', ','), 'anchorSelector': utility.anchor_selector, 'linkableTypes': utility.linkable.replace('\n', ',') } else: folder = context if not IFolderish.providedBy(context): folder = aq_parent(context) args['pattern_options'].update({ 'relatedItems': { 'vocabularyUrl': get_portal_url(context) + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, 'base_url': context.absolute_url(), 'rel_upload_path': '@@fileUpload', 'folder_url': folder.absolute_url(), 'prependToUrl': 'resolveuid/', 'linkAttribute': 'UID', 'prependToScalePart': '/@@images/image/', # XXX need to get this from somewhere... 'folderTypes': ','.join(['Folder']), 'imageTypes': ','.join(['Image']), #'anchorSelector': utility.anchor_selector, #'linkableTypes': utility.linkable.replace('\n', ',') }) return args
def add(self): request = self.request view = request.get('view', '') super(FavoriteActions, self).add() statusmsg = IStatusMessage(request) if IFolderish.providedBy(self.context): statusmsg.add(_("The folder has been added to your favorites")) else: statusmsg.add(_("The document has been added to your favorites")) request.response.redirect(self.context.absolute_url() + '/' + view)
def __init__(self, context, request, **kwargs): """ Contructor """ self.context = context self.request = request util = api.content.get_view(u'plone', self.context, self.request) self.getIcon = util.getIcon # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(self.context): self.obj = aq_parent(self.context) else: self.obj = aq_inner(self.context)
def get_navigation(self): directory = self.request.get('dir', './') base_query = json.loads(self.request.get('query', '{}'), object_hook=_decode_dict) pprops = getToolByName(self.context, 'portal_properties') site_props = pprops.site_properties folder_types = site_props.getProperty( 'typesLinkToFolderContentsInFC', ['Folder', 'Large Plone Folder']) query = base_query.copy() if 'portal_type' in query: if type(query['portal_type']) in (list, tuple, set): query['portal_type'] = list(query['portal_type']) query['portal_type'].extend(list(folder_types)) else: pt = query['portal_type'] query['portal_type'] = list(folder_types) query['portal_type'].append(pt) site = getSite() context = aq_inner(self.context) if directory == './': if IFolderish.providedBy(context): context = aq_parent(context) elif directory == '/': context = site else: context = site.restrictedTraverse(directory) results = context.getFolderContents(contentFilter=base_query) html = '<ul class="jqueryFileTree" style="display: none;">' site_path = '/'.join(site.getPhysicalPath()) for item in context.getFolderContents(contentFilter=query): path = item.getPath()[len(site_path) + 1:] klass = '' if aq_base(item) not in results: klass = 'unselectable' if item.portal_type in folder_types: html += """<li class="directory collapsed %s"> <a class="item" href="#" rel="%s">%s</a></li>""" % ( klass, path + '/', item.Title ) else: html += """<li class="file ext_txt %s"> <a class="item" href="#" rel="%s">%s</a></li>""" % ( klass, path, item.Title ) html += '</ul>' return html
def has_private_parents(obj): if IFolderish.providedBy(obj): for childId in obj.objectIds(): obj[childId].reindexObject(idxs=['has_private_parents']) parent = aq_parent(obj) while not ISiteRoot.providedBy(parent): try: if api.content.get_state(parent) != 'published': return True except Exception: pass parent = aq_parent(parent) return False
def remove(self): super(FavoriteActions, self).remove() statusmsg = IStatusMessage(self.request) if IFolderish.providedBy(self.context): statusmsg.add(_("The folder has been removed from your favorites")) else: statusmsg.add(_("The document has been removed from your favorites")) site_properties = getToolByName(self.context, 'portal_properties').site_properties useView = self.context.portal_type in site_properties.typesUseViewActionInListings url = self.context.absolute_url() + (useView and "/view" or "") self.request.response.redirect(url)
def __init__(self, context, query=None, include_subfolders=False): if not IFolderish.providedBy(context): raise ValueError('context does not appear to be a folder') self.context = context if query and not IComposedQuery.providedBy(query): raise ValueError('query does not provide IComposedQuery') elif query is None: query = ComposedQuery() self.query = query sm = sitemanager_for(self.context) self.cachetools = sm.queryUtility(ISetCacheTools) if self.cachetools is None: raise ComponentLookupError('cannot find local set cache utility') self.include_subfolders = include_subfolders
def action(self, obj, bypass_recurse=False): if self.putils.isDefaultPage(obj): self.action(obj.aq_parent, bypass_recurse=True) recurse = self.recurse and not bypass_recurse if recurse and IFolderish.providedBy(obj): for sub in obj.values(): self.action(sub) if IDexterityContent.providedBy(obj): self.dx_action(obj) else: self.at_action(obj) obj.reindexObject()
def __init__(self, context, request, **kwargs): """ Contructor """ self.context = context self.request = request self.catalog = getToolByName(self.context, "portal_catalog") self.plone_view = getMultiAdapter((self.context, self.request), name=u"plone") self.getIcon = self.plone_view.getIcon self.registry = getUtility(IRegistry) self.settings = self.registry.forInterface(ICoverSettings) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(self.context): self.obj = aq_parent(self.context) else: self.obj = aq_inner(self.context)
def recurse(context): """ Recurse through all content on Plone site """ annotations = IAnnotations(context) if name in annotations: msg = "Cleaning up annotation %s on item %s" msg = msg % (name, context.absolute_url()) logger.info(msg) del annotations[name] # Make sure that we recurse to real folders only, # otherwise contentItems() might be acquired from higher level if IFolderish.providedBy(context): for id, item in context.contentItems(): recurse(item)
def __init__(self, context, request, **kwargs): """ Contructor """ self.context = context self.request = request self.catalog = getToolByName(self.context, 'portal_catalog') self.plone_view = getMultiAdapter((self.context, self.request), name=u'plone') self.getIcon = self.plone_view.getIcon self.registry = getUtility(IRegistry) self.settings = self.registry.forInterface(ICoverSettings) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(self.context): self.obj = aq_parent(self.context) else: self.obj = aq_inner(self.context)
def action(obj): transitions = pworkflow.getTransitionsFor(obj) if transition_id in [t['id'] for t in transitions]: try: pworkflow.doActionFor(obj, transition_id) except ConflictError: raise except Exception: self.errors.append( _('Could not transition: ${title}', mapping={'title': safe_unicode(obj.Title())})) else: handled.append(safe_unicode(obj.Title())) if recursive and IFolderish.providedBy(obj): for sub in obj.values(): action(sub)
def getListing(self, filter_portal_types, rooted, document_base_url, upload_type=None, interface=''): """Returns the actual listing""" iface = interface.__identifier__ if interface else '' catalog_results = [] results = {} object = aq_inner(self.context) portal_catalog = getToolByName(object, 'portal_catalog') normalizer = getUtility(IIDNormalizer) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(object): object = aq_parent(object) if INavigationRoot.providedBy(object) or (rooted == 'True' and document_base_url[:-1] == object.absolute_url()): results['parent_url'] = '' else: results['parent_url'] = aq_parent(object).absolute_url() if rooted == 'True': results['path'] = self.getBreadcrumbs(results['parent_url']) else: # get all items from siteroot to context (title and url) results['path'] = self.getBreadcrumbs() # get all portal types and get information from brains path = '/'.join(object.getPhysicalPath()) for brain in portal_catalog(portal_type=filter_portal_types, sort_on='getObjPositionInParent', path={'query': path, 'depth': 1}, object_provides=iface): catalog_results.append({ 'id': brain.getId, 'uid': brain.UID or None, # Maybe Missing.Value 'url': brain.getURL(), 'portal_type': brain.portal_type, 'normalized_type': normalizer.normalize(brain.portal_type), 'title': brain.Title == '' and brain.id or brain.Title, 'icon': brain.getIcon, 'is_folderish': brain.is_folderish, 'i_type': str(interface) }) # add catalog_ressults results['items'] = catalog_results # return results in JSON format return json.dumps(results)
def remove(self): request = self.request user = request.AUTHENTICATED_USER view = request.get('view', '') portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) IFavoriteStorage(site).remove_favorite(user.getId(), id=IUUID(self.context)) statusmsg = IStatusMessage(request) if IFolderish.providedBy(self.context): statusmsg.add(_("The folder has been removed from your favorites")) else: statusmsg.add(_("The document has been removed from your favorites")) request.response.redirect(self.context.absolute_url() + '/' + view)
def getBreadcrumbs(self, path=None): """Get breadcrumbs""" result = [] portal_state = self.context.restrictedTraverse('@@plone_portal_state') root = getNavigationRootObject(self.context, portal_state.portal()) root_url = root.absolute_url() if path is not None: path = path.replace(root_url, '', 1).strip('/') root = aq_inner(root.restrictedTraverse(path)) relative = aq_inner( self.context).getPhysicalPath()[len(root.getPhysicalPath()):] if path is None: # Add siteroot if IPloneSiteRoot.providedBy(root): icon = self.root_icon else: icon = self.folder_icon result.append({ 'title': translate(MessageFactory('plone')('Home'), context=self.context.REQUEST), 'url': root_url, 'icon': '<img src="%s" width="16" height="16" />' % icon, }) for i in range(len(relative)): now = relative[:i + 1] obj = aq_inner(root.restrictedTraverse(now)) if IFolderish.providedBy(obj): if not now[-1] == 'talkback': result.append({ 'title': obj.title_or_id(), 'url': root_url + '/' + '/'.join(now), 'icon': '<img src="%s" width="16" height="16" />' % self.folder_icon, }) return result
def remove(self): request = self.request user = request.AUTHENTICATED_USER view = request.get('view', '') portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) IFavoriteStorage(site).remove_favorite(user.getId(), id=IUUID(self.context)) statusmsg = IStatusMessage(request) if IFolderish.providedBy(self.context): statusmsg.add(_("The folder has been removed from your favorites")) else: statusmsg.add( _("The document has been removed from your favorites")) request.response.redirect(self.context.absolute_url() + '/' + view)
def action(self, obj): transitions = self.pworkflow.getTransitionsFor(obj) if self.transition_id in [t["id"] for t in transitions]: try: # set effective date if not already set if obj.EffectiveDate() == "None": obj.setEffectiveDate(DateTime()) self.pworkflow.doActionFor(obj, self.transition_id, comment=self.comments) if self.putils.isDefaultPage(obj): self.action(obj.aq_parent.aq_parent) if self.recurse and IFolderish.providedBy(obj): for sub in obj.values(): self.action(sub) except ConflictError: raise except Exception: self.errors.append(_("Could not transition: ${title}", mapping={"title": self.objectTitle(obj)}))
def render(self, search_for='', path='', media_type='video', folders=True): """ """ results = [] normalizer = getUtility(IIDNormalizer) object = aq_inner(self.context) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(object): object = aq_parent(object) path = '/'.join(object.getPhysicalPath()) catalog = getToolByName(self.context, 'portal_catalog') medias = {'video': IVideo, 'audio': IAudio} iface = medias[media_type] media_results = catalog(object_provides=iface.__identifier__, sort_on='created', Title=search_for, path={'query': path, 'depth': 1}) utility = getUtility(ITinyMCE) folder_portal_types = [] if folders and not search_for: folder_portal_types.extend(utility.containsobjects.split('\n')) folders_results = catalog(portal_type=folder_portal_types, sort_on='getObjPositionInParent', path={'query': path, 'depth': 1}) media_results = folders_results + media_results for brain in media_results: results.append({ 'id': brain.getId, 'uid': brain.UID or None, # Maybe Missing.Value 'url': brain.getURL(), 'portal_type': brain.portal_type, 'normalized_type': normalizer.normalize(brain.portal_type), 'title': brain.Title == '' and brain.id or brain.Title, 'icon': brain.getIcon, 'is_folderish': brain.is_folderish, 'itype': 'folder' if brain.is_folderish else media_type }) return json.dumps(results)
def __call__(self, context): context = getattr(context, 'context', context) portal_url = getToolByName(context, 'portal_url') site = portal_url.getPortalObject() new_list = [] pt = getToolByName(site, 'portal_types') types = pt.listTypeInfo() for site_type in types: if (site_type.global_allow is True) and \ (site_type.isConstructionAllowed(site) == True): type_id = site_type.getId() site.invokeFactory(type_id, 'item') item = site['item'] if IFolderish.providedBy(item): new_list.append(SimpleTerm(type_id, type_id)) del site['item'] return SimpleVocabulary(new_list)
def getBreadcrumbs(self, path=None): """Get breadcrumbs""" result = [] portal_state = self.context.restrictedTraverse("@@plone_portal_state") root = getNavigationRootObject(self.context, portal_state.portal()) root_url = root.absolute_url() if path is not None: path = path.replace(root_url, "", 1).strip("/") root = aq_inner(root.restrictedTraverse(path)) phisycal_path = aq_inner(self.context).getPhysicalPath() relative = phisycal_path[len(root.getPhysicalPath()) :] if path is None: # Add siteroot if IPloneSiteRoot.providedBy(root): icon = self.root_icon else: icon = self.folder_icon result.append( { "title": translate(PMF("Home"), context=self.request), "url": root_url, "icon": '<img src="%s" width="16" height="16" />' % icon, } ) for i in range(len(relative)): now = relative[: i + 1] obj = aq_inner(root.restrictedTraverse(now)) icon_snippet = '<img src="%s" width="16" height="16" />' if IFolderish.providedBy(obj): if not now[-1] == "talkback": result.append( { "title": obj.title_or_id(), "url": root_url + "/" + "/".join(now), "icon": icon_snippet % self.folder_icon, } ) return result
def __call__(self, context): context = getattr(context, 'context', context) portal_url = getToolByName(context, 'portal_url') site = portal_url.getPortalObject() pt = getToolByName(site, 'portal_types') # Use only Friendly Types util = queryUtility(IVocabularyFactory, 'plone.app.vocabularies.ReallyUserFriendlyTypes') types = util(context) types_ids = types.by_token.keys() folderish = [] for type_id in types_ids: site_type = pt[type_id] if (site_type.global_allow) and (site_type.isConstructionAllowed(site)): term = types.by_token[type_id] site.invokeFactory(type_id, 'item') item = site['item'] if IFolderish.providedBy(item): folderish.append(term) del site['item'] return SimpleVocabulary(folderish)
def action(self, obj, bypass_recurse=False): transitions = self.pworkflow.getTransitionsFor(obj) if self.transition_id in [t['id'] for t in transitions]: try: # set effective date if not already set if obj.EffectiveDate() == 'None': obj.setEffectiveDate(DateTime()) self.pworkflow.doActionFor(obj, self.transition_id, comment=self.comments) if self.putils.isDefaultPage(obj): self.action(obj.aq_parent, bypass_recurse=True) recurse = self.recurse and not bypass_recurse if recurse and IFolderish.providedBy(obj): for sub in obj.values(): self.action(sub) except ConflictError: raise except Exception: self.errors.append('Could not transition: %s' % ( self.objectTitle(obj)))
def __init__(self, context): if not IFolderish.providedBy(context): # need to be able to drop on page as well context = aq_parent(context) self.context = context registry = getUtility(IRegistry) self.vat = registry.get('plone.types_use_view_action_in_listings', []) self.security = getSecurityManager() if IPloneSiteRoot.providedBy(context): catalog = api.portal.get_tool('portal_catalog') folder_path = '/'.join(context.getPhysicalPath()) brains = catalog(path={'query': folder_path, 'depth': 1}) order = [b.id for b in brains] else: order = context.getOrdering() if not isinstance(order, list): order = order.idsInOrder() if not isinstance(order, list): order = None self.order = order
def action(self, obj): transitions = self.pworkflow.getTransitionsFor(obj) if self.transition_id in [t['id'] for t in transitions]: try: # set effective date if not already set if obj.EffectiveDate() == 'None': obj.setEffectiveDate(DateTime()) self.pworkflow.doActionFor(obj, self.transition_id, comment=self.comments) if self.putils.isDefaultPage(obj): self.action(obj.aq_parent.aq_parent) if self.recurse and IFolderish.providedBy(obj): for sub in obj.values(): self.action(sub) except ConflictError: raise except Exception: self.errors.append('Could not transition: %s' % (self.objectTitle(obj)))
def add(self): request = self.request view = request.get('view', '') portal = getToolByName(self.context, 'portal_url').getPortalObject() site = getNavigationRootObject(self.context, portal) ISuggestionsStorage(site).add_suggestion( id=IUUID(self.context), type='uid', view=view, date=datetime.now()) if IFolderish.providedBy(self.context): IStatusMessage(self.request).addStatusMessage( _("The folder has been added to suggestions")) elif IContentish.providedBy(self.context): IStatusMessage(self.request).addStatusMessage( _("The document has been added to suggestions")) else: IStatusMessage(self.request).addStatusMessage( _("The element has been added to suggestions")) self.request.response.redirect(self.context.absolute_url() + '/' + view)
def __call__(self, context): context = getattr(context, 'context', context) portal_url = getToolByName(context, 'portal_url') site = portal_url.getPortalObject() pt = getToolByName(site, 'portal_types') # Use only Friendly Types util = queryUtility(IVocabularyFactory, 'plone.app.vocabularies.ReallyUserFriendlyTypes') types = util(context) types_ids = types.by_token.keys() folderish = [] for type_id in types_ids: site_type = pt[type_id] if (site_type.global_allow) and ( site_type.isConstructionAllowed(site)): term = types.by_token[type_id] site.invokeFactory(type_id, 'item') item = site['item'] if IFolderish.providedBy(item): folderish.append(term) del site['item'] return SimpleVocabulary(folderish)
def getBreadcrumbs(self, path=None): """Get breadcrumbs""" result = [] root_url = getNavigationRoot(self.context) root = aq_inner(self.context.restrictedTraverse(root_url)) root_url = root.absolute_url() if path is not None: path = path.replace(root_url, '', 1).strip('/') root = aq_inner(root.restrictedTraverse(path)) relative = aq_inner(self.context).getPhysicalPath()[len(root.getPhysicalPath()):] if path is None: # Add siteroot if IPloneSiteRoot.providedBy(root): icon = self.root_icon else: icon = self.folder_icon result.append({ 'title': root.title_or_id(), 'url': '/'.join(root.getPhysicalPath()), 'icon': '<img src="%s" width="16" height="16" />' % icon, }) for i in range(len(relative)): now = relative[:i + 1] obj = aq_inner(root.restrictedTraverse(now)) if IFolderish.providedBy(obj): if not now[-1] == 'talkback': result.append({ 'title': obj.title_or_id(), 'url': root_url + '/' + '/'.join(now), 'icon': '<img src="%s" width="16" height="16" />' % self.folder_icon, }) return result
def action(self, obj, bypass_recurse=False): transitions = self.pworkflow.getTransitionsFor(obj) if self.transition_id in [t['id'] for t in transitions]: try: # set effective date if not already set if obj.EffectiveDate() == 'None': obj.setEffectiveDate(DateTime()) self.pworkflow.doActionFor(obj, self.transition_id, comment=self.comments) if self.putils.isDefaultPage(obj): self.action(obj.aq_parent, bypass_recurse=True) recurse = self.recurse and not bypass_recurse if recurse and IFolderish.providedBy(obj): for sub in obj.values(): self.action(sub) obj.reindexObject() except ConflictError: raise except Exception: self.errors.append( _('Could not transition: ${title}', mapping={'title': self.objectTitle(obj)}))
def getConfiguration(self, context=None, field=None, request=None, script_url=None): """Return JSON configuration that is passed to javascript tinymce constructor""" results = {} # Get widget attributes widget = getattr(field, 'widget', None) filter_buttons = getattr(widget, 'filter_buttons', None) allow_buttons = getattr(widget, 'allow_buttons', None) redefine_parastyles = getattr(widget, 'redefine_parastyles', None) parastyles = getattr(widget, 'parastyles', None) rooted = getattr(widget, 'rooted', False) toolbar_width = getattr(widget, 'toolbar_width', self.toolbar_width) # Get safe html transform safe_html = getattr(getToolByName(self, 'portal_transforms'), 'safe_html') # Get kupu library tool filter # Settings are stored on safe_html transform in Plone 4 and # on kupu tool in Plone 3. kupu_library_tool = getToolByName(self, 'kupu_library_tool', None) # Remove to be stripped attributes try: style_whitelist = safe_html.get_parameter_value('style_whitelist') except (KeyError, AttributeError): if kupu_library_tool is not None: style_whitelist = kupu_library_tool.getStyleWhitelist() else: style_whitelist = [] results['valid_inline_styles'] = ','.join(style_whitelist) # tinymce format # Replacing some hardcoded translations labels = {} labels['label_styles'] = translate(_('(remove style)'), context=request) labels['label_paragraph'] = translate(_('Normal paragraph'), context=request) labels['label_plain_cell'] = translate(_('Plain cell'), context=request) labels['label_style_ldots'] = translate(_('Style...'), context=request) labels['label_text'] = translate(_('Text'), context=request) labels['label_tables'] = translate(_('Tables'), context=request) labels['label_selection'] = translate(_('Selection'), context=request) labels['label_lists'] = translate(_('Lists'), context=request) labels['label_print'] = translate(_('Print'), context=request) labels['label_no_items'] = translate(_('No items in this folder'), context=request) labels['label_no_anchors'] = translate(_('No anchors in this page'), context=request) labels['label_browser'] = translate(_('Browser'), context=request) labels['label_shortcuts'] = translate(_('Shortcuts'), context=request) labels['label_search_results'] = translate(_('Search results:'), context=request) labels['label_internal_path'] = translate(_('You are here:'), context=request) results['labels'] = labels # Add styles to results results['styles'] = [] table_styles = [] if not redefine_parastyles: if isinstance(self.tablestyles, StringTypes): for tablestyle in self.tablestyles.split('\n'): if not tablestyle: # empty line continue tablestylefields = tablestyle.split('|') tablestyletitle = tablestylefields[0] tablestyleid = tablestylefields[1] if tablestyleid == 'plain': # Do not duplicate the default style hardcoded in the # table.htm.pt continue if request is not None: tablestyletitle = translate(_(tablestylefields[0]), context=request) results['styles'].append(tablestyletitle + '|table|' + tablestyleid) table_styles.append(tablestyletitle + '=' + tablestyleid) if isinstance(self.styles, StringTypes): styles = [] for style in self.styles.split('\n'): if not style: # empty line continue stylefields = style.split('|') styletitle = stylefields[0] if request is not None: styletitle = translate(_(stylefields[0]), context=request) merge = styletitle + '|' + '|'.join(stylefields[1:]) styles.append(merge) results['styles'].extend(styles) results['table_styles'] = ';'.join(table_styles) # tinymce config if parastyles is not None: results['styles'].extend(parastyles) # Get buttons from control panel results['buttons'] = self.getEnabledButtons(context=context) # Filter buttons if allow_buttons is not None: allow_buttons = self.translateButtonsFromKupu(context=context, buttons=allow_buttons) results['buttons'] = filter(lambda x: x in results['buttons'], allow_buttons) if filter_buttons is not None: filter_buttons = self.translateButtonsFromKupu(context=context, buttons=filter_buttons) results['buttons'] = filter(lambda x: x not in filter_buttons, results['buttons']) # Get valid html elements valid_elements = self.getValidElements() results['valid_elements'] = ','.join(["%s[%s]" % (key, '|'.join(value)) for key, value in valid_elements.iteritems()]) # Set toolbar_location if self.toolbar_external: results['theme_advanced_toolbar_location'] = 'external' else: results['theme_advanced_toolbar_location'] = 'top' if self.autoresize: results['theme_advanced_path_location'] = 'none' results['theme_advanced_resizing_use_cookie'] = False results['theme_advanced_resizing'] = False results['autoresize'] = True else: results['theme_advanced_path_location'] = 'bottom' results['theme_advanced_resizing_use_cookie'] = True results['theme_advanced_resizing'] = self.resizing results['autoresize'] = False if '%' in self.editor_width: results['theme_advanced_resize_horizontal'] = False else: results['theme_advanced_resize_horizontal'] = True try: results['theme_advanced_source_editor_width'] = int(self.editor_width) except (TypeError, ValueError): results['theme_advanced_source_editor_width'] = 600 try: results['theme_advanced_source_editor_height'] = int(self.editor_height) except (TypeError, ValueError): results['theme_advanced_source_editor_height'] = 400 try: results['toolbar_width'] = int(toolbar_width) except (TypeError, ValueError): results['toolbar_width'] = 440 if self.directionality == 'auto': language = context.Language() if not language: portal_properties = getToolByName(context, "portal_properties") site_properties = portal_properties.site_properties language = site_properties.getProperty('default_language', None) directionality = (language[:2] in RIGHT_TO_LEFT) and 'rtl' or 'ltr' else: directionality = self.directionality results['directionality'] = directionality if self.content_css and self.content_css.strip() != "": results['content_css'] = self.content_css else: results['content_css'] = self.absolute_url() + """/@@tinymce-getstyle""" results['link_using_uids'] = self.link_using_uids results['contextmenu'] = self.contextmenu if script_url: results['script_url'] = script_url if self.allow_captioned_images: results['allow_captioned_images'] = True else: results['allow_captioned_images'] = False if self.rooted or rooted: results['rooted'] = True else: results['rooted'] = False results['entity_encoding'] = self.entity_encoding portal = getUtility(ISiteRoot) results['portal_url'] = aq_inner(portal).absolute_url() nav_root = getNavigationRootObject(context, portal) results['navigation_root_url'] = nav_root.absolute_url() props = getToolByName(self, 'portal_properties') livesearch = props.site_properties.getProperty('enable_livesearch', False) if livesearch: results['livesearch'] = True else: results['livesearch'] = False AVAILABLE_LANGUAGES = set( 'sq ar hy az eu be bn nb bs br bg ca ch zh hr cs da dv nl en et fi fr gl ' 'ka de el gu he hi hu is id ia it ja ko lv lt lb mk ms ml mn se no nn fa ' 'pl pt ps ro ru sc sr ii si sk sl es sv ta tt te th tr tw uk ur cy vi zu'.split()) if 'LANGUAGE' in context.REQUEST: results['language'] = context.REQUEST.LANGUAGE[:2] if results['language'] not in AVAILABLE_LANGUAGES: results['language'] = "en" else: results['language'] = "en" try: results['document_url'] = context.absolute_url() if getattr(aq_base(context), 'checkCreationFlag', None): parent = aq_parent(aq_inner(context)) if context.checkCreationFlag(): parent = aq_parent(aq_parent(parent)) results['document_base_url'] = parent.absolute_url() + "/" else: if IFolderish.providedBy(context): results['document_base_url'] = context.absolute_url() + "/" else: results['document_base_url'] = parent.absolute_url() + "/" else: results['document_base_url'] = results['portal_url'] + "/" except AttributeError: results['document_base_url'] = results['portal_url'] + "/" results['document_url'] = results['portal_url'] # Get Library options results['gecko_spellcheck'] = self.libraries_spellchecker_choice == 'browser' # Content Browser shortcuts_dict = dict(getUtilitiesFor(ITinyMCEShortcut)) results['link_shortcuts_html'] = [] results['image_shortcuts_html'] = [] results['num_of_thumb_columns'] = self.num_of_thumb_columns results['thumbnail_size'] = self.thumbnail_size for name in self.link_shortcuts: results['link_shortcuts_html'].extend(shortcuts_dict.get(name).render(context)) for name in self.image_shortcuts: results['image_shortcuts_html'].extend(shortcuts_dict.get(name).render(context)) # init vars specific for "After the Deadline" spellchecker mtool = getToolByName(portal, 'portal_membership') member = mtool.getAuthenticatedMember() results['atd_rpc_id'] = 'Products.TinyMCE-' + (member.getId() or '') # None when Anonymous User results['atd_rpc_url'] = "%s/@@" % portal.absolute_url() results['atd_show_types'] = self.libraries_atd_show_types.strip().replace('\n', ',') results['atd_ignore_strings'] = self.libraries_atd_ignore_strings.strip().replace('\n', ',') # generic configuration results['mode'] = "exact" results['theme'] = "advanced" results['skin'] = "plone" results['inlinepopups_skin'] = "plonepopup" results['body_class'] = "documentContent" results['body_id'] = "content" results['table_firstline_th'] = True results['force_span_wrappers'] = True results['fix_list_elements'] = False results['theme_advanced_path'] = False results['theme_advanced_toolbar_align'] = "left" results['plugins'] = self.getPlugins() results['theme_advanced_styles'] = self.getStyles(results) results['theme_advanced_buttons1'], results['theme_advanced_buttons2'], \ results['theme_advanced_buttons3'], results['theme_advanced_buttons4'] = self.getToolbars(results) return json.dumps(results)
def upload(self): """Adds uploaded file""" object = aq_inner(self.context) if not IFolderish.providedBy(object): object = object.getParentNode() context = self.context request = context.REQUEST ctr_tool = getToolByName(self.context, 'content_type_registry') id = request['uploadfile'].filename content_type = request['uploadfile'].headers["Content-Type"] typename = ctr_tool.findTypeName(id, content_type, "") # Permission checks based on code by Danny Bloemendaal # 1) check if we are allowed to create an Image in folder if not typename in [t.id for t in context.getAllowedTypes()]: return self.errorMessage(_("Not allowed to upload a file of this type to this folder")) # 2) check if the current user has permissions to add stuff if not context.portal_membership.checkPermission('Add portal content', context): return self.errorMessage(_("You do not have permission to upload files in this folder")) # Get an unused filename without path id = self.cleanupFilename(id) title = request['uploadtitle'] description = request['uploaddescription'] newid = context.invokeFactory(type_name=typename, id=id) if newid is None or newid == '': newid = id obj = getattr(context, newid, None) # Set title + description. # Attempt to use Archetypes mutator if there is one, in case it uses a custom storage if title: try: obj.setTitle(title) except AttributeError: obj.title = title if description: try: obj.setDescription(description) except AttributeError: obj.description = description # set primary field pf = obj.getPrimaryField() pf.set(obj, request['uploadfile']) if not obj: return self.errorMessage(_("Could not upload the file")) obj.reindexObject() utility = getUtility(ITinyMCE) if utility.link_using_uids: return self.okMessage("resolveuid/%s" % (uuidFor(obj))) return self.okMessage("%s" % (obj.absolute_url()))
def getListing(self, filter_portal_types, rooted, document_base_url, upload_type=None, image_types=None): """Returns the actual listing""" catalog_results = [] results = {} image_types = image_types or [] object = aq_inner(self.context) portal_catalog = getToolByName(object, 'portal_catalog') normalizer = getUtility(IIDNormalizer) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(object): object = aq_parent(object) if INavigationRoot.providedBy(object) or (rooted == "True" and document_base_url[:-1] == object.absolute_url()): results['parent_url'] = '' else: results['parent_url'] = aq_parent(object).absolute_url() if rooted == "True": results['path'] = self.getBreadcrumbs(results['parent_url']) else: # get all items from siteroot to context (title and url) results['path'] = self.getBreadcrumbs() plone_layout = self.context.restrictedTraverse('@@plone_layout', None) if plone_layout is None: # Plone 3 plone_view = self.context.restrictedTraverse('@@plone') getIcon = lambda brain: plone_view.getIcon(brain).html_tag() else: # Plone >= 4 getIcon = lambda brain: plone_layout.getIcon(brain)() # get all portal types and get information from brains path = '/'.join(object.getPhysicalPath()) query = self.listing_base_query.copy() query.update({'portal_type': filter_portal_types, 'sort_on': 'getObjPositionInParent', 'path': {'query': path, 'depth': 1}}) for brain in portal_catalog(**query): catalog_results.append({ 'id': brain.getId, 'uid': brain.UID or None, # Maybe Missing.Value 'url': brain.getURL(), 'portal_type': brain.portal_type, 'normalized_type': normalizer.normalize(brain.portal_type), 'title': brain.Title == "" and brain.id or brain.Title, 'icon': getIcon(brain), 'description': brain.Description, 'is_folderish': brain.is_folderish, }) # add catalog_ressults results['items'] = catalog_results # decide whether to show the upload new button results['upload_allowed'] = False if upload_type: portal_types = getToolByName(object, 'portal_types') fti = getattr(portal_types, upload_type, None) if fti is not None: results['upload_allowed'] = fti.isConstructionAllowed(object) # return results in JSON format self.context.REQUEST.response.setHeader("Content-type", "application/json") return json.dumps(results)
def getConfiguration(self, context=None, field=None, request=None): """Return configuration as a dictionary :param field: Dexterity or Archetypes Field instance :param context: The TinyMCE editor content items :return: JSON string of the TinyMCE configuration for this field """ results = {} # Get widget attributes widget = getattr(field, 'widget', None) filter_buttons = getattr(widget, 'filter_buttons', None) allow_buttons = getattr(widget, 'allow_buttons', None) redefine_parastyles = getattr(widget, 'redefine_parastyles', None) parastyles = getattr(widget, 'parastyles', None) rooted = getattr(widget, 'rooted', False) toolbar_width = getattr(widget, 'toolbar_width', self.toolbar_width) # Get safe html transform safe_html = getattr(getToolByName(self, 'portal_transforms'), 'safe_html') # Get kupu library tool filter # Settings are stored on safe_html transform in Plone 4 and # on kupu tool in Plone 3. kupu_library_tool = getToolByName(self, 'kupu_library_tool', None) # Remove to be stripped attributes try: style_whitelist = safe_html.get_parameter_value('style_whitelist') except (KeyError, AttributeError): if kupu_library_tool is not None: style_whitelist = kupu_library_tool.getStyleWhitelist() else: style_whitelist = [] results['valid_inline_styles'] = ','.join(style_whitelist) # tinymce format # Replacing some hardcoded translations labels = {} labels['label_browseimage'] = translate(_('Image Browser'), context=request) labels['label_browselink'] = translate(_('Link Browser'), context=request) labels['label_addnewimage'] = translate(_('Add new Image'), context=request) labels['label_addnewfile'] = translate(_('Add new File'), context=request) labels['label_styles'] = translate(_('(remove style)'), context=request) labels['label_paragraph'] = translate(_('Normal paragraph'), context=request) labels['label_plain_cell'] = translate(_('Plain cell'), context=request) labels['label_style_ldots'] = translate(_('Style...'), context=request) labels['label_text'] = translate(_('Text'), context=request) labels['label_tables'] = translate(_('Tables'), context=request) labels['label_selection'] = translate(_('Selection'), context=request) labels['label_lists'] = translate(_('Lists'), context=request) labels['label_print'] = translate(_('Print'), context=request) labels['label_no_items'] = translate(_('No items in this folder'), context=request) labels['label_no_anchors'] = translate(_('No anchors in this page'), context=request) labels['label_browser'] = translate(_('Browser'), context=request) labels['label_shortcuts'] = translate(_('Shortcuts'), context=request) labels['label_search_results'] = translate(_('Search results:'), context=request) labels['label_internal_path'] = translate(PMF("you_are_here", default="You are here:"), context=request) results['labels'] = labels # Add styles to results results['styles'] = [] table_styles = [] if not redefine_parastyles: if isinstance(self.tablestyles, StringTypes): for tablestyle in self.tablestyles.split('\n'): if not tablestyle: # empty line continue tablestylefields = tablestyle.split('|') tablestyletitle = tablestylefields[0] tablestyleid = tablestylefields[1] if tablestyleid == 'plain': # Do not duplicate the default style hardcoded in the # table.htm.pt continue if request is not None: tablestyletitle = translate(_(tablestylefields[0]), context=request) results['styles'].append(tablestyletitle + '|table|' + tablestyleid) table_styles.append(tablestyletitle + '=' + tablestyleid) if isinstance(self.styles, StringTypes): styles = [] for style in self.styles.split('\n'): if not style: # empty line continue stylefields = style.split('|') styletitle = stylefields[0] if request is not None: styletitle = translate(_(stylefields[0]), context=request) merge = styletitle + '|' + '|'.join(stylefields[1:]) styles.append(merge) results['styles'].extend(styles) results['table_styles'] = ';'.join(table_styles) # tinymce config if parastyles is not None: results['styles'].extend(parastyles) styles = results.pop('styles') # Get buttons from control panel results['buttons'] = self.getEnabledButtons(context=context) # Filter buttons if allow_buttons is not None: allow_buttons = self.translateButtonsFromKupu(context=context, buttons=allow_buttons) results['buttons'] = filter(lambda x: x in results['buttons'], allow_buttons) if filter_buttons is not None: filter_buttons = self.translateButtonsFromKupu(context=context, buttons=filter_buttons) results['buttons'] = filter(lambda x: x not in filter_buttons, results['buttons']) # Get valid html elements valid_elements = self.getValidElements() results['valid_elements'] = ','.join(["%s[%s]" % (key, '|'.join(value)) for key, value in valid_elements.iteritems()]) # self.customplugins can be None on old migrated sites results['customplugins'] = (self.customplugins or "").splitlines() # Set toolbar_location if self.toolbar_external: results['theme_advanced_toolbar_location'] = 'external' else: results['theme_advanced_toolbar_location'] = 'top' if self.autoresize: results['theme_advanced_path_location'] = 'none' results['theme_advanced_resizing_use_cookie'] = False results['theme_advanced_resizing'] = False results['autoresize'] = True else: results['theme_advanced_path_location'] = 'bottom' results['theme_advanced_resizing_use_cookie'] = True results['theme_advanced_resizing'] = self.resizing results['autoresize'] = False if '%' in self.editor_width: results['theme_advanced_resize_horizontal'] = False else: results['theme_advanced_resize_horizontal'] = True try: results['theme_advanced_source_editor_width'] = int(self.editor_width) except (TypeError, ValueError): results['theme_advanced_source_editor_width'] = 600 try: results['theme_advanced_source_editor_height'] = int(self.editor_height) except (TypeError, ValueError): results['theme_advanced_source_editor_height'] = 400 try: results['toolbar_width'] = int(toolbar_width) except (TypeError, ValueError): results['toolbar_width'] = 440 portal_state = context.restrictedTraverse('@@plone_portal_state') # is_rtl handles every possible setting as far as RTL/LTR is concerned # pass that to tinmyce results['directionality'] = portal_state.is_rtl() and 'rtl' or 'ltr' portal = portal_state.portal() portal_url = portal_state.portal_url() results['portal_url'] = portal_url results['navigation_root_url'] = portal_state.navigation_root_url() if self.content_css and self.content_css.strip() != "": results['content_css'] = self.content_css else: results['content_css'] = '/'.join([ results['portal_url'], self.getId(), "@@tinymce-getstyle"]) results['link_using_uids'] = self.link_using_uids results['contextmenu'] = self.contextmenu results['entity_encoding'] = self.entity_encoding results['script_url'] = portal_url + '/tiny_mce_gzip.js' results['allow_captioned_images'] = bool(self.allow_captioned_images) results['rooted'] = bool(self.rooted or rooted) props = getToolByName(portal, 'portal_properties') livesearch = props.site_properties.getProperty('enable_livesearch', False) results['livesearch'] = bool(livesearch) AVAILABLE_LANGUAGES = set( 'sq ar hy az eu be bn nb bs br bg ca ch zh hr cs da dv nl en et fi fr gl ' 'ka de el gu he hi hu is id ia it ja ko lv lt lb mk ms ml mn se no nn fa ' 'pl pt ps ro ru sc sr ii si sk sl es sv ta tt te th tr zh-cn zh-tw uk ur cy vi zu'.split()) if 'LANGUAGE' in context.REQUEST: if context.REQUEST.LANGUAGE in AVAILABLE_LANGUAGES: results['language'] = context.REQUEST.LANGUAGE elif context.REQUEST.LANGUAGE[:2] in AVAILABLE_LANGUAGES: results['language'] = context.REQUEST.LANGUAGE[:2] else: results['language'] = "en" else: results['language'] = "en" try: results['document_url'] = context.absolute_url() obj = context while obj is not None: if IFolderish.providedBy(obj): if obj.portal_type != 'TempFolder': # do not use portal_factory generated # temporary object for base url. results['document_base_url'] = obj.absolute_url() + "/" break # We should never reach this. if ISiteRoot.providedBy(obj): results['document_base_url'] = portal_url + "/" results['document_url'] = portal_url break obj = aq_parent(aq_inner(obj)) except AttributeError: results['document_base_url'] = portal_url + "/" results['document_url'] = portal_url # Get Library options results['gecko_spellcheck'] = self.libraries_spellchecker_choice == 'browser' # Content Browser shortcuts_dict = dict(getUtilitiesFor(ITinyMCEShortcut)) results['link_shortcuts_html'] = [] results['image_shortcuts_html'] = [] results['num_of_thumb_columns'] = self.num_of_thumb_columns results['thumbnail_size'] = self.thumbnail_size results['anchor_selector'] = self.anchor_selector for name in self.link_shortcuts: results['link_shortcuts_html'].extend(shortcuts_dict.get(name).render(context)) for name in self.image_shortcuts: results['image_shortcuts_html'].extend(shortcuts_dict.get(name).render(context)) # init vars specific for "After the Deadline" spellchecker mtool = getToolByName(portal, 'portal_membership') member = mtool.getAuthenticatedMember() results['atd_rpc_id'] = 'Products.TinyMCE-' + (member.getId() or '') # None when Anonymous User results['atd_rpc_url'] = "%s/@@" % portal_url results['atd_show_types'] = self.libraries_atd_show_types.strip().replace('\n', ',') results['atd_ignore_strings'] = self.libraries_atd_ignore_strings.strip().replace('\n', ',') # generic configuration results['mode'] = "exact" results['theme'] = "advanced" results['skin'] = "plone" results['inlinepopups_skin'] = "plonepopup" results['body_class'] = "documentContent" results['body_id'] = "content" results['table_firstline_th'] = True results['fix_list_elements'] = False # allow embed tag if user removes it from # list of nasty tags - see #10681 results['media_strict'] = False results['theme_advanced_path'] = False results['theme_advanced_toolbar_align'] = "left" results['plugins'] = self.getPlugins() results['theme_advanced_styles'] = self.getStyles(styles, labels) results['theme_advanced_buttons1'], results['theme_advanced_buttons2'], \ results['theme_advanced_buttons3'], results['theme_advanced_buttons4'] = self.getToolbars(results) if self.formats and self.formats.strip(): results['formats'] = json.loads(self.formats) return results
def getConfiguration(self, context=None, field=None, request=None): results = {} # Get widget attributes widget = getattr(field, 'widget', None) filter_buttons = getattr(widget, 'filter_buttons', None) allow_buttons = getattr(widget, 'allow_buttons', None) redefine_parastyles = getattr(widget, 'redefine_parastyles', None) parastyles = getattr(widget, 'parastyles', None) rooted = getattr(widget, 'rooted', False) toolbar_width = getattr(widget, 'toolbar_width', self.toolbar_width) # Get safe html transform safe_html = getattr(getToolByName(self, 'portal_transforms'), 'safe_html') # Get kupu library tool filter # Settings are stored on safe_html transform in Plone 4 and # on kupu tool in Plone 3. kupu_library_tool = getToolByName(self, 'kupu_library_tool', None) # Remove to be stripped attributes try: style_whitelist = safe_html.get_parameter_value('style_whitelist') except (KeyError, AttributeError): if kupu_library_tool is not None: style_whitelist = kupu_library_tool.getStyleWhitelist() else: style_whitelist = [] results['valid_inline_styles'] = style_whitelist # Replacing some hardcoded translations labels = {} labels['label_styles'] = translate(_('(remove style)'), context=request) labels['label_paragraph'] = translate(_('Normal paragraph'), context=request) labels['label_plain_cell'] = translate(_('Plain cell'), context=request) labels['label_style_ldots'] = translate(_('Style...'), context=request) labels['label_text'] = translate(_('Text'), context=request) labels['label_tables'] = translate(_('Tables'), context=request) labels['label_selection'] = translate(_('Selection'), context=request) labels['label_lists'] = translate(_('Lists'), context=request) labels['label_print'] = translate(_('Print'), context=request) labels['label_no_items'] = translate(_('No items in this folder'), context=request) labels['label_no_anchors'] = translate(_('No anchors in this page'), context=request) results['labels'] = labels # Add styles to results results['styles'] = [] results['table_styles'] = [] if not redefine_parastyles: if isinstance(self.tablestyles, StringTypes): for tablestyle in self.tablestyles.split('\n'): if not tablestyle: # empty line continue tablestylefields = tablestyle.split('|') tablestyletitle = tablestylefields[0] tablestyleid = tablestylefields[1] if tablestyleid == 'plain': # Do not duplicate the default style hardcoded in the # table.htm.pt continue if request is not None: tablestyletitle = translate(_(tablestylefields[0]), context=request) results['styles'].append(tablestyletitle + '|table|' + tablestyleid) results['table_styles'].append(tablestyletitle + '=' + tablestyleid) if isinstance(self.styles, StringTypes): styles = [] for style in self.styles.split('\n'): if not style: # empty line continue stylefields = style.split('|') styletitle = stylefields[0] if request is not None: styletitle = translate(_(stylefields[0]), context=request) merge = styletitle + '|' + '|'.join(stylefields[1:]) styles.append(merge) results['styles'].extend(styles) if parastyles is not None: results['styles'].extend(parastyles) # Get buttons from control panel results['buttons'] = self.getEnabledButtons(context=context) # Filter buttons if allow_buttons is not None: allow_buttons = self.translateButtonsFromKupu( context=context, buttons=allow_buttons) results['buttons'] = filter(lambda x: x in results['buttons'], allow_buttons) if filter_buttons is not None: filter_buttons = self.translateButtonsFromKupu( context=context, buttons=filter_buttons) results['buttons'] = filter(lambda x: x not in filter_buttons, results['buttons']) # Get valid html elements results['valid_elements'] = self.getValidElements() # Set toolbar_location if self.toolbar_external: results['toolbar_location'] = 'external' else: results['toolbar_location'] = 'top' if self.autoresize: results['path_location'] = 'none' results['resizing_use_cookie'] = False results['resizing'] = False results['autoresize'] = True else: results['path_location'] = 'bottom' results['resizing_use_cookie'] = True if self.resizing: results['resizing'] = True else: results['resizing'] = False results['autoresize'] = False if '%' in self.editor_width: results['resize_horizontal'] = False else: results['resize_horizontal'] = True try: results['editor_width'] = int(self.editor_width) except (TypeError, ValueError): results['editor_width'] = 600 try: results['editor_height'] = int(self.editor_height) except (TypeError, ValueError): results['editor_height'] = 400 try: results['toolbar_width'] = int(toolbar_width) except (TypeError, ValueError): results['toolbar_width'] = 440 if self.directionality == 'auto': language = context.Language() if not language: portal_properties = getToolByName(context, "portal_properties") site_properties = portal_properties.site_properties language = site_properties.getProperty('default_language', None) directionality = (language[:2] in RIGHT_TO_LEFT) and 'rtl' or 'ltr' else: directionality = self.directionality results['directionality'] = directionality if self.contextmenu: results['contextmenu'] = True else: results['contextmenu'] = False portal = getSite() results['portal_url'] = aq_inner(portal).absolute_url() nav_root = getNavigationRootObject(context, portal) results['navigation_root_url'] = nav_root.absolute_url() if self.content_css and self.content_css.strip() != "": results['content_css'] = self.content_css else: results['content_css'] = '/'.join( [results['portal_url'], self.getId(), "@@tinymce-getstyle"]) if self.link_using_uids: results['link_using_uids'] = True else: results['link_using_uids'] = False if self.allow_captioned_images: results['allow_captioned_images'] = True else: results['allow_captioned_images'] = False if self.rooted or rooted: results['rooted'] = True else: results['rooted'] = False results['customplugins'] = [] if self.customplugins is not None: results['customplugins'].extend(self.customplugins.split('\n')) results['entity_encoding'] = self.entity_encoding props = getToolByName(self, 'portal_properties') livesearch = props.site_properties.getProperty('enable_livesearch', False) if livesearch: results['livesearch'] = True else: results['livesearch'] = False AVAILABLE_LANGUAGES = set( 'sq ar hy az eu be bn nb bs br bg ca ch zh hr cs da dv nl en et fi fr gl ' 'ka de el gu he hi hu is id ia it ja ko lv lt lb mk ms ml mn se no nn fa ' 'pl pt ps ro ru sc sr ii si sk sl es sv ta tt te th tr tw uk ur cy vi zu' .split()) if 'LANGUAGE' in context.REQUEST: results['language'] = context.REQUEST.LANGUAGE[:2] if results['language'] not in AVAILABLE_LANGUAGES: results['language'] = "en" else: results['language'] = "en" try: results['document_url'] = context.absolute_url() parent = aq_parent(aq_inner(context)) if getattr(aq_base(context), 'checkCreationFlag', None) and context.checkCreationFlag(): parent = aq_parent(aq_parent(parent)) results['parent'] = parent.absolute_url() + "/" else: if IFolderish.providedBy(context): results['parent'] = context.absolute_url() + "/" else: results['parent'] = parent.absolute_url() + "/" except AttributeError: results['parent'] = results['portal_url'] + "/" results['document_url'] = results['portal_url'] # Get Library options results['libraries_spellchecker_choice'] = \ self.libraries_spellchecker_choice # init vars specific for "After the Deadline" spellchecker mtool = getToolByName(portal, 'portal_membership') member = mtool.getAuthenticatedMember() results['atd_rpc_id'] = 'Products.TinyMCE-' + ( member.getId() or '') # None when Anonymous User results['atd_rpc_url'] = "%s/@@" % portal.absolute_url() results['atd_show_types'] = self.libraries_atd_show_types.strip( ).replace('\n', ',') results[ 'atd_ignore_strings'] = self.libraries_atd_ignore_strings.strip( ).replace('\n', ',') return json.dumps(results)
def on_content_state_changed(obj, event): obj.reindexObject(idxs=['has_private_parents']) if IFolderish.providedBy(obj): tasks.reindex_children.delay(obj, ['has_private_parents'])
def getConfiguration(self, context=None, field=None, request=None, script_url=None): """Return JSON configuration that is passed to javascript tinymce constructor. :param field: Dexterity or Archetypes Field instance :param context: The TinyMCE editor content items :param script_url: tinymce.jquery.js plug-in TinyMCE script parameter. For more details see http://www.tinymce.com/wiki.php/jQuery_Plugin :return: JSON string of the TinyMCE configuration for this field """ results = {} # Get widget attributes widget = getattr(field, 'widget', None) filter_buttons = getattr(widget, 'filter_buttons', None) allow_buttons = getattr(widget, 'allow_buttons', None) redefine_parastyles = getattr(widget, 'redefine_parastyles', None) parastyles = getattr(widget, 'parastyles', None) rooted = getattr(widget, 'rooted', False) toolbar_width = getattr(widget, 'toolbar_width', self.toolbar_width) # Get safe html transform safe_html = getattr(getToolByName(self, 'portal_transforms'), 'safe_html') # Get kupu library tool filter # Settings are stored on safe_html transform in Plone 4 and # on kupu tool in Plone 3. kupu_library_tool = getToolByName(self, 'kupu_library_tool', None) # Remove to be stripped attributes try: style_whitelist = safe_html.get_parameter_value('style_whitelist') except (KeyError, AttributeError): if kupu_library_tool is not None: style_whitelist = kupu_library_tool.getStyleWhitelist() else: style_whitelist = [] results['valid_inline_styles'] = ','.join( style_whitelist) # tinymce format # Replacing some hardcoded translations labels = {} labels['label_browseimage'] = translate(_('Image Browser'), context=request) labels['label_browselink'] = translate(_('Link Browser'), context=request) labels['label_addnewimage'] = translate(_('Add new Image'), context=request) labels['label_addnewfile'] = translate(_('Add new File'), context=request) labels['label_styles'] = translate(_('(remove style)'), context=request) labels['label_paragraph'] = translate(_('Normal paragraph'), context=request) labels['label_plain_cell'] = translate(_('Plain cell'), context=request) labels['label_style_ldots'] = translate(_('Style...'), context=request) labels['label_text'] = translate(_('Text'), context=request) labels['label_tables'] = translate(_('Tables'), context=request) labels['label_selection'] = translate(_('Selection'), context=request) labels['label_lists'] = translate(_('Lists'), context=request) labels['label_print'] = translate(_('Print'), context=request) labels['label_no_items'] = translate(_('No items in this folder'), context=request) labels['label_no_anchors'] = translate(_('No anchors in this page'), context=request) labels['label_browser'] = translate(_('Browser'), context=request) labels['label_shortcuts'] = translate(_('Shortcuts'), context=request) labels['label_search_results'] = translate(_('Search results:'), context=request) labels['label_internal_path'] = translate(PMF("you_are_here"), context=request) results['labels'] = labels # Add styles to results results['styles'] = [] table_styles = [] if not redefine_parastyles: if isinstance(self.tablestyles, StringTypes): for tablestyle in self.tablestyles.split('\n'): if not tablestyle: # empty line continue tablestylefields = tablestyle.split('|') tablestyletitle = tablestylefields[0] tablestyleid = tablestylefields[1] if tablestyleid == 'plain': # Do not duplicate the default style hardcoded in the # table.htm.pt continue if request is not None: tablestyletitle = translate(_(tablestylefields[0]), context=request) results['styles'].append(tablestyletitle + '|table|' + tablestyleid) table_styles.append(tablestyletitle + '=' + tablestyleid) if isinstance(self.styles, StringTypes): styles = [] for style in self.styles.split('\n'): if not style: # empty line continue stylefields = style.split('|') styletitle = stylefields[0] if request is not None: styletitle = translate(_(stylefields[0]), context=request) merge = styletitle + '|' + '|'.join(stylefields[1:]) styles.append(merge) results['styles'].extend(styles) results['table_styles'] = ';'.join(table_styles) # tinymce config if parastyles is not None: results['styles'].extend(parastyles) styles = results.pop('styles') # Get buttons from control panel results['buttons'] = self.getEnabledButtons(context=context) # Filter buttons if allow_buttons is not None: allow_buttons = self.translateButtonsFromKupu( context=context, buttons=allow_buttons) results['buttons'] = filter(lambda x: x in results['buttons'], allow_buttons) if filter_buttons is not None: filter_buttons = self.translateButtonsFromKupu( context=context, buttons=filter_buttons) results['buttons'] = filter(lambda x: x not in filter_buttons, results['buttons']) # Get valid html elements valid_elements = self.getValidElements() results['valid_elements'] = ','.join([ "%s[%s]" % (key, '|'.join(value)) for key, value in valid_elements.iteritems() ]) # self.customplugins can be None on old migrated sites results['customplugins'] = (self.customplugins or "").splitlines() # Set toolbar_location if self.toolbar_external: results['theme_advanced_toolbar_location'] = 'external' else: results['theme_advanced_toolbar_location'] = 'top' if self.autoresize: results['theme_advanced_path_location'] = 'none' results['theme_advanced_resizing_use_cookie'] = False results['theme_advanced_resizing'] = False results['autoresize'] = True else: results['theme_advanced_path_location'] = 'bottom' results['theme_advanced_resizing_use_cookie'] = True results['theme_advanced_resizing'] = self.resizing results['autoresize'] = False if '%' in self.editor_width: results['theme_advanced_resize_horizontal'] = False else: results['theme_advanced_resize_horizontal'] = True try: results['theme_advanced_source_editor_width'] = int( self.editor_width) except (TypeError, ValueError): results['theme_advanced_source_editor_width'] = 600 try: results['theme_advanced_source_editor_height'] = int( self.editor_height) except (TypeError, ValueError): results['theme_advanced_source_editor_height'] = 400 try: results['toolbar_width'] = int(toolbar_width) except (TypeError, ValueError): results['toolbar_width'] = 440 portal_state = context.restrictedTraverse('@@plone_portal_state') # is_rtl handles every possible setting as far as RTL/LTR is concerned # pass that to tinmyce results['directionality'] = portal_state.is_rtl() and 'rtl' or 'ltr' portal = portal_state.portal() request = context.REQUEST portal_path = portal.getPhysicalPath() results['portal_url'] = request.physicalPathToURL(portal_path) results['navigation_root_url'] = portal_state.navigation_root_url() if self.content_css and self.content_css.strip() != "": results['content_css'] = self.content_css else: results['content_css'] = '/'.join( [results['portal_url'], self.getId(), "@@tinymce-getstyle"]) results['link_using_uids'] = self.link_using_uids results['contextmenu'] = self.contextmenu results['entity_encoding'] = self.entity_encoding if script_url: results['script_url'] = script_url if self.allow_captioned_images: results['allow_captioned_images'] = True else: results['allow_captioned_images'] = False if self.rooted or rooted: results['rooted'] = True else: results['rooted'] = False props = getToolByName(self, 'portal_properties') livesearch = props.site_properties.getProperty('enable_livesearch', False) if livesearch: results['livesearch'] = True else: results['livesearch'] = False AVAILABLE_LANGUAGES = set( 'sq ar hy az eu be bn nb bs br bg ca ch zh hr cs da dv nl en et fi fr gl ' 'ka de el gu he hi hu is id ia it ja ko lv lt lb mk ms ml mn se no nn fa ' 'pl pt ps ro ru sc sr ii si sk sl es sv ta tt te th tr tw uk ur cy vi zu' .split()) if 'LANGUAGE' in context.REQUEST: results['language'] = context.REQUEST.LANGUAGE[:2] if results['language'] not in AVAILABLE_LANGUAGES: results['language'] = "en" else: results['language'] = "en" try: results['document_url'] = context.absolute_url() if getattr(aq_base(context), 'checkCreationFlag', None): parent = aq_parent(aq_inner(context)) if context.checkCreationFlag(): parent = aq_parent(aq_parent(parent)) results['document_base_url'] = parent.absolute_url() + "/" else: if IFolderish.providedBy(context): results['document_base_url'] = context.absolute_url( ) + "/" else: results['document_base_url'] = parent.absolute_url( ) + "/" else: results['document_base_url'] = results['portal_url'] + "/" except AttributeError: results['document_base_url'] = results['portal_url'] + "/" results['document_url'] = results['portal_url'] # Get Library options results[ 'gecko_spellcheck'] = self.libraries_spellchecker_choice == 'browser' # Content Browser shortcuts_dict = dict(getUtilitiesFor(ITinyMCEShortcut)) results['link_shortcuts_html'] = [] results['image_shortcuts_html'] = [] results['num_of_thumb_columns'] = self.num_of_thumb_columns results['thumbnail_size'] = self.thumbnail_size for name in self.link_shortcuts: results['link_shortcuts_html'].extend( shortcuts_dict.get(name).render(context)) for name in self.image_shortcuts: results['image_shortcuts_html'].extend( shortcuts_dict.get(name).render(context)) # init vars specific for "After the Deadline" spellchecker mtool = getToolByName(portal, 'portal_membership') member = mtool.getAuthenticatedMember() results['atd_rpc_id'] = 'Products.TinyMCE-' + ( member.getId() or '') # None when Anonymous User results['atd_rpc_url'] = "%s/@@" % portal.absolute_url() results['atd_show_types'] = self.libraries_atd_show_types.strip( ).replace('\n', ',') results[ 'atd_ignore_strings'] = self.libraries_atd_ignore_strings.strip( ).replace('\n', ',') # generic configuration results['mode'] = "exact" results['theme'] = "advanced" results['skin'] = "plone" results['inlinepopups_skin'] = "plonepopup" results['body_class'] = "documentContent" results['body_id'] = "content" results['table_firstline_th'] = True results['fix_list_elements'] = False # allow embed tag if user removes it from # list of nasty tags - see #10681 results['media_strict'] = False results['theme_advanced_path'] = False results['theme_advanced_toolbar_align'] = "left" results['plugins'] = self.getPlugins() results['theme_advanced_styles'] = self.getStyles(styles, labels) results['theme_advanced_buttons1'], results['theme_advanced_buttons2'], \ results['theme_advanced_buttons3'], results['theme_advanced_buttons4'] = self.getToolbars(results) if self.formats and self.formats.strip(): results['formats'] = json.loads(self.formats) return json.dumps(results)
def getListing(self, filter_portal_types, rooted, document_base_url, upload_type=None, image_types=None): """Returns the actual listing""" catalog_results = [] results = {} image_types = image_types or [] object = aq_inner(self.context) portal_catalog = getToolByName(object, 'portal_catalog') normalizer = getUtility(IIDNormalizer) # check if object is a folderish object, if not, get it's parent. if not IFolderish.providedBy(object): object = aq_parent(object) if INavigationRoot.providedBy(object) or (rooted == "True" and document_base_url[:-1] == object.absolute_url()): results['parent_url'] = '' else: results['parent_url'] = aq_parent(object).absolute_url() if rooted == "True": results['path'] = self.getBreadcrumbs(results['parent_url']) else: # get all items from siteroot to context (title and url) results['path'] = self.getBreadcrumbs() plone_layout = self.context.restrictedTraverse('@@plone_layout', None) if plone_layout is None: # Plone 3 plone_view = self.context.restrictedTraverse('@@plone') getIcon = lambda brain: plone_view.getIcon(brain).html_tag() else: # Plone >= 4 getIcon = lambda brain: plone_layout.getIcon(brain)() # get all portal types and get information from brains path = '/'.join(object.getPhysicalPath()) query = self.listing_base_query.copy() query.update({ 'portal_type': filter_portal_types, 'sort_on': 'getObjPositionInParent', 'path': { 'query': path, 'depth': 1 } }) for brain in portal_catalog(**query): description = '' if brain.Description: if type(brain.Description) == str: description = unicode(brain.Description, 'utf-8', 'ignore') elif type(brain.Description) == unicode: description = brain.Description catalog_results.append({ 'id': brain.getId, 'uid': brain.UID or None, # Maybe Missing.Value 'url': brain.getURL(), 'review_state': brain.review_state or None, # Maybe Missing.Value 'portal_type': brain.portal_type, 'normalized_type': normalizer.normalize(brain.portal_type), 'title': brain.Title == "" and brain.id or brain.Title, 'icon': getIcon(brain), 'description': description, 'is_folderish': brain.is_folderish, 'is_image': brain.portal_type in image_types, }) # add catalog_ressults results['items'] = catalog_results # decide whether to show the upload new button results['upload_allowed'] = False if upload_type: portal_types = getToolByName(object, 'portal_types') fti = getattr(portal_types, upload_type, None) if fti is not None: results['upload_allowed'] = fti.isConstructionAllowed(object) # return results in JSON format self.context.REQUEST.response.setHeader("Content-type", "application/json") return json.dumps(results)
def tinymce(self): """ data-pat-tinymce : JSON.stringify({ relatedItems: { vocabularyUrl: config.portal_url + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' }, tiny: config, prependToUrl: 'resolveuid/', linkAttribute: 'UID', prependToScalePart: '/@@images/image/' }) """ generator = TinyMCESettingsGenerator(self.context, self.request) settings = generator.settings folder = aq_inner(self.context) # Test if we are currently creating an Archetype object if IFactoryTempFolder.providedBy(aq_parent(folder)): folder = aq_parent(aq_parent(aq_parent(folder))) if not IFolderish.providedBy(folder): folder = aq_parent(folder) if IPloneSiteRoot.providedBy(folder): initial = None else: initial = IUUID(folder, None) portal = get_portal() portal_url = portal.absolute_url() current_path = folder.absolute_url()[len(portal_url):] image_types = settings.image_objects or [] server_url = self.request.get('SERVER_URL', '') site_path = portal_url[len(server_url):] related_items_config = get_relateditems_options( context=self.context, value=None, separator=';', vocabulary_name='plone.app.vocabularies.Catalog', vocabulary_view='@@getVocabulary', field_name=None ) related_items_config = call_callables( related_items_config, self.context ) configuration = { 'base_url': self.context.absolute_url(), 'imageTypes': image_types, 'imageScales': self.image_scales, 'linkAttribute': 'UID', # This is for loading the languages on tinymce 'loadingBaseUrl': '{}/++plone++static/components/tinymce-builded/' 'js/tinymce'.format(portal_url), 'relatedItems': related_items_config, 'prependToScalePart': '/@@images/image/', 'prependToUrl': '{}/resolveuid/'.format(site_path.rstrip('/')), 'tiny': generator.get_tiny_config(), 'upload': { 'baseUrl': portal_url, 'currentPath': current_path, 'initialFolder': initial, 'maxFiles': 1, 'relativePath': '@@fileUpload', 'showTitle': False, 'uploadMultiple': False, }, } return {'data-pat-tinymce': json.dumps(configuration)}