def isSyndicationAllowed(self, obj=None):
     """
     Check whether syndication is enabled for the site.  This
     provides for extending the method to check for whether a
     particular obj is enabled, allowing for turning on only
     specific folders for syndication.
     """
     settings = IFeedSettings(obj)
     return settings.enabled
Ejemplo n.º 2
0
 def context_enabled(self, raise404=False):
     settings = IFeedSettings(self.context, None)
     if not self.context_allowed() or not settings.enabled:
         if raise404:
             raise NotFound
         else:
             return False
     else:
         return True
Ejemplo n.º 3
0
 def allowed_feed_types(self):
     settings = IFeedSettings(self.context)
     factory = getUtility(IVocabularyFactory,
                          "plone.app.vocabularies.SyndicationFeedTypes")
     vocabulary = factory(self.context)
     types = []
     for typ in settings.feed_types:
         types.append(vocabulary.getTerm(typ))
     return [{'path': t.value, 'title': t.title} for t in types]
Ejemplo n.º 4
0
 def __init__(self, context):
     self.context = context
     self.settings = IFeedSettings(context)
     self.site = getSite()
     if self.show_about:
         self.pm = getToolByName(self.context, 'portal_membership')
     registry = getUtility(IRegistry)
     self.view_action_types = registry.get(
         'plone.types_use_view_action_in_listings', [])
Ejemplo n.º 5
0
 def __call__(self):
     util = getMultiAdapter((self.context, self.request),
                            name='syndication-util')
     if util.context_enabled(raise404=True):
         settings = IFeedSettings(self.context)
         if self.__name__ not in settings.feed_types:
             raise NotFound
         self.request.response.setHeader('Content-Type',
                                         'application/atom+xml')
         return self.index()
Ejemplo n.º 6
0
 def __init__(self, context):
     self.context = context
     self.settings = IFeedSettings(context)
     self.site = getSite()
     if self.show_about:
         self.pm = getToolByName(self.context, 'portal_membership')
     pprops = getToolByName(self.context, 'portal_properties')
     self.site_props = pprops.site_properties
     self.view_action_types = self.site_props.getProperty(
         'typesUseViewActionInListings', ('File', 'Image'))
Ejemplo n.º 7
0
 def newsml_allowed(self):
     util = getMultiAdapter((self.context, self.request),
                            name='syndication-util')
     if not util.site_enabled():
         return False
     elif ISyndicatable.providedBy(self.context):
         settings = IFeedSettings(self.context, None)
         if settings.enabled:
             return True
     return False
Ejemplo n.º 8
0
 def __call__(self):
     util = getMultiAdapter((self.context, self.request),
                            name='syndication-util')
     context_state = getMultiAdapter((self.context, self.request),
                                     name=u'plone_context_state')
     if context_state.is_portal_root() or util.context_enabled(raise404=True):
         settings = IFeedSettings(self.context)
         if self.__name__ not in settings.feed_types:
             raise NotFound
         self.request.response.setHeader('Content-Type', self.content_type)
         return self.index()
Ejemplo n.º 9
0
 def rss2_is_enabled(self):
     """
     :return: Return boolean value if rss2 type is in feed_types
     :rtype: bool
     """
     try:
         settings = IFeedSettings(self.context)
     except TypeError:
         return False
     if settings.enabled:
         current_feeds = list(settings.feed_types)
         return u'rss.xml' in current_feeds
Ejemplo n.º 10
0
 def afterSetUp(self):
     self.syndication = getToolByName(self.portal, 'portal_syndication')
     self.folder.invokeFactory('Document', 'doc1')
     self.folder.invokeFactory('Document', 'doc2')
     self.folder.invokeFactory('File', 'file')
     self.doc1 = self.folder.doc1
     self.doc2 = self.folder.doc2
     self.file = self.folder.file
     # Enable syndication on folder
     registry = getUtility(IRegistry)
     self.site_settings = registry.forInterface(ISiteSyndicationSettings)
     settings = IFeedSettings(self.folder)
     settings.enabled = True
     self.folder_settings = settings
