Exemplo n.º 1
0
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
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
    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()
Exemplo n.º 9
0
    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()
Exemplo n.º 10
0
 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
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
    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()