def _check_for_sheet_error(sheet, expected_headers, processed_sheets=Ellipsis): if sheet.worksheet.title in processed_sheets: raise BulkAppTranslationsException( _('Sheet "%s" was repeated. Only the first occurrence has been ' 'processed.') % sheet.worksheet.title) if not expected_headers: raise BulkAppTranslationsException( _('Skipping sheet "%s", could not recognize title') % sheet.worksheet.title) num_required_headers = 0 if is_modules_and_forms_sheet(sheet.worksheet.title): num_required_headers = 1 # type elif is_module_sheet(sheet.worksheet.title): num_required_headers = 2 # case property, list or detail elif is_form_sheet(sheet.worksheet.title): num_required_headers = 1 # label elif is_single_sheet(sheet.worksheet.title): num_required_headers = 4 # menu or form, case property, list or detail, label expected_required_headers = tuple(expected_headers[:num_required_headers]) actual_required_headers = tuple(sheet.headers[:num_required_headers]) if expected_required_headers != actual_required_headers: raise BulkAppTranslationsException( _('Skipping sheet {title}: expected first columns to be ' '{expected}').format( title=sheet.worksheet.title, expected=", ".join(expected_required_headers)))
def _get_text_node(self, translation_node, label_id): text_node = translation_node.find("./{f}text[@id='%s']" % label_id) if text_node.exists(): return text_node raise BulkAppTranslationsException( _("Unrecognized translation label {0}. " "That row has been skipped").format(label_id))
def _get_current_header_index(self, module_or_form_id, header): if module_or_form_id not in self.current_headers: raise BulkAppTranslationsException( _(f"Could not find a module or form with ID '{module_or_form_id}' in app '{self.app.name}'" )) for index, _column_name in enumerate( self.current_headers[module_or_form_id]): if _column_name == header: return index
def _compare_sheet(self, module_or_form_id, uploaded_rows, for_type): """ :param uploaded_rows: dict :param for_type: type of sheet, module_and_forms, module, form :return: diff generated by ghdiff or None """ columns_to_compare = COLUMNS_TO_COMPARE[ for_type] + self.lang_cols_to_compare header_indices = { column_name: self._get_current_header_index(module_or_form_id, column_name) for column_name in columns_to_compare } if None in header_indices.values(): raise BulkAppTranslationsException( _("Could not find column(s) '{}'").format(", ".join( [str(k) for k, v in header_indices.items() if v is None]))) if module_or_form_id not in self.current_rows: return self._missing_module_or_form_diff(for_type) if self.lang_prefix + self.app.default_language in self.lang_cols_to_compare: current_rows = self._filter_rows( for_type, self.current_rows[module_or_form_id], module_or_form_id) else: current_rows = self.current_rows[module_or_form_id] parsed_current_rows = [] parsed_uploaded_rows = [] for current_row in current_rows: parsed_current_rows.append([ current_row[header_indices[column_name]] for column_name in columns_to_compare ]) for uploaded_row in uploaded_rows: parsed_uploaded_rows.append([ uploaded_row.get(column_name) for column_name in columns_to_compare ]) return self._generate_diff(parsed_current_rows, parsed_uploaded_rows)
def _validate_sheet(self): lang_col = self.lang_prefix + self.lang_to_compare if lang_col not in self.uploaded_workbook.worksheets[0].fieldnames: raise BulkAppTranslationsException( _("Missing translations for {} in uploaded sheet").format( self.lang_to_compare))
def _check_for_shadow_form_error(self): if isinstance(self.form, ShadowForm): raise BulkAppTranslationsException(_('Form {index}, "{name}", is a shadow form. ' 'Cannot translate shadow forms, skipping.').format(index=self.form.id + 1, name=self.form.default_name()))