def exportProfileQuestion(self, parent, profile): """:returns: An XML node with the details of an :obj:`euphorie.content.profilequestion`. """ node = etree.SubElement(parent, "profile-question") if getattr(profile, "external_id", None): node.attrib["external-id"] = profile.external_id etree.SubElement(node, "title").text = profile.title # Use title if question is not available (Euphorie < 2.0rc2 data) if HasText(profile.question): node = self._add_string_or_html(node, profile.question, "question") else: etree.SubElement(node, "question").text = profile.title if HasText(profile.description): node = self._add_string_or_html(node, profile.description, "description") for fname in ProfileQuestionLocationFields: value = getattr(profile, fname, None) if value: etree.SubElement(node, fname.replace("_", "-")).text = value etree.SubElement( node, "use-location-question").text = ("true" if getattr( profile, "use_location_question", True) else "false") for child in profile.values(): if IModule.providedBy(child): self.exportModule(node, child) elif IRisk.providedBy(child): self.exportRisk(node, child) return node
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 getSurveyTree(survey, profile=None): """Return a list of all modules, profile questions and risks in a survey. Each entry is represented by a dict with a `zodb_path` and `type` key. """ # XXX Can this be cached on the survey instance? nodes = [] base_length = len(survey.getPhysicalPath()) queue = collections.deque(survey.values()) while queue: node = queue.popleft() if node.portal_type not in [ "euphorie.profilequestion", "euphorie.module", "euphorie.risk", ]: continue # Note that in profile.AddToTree, we pretend that an optional module # always has a description. This logic needs to be replicated here. if node.portal_type == "euphorie.module": has_description = HasText(node.description) or node.optional else: has_description = HasText(node.description) if profile and node.portal_type == "euphorie.profilequestion": if not profile.get(node.id): continue nodes.append({ "zodb_path": "/".join(node.getPhysicalPath()[base_length:]), "type": node.portal_type[9:], "has_description": has_description, "always_present": (node.portal_type[9:] == "risk" and node.risk_always_present or False), "risk_type": (node.portal_type[9:] == "risk" and node.type or None), "optional": node.optional, }) if IQuestionContainer.providedBy(node): queue.extend(node.values()) return nodes
def do_GET(self): info = { 'id': self.context.id, 'type': 'session', 'survey': self.context.zodb_path, 'created': self.context.created.isoformat(), 'modified': self.context.modified.isoformat(), 'title': self.context.title, 'next-step': '%s/identification' % self.context.absolute_url(), } survey = get_survey(self.request, self.context.zodb_path) if HasText(survey.introduction): info['introduction'] = survey.introduction return info
def getSurveyTree(survey): """Return a list of all modules, profile questions and risks in a survey. Each entry is represented by a dict with a `zodb_path` and `type` key. """ # XXX Can this be cached on the survey instance? nodes = [] base_length = len(survey.getPhysicalPath()) queue = collections.deque(survey.values()) while queue: node = queue.popleft() if node.portal_type not in \ ['euphorie.profilequestion', 'euphorie.module', 'euphorie.risk']: continue nodes.append({ 'zodb_path': '/'.join(node.getPhysicalPath()[base_length:]), 'type': node.portal_type[9:], 'has_description': HasText(node.description), 'always_present': node.portal_type[9:] == "risk" and node.risk_always_present or False, 'optional': node.optional, }) if IQuestionContainer.providedBy(node): queue.extend(node.values()) return nodes
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 use_solution_direction(self): module = self.request.survey.restrictedTraverse( self.context.zodb_path.split("/")) return HasText(getattr(module, "solution_direction", None))
def AddToTree(root, node, zodb_path=[], title=None, profile_index=0, skip_children=False): """Add a new node to the session tree. :param root: parent node of the new child :type root: py:class:`euphorie.client.model.SurveySession` or :py:class:`euphorie.client.model.SurveyTreeItem` :param node: ZODB object to add to the node. :type node: one of the :py:mod:`euphorie.content` content types :param zodb_path: list of ids of all parents of the root in the session tree :param title: title for the generated node. Defaults to the title of the ZODB object :type title: unicode or None :param int profile_index: profile answer index number. """ title = title or node.title if title: title = title[:500] if IQuestionContainer.providedBy(node): child = model.Module(title=title, module_id=node.id) child.has_description = HasText(node.description) if IModule.providedBy(node): child.solution_direction = HasText(node.solution_direction) if node.optional: child.skip_children = False child.has_description = True else: child.postponed = False elif IRisk.providedBy(node): priority = getattr(node, "default_priority", None) if priority == "none": priority = None if IFrenchRisk.providedBy(node): effect = node.default_severity else: effect = node.default_effect child = model.Risk(title=title, risk_id=node.id, risk_type=node.type, skip_evaluation=(node.evaluation_method == 'fixed'), probability=node.default_probability, frequency=node.default_frequency, effect=effect, priority=priority) child.skip_children = False child.postponed = False child.has_description = HasText(node.description) if node.type in ['top5', 'policy']: child.priority = 'high' if node.risk_always_present: child.identification = u"no" else: return None # Should never happen zodb_path = zodb_path + [node.id] child.zodb_path = "/".join(zodb_path) child.profile_index = profile_index root.addChild(child) if IQuestionContainer.providedBy(node) and not skip_children: for grandchild in node.values(): AddToTree(child, grandchild, zodb_path, None, profile_index) return child