diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2014-12-18 19:57:25 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2014-12-18 19:57:25 +0100 |
commit | 9c523c4b7e10195ff21edc9b9375ecf43e16e182 (patch) | |
tree | 32143192425358f34c097d1931505c7b3d976684 /ishtar_common/data_importer.py | |
parent | 95c6c54e27cb24fc66760b595be984376b1abf86 (diff) | |
download | Ishtar-9c523c4b7e10195ff21edc9b9375ecf43e16e182.tar.bz2 Ishtar-9c523c4b7e10195ff21edc9b9375ecf43e16e182.zip |
Manage cli output for importation.
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r-- | ishtar_common/data_importer.py | 59 |
1 files changed, 49 insertions, 10 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 1d768c6b0..98132e8ff 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -63,14 +63,14 @@ class ImportFormater(object): def report_error(self, *args): return - def init(self, vals): + def init(self, vals, output=None): try: lst = iter(self.formater) except TypeError: lst = [self.formater] for formater in lst: if formater: - formater.check(vals) + formater.check(vals, output) def post_process(self, obj, context, value, owner=None): raise NotImplemented() @@ -89,7 +89,7 @@ class Formater(object): def format(self, value): return value - def check(self, values): + def check(self, values, output=None): return class UnicodeFormater(Formater): @@ -197,7 +197,9 @@ class StrChoiceFormater(Formater): def prepare(self, value): return unicode(value).strip() - def check(self, values): + def check(self, values, output=None): + if not output or output == 'silent': + return msgstr = unicode(_(u"Choice for \"%s\" is not available. "\ u"Which one is relevant?\n")) for idx, choice in enumerate(self.choices): @@ -269,7 +271,7 @@ class Importer(object): def __init__(self, skip_first_line=False, reference_header=None, check_col_num=False, test=False, check_validity=True, - history_modifier=None): + history_modifier=None, output=None): """ * skip_first_line must be set to True if the data provided has got an header. @@ -291,13 +293,22 @@ class Importer(object): self._initialized = False self._defaults = self.DEFAULTS.copy() self.history_modifier = history_modifier + self.output = output if not self.history_modifier: # get the first admin self.history_modifier = User.objects.filter(is_superuser=True ).order_by('pk')[0] - def initialize(self, table): - # copy vals in columns + def initialize(self, table, output='silent'): + """ + copy vals in columns and initialize formaters + * output: + - 'silent': no associations + - 'cli': output by command line interface and stocked in the database + - 'db': output on the database with no interactive association (further + exploitation by web interface) + """ + assert output in ('silent', 'cli', 'db') vals = [] for idx_line, line in enumerate(table): if (self.skip_first_line and not idx_line): @@ -310,7 +321,7 @@ class Importer(object): vals[idx_col].append(val) for idx, formater in enumerate(self.line_format): if formater: - formater.init(vals[idx]) + formater.init(vals[idx], output) self._initialized = True def importation(self, table): @@ -376,8 +387,27 @@ class Importer(object): raise ImporterError(self.ERRORS['header_check'], type=ImporterError.HEADER) self.now = datetime.datetime.now() + start = datetime.datetime.now() + total = len(table) + if self.output: + sys.stdout.write("\n") for idx_line, line in enumerate(table): - self._line_processing(idx_line, line) + if self.output: + left = None + if idx_line > 10: + ellapsed = datetime.datetime.now() - start + time_by_item = ellapsed/idx_line + if time_by_item: + left = ((total - idx_line)*time_by_item).seconds + txt = "\r* %d/%d" % (idx_line+1, total) + if left: + txt += " (%d seconds left)" % left + sys.stdout.write(txt) + sys.stdout.flush() + try: + self._line_processing(idx_line, line) + except ImporterError, msg: + self.errors.append((idx_line, None, msg)) def _line_processing(self, idx_line, line): if (self.skip_first_line and not idx_line): @@ -789,9 +819,18 @@ class Importer(object): for k in create_dict.keys(): if type(create_dict[k]) == dict: create_dict.pop(k) + defaults = {} + if 'history_modifier' in create_dict: + defaults = {'history_modifier':create_dict.pop('history_modifier')} try: - obj, created = cls.objects.get_or_create(**create_dict) + try: + dct = create_dict.copy() + dct['defaults'] = defaults + obj, created = cls.objects.get_or_create(**create_dict) + except: + created = False + obj = cls.objects.filter(**create_dict).all()[0] for attr, value in m2ms: getattr(obj, attr).add(value) except IntegrityError: |