From 354ae3ea31c663be55d6c0a98937f212d4b35838 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 9 Jul 2020 13:48:05 +0530 Subject: [PATCH 1/5] fix: Set default date format if not found --- frappe/core/doctype/data_import/importer.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index f1d0422458..619b083685 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -970,6 +970,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() From 4fe233827e058a6a07426021f381fa6eb7d90fde Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 9 Jul 2020 13:48:37 +0530 Subject: [PATCH 2/5] fix: Dont use df method in case df is a dict --- frappe/core/doctype/data_import/importer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index 619b083685..24c0516484 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -618,7 +618,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) From 6e336fa10eb2f74c261b5d82719f1e250e5e5e8f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 9 Jul 2020 13:48:57 +0530 Subject: [PATCH 3/5] fix: Set status before import --- frappe/core/doctype/data_import/importer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index 24c0516484..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): From 89d2c064a9eeba3f0d27cab9270a638a7226bfbd Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 9 Jul 2020 13:49:49 +0530 Subject: [PATCH 4/5] fix: Guess more date formats Can guess the following formats now: - 7 May 2020 - 1 Jan 2020 --- frappe/utils/data.py | 66 ++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 4870c2d7ba..07bd2e840a 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,45 @@ 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 + _date = None + _time = None + + 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() From 4eb4563de5dbf3f88d7698cd8fd78a4b9e4ed4b8 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 9 Jul 2020 13:57:09 +0530 Subject: [PATCH 5/5] fix: remove unused variables --- frappe/utils/data.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 07bd2e840a..d1b409d1fc 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1302,9 +1302,6 @@ def guess_date_format(date_string): # date_string doesnt look like date, it can have a time part too # split the date string into date and time parts - _date = None - _time = None - if " " in date_string: date_str, time_str = date_string.split(" ", 1)