Пример #1
0
    def exportModule(self, parent, module):
        """:returns: An XML node with the details of an
        :obj:`euphorie.content.module`."""
        node = etree.SubElement(
            parent, "module", optional="true" if module.optional else "false")
        if getattr(module, "external_id", None):
            node.attrib["external-id"] = module.external_id
        etree.SubElement(node, "title").text = module.title
        if self.include_module_description_texts and HasText(
                module.description):
            node = self._add_string_or_html(node, module.description,
                                            "description")
        if module.optional:
            etree.SubElement(node, "question").text = module.question
        if self.include_module_solution_texts and StripMarkup(
                module.solution_direction):
            etree.SubElement(node, "solution-direction").text = StripUnwanted(
                module.solution_direction)
        if module.image is not None:
            self.exportImage(node, module.image, module.caption)

        for child in module.values():
            if IModule.providedBy(child):
                self.exportModule(node, child)
            elif IRisk.providedBy(child):
                self.exportRisk(node, child)
        return node
Пример #2
0
    def exportSurvey(self, parent, survey):
        """ :returns: An XML node with the details of an :obj:`euphorie.content.survey`.
        """
        node = etree.SubElement(parent, "survey")
        if getattr(survey, "external_id", None):
            node.attrib["external-id"] = survey.external_id
        etree.SubElement(node, "title").text = aq_parent(survey).title
        if StripMarkup(survey.introduction):
            etree.SubElement(node, "introduction").text = StripUnwanted(
                survey.introduction)
        if survey.classification_code:
            etree.SubElement(node, "classification-code").text = \
                    survey.classification_code
        etree.SubElement(node, "language").text = survey.language
        etree.SubElement(node, "evaluation-algorithm").text = \
                aq_parent(survey).evaluation_algorithm
        etree.SubElement(node, "evaluation-optional").text = \
                "true" if survey.evaluation_optional else "false"

        for child in survey.values():
            if IProfileQuestion.providedBy(child):
                self.exportProfileQuestion(node, child)
            if IModule.providedBy(child):
                self.exportModule(node, child)
        return node
Пример #3
0
def Description(obj):
    """Indexer for rich text descriptions fields. Return a plain text
    version of the description for use in the Plone catalog.
    """
    d = getattr(obj, "description", "")
    if d is None:
        return None

    return unescape(StripMarkup(d))
Пример #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 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
Пример #5
0
def SearchableTextIndexer(obj):
    """ Index the introduction, authentication, sessions, identification,
    evaluation, actionplan, report and finalwords.
    """
    return " ".join([
        StripMarkup(obj.introduction),
        StripMarkup(obj.authentication),
        StripMarkup(obj.sessions),
        StripMarkup(obj.identification),
        StripMarkup(obj.evaluation),
        StripMarkup(obj.actionplan),
        StripMarkup(obj.report),
        StripMarkup(obj.finalwords)
    ])
Пример #6
0
 def splash_message(self):
     message = None
     motd = self._findMOTD()
     if motd:
         now = datetime.now()
         message = dict(
             title=StripMarkup(motd.description),
             text=motd.body,
             id="motd{0}{1}".format(
                 motd.modification_date.strftime("%Y%m%d%H%M%S"),
                 now.strftime("%Y%m%d"),
             ),
         )
     return message
Пример #7
0
 def __init__(self, context, request):
     super(OSHAWebHelpers, self).__init__(context, request)
     survey = self._survey
     if not survey:
         return
     data = cached_tools_json(self.request.client, self.request)
     own_path = "/".join(self._survey.getPhysicalPath()[-3:])
     entries = [
         entry for entry in data
         if entry.get('tool_link', '').endswith(own_path)
     ]
     if len(entries):
         entry = entries[0]
         description = (entry.get('body_alt', None) or entry.get('body')
                        or self.tool_description)
         ploneview = getMultiAdapter((self.context, self.request),
                                     name="plone")
         self.tool_description = ploneview.cropText(
             StripMarkup(description), 800)
