def walk(node): for idx, sub_node in node.ZopeFind(node, search_sub=0): if ISolution.providedBy(sub_node): yield sub_node if IDexterityContainer.providedBy(sub_node): for sub_sub_node in walk(sub_node): yield sub_sub_node
def add_solutions(self, zodb_node, doc): for solution in zodb_node.values(): if not ISolution.providedBy(solution): continue self.add_measure(doc, solution.description, solution, implemented=True)
def exportRisk(self, parent, risk): """ :returns: An XML node with the details of an :obj:`euphorie.content.risk`. """ node = etree.SubElement(parent, "risk", type=risk.type) if getattr(risk, "external_id", None): node.attrib["external-id"] = risk.external_id etree.SubElement(node, "title").text = risk.title etree.SubElement(node, "problem-description").text = StripUnwanted( risk.problem_description) etree.SubElement(node, "description").text = StripUnwanted(risk.description) if StripMarkup(risk.legal_reference): etree.SubElement(node, "legal-reference").text = StripUnwanted( risk.legal_reference) etree.SubElement(node, "show-not-applicable").text = \ "true" if risk.show_notapplicable else "false" if self.use_existing_measures: etree.SubElement(node, "existing_measures").text = \ risk.existing_measures if risk.type == "risk": method = etree.SubElement(node, "evaluation-method") method.text = risk.evaluation_method if risk.evaluation_method == "calculated": if risk.evaluation_algorithm() == "kinney": if risk.default_probability: method.attrib["default-probability"] = getToken( IKinneyEvaluation["default_probability"], risk.default_probability) if risk.default_frequency: method.attrib["default-frequency"] = getToken( IKinneyEvaluation["default_frequency"], risk.default_frequency) if risk.default_effect: method.attrib["default-effect"] = getToken( IKinneyEvaluation["default_effect"], risk.default_effect) elif risk.evaluation_method == "direct": if risk.default_priority: method.attrib["default-priority"] = getToken( IRisk["default_priority"], risk.default_priority) for index in range(4): postfix = "" if not index else str(index + 1) image = getattr(risk, "image" + postfix, None) if image is not None: self.exportImage(node, image, getattr(risk, "caption" + postfix, None)) solutions = [ child for child in risk.values() if ISolution.providedBy(child) ] if solutions: sols = etree.SubElement(node, "solutions") for solution in solutions: self.exportSolution(sols, solution) return node
def exportRisk(self, parent, risk): """ :returns: An XML node with the details of an :obj:`euphorie.content.risk`. """ node = etree.SubElement(parent, "risk", type=risk.type) if getattr(risk, "external_id", None): node.attrib["external-id"] = risk.external_id etree.SubElement(node, "title").text = risk.title etree.SubElement(node, "problem-description").text = StripUnwanted( risk.problem_description) etree.SubElement(node, "description").text = StripUnwanted( risk.description) if StripMarkup(risk.legal_reference): etree.SubElement(node, "legal-reference").text = StripUnwanted( risk.legal_reference) etree.SubElement(node, "show-not-applicable").text = \ "true" if risk.show_notapplicable else "false" if risk.type == "risk": method = etree.SubElement(node, "evaluation-method") method.text = risk.evaluation_method if risk.evaluation_method == "calculated": if risk.evaluation_algorithm() == "kinney": if risk.default_probability: method.attrib["default-probability"] = getToken( IKinneyEvaluation["default_probability"], risk.default_probability) if risk.default_frequency: method.attrib["default-frequency"] = getToken( IKinneyEvaluation["default_frequency"], risk.default_frequency) if risk.default_effect: method.attrib["default-effect"] = getToken( IKinneyEvaluation["default_effect"], risk.default_effect) elif risk.evaluation_method == "direct": if risk.default_priority: method.attrib["default-priority"] = getToken( IRisk["default_priority"], risk.default_priority) for index in range(4): postfix = "" if not index else str(index + 1) image = getattr(risk, "image" + postfix, None) if image is not None: self.exportImage(node, image, getattr(risk, "caption" + postfix, None)) solutions = [child for child in risk.values() if ISolution.providedBy(child)] if solutions: sols = etree.SubElement(node, "solutions") for solution in solutions: self.exportSolution(sols, solution) return node
def get_solutions(self, node): solutions = [] zodb_node = self.zodb_node(node) if not zodb_node: return solutions mode = getattr(self.webhelpers._survey, "measures_text_handling", "full") for solution in zodb_node.values(): if not ISolution.providedBy(solution): continue if mode == "full": text = "{title}<br/>{description}".format( title=solution.description, description=solution.action) else: text = solution.action solutions.append(text) return solutions
def migrate_existing_measures(context): ct = getToolByName(context, "portal_catalog") risks = ct(portal_type="euphorie.risk") count = 0 for brain in risks: risk = brain.getObject() existing_measures = getattr(risk, "existing_measures", None) if existing_measures: solutions = [ solution.description.strip() for solution in risk.values() if ISolution.providedBy(solution) ] for measure in existing_measures.splitlines(): if measure.strip() not in solutions: id = get_next_id(risk) risk.invokeFactory("euphorie.solution", id) solution = getattr(risk, id) solution.description = measure solution.action_plan = measure count += 1 log.info("Created %d Solutions", count)
def exportSolution(self, parent, solution): """:returns: An XML node with the details of an :obj:`euphorie.content.solution`.""" node = etree.SubElement(parent, "solution") if getattr(solution, "external_id", None): node.attrib["external-id"] = solution.external_id etree.SubElement(node, "description").text = StripUnwanted( solution.description) stripped_action = StripUnwanted(solution.action) if ISolution.providedBy(solution) and self.is_etranslate_compatible: solution_view = api.content.get_view(context=solution, name="nuplone-view", request=self.request) action_with_br = stripped_action.replace("\n", "<br/>") action_html = solution_view.render_md(action_with_br) fragment = html.fragment_fromstring(action_html, "action") node.append(fragment) else: etree.SubElement(node, "action").text = stripped_action if solution.requirements: etree.SubElement(node, "requirements").text = StripUnwanted( solution.requirements) return node
def update(self): if redirectOnSurveyUpdate(self.request): return context = aq_inner(self.context) appconfig = getUtility(IAppConfig) settings = appconfig.get('euphorie') self.use_existing_measures = settings.get('use_existing_measures', False) self.next_is_report = False # already compute "next" here, so that we can know in the template # if the next step might be the report phase, in which case we # need to switch off the sidebar next = FindNextQuestion(context, filter=self.question_filter) if next is None: # We ran out of questions, proceed to the report url = "%s/report" % self.request.survey.absolute_url() self.next_is_report = True else: url = QuestionURL(self.request.survey, next, phase="actionplan") if self.request.environ["REQUEST_METHOD"] == "POST": reply = self.request.form session = Session() context.comment = reply.get("comment") context.priority = reply.get("priority") new_plans = self.extract_plans_from_request() for plan in context.action_plans: session.delete(plan) context.action_plans.extend(new_plans) SessionManager.session.touch() if reply["next"] == "previous": next = FindPreviousQuestion(context, filter=self.question_filter) if next is None: # We ran out of questions, step back to intro page url = "%s/evaluation" % self.request.survey.absolute_url() else: url = QuestionURL(self.request.survey, next, phase="actionplan") return self.request.response.redirect(url) else: self.data = context if len(context.action_plans) == 0: self.data.empty_action_plan = [model.ActionPlan()] self.title = context.parent.title self.tree = getTreeData(self.request, context, filter=self.question_filter, phase="actionplan") if self.context.is_custom_risk: self.risk = self.context self.description_intro = u"" self.risk.description = u"" number_images = 0 else: self.risk = self.request.survey.restrictedTraverse( context.zodb_path.split("/")) number_images = getattr(self.risk, 'image', None) and 1 or 0 if number_images: for i in range(2, 5): number_images += getattr(self.risk, 'image{0}'.format(i), None) and 1 or 0 ploneview = getMultiAdapter((self.context, self.request), name="plone") stripped_description = StripMarkup(self.risk.description) if len(stripped_description) > self.DESCRIPTION_CROP_LENGTH: self.description_intro = ploneview.cropText( stripped_description, self.DESCRIPTION_CROP_LENGTH) else: self.description_intro = "" self.solutions = [ solution for solution in self.risk.values() if ISolution.providedBy(solution) ] self.number_images = number_images self.has_images = number_images > 0 self.image_class = IMAGE_CLASS[number_images] self.risk_number = self.context.number lang = getattr(self.request, 'LANGUAGE', 'en') if "-" in lang: elems = lang.split("-") lang = "{0}_{1}".format(elems[0], elems[1].upper()) self.delete_confirmation = translate(_( u"Are you sure you want to delete this measure? This action can " u"not be reverted."), target_language=lang) self.override_confirmation = translate(_( u"The current text in the fields 'Action plan', 'Prevention plan' and " u"'Requirements' of this measure will be overwritten. This action cannot be " u"reverted. Are you sure you want to continue?"), target_language=lang) self.message_date_before = translate(_( u"error_validation_before_end_date", default=u"This date must be on or before the end date."), target_language=lang) self.message_date_after = translate(_( u"error_validation_after_start_date", default=u"This date must be on or after the start date."), target_language=lang) self.message_positive_number = translate(_( u"error_validation_positive_whole_number", default=u"This value must be a positive whole number."), target_language=lang) super(ActionPlanView, self).update()
def update(self): if redirectOnSurveyUpdate(self.request): return context = aq_inner(self.context) self.next_is_report = False # already compute "next" here, so that we can know in the template # if the next step might be the report phase, in which case we # need to switch off the sidebar next = FindNextQuestion( context, filter=self.question_filter) if next is None: # We ran out of questions, proceed to the report url = "%s/report" % self.request.survey.absolute_url() self.next_is_report = True else: url = QuestionURL( self.request.survey, next, phase="actionplan") if self.request.environ["REQUEST_METHOD"] == "POST": reply = self.request.form session = Session() context.comment = reply.get("comment") context.priority = reply.get("priority") new_plans = self.extract_plans_from_request() for plan in context.action_plans: session.delete(plan) context.action_plans.extend(new_plans) SessionManager.session.touch() if reply["next"] == "previous": next = FindPreviousQuestion( context, filter=self.question_filter) if next is None: # We ran out of questions, step back to intro page url = "%s/evaluation" % self.request.survey.absolute_url() else: url = QuestionURL( self.request.survey, next, phase="actionplan") return self.request.response.redirect(url) else: self.data = context if len(context.action_plans) == 0: self.data.empty_action_plan = [model.ActionPlan()] self.title = context.parent.title self.tree = getTreeData( self.request, context, filter=self.question_filter, phase="actionplan") if self.context.is_custom_risk: self.risk = self.context self.description_intro = u"" self.risk.description = u"" number_images = 0 else: self.risk = self.request.survey.restrictedTraverse( context.zodb_path.split("/")) number_images = getattr(self.risk, 'image', None) and 1 or 0 if number_images: for i in range(2, 5): number_images += getattr( self.risk, 'image{0}'.format(i), None) and 1 or 0 ploneview = getMultiAdapter( (self.context, self.request), name="plone") stripped_description = StripMarkup(self.risk.description) if len(stripped_description) > DESCRIPTION_CROP_LENGTH: self.description_intro = ploneview.cropText( stripped_description, DESCRIPTION_CROP_LENGTH) else: self.description_intro = "" self.solutions = [ solution for solution in self.risk.values() if ISolution.providedBy(solution)] self.number_images = number_images self.has_images = number_images > 0 self.image_class = IMAGE_CLASS[number_images] self.risk_number = self.context.number lang = getattr(self.request, 'LANGUAGE', 'en') if "-" in lang: elems = lang.split("-") lang = "{0}_{1}".format(elems[0], elems[1].upper()) self.delete_confirmation = translate(_( u"Are you sure you want to delete this measure? This action can " u"not be reverted."), target_language=lang) self.override_confirmation = translate(_( u"The current text in the fields 'Action plan', 'Prevention plan' and " u"'Requirements' of this measure will be overwritten. This action cannot be " u"reverted. Are you sure you want to continue?"), target_language=lang) self.message_date_before = translate(_( u"error_validation_before_end_date", default=u"This date must be on or before the end date."), target_language=lang) self.message_date_after = translate(_( u"error_validation_after_start_date", default=u"This date must be on or after the start date."), target_language=lang) self.message_positive_number = translate(_( u"error_validation_positive_whole_number", default=u"This value must be a positive whole number."), target_language=lang) super(ActionPlanView, self).update()
def do_GET(self): self.risk = risk = self.request.survey.restrictedTraverse( self.context.zodb_path.split('/')) info = {'id': self.context.id, 'type': 'risk', 'title': risk.title, 'module-title': aq_parent(risk).title, 'problem-description': risk.problem_description, 'show-not-applicable': risk.show_notapplicable, 'evaluation-method': risk.evaluation_method, 'present': self.context.identification, 'priority': self.context.priority, 'comment': self.context.comment, } images = filter(None, [export_image(risk, self.request, 'image%s' % postfix, 'caption%s' % postfix, width=150, height=500, direction='thumbnail') for postfix in ['', '2', '3', '4']]) if images: info['images'] = images if HasText(risk.description): info['description'] = risk.description if HasText(risk.legal_reference): info['legal-reference'] = risk.legal_reference if risk.evaluation_method == 'calculated': algorithm = evaluation_algorithm(risk) info['evaluation-algorithm'] = algorithm if algorithm == 'french': field = IFrenchEvaluation['default_severity'] info['severity'] = vocabulary_token( field, self.context.severity) \ if self.context.severity else None info['severity-options'] = vocabulary_options( field, self.request) field = IFrenchEvaluation['default_frequency'] info['frequency'] = vocabulary_token( field, self.context.frequency) \ if self.context.frequency else None info['frequency-options'] = vocabulary_options( field, self.request) else: # Kinney field = IKinneyEvaluation['default_frequency'] info['frequency'] = vocabulary_token( field, self.context.frequency) \ if self.context.frequency else None info['frequency-options'] = vocabulary_options( field, self.request) field = IKinneyEvaluation['default_effect'] info['effect'] = vocabulary_token(field, self.context.effect) \ if self.context.effect else None info['effect-options'] = vocabulary_options( field, self.request) field = IKinneyEvaluation['default_probability'] info['probability'] = vocabulary_token( field, self.context.probability) \ if self.context.probability else None info['probability-options'] = vocabulary_options( field, self.request) solutions = [solution for solution in risk.values() if ISolution.providedBy(solution)] if solutions: info['standard-solutions'] = [ {'description': solution.description, 'action-plan': solution.action_plan, 'prevention-plan': solution.prevention_plan, 'requirements': solution.requirements} for solution in risk.values()] return info
def do_GET(self): self.risk = risk = self.request.survey.restrictedTraverse( self.context.zodb_path.split('/')) info = { 'id': self.context.id, 'type': 'risk', 'title': risk.title, 'module-title': aq_parent(risk).title, 'problem-description': risk.problem_description, 'show-not-applicable': risk.show_notapplicable, 'evaluation-method': risk.evaluation_method, 'present': self.context.identification, 'priority': self.context.priority, 'comment': self.context.comment, } images = filter(None, [ export_image(risk, self.request, 'image%s' % postfix, 'caption%s' % postfix, width=150, height=500, direction='thumbnail') for postfix in ['', '2', '3', '4'] ]) if images: info['images'] = images if HasText(risk.description): info['description'] = risk.description if HasText(risk.legal_reference): info['legal-reference'] = risk.legal_reference if risk.evaluation_method == 'calculated': algorithm = evaluation_algorithm(risk) info['evaluation-algorithm'] = algorithm if algorithm == 'french': field = IFrenchEvaluation['default_severity'] info['severity'] = vocabulary_token( field, self.context.severity) \ if self.context.severity else None info['severity-options'] = vocabulary_options( field, self.request) field = IFrenchEvaluation['default_frequency'] info['frequency'] = vocabulary_token( field, self.context.frequency) \ if self.context.frequency else None info['frequency-options'] = vocabulary_options( field, self.request) else: # Kinney field = IKinneyEvaluation['default_frequency'] info['frequency'] = vocabulary_token( field, self.context.frequency) \ if self.context.frequency else None info['frequency-options'] = vocabulary_options( field, self.request) field = IKinneyEvaluation['default_effect'] info['effect'] = vocabulary_token(field, self.context.effect) \ if self.context.effect else None info['effect-options'] = vocabulary_options( field, self.request) field = IKinneyEvaluation['default_probability'] info['probability'] = vocabulary_token( field, self.context.probability) \ if self.context.probability else None info['probability-options'] = vocabulary_options( field, self.request) solutions = [ solution for solution in risk.values() if ISolution.providedBy(solution) ] if solutions: info['standard-solutions'] = [{ 'description': solution.description, 'action-plan': solution.action_plan, 'prevention-plan': solution.prevention_plan, 'requirements': solution.requirements } for solution in risk.values()] return info
def update(self): if redirectOnSurveyUpdate(self.request): return context = aq_inner(self.context) self.errors = {} if self.request.environ["REQUEST_METHOD"] == "POST": reply = self.request.form session = Session() errors = False reply["action_plans"] = [] new_plans = [] for i in range(0, len(reply['measure'])): # repoze.formapi treats an empty input for an int as a # validation error. measure = dict([p for p in reply['measure'][i].items() if p[1].strip()]) form = ActionPlanItemForm(params=measure) reply['action_plans'].append(measure) if not form.validate(): errors = True reply['action_plans'][-1]['errors'] = \ dict(form.errors._dict) if u'Start date is not before end date' in \ form.errors._messages: reply['action_plans'][-1]['errors'][ 'planning_start_date'] = [ u'Start date is not before end date'] continue if len(measure) > 2: new_plans.append(model.ActionPlan( action_plan=form.data["action_plan"], prevention_plan=form.data["prevention_plan"], requirements=form.data["requirements"], responsible=form.data["responsible"], budget=form.data["budget"], planning_start=self._fieldsToDate( form.data["planning_start_year"], form.data["planning_start_month"], form.data["planning_start_day"]), planning_end=self._fieldsToDate( form.data["planning_end_year"], form.data["planning_end_month"], form.data["planning_end_day"]), )) if errors: self.data = reply else: context.comment = reply.get("comment") context.priority = reply.get("priority") for plan in context.action_plans: session.delete(plan) context.action_plans.extend(new_plans) SessionManager.session.touch() if reply["next"] == "previous": next = FindPreviousQuestion( context, filter=self.question_filter) if next is None: # We ran out of questions, step back to intro page url = "%s/evaluation" \ % self.request.survey.absolute_url() self.request.response.redirect(url) return else: next = FindNextQuestion( context, filter=self.question_filter) if next is None: # We ran out of questions, proceed to the report url = "%s/report" % self.request.survey.absolute_url() self.request.response.redirect(url) return url = QuestionURL( self.request.survey, next, phase="actionplan") self.request.response.redirect(url) return else: if len(context.action_plans) == 0: context.action_plans.append(model.ActionPlan()) self.data = context self.risk = risk = self.request.survey.restrictedTraverse( context.zodb_path.split("/")) self.title = context.parent.title self.tree = getTreeData( self.request, context, filter=self.question_filter, phase="actionplan") self.solutions = [solution for solution in risk.values() if ISolution.providedBy(solution)] super(ActionPlanView, self).update()