def __call__(self): context = aq_inner(self.context) request = aq_inner(self.request) form = request.form status = IStatusMessage(self.request) operation = request.get('operation', None) if operation == 'move_up': assignable = IRuleAssignmentManager(context) 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': assignable = IRuleAssignmentManager(context) 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') api.assign_rule(self.context, rule_id) elif 'form.button.Delete' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.unassign_rule(self.context, r) status.addStatusMessage(_(u'Assignments deleted.'), type='info') elif 'form.button.Enable' in form: rule_ids = form.get('rule_ids', ()) for r in rule_ids: api.edit_rule_assignment(context, r, 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: api.edit_rule_assignment(context, r, 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: api.edit_rule_assignment( context, r, bubbles=True, enabled=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: api.edit_rule_assignment(context, r, bubbles=False) status.addStatusMessage(_(u'Changes saved.'), type='info') return self.template()
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()) insert_assignment(storage[rule_id], 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 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()) insert_assignment(storage[rule_id], 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 _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 __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()