Пример #8
0
    def exportSurvey(self, parent, survey):
        """Export a survey given a parent and the survey itself

        :returns: An XML node with the details of an :obj:`euphorie.content.survey`.
        """
        node = etree.SubElement(parent, "survey")
        if getattr(survey, "external_id", None):
            node.attrib["external-id"] = survey.external_id
        etree.SubElement(node, "title").text = aq_parent(survey).title
        if self.include_intro_text and StripMarkup(survey.introduction):
            node = self._add_string_or_html(node, survey.introduction,
                                            "introduction")
        if survey.classification_code:
            etree.SubElement(
                node, "classification-code").text = survey.classification_code
        etree.SubElement(node, "language").text = survey.language
        if self.is_etranslate_compatible:
            etree.SubElement(node,
                             "tool_type",
                             attrib={"value": get_tool_type(survey)})
            etree.SubElement(
                node,
                "measures_text_handling",
                attrib={
                    "value": getattr(survey, "measures_text_handling", "full")
                },
            )
            etree.SubElement(
                node,
                "integrated_action_plan",
                attrib={
                    "value":
                    "true" if getattr(survey, "integrated_action_plan", False)
                    else "false"
                },
            )
            etree.SubElement(
                node,
                "evaluation-algorithm",
                attrib={"value": aq_parent(survey).evaluation_algorithm},
            )
            etree.SubElement(
                node,
                "evaluation-optional",
                attrib={
                    "value": "true" if survey.evaluation_optional else "false"
                },
            )
        else:
            etree.SubElement(node, "tool_type").text = get_tool_type(survey)
            etree.SubElement(node, "measures_text_handling").text = getattr(
                survey, "measures_text_handling", "full")
            etree.SubElement(
                node, "integrated_action_plan").text = ("true" if getattr(
                    survey, "integrated_action_plan", False) else "false")
            etree.SubElement(node, "evaluation-algorithm").text = aq_parent(
                survey).evaluation_algorithm
            etree.SubElement(node, "evaluation-optional").text = (
                "true" if survey.evaluation_optional else "false")
        if IToolCategory.providedBy(survey):
            tool_category = IToolCategory(survey).tool_category or []
            etree.SubElement(node, "tool-category").text = ", ".join(
                [x.replace(",", COMMA_REPLACEMENT) for x in tool_category])

        if getattr(survey, "external_site_logo", None):
            self.exportImage(node,
                             survey.external_site_logo,
                             tagname="external_site_logo")
        if getattr(survey, "image", None):
            self.exportImage(node, survey.image)

        for child in survey.values():
            if IProfileQuestion.providedBy(child):
                self.exportProfileQuestion(node, child)
            if IModule.providedBy(child):
                self.exportModule(node, child)
        return node
