diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index f1d0422458..c37b80c9f5 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -59,6 +59,7 @@ class Importer: frappe.flags.in_import = True frappe.flags.mute_emails = self.data_import.mute_emails + self.data_import.db_set("status", "Pending") self.data_import.db_set("template_warnings", "") def import_data(self): @@ -618,7 +619,7 @@ class Row: def validate_value(self, value, col): df = col.df if df.fieldtype == "Select": - select_options = df.get_select_options() + select_options = [d for d in (df.options or '').split('\n') if d] if select_options and value not in select_options: options_string = ", ".join([frappe.bold(d) for d in select_options]) msg = _("Value must be one of {0}").format(options_string) @@ -970,6 +971,13 @@ class Column: elif self.df.fieldtype in ("Date", "Time", "Datetime"): # guess date format self.date_format = self.guess_date_format_for_column() + if not self.date_format: + self.date_format = '%Y-%m-%d' + self.warnings.append({ + 'col': self.column_number, + 'message': _("Date format could not determined from the values in this column. Defaulting to yyyy-mm-dd."), + 'type': 'info' + }) def as_dict(self): d = frappe._dict() diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 4870c2d7ba..d1b409d1fc 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1258,6 +1258,8 @@ def guess_date_format(date_string): r"%d.%m.%y", r"%m.%d.%y", r"%y.%m.%d", + r"%d %b %Y", + r"%d %B %Y", ] TIME_FORMATS = [ @@ -1269,41 +1271,42 @@ def guess_date_format(date_string): r"%I:%M %p", ] - date_string = date_string.strip() + def _get_date_format(date_str): + for f in DATE_FORMATS: + try: + # if date is parsed without any exception + # capture the date format + datetime.datetime.strptime(date_str, f) + return f + except ValueError: + pass - _date = None - _time = None - - if " " in date_string: - _date, _time = date_string.split(" ", 1) - else: - _date = date_string - - date_format = None - time_format = None - - for f in DATE_FORMATS: - try: - # if date is parsed without any exception - # capture the date format - datetime.datetime.strptime(_date, f) - date_format = f - break - except ValueError: - pass - - if _time: + def _get_time_format(time_str): for f in TIME_FORMATS: try: # if time is parsed without any exception # capture the time format - datetime.datetime.strptime(_time, f) - time_format = f - break + datetime.datetime.strptime(time_str, f) + return f except ValueError: pass - full_format = date_format - if time_format: - full_format += " " + time_format - return full_format + date_format = None + time_format = None + date_string = date_string.strip() + + # check if date format can be guessed + date_format = _get_date_format(date_string) + if date_format: + return date_format + + # date_string doesnt look like date, it can have a time part too + # split the date string into date and time parts + if " " in date_string: + date_str, time_str = date_string.split(" ", 1) + + date_format = _get_date_format(date_str) or '' + time_format = _get_time_format(time_str) or '' + + if date_format and time_format: + return (date_format + ' ' + time_format).strip()