def _assignContentRules(self, rule_id, f, langs): log.info("_assignContentRules") for lang, dummy in langs: parents = [ '%s/campaigns/ew2006/' % lang, '%s/campaigns/ew2007/' % lang, '%s/campaigns/hw2008/' % lang, '%s/campaigns/hwi/' % lang, '%s/good_practice/' % lang, '%s/oshnetwork/member-states/' % lang, '%s/topics/business/' % lang, '%s/riskobservatory/' % lang, ] storage = component.queryUtility(IRuleStorage) rule = storage.get(rule_id) portal_obj = self.portal_url.getPortalObject() for p in parents: try: parent = portal_obj.unrestrictedTraverse(p) except: log.info("Couldn't find folder %s for adding content rule %s \n" % (parent.absolute_url(), rule_id)) f.write("Couldn't find folder %s for adding content rule %s \n" % (parent.absolute_url(), rule_id)) continue # XXX DOUBLE CHECK!!!! assignments = IRuleAssignmentManager(parent, None) get_assignments(storage[rule_id]).insert('/'.join(parent.getPhysicalPath())) rule_ass = RuleAssignment(ruleid=rule_id, enabled=True, bubbles=True) assignments[rule_id] = rule_ass f.write("Content Rule '%s' assigned to %s \n" % (rule_id, parent.absolute_url())) log.info("Content Rule '%s' assigned to %s \n" % (rule_id, parent.absolute_url()))
def testContainerRemoved(self): f12path = "/".join(self.folder.f1.f12.getPhysicalPath()) self.failUnless(f12path in get_assignments(self.storage["r1"])) self.failUnless(f12path in get_assignments(self.storage["r2"])) transaction.savepoint(1) self.folder._delObject("f1") self.failIf(f12path in get_assignments(self.storage["r1"])) self.failIf(f12path in get_assignments(self.storage["r2"]))
def _activate_rule(rule_id, context=None): storage = component.getUtility(IRuleStorage) rule = storage.get(rule_id) assignable = IRuleAssignmentManager(context) assignment = assignable.get(rule_id, None) if not assignment: assignment = assignable[rule_id] = RuleAssignment(rule_id) assignment.enabled = True assignment.bubbles = True get_assignments(rule).insert('/'.join(context.getPhysicalPath()))
def testContainerRemoved(self): f12path = '/'.join(self.folder.f1.f12.getPhysicalPath()) self.assertTrue(f12path in get_assignments(self.storage['r1'])) self.assertTrue(f12path in get_assignments(self.storage['r2'])) transaction.savepoint(1) self.folder._delObject('f1') self.assertFalse(f12path in get_assignments(self.storage['r1'])) self.assertFalse(f12path in get_assignments(self.storage['r2']))
def unassign_rule(container, rule_id): """Remove @param string rule_id rule from @param object container """ assignable = IRuleAssignmentManager(container) storage = queryUtility(IRuleStorage) path = '/'.join(container.getPhysicalPath()) del assignable[rule_id] get_assignments(storage[rule_id]).remove(path)
def unassign_rule(container, rule_id): """Remove @param string rule_id rule from @param object container """ assignable = IRuleAssignmentManager(container) storage = queryUtility(IRuleStorage) path = '/'.join(container.getPhysicalPath()) del assignable[rule_id] get_assignments(storage[rule_id]).remove(path)
def globally_assign(self): self.authorize() portal = getToolByName(self.context, 'portal_url').getPortalObject() path = '/'.join(portal.getPhysicalPath()) get_assignments(self.context).insert(path) assignable = IRuleAssignmentManager(portal) rule_id = self.context.__name__ assignable[rule_id] = RuleAssignment(rule_id) assignment = assignable[rule_id] assignment.enabled = True assignment.bubbles = True
def createRule(self, context, rule_context, rule_id, rule_title, rule_description, rule_event, message, subject, for_types=None, area_id=None): """ Enabled types are taken from the Plone registry, or you can manually set them using for_types Id of the area (used for getting the notification group) is taken from current area, or by area_id param """ registry = queryUtility(IRegistry) settings = registry.forInterface(IGroupwareNotifySettings, check=False) #create the rule rule = Rule() rule.__name__ = rule_id rule.event = rule_event rule.title = rule_title rule.description = rule_description #add the rule to rule's storage storage = getUtility(IRuleStorage) # chooser = INameChooser(storage) if rule_id not in storage.keys(): storage[rule_id] = rule #set the action and add it to the rule action = MailForGroupwareNotificationAction(area_id) if settings and settings.default_email_sender: action.source = settings.default_email_sender action.sender = None action.subject = subject action.message = message rule.actions.append(action) if not for_types: #set the condition and add it to the rule if settings: behavior = ISelectableConstrainTypes(rule_context) allowed_types = behavior.getLocallyAllowedTypes() types_list = set(allowed_types).difference(settings.black_list) condition = PortalTypeCondition() condition.check_types=tuple(types_list) rule.conditions.append(condition) else: # explicit types condition=PortalTypeCondition() condition.check_types=tuple(for_types) rule.conditions.append(condition) logger.info('Created rule %s' % rule_id) #assignment rule_id=rule.id.replace('++rule++','') assignable = IRuleAssignmentManager(rule_context) assignable[rule_id] = RuleAssignment(rule_id) assignable[rule_id].bubbles=True get_assignments(storage[rule_id]).insert('/'.join(rule_context.getPhysicalPath())) logger.info('Enabled rule %s on %s' % (rule_id, rule_context.Title().decode('utf-8')))
def assignments(self): rule = aq_inner(self.context) paths = set(get_assignments(rule)) site = getToolByName(rule, "portal_url").getPortalObject() site_path = '/'.join(site.getPhysicalPath()) plone_view = getMultiAdapter((rule, self.request), name="plone") info = [] if site_path in paths: paths.remove(site_path) info.append({ 'url': site.absolute_url(), 'title': site.title_or_id(), 'description': site.Description(), 'icon': plone_view.getIcon(site)}) catalog = getToolByName(rule, "portal_catalog") for a in catalog(path=dict(query=list(paths), depth=0), sort_on='sortable_title'): info.append({ 'url': a.getURL(), 'title': a.Title or a.getId, 'description': a.Description, 'icon': plone_view.getIcon(a)}) return info
def assignments(self): rule = aq_inner(self.context) paths = set(get_assignments(rule)) site = getToolByName(rule, "portal_url").getPortalObject() site_path = '/'.join(site.getPhysicalPath()) plone_view = getMultiAdapter((rule, self.request), name="plone") info = [] if site_path in paths: paths.remove(site_path) info.append({ 'url': site.absolute_url(), 'title': site.Title(), 'description': site.Description(), 'icon': plone_view.getIcon(site), }) catalog = getToolByName(rule, "portal_catalog") for a in catalog(path=dict(query=list(paths), depth=0), sort_on='sortable_title'): info.append({ 'url': a.getURL(), 'title': a.Title, 'description': a.Description, 'icon': plone_view.getIcon(a), }) return info
def registeredRules(self): rules = self._getRules() events = dict([(e.value, e.token) for e in self._events()]) info = [] for r in rules: trigger_class = get_trigger_class(r.event) enabled_class = r.enabled and 'state-enabled' or 'state-disabled' assigned = len(get_assignments(r)) > 0 assigned_class = assigned and 'assignment-assigned' or 'assignment-unassigned' info.append({ 'id': r.__name__, 'title': r.title, 'description': r.description, 'enabled': r.enabled, 'assigned': assigned, 'trigger': events[r.event], 'row_class': "%s %s %s" % (trigger_class, enabled_class, assigned_class) }) return info
def registeredRules(self): rules = self._getRules() events = dict([(e.value, e.token) for e in self._events()]) info = [] for r in rules: trigger_class = get_trigger_class(r.event) enabled_class = r.enabled and 'state-enabled' or 'state-disabled' assigned = len(get_assignments(r)) > 0 assigned_class = 'assignment-unassigned' if assigned: assigned_class = 'assignment-assigned' info.append({ 'id': r.__name__, 'title': r.title, 'description': r.description, 'enabled': r.enabled, 'assigned': assigned, 'trigger': events[r.event], 'row_class': '{0} {1} {2}'.format( trigger_class, enabled_class, assigned_class, ) }) return info
def __call__(self): """ """ request = aq_inner(self.request) form = request.form if not 'form.button.Delete' in form: return super(PatchedManageAssignments, self).__call__() context = aq_inner(self.context) assignable = IRuleAssignmentManager(context) storage = getUtility(IRuleStorage) status = IStatusMessage(self.request) rule_ids = form.get('rule_ids', ()) path = '/'.join(context.getPhysicalPath()) for r in rule_ids: del assignable[r] assignments = get_assignments(storage[r]) if path in assignments: msg = 'Try to remove from %r' % ( assignments ) logger.info(msg) try: assignments.remove(path, None) except: assignments.remove(path) status.addStatusMessage(_(u"Assignments deleted."), type='info') return self.template()
def assignContentRulesToContainer(container, storage, bubbles): '''Assign the standard EDRN content events to the given container.''' assignmentManager = IRuleAssignmentManager(container, None) if assignmentManager is None: # This container doesn't support content rules, so skip it. return for eventName in _edrnContentEvents: assignment = assignmentManager.get(eventName, None) if assignment is None: # Brand new assignment assignment = assignmentManager[eventName] = RuleAssignment(eventName) if not assignment.enabled: assignment.enabled = True if assignment.bubbles != bubbles: assignment.bubbles = bubbles path = '/'.join(container.getPhysicalPath()) get_assignments(storage[eventName]).insert(path)
def on_create(obj, event): """ temporary disabled """ storage = getUtility(IRuleStorage) assignable = IRuleAssignmentManager(obj) for rule_id in [ "booking-accepted", "booking-moved", "booking-created-user", "booking-refuse", ]: assignable[rule_id] = RuleAssignment(rule_id) assignable[rule_id].bubbles = True get_assignments(storage[rule_id]).insert("/".join( obj.getPhysicalPath()))
def assignContentRulesToContainer(container, storage, bubbles): '''Assign the standard EDRN content events to the given container.''' assignmentManager = IRuleAssignmentManager(container, None) if assignmentManager is None: # This container doesn't support content rules, so skip it. return for eventName in _edrnContentEvents: assignment = assignmentManager.get(eventName, None) if assignment is None: # Brand new assignment assignment = assignmentManager[eventName] = RuleAssignment( eventName) if not assignment.enabled: assignment.enabled = True if assignment.bubbles != bubbles: assignment.bubbles = bubbles path = '/'.join(container.getPhysicalPath()) get_assignments(storage[eventName]).insert(path)
def apply_rule(folder, event): """ Apply content rule to execute a transition from new to pending """ name = "rule-transition-registration" storage = getUtility(IRuleStorage) # Assignment assignable = IRuleAssignmentManager(folder, None) if assignable is None: return assignment = assignable.get(name, None) if assignment is None: assignment = assignable[name] = RuleAssignment(name) assignment.enabled = True assignment.bubbles = False path = "/".join(folder.getPhysicalPath()) get_assignments(storage[name]).insert(path)
def setup_contentrules_registration(registrations): assignable = IRuleAssignmentManager(registrations, None) if assignable is None: return None storage = getUtility(IRuleStorage) path = '/'.join(registrations.getPhysicalPath()) names = [ 'registration-rule-transition', 'registration-new', 'registration-confirmed', ] for name in names: assignment = assignable.get(name, None) if assignment is None: assignment = assignable[name] = RuleAssignment(name) assignment.enabled = True assignment.bubbles = True get_assignments(storage[name]).insert(path)
def setup_contentrules_program(program): assignable = IRuleAssignmentManager(program, None) if assignable is None: return None storage = getUtility(IRuleStorage) path = '/'.join(program.getPhysicalPath()) names = [ 'talk-submited', 'talk-accepted', 'training-submited', 'training-accepted', ] for name in names: assignment = assignable.get(name, None) if assignment is None: assignment = assignable[name] = RuleAssignment(name) assignment.enabled = True assignment.bubbles = True get_assignments(storage[name]).insert(path)
def _assignContentRules(self, rule_id, f, langs): log.info("_assignContentRules") for lang, dummy in langs: parents = [ '%s/campaigns/ew2006/' % lang, '%s/campaigns/ew2007/' % lang, '%s/campaigns/hw2008/' % lang, '%s/campaigns/hwi/' % lang, '%s/good_practice/' % lang, '%s/oshnetwork/member-states/' % lang, '%s/topics/business/' % lang, '%s/riskobservatory/' % lang, ] storage = component.queryUtility(IRuleStorage) rule = storage.get(rule_id) portal_obj = self.portal_url.getPortalObject() for p in parents: try: parent = portal_obj.unrestrictedTraverse(p) except: log.info( "Couldn't find folder %s for adding content rule %s \n" % (parent.absolute_url(), rule_id)) f.write( "Couldn't find folder %s for adding content rule %s \n" % (parent.absolute_url(), rule_id)) continue # XXX DOUBLE CHECK!!!! assignments = IRuleAssignmentManager(parent, None) get_assignments(storage[rule_id]).insert('/'.join( parent.getPhysicalPath())) rule_ass = RuleAssignment(ruleid=rule_id, enabled=True, bubbles=True) assignments[rule_id] = rule_ass f.write("Content Rule '%s' assigned to %s \n" % (rule_id, parent.absolute_url())) log.info("Content Rule '%s' assigned to %s \n" % (rule_id, parent.absolute_url()))
def addContentRules(obj, event): '''For newly-created groups, add content rules to handle notifications and an index page.''' if not IGroupSpace.providedBy(obj): return factory = getToolByName(obj, 'portal_factory') if factory.isTemporary(obj): return # First, the index if obj.Title(): if 'index_html' not in obj.keys(): index = obj[obj.invokeFactory(obj.getIndexPortalType(), 'index_html')] else: index = obj['index_html'] index.setTitle(obj.title) index.setDescription(obj.description) index.reindexObject() obj.setDefaultPage('index_html') # Now the content rules assignable, storage, path = IRuleAssignmentManager(obj), getUtility(IRuleStorage), '/'.join(obj.getPhysicalPath()) for ruleName in ('gs-add-event', 'gs-mod-event', 'gs-pub-event'): if ruleName not in assignable and ruleName in storage: assignable[ruleName] = RuleAssignment(ruleName) get_assignments(storage[ruleName]).insert(path)
def assign_rule(container, rule_id, enabled=True, bubbles=True, insert_before=None): """Assign @param string rule_id rule to @param object container with options @param bool enabled @param bool bubbles (apply in subfolders) @param string insert-before """ storage = queryUtility(IRuleStorage) if storage is None: return assignable = IRuleAssignmentManager(container, None) if assignable is None: return assignment = assignable.get(rule_id, None) if assignment is None: assignable[rule_id] = RuleAssignment(rule_id) assignable[rule_id].enabled = bool(enabled) assignable[rule_id].bubbles = bool(bubbles) path = '/'.join(container.getPhysicalPath()) get_assignments(storage[rule_id]).insert(path) if insert_before: position = None keys = list(assignable.keys()) if insert_before == "*": position = 0 elif insert_before in keys: position = keys.index(insert_before) if position is not None: keys.remove(rule_id) keys.insert(position, rule_id) assignable.updateOrder(keys)
def activate(self): """ 1) make sure condition is enabled for transition 2) enable at root and bubble to item below """ c = WorkflowTransitionCondition() c.wf_transitions = [self.transition.id] self.rule.conditions = [c] self.rule.event = IActionSucceededEvent assignable = IRuleAssignmentManager(self.portal) path = '/'.join(self.portal.getPhysicalPath()) assignable[self.rule.__name__] = RuleAssignment(self.rule.id, enabled=True, bubbles=True) assignments = get_assignments(self.rule) if not path in assignments: assignments.insert(path)
def activate(self): """ 1) make sure condition is enabled for transition 2) enable at root and bubble to item below """ c = WorkflowTransitionCondition() c.wf_transitions = [self.transition.id] self.rule.conditions = [c] self.rule.event = IActionSucceededEvent assignable = IRuleAssignmentManager(self.portal) path = '/'.join(self.portal.getPhysicalPath()) assignable[self.rule.__name__] = RuleAssignment(self.rule.id, enabled=True, bubbles=True) assignments = get_assignments(self.rule) if not path in assignments: assignments.insert(path)
def testParentOfContainerMoved(self): f12path = '/'.join(self.folder.f1.f12.getPhysicalPath()) self.assertTrue(f12path in get_assignments(self.storage['r1'])) self.assertTrue(f12path in get_assignments(self.storage['r2'])) transaction.savepoint(1) self.folder.manage_renameObject('f1', 'f1a') f12apath = '/'.join(self.folder.f1a.f12.getPhysicalPath()) self.assertFalse(f12path in get_assignments(self.storage['r1'])) self.assertFalse(f12path in get_assignments(self.storage['r2'])) self.assertTrue(f12apath in get_assignments(self.storage['r1'])) self.assertTrue(f12apath in get_assignments(self.storage['r1']))
def testParentOfContainerMoved(self): f12path = "/".join(self.folder.f1.f12.getPhysicalPath()) self.failUnless(f12path in get_assignments(self.storage["r1"])) self.failUnless(f12path in get_assignments(self.storage["r2"])) transaction.savepoint(1) self.folder.manage_renameObject("f1", "f1a") f12apath = "/".join(self.folder.f1a.f12.getPhysicalPath()) self.failIf(f12path in get_assignments(self.storage["r1"])) self.failIf(f12path in get_assignments(self.storage["r2"])) self.failUnless(f12apath in get_assignments(self.storage["r1"])) self.failUnless(f12apath in get_assignments(self.storage["r1"]))
def testContainerMoved(self): f12path = '/'.join(self.folder.f1.f12.getPhysicalPath()) self.failUnless(f12path in get_assignments(self.storage['r1'])) self.failUnless(f12path in get_assignments(self.storage['r2'])) transaction.savepoint(1) self.folder.f1.manage_renameObject('f12', 'f12a') f12apath = '/'.join(self.folder.f1.f12a.getPhysicalPath()) self.failIf(f12path in get_assignments(self.storage['r1'])) self.failIf(f12path in get_assignments(self.storage['r2'])) self.failUnless(f12apath in get_assignments(self.storage['r1'])) self.failUnless(f12apath in get_assignments(self.storage['r1']))
def registeredRules(self): rules = self._getRules() events = dict([(e.value, e.token) for e in self._events()]) info = [] for r in rules: trigger_class = get_trigger_class(r.event) enabled_class = r.enabled and "state-enabled" or "state-disabled" assigned = len(get_assignments(r)) > 0 assigned_class = assigned and "assignment-assigned" or "assignment-unassigned" info.append( { "id": r.__name__, "title": r.title, "description": r.description, "enabled": r.enabled, "assigned": assigned, "trigger": events[r.event], "row_class": "%s %s %s" % (trigger_class, enabled_class, assigned_class), } ) return info
def afterSetUp(self): self.folder.invokeFactory("Folder", "f1") self.folder.f1.invokeFactory("Folder", "f11") self.folder.f1.invokeFactory("Folder", "f12") self.storage = getUtility(IRuleStorage) self.storage["r1"] = Rule() self.storage["r2"] = Rule() self.f11a = IRuleAssignmentManager(self.folder.f1.f11) self.f11a["r1"] = RuleAssignment("r1") get_assignments(self.storage["r1"]).insert("/".join(self.folder.f1.f11.getPhysicalPath())) self.f12a = IRuleAssignmentManager(self.folder.f1.f12) self.f12a["r1"] = RuleAssignment("r1") get_assignments(self.storage["r1"]).insert("/".join(self.folder.f1.f12.getPhysicalPath())) self.f12a["r2"] = RuleAssignment("r2") get_assignments(self.storage["r2"]).insert("/".join(self.folder.f1.f12.getPhysicalPath()))
def afterSetUp(self): self.folder.invokeFactory('Folder', 'f1') self.folder.f1.invokeFactory('Folder', 'f11') self.folder.f1.invokeFactory('Folder', 'f12') self.storage = getUtility(IRuleStorage) self.storage['r1'] = Rule() self.storage['r2'] = Rule() self.f11a = IRuleAssignmentManager(self.folder.f1.f11) self.f11a['r1'] = RuleAssignment('r1') get_assignments(self.storage['r1']).insert('/'.join(self.folder.f1.f11.getPhysicalPath())) self.f12a = IRuleAssignmentManager(self.folder.f1.f12) self.f12a['r1'] = RuleAssignment('r1') get_assignments(self.storage['r1']).insert('/'.join(self.folder.f1.f12.getPhysicalPath())) self.f12a['r2'] = RuleAssignment('r2') get_assignments(self.storage['r2']).insert('/'.join(self.folder.f1.f12.getPhysicalPath()))
def afterSetUp(self): self.folder.invokeFactory('Folder', 'f1') self.folder.f1.invokeFactory('Folder', 'f11') self.folder.f1.invokeFactory('Folder', 'f12') self.storage = getUtility(IRuleStorage) self.storage['r1'] = Rule() self.storage['r2'] = Rule() self.storage['r3'] = Rule() self.f11a = IRuleAssignmentManager(self.folder.f1.f11) self.f11a['r1'] = RuleAssignment('r1', bubbles=True) get_assignments(self.storage['r1']).insert('/'.join(self.folder.f1.f11.getPhysicalPath())) self.f12a = IRuleAssignmentManager(self.folder.f1.f12) self.f12a['r1'] = RuleAssignment('r1', bubbles=True) get_assignments(self.storage['r1']).insert('/'.join(self.folder.f1.f12.getPhysicalPath())) self.f12a['r2'] = RuleAssignment('r2', bubbles=True) get_assignments(self.storage['r2']).insert('/'.join(self.folder.f1.f12.getPhysicalPath()))
def _extractRules(self): """Extract rules to a document fragment """ site = self.environ.getSite() storage = queryUtility(IRuleStorage) if storage is None: return fragment = self._doc.createDocumentFragment() assignment_paths = set() for name, rule in storage.items(): rule_node = self._doc.createElement('rule') rule_node.setAttribute('name', name) rule_node.setAttribute('title', rule.title) rule_node.setAttribute('description', rule.description) rule_node.setAttribute('event', _getDottedName(rule.event)) rule_node.setAttribute('enabled', str(rule.enabled)) rule_node.setAttribute('stop-after', str(rule.stop)) rule_node.setAttribute('cascading', str(rule.cascading)) # Aq-wrap so that exporting fields with clever getters or # vocabularies will work. We also aq-wrap conditions and # actions below. rule = rule.__of__(site) # Add conditions conditions_node = self._doc.createElement('conditions') for condition in rule.conditions: condition_data = IRuleElementData(condition) condition = condition.__of__(rule) condition_node = self._doc.createElement('condition') condition_node.setAttribute('type', condition_data.element) handler = IRuleElementExportImportHandler(condition) handler.export_element(self._doc, condition_node) conditions_node.appendChild(condition_node) rule_node.appendChild(conditions_node) # Add actions actions_node = self._doc.createElement('actions') for action in rule.actions: action_data = IRuleElementData(action) action = action.__of__(rule) action_node = self._doc.createElement('action') action_node.setAttribute('type', action_data.element) handler = IRuleElementExportImportHandler(action) handler.export_element(self._doc, action_node) actions_node.appendChild(action_node) rule_node.appendChild(actions_node) fragment.appendChild(rule_node) assignment_paths.update(get_assignments(rule)) # Export assignments last - this is necessary to ensure they # are orderd properly site_path_length = len('/'.join(site.getPhysicalPath())) for path in assignment_paths: try: container = site.unrestrictedTraverse(path) except KeyError: continue assignable = IRuleAssignmentManager(container, None) if assignable is None: continue location = path[site_path_length:] for name, assignment in assignable.items(): assignment_node = self._doc.createElement('assignment') assignment_node.setAttribute('location', location) assignment_node.setAttribute('name', name) assignment_node.setAttribute('enabled', str(assignment.enabled)) assignment_node.setAttribute('bubbles', str(assignment.bubbles)) fragment.appendChild(assignment_node) return fragment
def __call__(self): context = aq_inner(self.context) request = aq_inner(self.request) form = request.form path = '/'.join(context.getPhysicalPath()) status = IStatusMessage(self.request) assignable = IRuleAssignmentManager(context) storage = getUtility(IRuleStorage) operation = request.get('operation', None) if operation == 'move_up': rule_id = request.get('rule_id') keys = list(assignable.keys()) idx = keys.index(rule_id) del keys[idx] keys.insert(idx - 1, rule_id) assignable.updateOrder(keys) elif operation == 'move_down': rule_id = request.get('rule_id') keys = list(assignable.keys()) idx = keys.index(rule_id) del keys[idx] keys.insert(idx + 1, rule_id) assignable.updateOrder(keys) elif 'form.button.AddAssignment' in form: rule_id = form.get('rule_id') assignable[rule_id] = RuleAssignment(rule_id) get_assignments(storage[rule_id]).insert(path) elif 'form.button.Delete' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: del assignable[r] get_assignments(storage[r]).remove(path) status.addStatusMessage(_(u"Assignments deleted."), type='info') elif 'form.button.Enable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.enabled = True status.addStatusMessage(_(u"Assignments enabled."), type='info') elif 'form.button.Disable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.enabled = False status.addStatusMessage(_(u"Assignments disabled."), type='info') elif 'form.button.Bubble' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.bubbles = True status.addStatusMessage(_(u"Changes saved."), type='info') elif 'form.button.NoBubble' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.bubbles = False status.addStatusMessage(_(u"Changes saved."), type='info') return self.template()
def __call__(self): context = aq_inner(self.context) request = aq_inner(self.request) form = request.form path = '/'.join(context.getPhysicalPath()) status = IStatusMessage(self.request) assignable = IRuleAssignmentManager(context) storage = getUtility(IRuleStorage) operation = request.get('operation', None) if operation == 'move_up': rule_id = request.get('rule_id') keys = list(assignable.keys()) idx = keys.index(rule_id) del keys[idx] keys.insert(idx-1, rule_id) assignable.updateOrder(keys) elif operation == 'move_down': rule_id = request.get('rule_id') keys = list(assignable.keys()) idx = keys.index(rule_id) del keys[idx] keys.insert(idx+1, rule_id) assignable.updateOrder(keys) elif 'form.button.AddAssignment' in form: rule_id = form.get('rule_id') assignable[rule_id] = RuleAssignment(rule_id) get_assignments(storage[rule_id]).insert(path) elif 'form.button.Delete' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: del assignable[r] get_assignments(storage[r]).remove(path) status.addStatusMessage(_(u"Assignments deleted."), type='info') elif 'form.button.Enable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.enabled = True status.addStatusMessage(_(u"Assignments enabled."), type='info') elif 'form.button.Disable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.enabled = False status.addStatusMessage(_(u"Assignments disabled."), type='info') elif 'form.button.Bubble' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.bubbles = True status.addStatusMessage(_(u"Changes saved."), type='info') elif 'form.button.NoBubble' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: assignment = assignable.get(r, None) if assignment is not None: assignment.bubbles = False status.addStatusMessage(_(u"Changes saved."), type='info') return self.template()
def _initRules(self, node): """Import rules from the given node """ site = self.environ.getSite() storage = queryUtility(IRuleStorage) if storage is None: return for child in node.childNodes: if child.nodeName == 'rule': rule = None name = child.getAttribute('name') if name: rule = storage.get(name, None) if rule is None: rule = Rule() if not name: chooser = INameChooser(storage) name = chooser.chooseName(None, rule) storage[name] = rule else: # Clear out conditions and actions since we're expecting new ones del rule.conditions[:] del rule.actions[:] rule.title = child.getAttribute('title') rule.description = child.getAttribute('description') event_name = child.getAttribute('event') rule.event = _resolveDottedName(event_name) if not rule.event: raise ImportError("Can not import %s" % event_name) rule.enabled = as_bool(child.getAttribute('enabled'), True) rule.stop = as_bool(child.getAttribute('stop-after')) # Aq-wrap to enable complex setters for elements below # to work rule = rule.__of__(site) for rule_config_node in child.childNodes: if rule_config_node.nodeName == 'conditions': for condition_node in rule_config_node.childNodes: if not condition_node.nodeName == 'condition': continue type_ = condition_node.getAttribute('type') element_type = getUtility(IRuleCondition, name=type_) if element_type.factory is None: continue condition = element_type.factory() # Aq-wrap in case of complex setters condition = condition.__of__(rule) handler = IRuleElementExportImportHandler( condition) handler.import_element(condition_node) rule.conditions.append(aq_base(condition)) elif rule_config_node.nodeName == 'actions': for action_node in rule_config_node.childNodes: if not action_node.nodeName == 'action': continue type_ = action_node.getAttribute('type') element_type = getUtility(IRuleAction, name=type_) if element_type.factory is None: continue action = element_type.factory() # Aq-wrap in case of complex setters action = action.__of__(rule) handler = IRuleElementExportImportHandler(action) handler.import_element(action_node) rule.actions.append(aq_base(action)) elif child.nodeName == 'assignment': location = child.getAttribute('location') if location.startswith("/"): location = location[1:] try: container = site.unrestrictedTraverse(str(location)) except KeyError: continue assignable = IRuleAssignmentManager(container, None) if assignable is None: continue name = child.getAttribute('name') assignment = assignable.get(name, None) if assignment is None: assignment = assignable[name] = RuleAssignment(name) assignment.enabled = as_bool(child.getAttribute('enabled')) assignment.bubbles = as_bool(child.getAttribute('bubbles')) insert_before = child.getAttribute('insert-before') if insert_before: position = None keys = list(assignable.keys()) if insert_before == "*": position = 0 elif insert_before in keys: position = keys.index(insert_before) if position is not None: keys.remove(name) keys.insert(position, name) assignable.updateOrder(keys) path = '/'.join(container.getPhysicalPath()) get_assignments(storage[name]).insert(path)
def _initRules(self, node): """Import rules from the given node """ site = self.environ.getSite() storage = queryUtility(IRuleStorage) if storage is None: return for child in node.childNodes: if child.nodeName == 'rule': rule = None name = child.getAttribute('name') if name: rule = storage.get(name, None) if rule is None: rule = Rule() if not name: chooser = INameChooser(storage) name = chooser.chooseName(None, rule) storage[name] = rule else: # Clear out conditions and actions since we're expecting new ones del rule.conditions[:] del rule.actions[:] rule.title = child.getAttribute('title') rule.description = child.getAttribute('description') event_name = child.getAttribute('event') rule.event = _resolveDottedName(event_name) if not rule.event: raise ImportError("Can not import %s" % event_name) rule.enabled = as_bool(child.getAttribute('enabled'), True) rule.stop = as_bool(child.getAttribute('stop-after')) # Aq-wrap to enable complex setters for elements below # to work rule = rule.__of__(site) for rule_config_node in child.childNodes: if rule_config_node.nodeName == 'conditions': for condition_node in rule_config_node.childNodes: if not condition_node.nodeName == 'condition': continue type_ = condition_node.getAttribute('type') element_type = getUtility(IRuleCondition, name=type_) if element_type.factory is None: continue condition = element_type.factory() # Aq-wrap in case of complex setters condition = condition.__of__(rule) handler = IRuleElementExportImportHandler(condition) handler.import_element(condition_node) rule.conditions.append(aq_base(condition)) elif rule_config_node.nodeName == 'actions': for action_node in rule_config_node.childNodes: if not action_node.nodeName == 'action': continue type_ = action_node.getAttribute('type') element_type = getUtility(IRuleAction, name=type_) if element_type.factory is None: continue action = element_type.factory() # Aq-wrap in case of complex setters action = action.__of__(rule) handler = IRuleElementExportImportHandler(action) handler.import_element(action_node) rule.actions.append(aq_base(action)) elif child.nodeName == 'assignment': location = child.getAttribute('location') if location.startswith("/"): location = location[1:] try: container = site.unrestrictedTraverse(str(location)) except KeyError: continue assignable = IRuleAssignmentManager(container, None) if assignable is None: continue name = child.getAttribute('name') assignment = assignable.get(name, None) if assignment is None: assignment = assignable[name] = RuleAssignment(name) assignment.enabled = as_bool(child.getAttribute('enabled')) assignment.bubbles = as_bool(child.getAttribute('bubbles')) insert_before = child.getAttribute('insert-before') if insert_before: position = None keys = list(assignable.keys()) if insert_before == "*": position = 0 elif insert_before in keys: position = keys.index(insert_before) if position is not None: keys.remove(name) keys.insert(position, name) assignable.updateOrder(keys) path = '/'.join(container.getPhysicalPath()) get_assignments(storage[name]).insert(path)
def _extractRules(self): """Extract rules to a document fragment """ site = self.environ.getSite() storage = queryUtility(IRuleStorage) if storage is None: return fragment = self._doc.createDocumentFragment() assignment_paths = set() for name, rule in storage.items(): rule_node = self._doc.createElement('rule') rule_node.setAttribute('name', name) rule_node.setAttribute('title', rule.title) rule_node.setAttribute('description', rule.description) rule_node.setAttribute('event', _getDottedName(rule.event)) rule_node.setAttribute('enabled', str(rule.enabled)) rule_node.setAttribute('stop-after', str(rule.stop)) rule_node.setAttribute('cascading', str(rule.cascading)) # Aq-wrap so that exporting fields with clever getters or # vocabularies will work. We also aq-wrap conditions and # actions below. rule = rule.__of__(site) # Add conditions conditions_node = self._doc.createElement('conditions') for condition in rule.conditions: condition_data = IRuleElementData(condition) condition = condition.__of__(rule) condition_node = self._doc.createElement('condition') condition_node.setAttribute('type', condition_data.element) handler = IRuleElementExportImportHandler(condition) handler.export_element(self._doc, condition_node) conditions_node.appendChild(condition_node) rule_node.appendChild(conditions_node) # Add actions actions_node = self._doc.createElement('actions') for action in rule.actions: action_data = IRuleElementData(action) action = action.__of__(rule) action_node = self._doc.createElement('action') action_node.setAttribute('type', action_data.element) handler = IRuleElementExportImportHandler(action) handler.export_element(self._doc, action_node) actions_node.appendChild(action_node) rule_node.appendChild(actions_node) fragment.appendChild(rule_node) assignment_paths.update(get_assignments(rule)) # Export assignments last - this is necessary to ensure they # are orderd properly site_path_length = len('/'.join(site.getPhysicalPath())) for path in assignment_paths: try: container = site.unrestrictedTraverse(path) except KeyError: continue assignable = IRuleAssignmentManager(container, None) if assignable is None: continue location = path[site_path_length:] for name, assignment in assignable.items(): assignment_node = self._doc.createElement('assignment') assignment_node.setAttribute('location', location) assignment_node.setAttribute('name', name) assignment_node.setAttribute('enabled', str(assignment.enabled)) assignment_node.setAttribute('bubbles', str(assignment.bubbles)) fragment.appendChild(assignment_node) return fragment