# -*- coding: utf-8 -*- import xlrd from django.core.management.base import BaseCommand from django.conf import settings from exposition.models import Exposition from import_xls.excel_settings import event_sett from django.db import IntegrityError CHINA_FILE = settings.MEDIA_ROOT+'/import/expo_china_ru.xlsx' GERMANY_FILE = settings.MEDIA_ROOT+'/import/expo_germany_ru.xlsx' # 391 row not imported(same url) ITALY_FILE = settings.MEDIA_ROOT+'/import/expo_italy_ru.xlsx' # moscow 3 exps F = settings.MEDIA_ROOT+'/import/exp.xlsx' LA_FILE = settings.MEDIA_ROOT+'/import/expo_la.xlsx' NA_EU_ASIA_FILE = settings.MEDIA_ROOT+'/import/expo_na_eu_ sa.xls' NA_EU_ASIA_FILE2 = settings.MEDIA_ROOT+'/import/expo_na_eu_ sa_part2.xls' RUSSIA_FILE = settings.MEDIA_ROOT+'/import/expo_russia.xls' class Command(BaseCommand): def handle(self, *args, **options): f = open(RUSSIA_FILE, 'r') 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)] labels = [label for label in row_list[0]] existing = 0 for row_number, row in enumerate(row_list[1246:]): #print(row_number) if row[0] != '': # in first column ids try: object = Exposition.objects.language('ru').get(id=int(row[0])) existing += 1 except ValueError: object = Exposition() object.translate('ru') except Exposition.DoesNotExist: object = Exposition(id= int(row[0])) object.translate('ru') existing += 1 else: # if id blank - its a new place object = Exposition() object.translate('ru') methods = [] for col_number, cell in enumerate(row): label = labels[col_number] setting = event_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 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 # in function we add language(need for relation fields) # and extra value from object (like for city need country) value = func(cell, 'ru', getattr(object, extra_value)) elif setting.get('bitfield'): value = func(object, cell, setting['label']) else: value = func(cell) if field_name == 'city': pass else: setattr(object, field_name, value) try: object.save() except IntegrityError: continue print('post save %s'% str(object)) for method in methods: func = method['func'] if method.get('purpose'): try: func(object, method['value'], method['purpose']) except: continue else: func(object, method['value'])