def execute(context, event):
    """ Execute all rules relative to the context, and bubble as appropriate.
        #134252 patch content rules engine to go beyond site folder.
    """
    # Do nothing if there is no rule storage or it is not active
    storage = queryUtility(IRuleStorage)
    if storage is None or not storage.active:
        return
    init()

    rule_filter = _status.rule_filter

    # Stop if someone else is already executing. This could happen if,
    # for example, a rule triggered here caused another event to be fired.
    # We continue if we are in the context of a 'cascading' rule.

    if rule_filter.in_progress and not rule_filter.cascade:
        return

    # Tell other event handlers to be equally kind
    rule_filter.in_progress = True

    # Prepare to break hard if a rule demanded execution be stopped
    try:

        # Try to execute rules in the context. It may not work if the context
        # is not a rule executor, but we may still want to bubble events
        executor = IRuleExecutor(context, None)
        if executor is not None:
            executor(event, bubbled=False, rule_filter=rule_filter)

        # Do not bubble beyond the site root
        is_site = context.id == 'SITE'
        if not ISiteRoot.providedBy(context) or is_site:
            parent = aq_parent(aq_inner(context))
            while parent is not None:
                parent_is_site = parent.id == 'SITE'
                executor = IRuleExecutor(parent, None)
                if executor is not None:
                    executor(event, bubbled=True, rule_filter=rule_filter)
                # 134252 set parent to none only if parent id != SITE
                if ISiteRoot.providedBy(parent) and not parent_is_site:
                    parent = None
                else:
                    parent = aq_parent(aq_inner(parent))

    except StopRule:
        pass

    # We are done - other events that occur after this one will be allowed to
    # execute rules again
    rule_filter.in_progress = False
Example #2
0
    def _createFolderStructure(self, folder, structure='ymd', date=None):
        """ Create a folder structure and then return our innermost folder
        """
        if not date:
            date = DateTime()

        dateFormat = structure

        date = date.strftime(dateFormat)

        folderStructure = [str(p) for p in date.split('/')]

        container = self.element.container
        language = folder.Language()
        # We run IRuleExecutor here to make sure other rules will be
        # executed for the newly created folders
        executor = IRuleExecutor(self.context, None)
        for fId in folderStructure:
            if not fId in folder.objectIds():
                _createObjectByType(container,
                                    folder,
                                    id=fId,
                                    title=fId,
                                    description=fId)
                folder = folder[fId]
                # this makes happy multilang sites
                folder.setLanguage(language)
                event = ObjectAddedEvent(folder, aq_parent(folder), fId)
                if executor is not None:
                    executor(event)
            else:
                folder = folder[fId]
        return folder
Example #3
0
    def _createFolderStructure(self, folder, structure='ymd', date=None):
        """ Create a folder structure and then return our innermost folder
        """
        if not date:
            date = DateTime()

        dateFormat = structure

        if '%B' in dateFormat:
            translation = getToolByName(self.context, 'translation_service')
            PLMF = MessageFactory('plonelocales')
            dateFormat = dateFormat.replace('%B', '%m')
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]
            index = dateFormat.split('/').index('%m')
            month_msgid = PLMF(translation.month_msgid(folderStructure[index]))
            try:
                target_language = i18n.negotiate(self.context.REQUEST)
            except:
                target_language = None
            transale_month = translate(month_msgid,
                                       target_language=target_language)
            folderStructure[index] = transale_month
        else:
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]

        container = self.element.container
        language = folder.Language()
        normalizer = getUtility(IIDNormalizer)

        portal_workflow = getToolByName(self.context, 'portal_workflow')
        pw = portal_workflow.doActionFor

        # We run IRuleExecutor here to make sure other rules will be
        # executed for the newly created folders
        executor = IRuleExecutor(self.context, None)
        for fId in folderStructure:
            fTitle = fId
            fId = normalizer.normalize(fId)
            if not fId in folder.objectIds():
                _createObjectByType(container,
                                    folder,
                                    id=normalizer.normalize(fId),
                                    title=fTitle,
                                    description=fTitle)
                folder = folder[fId]
                pw(folder, 'publish')
                # this makes happy multilang sites
                folder.setLanguage(language)
                event = ObjectAddedEvent(folder, aq_parent(folder), fId)
                if executor is not None:
                    executor(event)
            else:
                folder = folder[fId]
        return folder