diff --git a/import_xls/admin.py b/import_xls/admin.py index 2de38d12..eaca4eab 100644 --- a/import_xls/admin.py +++ b/import_xls/admin.py @@ -27,13 +27,17 @@ class ImportView(FormView): """ abstract class """ - template_name = 'import.html' + template_name = 'admin/import templates/import.html' def form_valid(self, form): - form.save_file() + errors = form.save_file() + messages.success(self.request, 'Success') + context = self.get_context_data() + context['import_errors'] = errors + context['form'] = form + return render_to_response(self.template_name, context) - return super(ImportView, self).form_valid(form) class ExportView(FormView): diff --git a/import_xls/excel_settings.py b/import_xls/excel_settings.py index 94cab89f..4a905ada 100644 --- a/import_xls/excel_settings.py +++ b/import_xls/excel_settings.py @@ -280,7 +280,7 @@ place_exp_sett = { u'Тип':{u'field': u'type', u'func': to_type}, u'Краткое описание':{u'field': u'main_title', u'func': unicode}, u'Страна':{u'field': u'country', u'func': to_country}, - u'Город':{u'field': u'city', u'func': to_city, 'extra_values': 'country'}, + u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'}, u'Описание':{u'field': u'description', u'func': unicode}, u'Адрес':{u'field': u'adress', u'func': unicode}, u'Тел.':{u'field': u'phone', u'func': to_phone}, diff --git a/import_xls/import_forms.py b/import_xls/import_forms.py index 27f83514..674c30fa 100644 --- a/import_xls/import_forms.py +++ b/import_xls/import_forms.py @@ -106,6 +106,7 @@ def google_address(address): response = {'address' : results[0].get('formatted_address'), 'lat' : results[0]['geometry']['location']['lat'], 'lng' : results[0]['geometry']['location']['lng']} + #return response return json.dumps(response) else: return '' @@ -113,11 +114,11 @@ def google_address(address): from djutils.decorators import async from djutils.queue.decorators import queue_command - +# place class ImportPlaceExpositionForm(ImportForm): model = PlaceExposition settings = place_exp_sett - #@async + def save_file(self): data = self.cleaned_data lang = data['language'] @@ -125,86 +126,113 @@ class ImportPlaceExpositionForm(ImportForm): book = xlrd.open_workbook(file_contents=f.read()) sheet = book.sheet_by_index(0) row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)] + model = self.model labels = [label for label in row_list[0]] + errors = [] for row_number, row in enumerate(row_list): + if row_number == 0: + continue + if row[0] != '': + # in first column id + try: + obj = self.model.objects.language(lang).get(id=int(row[0])) + except ValueError: + obj = self.model() + obj.translate(lang) + + except self.model.DoesNotExist: + obj = self.model(id= int(row[0])) + obj.translate(lang) + else: + # if id blank - its a new event + obj = model() + obj.translate(lang) + # ---------------- # go through all rows in file - if row_number > 0: - # first field is label - if row[0] != '': - # in first column ids + methods = [] + for col_number, cell in enumerate(row): + # go through row cells + # field name current cell + label = labels[col_number] + setting = place_exp_sett.get(label) + + if setting is None: + continue + + if setting.get('method'): + if cell != "": + methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')}) + continue + + field_name = setting['field'] + + func = setting.get('func') + if func is None: + continue + + extra_value = setting.get('extra_values') + if extra_value is not None: + # if setting has extra value then + # it is some field like city, theme, tag + # that has relation and can be created + + # in function we add language(need for relation fields) + # and extra value from object (like for city need country) try: - object = self.model.objects.language(lang).get(id=int(row[0])) - except ValueError: - object = self.model() - object.translate(lang) + extra = getattr(obj, extra_value) + except Exception: + continue + value = func(cell, 'ru', extra) - except self.model.DoesNotExist: - object = self.model(id= int(row[0])) - object.translate(lang) else: - # if id blank - its a new event - object = self.model() - object.translate(lang) - methods = [] - for col_number, cell in enumerate(row): - # go through row cells - # field name current cell - label = labels[col_number] - setting = place_exp_sett.get(label) + value = func(cell) - if setting is None: - continue + try: + setattr(obj, field_name, value) + except ValueError, e: + continue - if setting.get('method'): - if cell != "": - methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')}) + if field_name !='adress': + try: + setattr(obj, field_name, value) + except ValueError: continue - field_name = setting['field'] + else: + #gaddress = google_address(value) + setattr(obj, 'address', google_address(value)) + if not obj.url: + obj.url = translit_with_separator(obj.name) + try: + obj.save() - func = setting.get('func') - if func is not None: - extra_value = setting.get('extra_values') - if extra_value is not None: - # if setting has extra value then - # it is some field like city, theme, tag - # that has relation and can be created + except IntegrityError, e: - # in function we add language(need for relation fields) - # and extra value from object (like for city need country) - value = func(cell, lang, getattr(object, extra_value)) - else: - value = func(cell) - if field_name =='adress': - setattr(object, 'address', google_address(value)) - setattr(object, field_name, value) + error = str(e) + if typical_errors.get(error): + error = typical_errors[error] + if error.startswith('(1062, "Duplicate entry') and error.endswith('for key \'url\'")'): + error = u'Место с таким названием или урлом уже существует' + errors.append([obj.name, error]) + continue - try: - object.save() + for method in methods: + func = method['func'] + if method.get('purpose'): + try: + func(obj, method['value'], method['purpose']) + except Exception, e: + continue + else: + func(obj, method['value']) + + return errors - except IntegrityError: - continue - #url = object.url + translit_with_separator(object.city.name) - #object.url = url - #object.save() - - for method in methods: - func = method['func'] - if method.get('purpose'): - try: - func(object, method['value'], method['purpose']) - except: - continue - else: - try: - func(object, method['value']) - except: - continue class ImportPlaceConferenceForm(ImportForm): @@ -217,6 +245,7 @@ typical_errors = {'(1048, "Column \'city_id\' cannot be null")':u'Неправи '(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата окончания', '(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата начала'} +# event class ImportEventForm(ImportForm): """ extended form for importing one type of event diff --git a/import_xls/utils.py b/import_xls/utils.py index de52aac3..b664fc16 100644 --- a/import_xls/utils.py +++ b/import_xls/utils.py @@ -62,12 +62,12 @@ def to_country(value): return None def to_city(value, lang, country): + try: # get city by name #objects = get_translation_aware_manager(City) # except IndexError if no found city = City.objects.filter(translations__name=value, country=country)[0] - # print(city) return city.id except IndexError: print('---------city error------------') @@ -154,14 +154,19 @@ def get_audience(value): return ', '.join(new_list) return '' - +import types def save_logo(obj, path): if not path: return None file_name = path.split('/')[-1] logo_path = obj.logo.field.upload_to + if isinstance(logo_path, types.FunctionType): + logo_path = logo_path(obj, obj.url) + logo_path = '/'.join(logo_path.split('/')[:-1]) + full_path = settings.MEDIA_ROOT + logo_path + try: alt_name = get_alternative_filename(full_path, file_name) except UnicodeEncodeError: diff --git a/templates/admin/import templates/import.html b/templates/admin/import templates/import.html index c67a3cf0..a6de3a3f 100644 --- a/templates/admin/import templates/import.html +++ b/templates/admin/import templates/import.html @@ -62,6 +62,26 @@ {% endfor %} {% endif %} + {% if import_errors %} +
+ + + + + + + + + {% for error in import_errors %} + + + + + {% endfor %} + +
СобытиеОшибка
{{ error.0 }}{{ error.1 }}
+
+ {% endif %} + {% endblock %} \ No newline at end of file