Ejemplo n.º 11
0
def enable_rss2(context):
    """ Enable the new-style RSS2 feed #14323
    """
    portal = getToolByName(context, 'portal_url').getPortalObject()
    catalog = getToolByName(portal, 'portal_catalog')
    at_tool = getToolByName(portal, 'archetype_tool')

    logger.info('Enabling new RSS2')

    registry = getUtility(IRegistry)
    synd_settings = registry.forInterface(ISiteSyndicationSettings)

    custom_rss2 = u'RSS2|RSS 2.0 EEA'
    current_allowed = synd_settings.allowed_feed_types
    if custom_rss2 not in current_allowed:
        new_allowed = current_allowed + (custom_rss2, )
        new_allowed = tuple(unicode(x) for x in new_allowed)
        synd_settings.allowed_feed_types = new_allowed

    logger.info('Adding RSS2 to allowed views')

    folder_types = set([])
    for _type in at_tool.listPortalTypesWithInterfaces([ISyndicatable]):
        folder_types.add(_type.getId())
    folder_types = folder_types
    index = 0
    for brain in catalog(portal_type=tuple(folder_types), Language='all'):
        obj = brain.getObject()
        try:
            settings = IFeedSettings(obj)
        except TypeError:
            continue
        if settings.enabled:
            current_feeds = list(settings.feed_types)
            if u'RSS2' in current_feeds:
                continue
            new_feeds = [u'RSS2']
            current_feeds.extend(new_feeds)
            settings.feed_types = tuple(set(current_feeds))
            message = 'Enabling RSS2 for %s' % brain.getURL()
            logger.info(message)
        if index % 100 == 0:
            transaction.commit()
            logger.info('Transaction commited')
        index += 1
    logger.info('Done enable RSS2')
Ejemplo n.º 12
0
 def getRssLinks(self, obj):
     settings = IFeedSettings(obj, None)
     if settings is None:
         return []
     factory = getUtility(IVocabularyFactory,
                          "plone.app.vocabularies.SyndicationFeedTypes")
     vocabulary = factory(self.context)
     urls = []
     for typ in settings.feed_types:
         try:
             term = vocabulary.getTerm(typ)
         except LookupError:
             continue
         urls.append({
             'title': '%s - %s' % (obj.Title(), term.title),
             'url': obj.absolute_url() + '/' + term.value
         })
     return urls
Ejemplo n.º 13
0
 def afterSetUp(self):
     super(TestRenderBody, self).afterSetUp()
     self.folder.invokeFactory('News Item', 'news1')
     self.folder.invokeFactory('News Item', 'news2')
     self.news1 = self.folder.news1
     self.news1.setTitle('News 1')
     self.news1.setDescription('The news item #1')
     self.news1.setText(BODY_TEXT)
     self.news2 = self.folder.news2
     self.news2.setTitle('News 2')
     self.news2.setText(ROOTED_BODY_TEXT)
     # Enable syndication on folder
     registry = getUtility(IRegistry)
     self.site_settings = registry.forInterface(ISiteSyndicationSettings)
     settings = IFeedSettings(self.folder)
     settings.enabled = True
     settings.render_body = True
     self.folder_settings = settings
Ejemplo n.º 14
0
 def afterSetUp(self):
     self.syndication = getToolByName(self.portal, 'portal_syndication')
     self.folder.invokeFactory('Document', 'doc')
     self.folder.invokeFactory('Document', 'doc1')
     self.folder.invokeFactory('News Item', 'news1')
     self.folder.invokeFactory('News Item', 'news2')
     self.folder.invokeFactory('File', 'file')
     self.doc1 = self.folder.doc1
     self.news1 = self.folder.news1
     self.news1.setText(BODY_TEXT)
     self.news2 = self.folder.news2
     self.news2.setText(ROOTED_BODY_TEXT)
     self.file = self.folder.file
     # Enable syndication on folder
     registry = getUtility(IRegistry)
     self.site_settings = registry.forInterface(ISiteSyndicationSettings)
     settings = IFeedSettings(self.folder)
     settings.enabled = True
     self.folder_settings = settings
 def disableSyndication(self, obj):
     if not _checkPermission(ModifyPortalContent, obj):
         raise Unauthorized
     settings = IFeedSettings(obj)
     settings.enabled = False
Ejemplo n.º 16
0
 def rss_enabled(self):
     rss_settings = IFeedSettings(self.context)
     return rss_settings.enabled
Ejemplo n.º 17
0
 def context_enabled(self):
     settings = IFeedSettings(self.context, None)
     if settings and not settings.enabled:
         raise NotFound
     else:
         return True
