Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Worksheet(object):
- errors = ''
- rows_inserted_count = 0
- rows_updated_count = 0
- reversed_data_map = {}
- def __init__(self, file_contents, DATA_MAP, data_range, required_fields):
- self.ws = self.get_worksheet(file_contents)
- self.required_fields = required_fields
- self.DATA_MAP = DATA_MAP
- self.reverse_data_map()
- self.data = self.get_data(data_range)
- def add_custom_error(self, error, cell):
- self.errors += error + ' Пустая ячейка %s \n\r' % (cell)
- def add_error(self, cell):
- self.errors += 'Пустая ячейка %s \n\r' % (cell)
- def validate_fields(self, row):
- ''' Отдает список проблемных ячеек типа А, В, С, Е'''
- return [self.reversed_data_map[field] for field in self.required_fields if not row[field]]
- def make_error(self, problem_columns, row):
- ''' Записывает координаты проблемных мест на основе перебора всей строчки по ячейке'''
- for x in row:
- [self.add_error(x.column+str(x.row)) for column in problem_columns if column == x.column]
- def get_data(self, data_range):
- assert len(data_range) == 2, 'Неправильный формат диапазона'
- start, end = data_range
- raw_data = self.ws[start:end]
- data = []
- for row in raw_data:
- raw_dict = {}
- row_cells = {}
- for cell in row:
- raw_dict[cell.coordinate[0]] = cell.value
- # Переименование словаря в удобный для работы и чтения
- for x, y in zip(raw_dict, self.DATA_MAP): row_cells[self.DATA_MAP[y]] = raw_dict[x]
- problem_columns = self.validate_fields(row_cells)
- if problem_columns:
- self.make_error(problem_columns, row)
- if self.errors:
- break
- data.append(row_cells)
- return data
- @staticmethod
- def get_worksheet(file_contents):
- assert file_contents, 'Файл не найден'
- str_io = StringIO.StringIO()
- str_io.write(file_contents)
- str_io.seek(0)
- wb = openpyxl.load_workbook(str_io)
- return wb.worksheets[0]
- def reverse_data_map(self):
- ''' Зеркалит DATA_MAP чтобы по имени найти ячейку'''
- for key, val in self.DATA_MAP.iteritems():
- self.reversed_data_map[val] = key
- def import_devices(session, file_contents=None):
- '''Абонентские терминалы'''
- search_in_db_fields = ['device_type_id', 'organization_id']
- required_fields = ['number', 'imei', ] + search_in_db_fields # Обязательные поля
- # Буква ячеек и их имя в экселе
- DATA_MAP = {
- 'B': 'device_fullname', # Полное наименование и модель прибора
- 'C': 'imei', # Номер IMEI прибора
- 'D': 'sim_card', # № SIM карты установленной в прибор
- 'E': 'number', # Номер прибора, с которым он шлет данные напрямую (id)
- 'F': 'rnic_number', # Номер прибора, если данные ретранслируются
- 'G': 'ip_addr', # IP адрес и порт локального оператора при ретрансляции
- 'H': 'support_device_type_LO', # Протоколы, в которых могут ретранслировать с сервера ЛО
- 'I': 'support_device_type', # Протоколы, в которых может отправлять данные прибор
- 'J': 'device_type_id', # Протокол, в котором отправляет данные прибор
- 'K': 'organization_id', # Организация - владелец прибора
- 'L': 'mounter_organization_id', # Организация, обслуживающая прибор
- 'M': 'comment', # Особенности подключения прибора и его заведения в АИС УТ
- 'N': 'date_import' # Дата создания
- }
- data_range = ('B2', 'N2')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement