diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-02-27 20:44:52 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-06-17 13:21:27 +0200 |
commit | 86c03a98d11e93880b4568776e0939113a92a707 (patch) | |
tree | e07ad2e91e2544f7b2d61e8f3f653fdda26bfd52 /ishtar_common/data_importer.py | |
parent | 52f442699a72ff5d0341a7d15d5b966a3cc2bd60 (diff) | |
download | Ishtar-86c03a98d11e93880b4568776e0939113a92a707.tar.bz2 Ishtar-86c03a98d11e93880b4568776e0939113a92a707.zip |
Migrate to python 3 - Clean old migrations and some old scripts
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r-- | ishtar_common/data_importer.py | 160 |
1 files changed, 77 insertions, 83 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 7ece668c6..7088eee08 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -108,7 +108,7 @@ class ImportFormater(object): def init_db_target(self, user=None): pass - def __unicode__(self): + def __str__(self): return self.field_name def report_succes(self, *args): @@ -214,8 +214,8 @@ class UnicodeFormater(Formater): def format(self, value): try: - if type(value) != unicode: - value = unicode(value.strip()) + if type(value) != str: + value = str(value.strip()) vals = [] for v in value.split(u'\n'): v = v.strip() @@ -285,17 +285,17 @@ class InseeFormater(Formater): try: int(code) except ValueError: - raise ValueError(unicode(self.ERROR).format(value)) + raise ValueError(str(self.ERROR).format(value)) while len(code) < 5: code = "0" + code if len(exp) > 2: - raise ValueError(unicode(self.ERROR).format(value)) + raise ValueError(str(self.ERROR).format(value)) elif len(exp) == 1: return code try: datetime.datetime.strptime(exp[1], '%Y') except ValueError: - raise ValueError(unicode(self.ERROR).format(value)) + raise ValueError(str(self.ERROR).format(value)) return code + u"-" + exp[1] @@ -357,7 +357,7 @@ class StrChoiceFormater(Formater, ChoiceChecker): self.many_split = many_split self.import_instance = None for key, value in self.choices: - value = unicode(value) + value = str(value) if not self.strict: value = slugify(value) if value not in self.equiv_dict: @@ -380,7 +380,7 @@ class StrChoiceFormater(Formater, ChoiceChecker): if key in self.equiv_dict: continue v = target_key.value - if self.model and v and type(v) in (int, unicode): + if self.model and v and type(v) in (int, str): try: v = self.model.objects.get(txt_idx=v) except: @@ -388,21 +388,21 @@ class StrChoiceFormater(Formater, ChoiceChecker): self.equiv_dict[key] = v def prepare(self, value): - return unicode(value).strip() + return str(value).strip() def _get_choices(self, comment=''): msgstr = comment + u" - " - msgstr += unicode(_(u"Choice for \"%s\" is not available. " + msgstr += str(_(u"Choice for \"%s\" is not available. " u"Which one is relevant?\n")) idx = -1 for idx, choice in enumerate(self.choices): msgstr += u"%d. %s\n" % (idx + 1, choice[1]) idx += 2 if self.create: - msgstr += unicode(_(u"%d. None of the above - create new")) % idx \ + msgstr += str(_(u"%d. None of the above - create new")) % idx \ + u"\n" idx += 1 - msgstr += unicode(_(u"%d. None of the above - skip")) % idx + u"\n" + msgstr += str(_(u"%d. None of the above - skip")) % idx + u"\n" return msgstr, idx def check(self, values, output=None, comment='', choose_default=False, @@ -452,7 +452,7 @@ class StrChoiceFormater(Formater, ChoiceChecker): msg = msgstr % value sys.stdout.write(msg.encode('utf-8')) sys.stdout.write("\n>>> ") - res = raw_input() + res = input() try: res = int(res) except ValueError: @@ -468,8 +468,8 @@ class StrChoiceFormater(Formater, ChoiceChecker): elif self.create and res == len(self.choices): self.equiv_dict[value] = self.new(base_value) self.choices.append((self.equiv_dict[value].pk, - unicode(self.equiv_dict[value]))) - self.new_keys[value] = unicode(self.equiv_dict[value]) + str(self.equiv_dict[value]))) + self.new_keys[value] = str(self.equiv_dict[value]) else: self.equiv_dict[value] = None if self.equiv_dict[value] and self.db_target: @@ -540,12 +540,12 @@ class TypeFormater(StrChoiceFormater): self.import_instance = import_instance if self.import_instance: for item in model.objects.all(): - self.choices.append((item.pk, unicode(item))) + self.choices.append((item.pk, str(item))) for key in item.get_keys(importer=import_instance): self.equiv_dict[key] = item def prepare(self, value): - return slugify(unicode(value).strip()) + return slugify(str(value).strip()) def add_key(self, obj, value, importer=None): obj.add_key(slugify(value), force=True, importer=importer) @@ -600,13 +600,14 @@ class FileFormater(Formater): os.mkdir(base_dir) filename = base_dir + os.sep + \ u".".join(items[:-1]) + u'.' + items[-1] + try: - with open(filename, 'w') as f: + with open(filename, 'wb') as f: with zp.open(value) as z: f.write(z.read()) - f = open(filename, 'r') + f = open(filename, 'rb') my_file = File(f) - # manualy set the file size because of an issue with TempFile + # manually set the file size because of an issue with TempFile my_file.size = os.stat(filename).st_size return my_file except KeyError: @@ -639,7 +640,7 @@ class StrToBoolean(Formater, ChoiceChecker): self.dct[key] = v def prepare(self, value): - value = unicode(value).strip() + value = str(value).strip() if not self.strict: value = slugify(value) return value @@ -649,9 +650,9 @@ class StrToBoolean(Formater, ChoiceChecker): if (not output or output == 'silent') and not choose_default: return msgstr = comment + u" - " - msgstr += unicode(_( - u"Choice for \"%s\" is not available. " - u"Which one is relevant?\n")) + msgstr += str(_( + "Choice for \"%s\" is not available. " + "Which one is relevant?\n")) msgstr += u"1. True\n" msgstr += u"2. False\n" msgstr += u"3. Empty\n" @@ -669,7 +670,7 @@ class StrToBoolean(Formater, ChoiceChecker): msg = msgstr % value sys.stdout.write(msg.encode('utf-8')) sys.stdout.write("\n>>> ") - res = raw_input() + res = input() try: res = int(res) except ValueError: @@ -680,7 +681,7 @@ class StrToBoolean(Formater, ChoiceChecker): self.dct[value] = False else: self.dct[value] = None - self.new_keys[value] = unicode(self.dct[value]) + self.new_keys[value] = str(self.dct[value]) if output == 'db' and self.db_target: from ishtar_common.models import TargetKey for missing in self.missings: @@ -811,7 +812,7 @@ class Importer(object): options = formater.model.__module__ + '.' + \ formater.model.__name__ elif formater_name == 'UnicodeFormater': - options = unicode(formater.max_length or '') + options = str(formater.max_length or '') elif formater_name == 'DateFormater': options = formater.date_formats[0] formater_model, created = \ @@ -840,7 +841,7 @@ class Importer(object): if q.count(): cls_name = q.all()[0].name return ImporterError( - unicode(self.ERRORS['improperly_configured']).format(cls_name)) + str(self.ERRORS['improperly_configured']).format(cls_name)) def _get_does_not_exist_in_db_error(self, model, data): from ishtar_common.models import ImporterModel @@ -852,8 +853,7 @@ class Importer(object): [u"{}: {}".format(k, data[k]) for k in data] ) raise ImporterError( - unicode(self.ERRORS['does_not_exist_in_db'] - ).format(cls_name, values)) + str(self.ERRORS['does_not_exist_in_db']).format(cls_name, values)) def __init__(self, skip_lines=0, reference_header=None, check_col_num=False, test=False, history_modifier=None, @@ -1033,15 +1033,15 @@ class Importer(object): elif force_value and value: if concat_str and key in current_data \ and current_data[key]: - current_data[key] = unicode(current_data[key]) + \ - concat_str + unicode(value) + current_data[key] = str(current_data[key]) + \ + concat_str + str(value) else: current_data[key] = value elif key not in current_data or not current_data[key]: current_data[key] = value elif concat_str: - current_data[key] = unicode(current_data[key]) +\ - concat_str + unicode(value) + current_data[key] = str(current_data[key]) +\ + concat_str + str(value) if force_new: current_data['__force_new'] = True elif key not in current_data: @@ -1102,7 +1102,7 @@ class Importer(object): sys.stdout.flush() try: results.append(self._line_processing(idx_line, line)) - except ImporterError, msg: + except ImporterError as msg: self.errors.append((idx_line, None, msg)) return results @@ -1130,7 +1130,7 @@ class Importer(object): self.current_csv_line = line n = datetime.datetime.now() - logger.debug('%s - Processing line %d' % (unicode(n - self.now), + logger.debug('%s - Processing line %d' % (str(n - self.now), idx_line)) self.now = n n2 = n @@ -1151,7 +1151,7 @@ class Importer(object): if self.c_errors: return n = datetime.datetime.now() - logger.debug('* %s - Cols read' % (unicode(n - n2))) + logger.debug('* %s - Cols read' % (str(n - n2))) n2 = n if self.test: return @@ -1183,11 +1183,11 @@ class Importer(object): setattr(obj, k, data['defaults'][k]) obj.save() n = datetime.datetime.now() - logger.debug('* %s - Item saved' % (unicode(n - n2))) + logger.debug('* %s - Item saved' % (str(n - n2))) n2 = n for formater, value in self._throughs: n = datetime.datetime.now() - logger.debug('* %s - Processing formater %s' % (unicode(n - n2), + logger.debug('* %s - Processing formater %s' % (str(n - n2), formater.field_name)) n2 = n data = {} @@ -1199,7 +1199,7 @@ class Importer(object): through_cls = formater.through if formater.through_unicity_keys: data['defaults'] = {} - for k in data.keys(): + for k in list(data.keys()): if k not in formater.through_unicity_keys \ and k != 'defaults': data['defaults'][k] = data.pop(k) @@ -1270,7 +1270,7 @@ class Importer(object): val = val.replace(NEW_LINE_BREAK, '\n') self.errors.append( (idx_line + 1, idx_col + 1, - unicode(self.ERRORS['regex_not_match']) + val)) + str(self.ERRORS['regex_not_match']) + val)) c_row.append("") return val_group = [] @@ -1288,7 +1288,7 @@ class Importer(object): func = formater.formater if type(func) in (list, tuple): func = func[idx_v] - if not callable(func) and type(func) in (unicode, str): + if not callable(func) and type(func) == str: func = getattr(self, func) values = [v] @@ -1334,10 +1334,10 @@ class Importer(object): value = func.format(v, archive=self.archive) else: value = func.format(v) - except ValueError, e: + except ValueError as e: if formater.required: self.c_errors = True - self.errors.append((idx_line + 1, idx_col + 1, e.message)) + self.errors.append((idx_line + 1, idx_col + 1, str(e))) c_values.append('') return if formater.value_format and value is not None and value != "": @@ -1357,10 +1357,9 @@ class Importer(object): printed_values = [value] try: # don't reunicode - unicoded values - c_values.append(u" ; ".join([v for v in printed_values])) + c_values.append(" ; ".join([v for v in printed_values])) except TypeError: - c_values.append(u" ; ".join([unicode(v) - for v in printed_values])) + c_values.append(" ; ".join([str(v) for v in printed_values])) if value is None and formater.required: self.c_errors = True self.errors.append((idx_line + 1, idx_col + 1, @@ -1449,7 +1448,7 @@ class Importer(object): vals.append(default_dict.copy()) # # manage multiple values - for key in val.keys(): + for key in list(val.keys()): if type(val[key]) in (list, tuple): for idx, v in enumerate(val[key]): if len(vals) <= idx: @@ -1475,7 +1474,7 @@ class Importer(object): self.history_modifier m2m_m2ms = [] c_c_path = c_path[:] - for k in v.keys(): + for k in list(v.keys()): if k not in field_names: continue self.get_field(model, k, v, m2m_m2ms, c_c_path, @@ -1518,15 +1517,14 @@ class Importer(object): **v) except FieldError as e: raise ImporterError( - unicode( - _(u"Importer configuration error: " - u"\"{}\".")).format(e.message)) + str( + _("Importer configuration error: " + "\"{}\".")).format(e)) except Exception as e: - msg = unicode( - _(u"Import error: {} - \"{}\".") - ).format(model, e.message.decode('utf-8')) - e.message = msg - raise e + msg = str( + _("Import error: {} - \"{}\".") + ).format(model, e) + raise e(msg) else: get_v = v.copy() if 'defaults' in get_v: @@ -1603,16 +1601,15 @@ class Importer(object): try: field_object = cls._meta.get_field(attribute) except FieldDoesNotExist: - raise ImporterError(unicode( - _(u"Importer configuration error: field \"{}\" does not exist " - u"for {}.")).format(attribute, cls._meta.verbose_name)) + raise ImporterError(str( + _("Importer configuration error: field \"{}\" does not exist " + "for {}.")).format(attribute, cls._meta.verbose_name)) if field_object.many_to_many: try: m2ms += self._get_field_m2m(attribute, data, c_path, new_created, field_object) except Exception as e: - self.errors.append( - (self.idx_line, None, e.message.decode('utf-8'))) + self.errors.append((self.idx_line, None, str(e))) return if not hasattr(field_object, 'rel') or not field_object.rel: return @@ -1680,17 +1677,17 @@ class Importer(object): new_created) except (ValueError, IntegrityError, FieldDoesNotExist) as e: try: - message = e.message.decode('utf-8') + message = str(e) except (UnicodeDecodeError, UnicodeDecodeError): message = '' try: - data = unicode(data) + data = str(data) except UnicodeDecodeError: data = '' raise ImporterError( "Erreur d'import %s %s, contexte : %s, erreur : %s" - % (unicode(cls), unicode("__".join(path)), - unicode(data), message)) + % (str(cls), str("__".join(path)), + str(data), message)) create_dict = copy.deepcopy(data) for k in create_dict.keys(): @@ -1740,7 +1737,7 @@ class Importer(object): else: # manage UNICITY_KEYS - only level 1 if not path and self.UNICITY_KEYS: - for k in dct.keys(): + for k in list(dct.keys()): if k not in self.UNICITY_KEYS \ and k != 'defaults': if dct[k]: @@ -1774,8 +1771,8 @@ class Importer(object): return _(u"* the query match more than 10 " u"results*"), False else: - return unicode(_(u" or ")).join( - [unicode(item) for item in q.all()] + return str(_(u" or ")).join( + [str(item) for item in q.all()] ), False else: self.updated_objects.append( @@ -1805,8 +1802,8 @@ class Importer(object): if val is None or val == '': updated_dct[k] = new_val elif k in self.concats \ - and type(val) == unicode \ - and type(new_val) == unicode: + and type(val) == str \ + and type(new_val) == str: updated_dct[k] = val + u"\n" + new_val else: for k in dct['defaults']: @@ -1830,12 +1827,12 @@ class Importer(object): obj.imports.add(self.import_instance) except (ValueError, IntegrityError, DatabaseError, GEOSException) as e: - raise IntegrityError(e.message) + raise IntegrityError(str(e)) except cls.MultipleObjectsReturned as e: created = False if 'defaults' in dct: dct.pop('defaults') - raise IntegrityError(e.message) + raise IntegrityError(str(e)) # obj = cls.objects.filter(**dct).all()[0] for attr, value in m2ms: values = [value] @@ -1905,26 +1902,23 @@ class Importer(object): obj.fix() except IntegrityError as e: try: - message = e.message.decode('utf-8') + message = str(e) except (UnicodeDecodeError, UnicodeDecodeError): message = '' try: - data = unicode(data) + data = str(data) except UnicodeDecodeError: data = '' raise ImporterError( u"Erreur d'import %s %s, contexte : %s, erreur : %s" - % (unicode(cls), unicode("__".join(path)), - unicode(data), message)) + % (str(cls), str("__".join(path)), + str(data), message)) return obj, created def _format_csv_line(self, values, empty=u"-"): - try: - return u'"' + u'","'.join( - [(v and unicode(v).replace('"', '""')) or empty - for v in values]) + u'"' - except UnicodeDecodeError: - return "" + return u'"' + u'","'.join( + [(v and str(v).replace('"', '""')) or empty + for v in values]) + u'"' def _get_csv(self, rows, header=[], empty=u"-"): if not rows: |