Ejemplo n.º 18
0
def upgradeSyndication(context):
    from zope.component import getUtility, getSiteManager
    from plone.registry.interfaces import IRegistry
    from Products.CMFCore.interfaces import ISyndicationTool
    from Products.CMFPlone.interfaces.syndication import ISyndicatable
    from Products.CMFPlone.interfaces.syndication import (
        ISiteSyndicationSettings, IFeedSettings)

    portal = getToolByName(context, 'portal_url').getPortalObject()

    def getDexterityFolderTypes():
        try:
            from plone.dexterity.interfaces import IDexterityFTI
            from plone.dexterity.utils import resolveDottedName
        except ImportError:
            return set([])

        portal_types = getToolByName(portal, 'portal_types')
        types = [
            fti for fti in portal_types.listTypeInfo()
            if IDexterityFTI.providedBy(fti)
        ]

        ftypes = set([])
        for _type in types:
            klass = resolveDottedName(_type.klass)
            if ISyndicatable.implementedBy(klass):
                ftypes.add(_type.getId())
        return ftypes

    logger.info('Migrating syndication tool')
    registry = getUtility(IRegistry)
    synd_settings = registry.forInterface(ISiteSyndicationSettings)
    # default settings work fine here if all settings are not
    # available
    try:
        old_synd_tool = portal.portal_syndication
        try:
            synd_settings.allowed = old_synd_tool.isAllowed
        except AttributeError:
            pass
        try:
            synd_settings.max_items = old_synd_tool.max_items
        except AttributeError:
            pass
        portal.manage_delObjects(['portal_syndication'])
    except AttributeError:
        pass
    sm = getSiteManager()
    sm.unregisterUtility(provided=ISyndicationTool)
    # now, go through all containers and look for syndication_info
    # objects
    catalog = getToolByName(portal, 'portal_catalog')
    # get all folder types from portal_types
    at_tool = getToolByName(portal, 'archetype_tool')
    folder_types = set([])
    for _type in at_tool.listPortalTypesWithInterfaces([ISyndicatable]):
        folder_types.add(_type.getId())
    folder_types = folder_types | getDexterityFolderTypes()
    for brain in catalog(portal_type=tuple(folder_types)):
        try:
            obj = brain.getObject()
        except (AttributeError, KeyError):
            continue
        if 'syndication_information' in obj.objectIds():
            # just having syndication info object means
            # syndication is enabled
            info = obj.syndication_information
            try:
                settings = IFeedSettings(obj)
            except TypeError:
                continue
            settings.enabled = True
            try:
                settings.max_items = info.max_items
            except AttributeError:
                pass
            settings.feed_types = ('RSS', )
            obj.manage_delObjects(['syndication_information'])
Ejemplo n.º 19
0
def createEventsAndNews(portal):
    """
    Inspired by Products.CMFPlone.setuphandlers
    """
    language = portal.Language()
    wftool = getToolByName(portal, "portal_workflow")
    actu_folder = getattr(portal, "actualites")
    events_folder = getattr(portal, "evenements")
    # News topic
    if actu_folder:
        actu_folder.title = _(u"Actualités")
        actu_folder.description = _(u"Actualités du site")
        _createObjectByType(
            "Collection",
            portal.actualites,
            id="actualites",
            title=actu_folder.title,
            description=actu_folder.description,
        )

        folder = portal.actualites
        alsoProvides(folder, IFolderViewSelectedContent)
        folder.setConstrainTypesMode(constraintypes.ENABLED)
        folder.setLocallyAllowedTypes(["News Item"])
        folder.setImmediatelyAddableTypes(["News Item"])
        folder.setDefaultPage("actualites")
        folder.unmarkCreationFlag()
        folder.setLanguage(language)
        alsoProvides(folder, IFolderViewSelectedContent)
        publishContent(wftool, folder)

        topic = portal.actualites.actualites
        IFeedSettings(topic).enabled = True
        topic.setLanguage(language)

        query = [
            {
                "i": "portal_type",
                "o": "plone.app.querystring.operation.selection.is",
                "v": ["News Item"],
            },
            {
                "i": "review_state",
                "o": "plone.app.querystring.operation.selection.is",
                "v": ["published"],
            },
        ]
        topic.setQuery(query)

        topic.setSort_on("effective")
        topic.setSort_reversed(True)
        topic.setLayout("summary_view")
        topic.unmarkCreationFlag()
        publishContent(wftool, topic)

    # Events topic
    if events_folder:
        events_folder.title = _(u"Événements")
        events_folder.description = _(u"Événements du site")
        _createObjectByType(
            "Collection",
            portal.evenements,
            id="evenements",
            title=events_folder.title,
            description=events_folder.description,
        )

        folder = portal.evenements
        alsoProvides(folder, IFolderViewSelectedContent)
        folder.setConstrainTypesMode(constraintypes.ENABLED)
        folder.setLocallyAllowedTypes(["Event"])
        folder.setImmediatelyAddableTypes(["Event"])
        folder.setDefaultPage("evenements")
        folder.unmarkCreationFlag()
        folder.setLanguage(language)
        publishContent(wftool, folder)

        topic = folder.evenements
        IFeedSettings(topic).enabled = True
        topic.unmarkCreationFlag()
        topic.setLanguage(language)

        query = [
            {
                "i": "portal_type",
                "o": "plone.app.querystring.operation.selection.is",
                "v": ["Event"],
            },
            {
                "i": "start",
                "o": "plone.app.querystring.operation.date.afterToday",
                "v": "",
            },
            {
                "i": "review_state",
                "o": "plone.app.querystring.operation.selection.is",
                "v": ["published"],
            },
        ]
        topic.setQuery(query)
        topic.setSort_on("start")
        topic.setLayout("summary_view")
        publishContent(wftool, topic)