Пример #9
0
    def update(self):
        if redirectOnSurveyUpdate(self.request):
            return

        self.risk = self.request.survey.restrictedTraverse(
            self.context.zodb_path.split("/"))

        appconfig = getUtility(IAppConfig)
        settings = appconfig.get('euphorie')
        self.use_existing_measures = settings.get('use_existing_measures',
                                                  False)

        if self.request.environ["REQUEST_METHOD"] == "POST":
            reply = self.request.form
            answer = reply.get("answer")
            self.context.comment = reply.get("comment")
            if self.use_existing_measures:
                measures = self.get_existing_measures()
                new_measures = []
                for i, entry in enumerate(measures):
                    on = int(bool(reply.get('measure-{}'.format(i))))
                    entry[0] = on
                    measures[i] = entry
                    if on:
                        new_measures.append([1, entry[1]])
                for k, val in reply.items():
                    if k.startswith('new-measure') and val.strip() != '':
                        new_measures.append([1, val])
                self.context.existing_measures = dumps(new_measures)
            self.context.postponed = (answer == "postponed")
            if self.context.postponed:
                self.context.identification = None
            else:
                self.context.identification = answer
                if self.risk.type in ('top5', 'policy'):
                    self.context.priority = 'high'
                elif self.risk.evaluation_method == 'calculated':
                    self.calculatePriority(self.risk, reply)
                elif self.risk.evaluation_method == "direct":
                    self.context.priority = reply.get("priority")

            SessionManager.session.touch()

            if reply["next"] == "previous":
                next = FindPreviousQuestion(self.context,
                                            filter=self.question_filter)
                if next is None:
                    # We ran out of questions, step back to intro page
                    url = "%s/identification" % \
                        self.request.survey.absolute_url()
                    self.request.response.redirect(url)
                    return
            else:
                next = FindNextQuestion(self.context,
                                        filter=self.question_filter)
                if next is None:
                    # We ran out of questions, proceed to the action plan
                    url = "%s/actionplan" % self.request.survey.absolute_url()
                    self.request.response.redirect(url)
                    return

            url = QuestionURL(self.request.survey,
                              next,
                              phase="identification")
            self.request.response.redirect(url)

        else:
            self.tree = getTreeData(self.request, self.context)
            self.title = self.context.parent.title
            self.show_info = self.risk.image or \
                HasText(self.risk.description) or \
                HasText(self.risk.legal_reference)
            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
            self.has_images = number_images > 0
            self.number_images = number_images
            self.image_class = IMAGE_CLASS[number_images]
            number_files = 0
            for i in range(1, 5):
                number_files += getattr(self.risk, 'file{0}'.format(i),
                                        None) and 1 or 0
            self.has_files = number_files > 0
            self.risk_number = self.context.number

            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.description_probability = _(
                u"help_default_probability",
                default=u"Indicate how "
                "likely occurence of this risk is in a normal situation.")
            self.description_frequency = _(
                u"help_default_frequency",
                default=u"Indicate how often this "
                u"risk occurs in a normal situation.")
            self.description_severity = _(u"help_default_severity",
                                          default=u"Indicate the "
                                          "severity if this risk occurs.")

            self.title_extra = ''
            self.show_existing_measures = False
            if self.use_existing_measures:
                measures = self.risk.existing_measures or ""
                # Only show the form to select and add existing measures if
                # at least one measure was defined in the CMS
                if len(measures):
                    self.show_existing_measures = True
                    self.title_extra = _(
                        "Are the measures that are selected above sufficient?")
                if not self.context.existing_measures:
                    self.context.existing_measures = dumps([
                        (1, text) for text in measures.splitlines()
                    ])

            if getattr(self.request.survey,
                       'enable_custom_evaluation_descriptions', False):
                if self.request.survey.evaluation_algorithm != 'french':
                    custom_dp = getattr(self.request.survey,
                                        'description_probability', '') or ''
                    self.description_probability = custom_dp.strip(
                    ) or self.description_probability
                custom_df = getattr(self.request.survey,
                                    'description_frequency', '') or ''
                self.description_frequency = custom_df.strip(
                ) or self.description_frequency
                custom_ds = getattr(self.request.survey,
                                    'description_severity', '') or ''
                self.description_severity = custom_ds.strip(
                ) or self.description_severity

            # Italian special
            if IItalyIdentificationPhaseSkinLayer.providedBy(self.request):
                self.skip_evaluation = True
            else:
                self.skip_evaluation = False
            super(IdentificationView, self).update()
Пример #10
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()
Пример #11
0
 def StripMarkup(self, *a, **kw):
     from euphorie.content.utils import StripMarkup
     return StripMarkup(*a, **kw)
Пример #12
0
def SearchableTextIndexer(obj):
    return " ".join(
        [obj.title,
         StripMarkup(obj.description),
         StripMarkup(obj.body)])
Пример #13
0
 def StripMarkup(self, *a, **kw):
     return StripMarkup(*a, **kw)
Пример #14
0
 def check_markup(self, text):
     if StripMarkup(text).strip():
         return text
Пример #15
0
 def tool_description(self):
     obj = self._survey
     if not obj:
         return ""
     ploneview = self.context.restrictedTraverse("@@plone")
     return ploneview.cropText(StripMarkup(obj.introduction), 800)
Пример #16
0
def HasText(html):
    """Determine if a HTML fragment contains text."""
    if not html:
        return False
    text = StripMarkup(html).replace(" ", "").replace(" ", "")
    return bool(text)