Skip to content
Snippets Groups Projects
Commit c75e6204 authored by Marko Samastur's avatar Marko Samastur
Browse files

Bunch of fixes for processing spreadsheets

parent 4348d82e
Branches
No related tags found
No related merge requests found
...@@ -19,6 +19,7 @@ django-jenkins==0.17.0 ...@@ -19,6 +19,7 @@ django-jenkins==0.17.0
openpyxl==2.2.3 openpyxl==2.2.3
jsonfield==1.0.3 jsonfield==1.0.3
python-dateutil==2.4.2
# ======================================================================== # ========================================================================
......
import dateutil.parser
from decimal import Decimal from decimal import Decimal
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
...@@ -54,7 +55,7 @@ def order_columns(profile_columns, first_row=None): ...@@ -54,7 +55,7 @@ def order_columns(profile_columns, first_row=None):
col_map = get_columns_map(profile_columns) col_map = get_columns_map(profile_columns)
for label in first_row: for label in first_row:
try: try:
columns.append(col_map['label']) columns.append(col_map[label])
except: except:
error_msg = _('Unknown column: %s') % label error_msg = _('Unknown column: %s') % label
raise SheetImportException(error_msg) raise SheetImportException(error_msg)
...@@ -70,15 +71,20 @@ def get_fields_and_types(columns): ...@@ -70,15 +71,20 @@ def get_fields_and_types(columns):
return fields, types return fields, types
def parse_date(value):
return dateutil.parser.parse(value, dayfirst=True).date()
def convert_row(orig_values, types, row_number): def convert_row(orig_values, types, row_number):
converters = { converters = {
'text': lambda x: x, 'text': lambda x: x,
'date': lambda x: x, 'date': parse_date,
'integer': lambda x: int(x), 'integer': lambda x: int(x),
'number': lambda x: Decimal(x) 'number': lambda x: Decimal(x)
} }
row = [] row = []
for value_type, value in zip(types, orig_values): for value_type, value in zip(types, orig_values):
if value_type not in converters: if value_type not in converters:
err_msg = _(u"Unknown data type '%s' on row %d ") % \ err_msg = _(u"Unknown data type '%s' on row %d ") % \
(value_type, row_number) (value_type, row_number)
...@@ -92,19 +98,29 @@ def convert_row(orig_values, types, row_number): ...@@ -92,19 +98,29 @@ def convert_row(orig_values, types, row_number):
return row return row
def normalize_row(raw_row):
# Unify difference between CSV and openpyxl cells
row = []
for val in raw_row:
value = val.value if hasattr(val, "value") else val
row.append(value)
return row
def process_rows(spreadsheet, profile): def process_rows(spreadsheet, profile):
file_format = profile.get('format') file_format = profile.get('format')
rows = get_rows_iterator(spreadsheet, file_format) rows = get_rows_iterator(spreadsheet, file_format)
# If skip_header, then use profile's order of columns, otherwise # If skip_header, then use profile's order of columns, otherwise
# use header line to check mapping and define order # use header line to check mapping and define order
first_row = rows.next() if not profile['skip_header'] else None first_row = rows.next() if profile['skip_header'] else None
columns = order_columns(profile['columns'], first_row) columns = order_columns(profile['columns'], normalize_row(first_row))
fields, types = get_fields_and_types(columns) fields, types = get_fields_and_types(columns)
objects = [] objects = []
for i, row in enumerate(rows): for i, raw_row in enumerate(rows):
row = normalize_row(raw_row)
row_num = i + 2 if first_row else i + 1 row_num = i + 2 if first_row else i + 1
values = convert_row(row, types, row_num) values = convert_row(row, types, row_num)
obj = dict(zip(fields, values)) obj = dict(zip(fields, values))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment