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
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
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))
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 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) ])
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
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)
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
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()
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 StripMarkup(self, *a, **kw): from euphorie.content.utils import StripMarkup return StripMarkup(*a, **kw)
def SearchableTextIndexer(obj): return " ".join( [obj.title, StripMarkup(obj.description), StripMarkup(obj.body)])
def StripMarkup(self, *a, **kw): return StripMarkup(*a, **kw)
def check_markup(self, text): if StripMarkup(text).strip(): return text
def tool_description(self): obj = self._survey if not obj: return "" ploneview = self.context.restrictedTraverse("@@plone") return ploneview.cropText(StripMarkup(obj.introduction), 800)
def HasText(html): """Determine if a HTML fragment contains text.""" if not html: return False text = StripMarkup(html).replace(" ", "").replace(" ", "") return bool(text)