def test_06_FrenchTranslationOfMessageWithContext(self, quiet=0, run=run_all_test): """ Test French translation """ self.lang = 'fr' message_catalog = self.portal.Localizer.erp5_ui message_catalog.gettext('Validated', add=1) message_catalog.gettext('Draft', add=1) message_catalog.gettext(getMessageIdWithContext( 'Validated', 'state', 'item_workflow'), add=1) message_catalog.message_edit('Validated', self.lang, 'Validé'.decode('utf8'), '') message_catalog.message_edit( getMessageIdWithContext('Validated', 'state', 'item_workflow'), self.lang, "En bon usage", '') message_catalog.message_edit('Draft', self.lang, '', '') portal_type = 'Organisation' organisation_module = self.getPortal().getDefaultModule(portal_type) organisation = organisation_module.newContent(portal_type=portal_type, title='My Organisation') organisation.validate() portal_type = 'Item' item_module = self.getPortal().getDefaultModule(portal_type) item = item_module.newContent(portal_type=portal_type, title='Lot A') self.tic() self.portal.Localizer._default_language = 'fr' self.assertEqual(item.getTranslatedValidationStateTitle(), 'Draft') item.validate() self.assertEqual(item.getTranslatedValidationStateTitle(), "En bon usage") self.assertEqual(organisation.getTranslatedValidationStateTitle(), 'Validé') # Now run indexation of translations. self.portal.ERP5Site_updateTranslationTable() self.tic() # Ckeck queries with translated workflow state title generated with # getMessageIdWithContext self.assertEqual( 1, len( self.portal.portal_catalog( translated_validation_state_title="En bon usage"))) self.assertEqual( 1, len( self.portal.portal_catalog( translated_validation_state_title="En bon usage", portal_type='Item'))) self.assertEqual( 0, len( self.portal.portal_catalog( translated_validation_state_title="En bon usage", portal_type='Organisation')))
def test_07_NegatedQueryForTranslation(self, quiet=0, run=run_all_test): """ Check that catalog search with a negated query parameter doesn't return unexpected results. - get a portal type ans its related workflow - add a new context translation for the original state - update the catalog tables - verify the catalog result """ self.lang = 'en' # Get one portal type and its related workflow portal_type_id = 'Bug' workflow_id = 'bug_workflow' workflow_value = self.portal.portal_workflow._getOb(workflow_id) assert(workflow_value in \ self.portal.portal_workflow.getWorkflowValueListFor(portal_type_id)) bug = self.portal.getDefaultModule(portal_type_id).newContent( portal_type=portal_type_id) state_title = bug.getSimulationStateTitle() # add a new context translation for the original state message_catalog = self.portal.Localizer.erp5_ui message_catalog.gettext(state_title, add=1) message_catalog.gettext(getMessageIdWithContext(state_title, 'state', workflow_id), add=1) assert(bug.getTranslatedSimulationStateTitle() == state_title) try: message_catalog.message_edit(getMessageIdWithContext(state_title, 'state', workflow_id), self.lang, "%s in context" % state_title, '') assert(bug.getTranslatedSimulationStateTitle() == \ "%s in context" % state_title) # Update the translation table self.portal.ERP5Site_updateTranslationTable() self.tic() # Check the catalog result assert(len(self.portal.portal_catalog(portal_type=portal_type_id)) == 1) result = self.portal.portal_catalog(portal_type=portal_type_id, translated_simulation_state_title='!="%s in context"' % state_title) self.assertEqual(len(result), 0) finally: # Clean the new context message message_catalog.message_del(getMessageIdWithContext(state_title, 'state', workflow_id)) # Update the translation table self.portal.ERP5Site_updateTranslationTable() self.tic()
def test_07_NegatedQueryForTranslation(self, quiet=0, run=run_all_test): """ Check that catalog search with a negated query parameter doesn't return unexpected results. - get a portal type ans its related workflow - add a new context translation for the original state - update the catalog tables - verify the catalog result """ self.lang = 'en' # Get one portal type and its related workflow portal_type_id = 'Bug' workflow_id = 'bug_workflow' assert(workflow_id in \ self.portal.portal_workflow.getChainFor(portal_type_id)) bug = self.portal.getDefaultModule(portal_type_id).newContent( portal_type=portal_type_id) state_title = bug.getSimulationStateTitle() # add a new context translation for the original state message_catalog = self.portal.Localizer.erp5_ui message_catalog.gettext(state_title, add=1) message_catalog.gettext(getMessageIdWithContext(state_title, 'state', workflow_id), add=1) assert(bug.getTranslatedSimulationStateTitle() == state_title) try: message_catalog.message_edit(getMessageIdWithContext(state_title, 'state', workflow_id), self.lang, "%s in context" % state_title, '') assert(bug.getTranslatedSimulationStateTitle() == \ "%s in context" % state_title) # Update the translation table self.portal.ERP5Site_updateTranslationTable() self.tic() # Check the catalog result assert(len(self.portal.portal_catalog(portal_type=portal_type_id)) == 1) result = self.portal.portal_catalog(portal_type=portal_type_id, translated_simulation_state_title='!="%s in context"' % state_title) self.assertEqual(len(result), 0) finally: # Clean the new context message message_catalog.message_del(getMessageIdWithContext(state_title, 'state', workflow_id)) # Update the translation table self.portal.ERP5Site_updateTranslationTable() self.tic()
def test_06_FrenchTranslationOfMessageWithContext(self, quiet=0, run=run_all_test): """ Test French translation """ self.lang = 'fr' message_catalog = self.portal.Localizer.erp5_ui message_catalog.gettext('Validated', add=1) message_catalog.gettext('Draft', add=1) message_catalog.gettext(getMessageIdWithContext('Validated', 'state', 'item_workflow'), add=1) message_catalog.message_edit('Validated', self.lang, 'Validé'.decode('utf8'), '') message_catalog.message_edit(getMessageIdWithContext('Validated', 'state', 'item_workflow'), self.lang, "En bon usage", '') message_catalog.message_edit('Draft', self.lang, '', '') portal_type = 'Organisation' organisation_module = self.getPortal().getDefaultModule(portal_type) organisation = organisation_module.newContent( portal_type=portal_type, title='My Organisation') organisation.validate() portal_type = 'Item' item_module = self.getPortal().getDefaultModule(portal_type) item = item_module.newContent(portal_type=portal_type, title='Lot A') self.tic() self.portal.Localizer._default_language = 'fr' self.assertEqual(item.getTranslatedValidationStateTitle(), 'Draft') item.validate() self.assertEqual(item.getTranslatedValidationStateTitle(), "En bon usage") self.assertEqual(organisation.getTranslatedValidationStateTitle(), 'Validé') # Now run indexation of translations. self.portal.ERP5Site_updateTranslationTable() self.tic() # Ckeck queries with translated workflow state title generated with # getMessageIdWithContext self.assertEqual(1, len(self.portal.portal_catalog( translated_validation_state_title="En bon usage"))) self.assertEqual(1, len(self.portal.portal_catalog( translated_validation_state_title="En bon usage", portal_type='Item'))) self.assertEqual(0, len(self.portal.portal_catalog( translated_validation_state_title="En bon usage", portal_type='Organisation')))
def test_06_FrenchTranslationOfMessageWithContext(self, quiet=0, run=run_all_test): """ Test French translation """ self.lang = "fr" message_catalog = self.portal.Localizer.erp5_ui message_catalog.gettext("Validated", add=1) message_catalog.gettext("Draft", add=1) message_catalog.gettext(getMessageIdWithContext("Validated", "state", "item_workflow"), add=1) message_catalog.message_edit("Validated", self.lang, "Validé".decode("utf8"), "") message_catalog.message_edit( getMessageIdWithContext("Validated", "state", "item_workflow"), self.lang, "En bon usage", "" ) message_catalog.message_edit("Draft", self.lang, "", "") portal_type = "Organisation" organisation_module = self.getPortal().getDefaultModule(portal_type) organisation = organisation_module.newContent(portal_type=portal_type, title="My Organisation") organisation.validate() portal_type = "Item" item_module = self.getPortal().getDefaultModule(portal_type) item = item_module.newContent(portal_type=portal_type, title="Lot A") transaction.commit() self.tic() self.portal.Localizer._default_language = "fr" self.assertEquals(item.getTranslatedValidationStateTitle(), "Draft") item.validate() self.assertEquals(item.getTranslatedValidationStateTitle(), "En bon usage") self.assertEquals(organisation.getTranslatedValidationStateTitle(), "Validé") # Now run indexation of translations. self.portal.ERP5Site_updateTranslationTable() transaction.commit() self.tic() # Ckeck queries with translated workflow state title generated with # getMessageIdWithContext self.assertEquals(1, len(self.portal.portal_catalog(translated_validation_state_title="En bon usage"))) self.assertEquals( 1, len(self.portal.portal_catalog(translated_validation_state_title="En bon usage", portal_type="Item")) ) self.assertEquals( 0, len( self.portal.portal_catalog(translated_validation_state_title="En bon usage", portal_type="Organisation") ), )
key = (lang, portal_type.getId(), state_var, state_reference) if not translated_keys.has_key(key): translated_message = context.Localizer.erp5_ui.gettext( state_reference, lang=lang).encode('utf-8') translated_keys[key] = None # mark as translated object_list.append( dict(language=lang, message_context=state_var, portal_type=portal_type.getId(), original_message=state_reference, translated_message=translated_message)) # translate state title as well if state.getTitle() is not None and state.getTitle() != '': state_var_title = '%s_title' % state_var msg_id = getMessageIdWithContext(state.getTitle(), 'state', wf_id) translated_message = context.Localizer.erp5_ui.gettext( msg_id, default='', lang=lang).encode('utf-8') if translated_message == '': msg_id = state.getTitle() translated_message = context.Localizer.erp5_ui.gettext( state.getTitle().decode('utf-8'), lang=lang).encode('utf-8') key = (lang, portal_type.getId(), state_var_title, state_reference, msg_id) if not translated_keys.has_key(key): translated_keys[key] = None # mark as translated object_list.append( dict(language=lang, message_context=state_var_title, portal_type=portal_type.getId(),
key = (lang, portal_type, state_var, state_id) if not translated_keys.has_key(key): translated_message = context.Localizer.erp5_ui.gettext( state_id, lang=lang).encode('utf-8') translated_keys[key] = None # mark as translated object_list.append( dict(language=lang, message_context=state_var, portal_type=portal_type, original_message=state_id, translated_message=translated_message)) # translate state title as well if state.title != '': state_var_title = '%s_title' % state_var msg_id = getMessageIdWithContext( state.title, 'state', wf.id) translated_message = context.Localizer.erp5_ui.gettext( msg_id, default='', lang=lang).encode('utf-8') if translated_message == '': msg_id = state.title translated_message = context.Localizer.erp5_ui.gettext( state.title.decode('utf-8'), lang=lang).encode('utf-8') key = (lang, portal_type, state_var_title, state_id, msg_id) if not translated_keys.has_key(key): translated_keys[key] = None # mark as translated object_list.append( dict(language=lang, message_context=state_var_title, portal_type=portal_type,
add_message(m, portal_url.getRelativeContentURL(i)) # # Workflow # s_title_list = [] for i in context.portal_workflow.objectValues(): add_message(i.title_or_id(), portal_url.getRelativeContentURL(i)) if not i.states: continue for s in i.states.values(): s_title = s.title if s_title: # adding a context in msg_id for more precise translation msg_id = getMessageIdWithContext(s_title,'state',i.id) add_message(msg_id, portal_url.getRelativeContentURL(s)) # also use state title as msg_id for compatibility add_message(s_title, portal_url.getRelativeContentURL(s)) if not i.transitions: continue for t in i.transitions.values(): if t.actbox_name: #adding a context in msg_id for more precise translation msg_id = getMessageIdWithContext(t.actbox_name,'transition',i.id) add_message(msg_id, portal_url.getRelativeContentURL(t)) # also use action box name as msg_id for compatibility add_message(t.actbox_name, portal_url.getRelativeContentURL(t)) if t.title: #adding a context in msg_id for more precise translation
def checkWorkflowStateTitle(self, quiet=0, run=run_all_test): """ Test workflow state title translation. Check that using portal_catalog can not return strange results to the user. Each translation must be only related to one state ID. """ if not run: return self.message = '\n' translation_dict = {} workflow_tool = self.portal.portal_workflow for workflow_id in workflow_tool.objectIds(): workflow = workflow_tool._getOb(workflow_id) class_name = workflow.__class__.__name__ if class_name == 'DCWorkflowDefinition': for state in workflow.states.items(): state_title = state[1].title state_id = state[0] msgid = getMessageIdWithContext(state_title, 'state', workflow_id) translated_state_title = self.getTranslation(msgid) if translated_state_title is not None: try: translation_dict[translated_state_title].add( state_id) except KeyError: translation_dict[translated_state_title] = { state_id } for key, value in translation_dict.items(): if len(value) == 1: translation_dict.pop(key) if translation_dict != {}: # State ID has multiple translation associated, and it leads to # unexpected results for the user when using portal catalog. rejected_key_list = translation_dict.keys() result_dict = {x: [] for x in rejected_key_list} error_dict = {x: [] for x in rejected_key_list} error = 0 # Browse all workflows to ease fixing this issue. for workflow in self.portal.portal_workflow.objectValues(): if workflow.__class__.__name__ == 'DCWorkflowDefinition': workflow_id = workflow.id workflow_dict = {} for state_id, state in workflow.states._mapping.items(): state_title = state.title translated_state_title = \ self.portal.Localizer.erp5_ui.gettext(state_title, lang=self.lang) if translated_state_title in rejected_key_list: result_dict[translated_state_title].append( (workflow_id, state_id, state_title)) # XXX To be improved not_used_workflow_id_list = [] for key, item_list in result_dict.items(): wrong_state_id_list = [x[1] for x in item_list] for workflow_id, wrong_state_id, state_title in item_list: if workflow_id not in not_used_workflow_id_list: workflow = self.portal.portal_workflow._getOb( workflow_id) state_id_list = [] for state_id in workflow.states._mapping.keys(): if (state_id in wrong_state_id_list) and \ (state_id != wrong_state_id): state_id_list.append(state_id) if len(state_id_list) != 0: error_dict[key].append( (workflow_id, wrong_state_id, state_title, state_id_list)) error = 1 if error: for key, item_list in error_dict.items(): if len(item_list) != 0: self.logMessage("\n'%s'" % key.encode('utf-8')) self.logMessage( '\t### Conflicting workflow with common states (ie, what user can see) ###' ) for item in item_list: # XXX Improve rendering self.logMessage( "\t%r\t%r\t'%s'\t%r" % \ item) self.logMessage( '\n\t### All conflicting workflows (ie, problems asking to happen) ###' ) for item in result_dict[key]: # XXX Improve rendering self.logMessage( "\t%r\t%r\t'%s'" % \ item) self.fail(self.message)
def checkWorkflowStateTitle(self, quiet=0, run=run_all_test): """ Test workflow state title translation. Check that using portal_catalog can not return strange results to the user. Each translation must be only related to one state ID. """ if not run: return self.message = "\n" translation_dict = {} workflow_tool = self.portal.portal_workflow for workflow_id in workflow_tool.objectIds(): workflow = workflow_tool._getOb(workflow_id) class_name = workflow.__class__.__name__ if class_name == "DCWorkflowDefinition": for state in workflow.states.items(): state_title = state[1].title state_id = state[0] msgid = getMessageIdWithContext(state_title, "state", workflow_id) translated_state_title = self.getTranslation(msgid) if translated_state_title is not None: if translation_dict.has_key(translated_state_title): translation_dict[translated_state_title].add(state_id) else: translation_dict[translated_state_title] = set([state_id]) for key, value in translation_dict.items(): if len(value) == 1: translation_dict.pop(key) if translation_dict != {}: # State ID has multiple translation associated, and it leads to # unexpected results for the user when using portal catalog. rejected_key_list = translation_dict.keys() result_dict = dict([(x, []) for x in rejected_key_list]) error_dict = dict([(x, []) for x in rejected_key_list]) error = 0 # Browse all workflows to ease fixing this issue. for workflow in self.portal.portal_workflow.objectValues(): if workflow.__class__.__name__ == "DCWorkflowDefinition": workflow_id = workflow.id workflow_dict = {} for state_id, state in workflow.states._mapping.items(): state_title = state.title translated_state_title = self.portal.Localizer.erp5_ui.gettext(state_title, lang=self.lang) if translated_state_title in rejected_key_list: result_dict[translated_state_title].append((workflow_id, state_id, state_title)) # XXX To be improved not_used_workflow_id_list = [] for key, item_list in result_dict.items(): wrong_state_id_list = [x[1] for x in item_list] for workflow_id, wrong_state_id, state_title in item_list: if workflow_id not in not_used_workflow_id_list: workflow = self.portal.portal_workflow._getOb(workflow_id) state_id_list = [] for state_id in workflow.states._mapping.keys(): if (state_id in wrong_state_id_list) and (state_id != wrong_state_id): state_id_list.append(state_id) if len(state_id_list) != 0: error_dict[key].append((workflow_id, wrong_state_id, state_title, state_id_list)) error = 1 if error: for key, item_list in error_dict.items(): if len(item_list) != 0: self.logMessage("\n'%s'" % key.encode("utf-8")) self.logMessage("\t### Conflicting workflow with common states (ie, what user can see) ###") for item in item_list: # XXX Improve rendering self.logMessage("\t%r\t%r\t'%s'\t%r" % item) self.logMessage("\n\t### All conflicting workflows (ie, problems asking to happen) ###") for item in result_dict[key]: # XXX Improve rendering self.logMessage("\t%r\t%r\t'%s'" % item) self.fail(self.message)
for m in Base_findStaticTranslationText(i, FUNC_NAME_LIST): add_message(m, portal_url.getRelativeContentURL(i)) # # Workflow # for i in context.portal_workflow.objectValues(): add_message(i.title_or_id(), portal_url.getRelativeContentURL(i)) state_value_list = i.getStateValueList() if not state_value_list: continue for s in state_value_list: if s.getTitle(): # adding a context in msg_id for more precise translation msg_id = getMessageIdWithContext(s.getTitle(), 'state', i.getId()) add_message(msg_id, portal_url.getRelativeContentURL(s)) # also use state title as msg_id for compatibility add_message(s.getTitle(), portal_url.getRelativeContentURL(s)) transition_value_list = i.getTransitionValueList() if not transition_value_list: continue for t in transition_value_list: if t.getActionName(): #adding a context in msg_id for more precise translation msg_id = getMessageIdWithContext(t.getActionName(), 'transition', i.getId()) add_message(msg_id, portal_url.getRelativeContentURL(t)) # also use action box name as msg_id for compatibility add_message(t.getActionName(), portal_url.getRelativeContentURL(t))