# -*- coding: utf-8 -*- import common.excel from place.models import Place, PlaceType from supplier.models import Supplier class LogEntry(object): """ Common log entry for models import. # REVIEW: после первой строки docsting должна быть пустая строка unstable - can be splitted to several classes. """ CREATED = 'created' UPDATE = 'updated' ERROR = 'error' WARNING = 'warning' # REVIEW: не надо выравнивать по одной колонке знаки равенства, вокруг равенства должен быть только *один* пробел def __init__(self, type, msg = ''): self.type = type self.msg = msg # REVIEW: между методами должно быть две строки, также см. про один пробел выше def add_related_model(self, model_cls, model_instance): # REVIEW: зачем ты передаёшь model_cls, его можно узнать из model_instance, хотя я сейчас не совсем понимаю, вообще, что этот класс делает. attr_name = type(model_cls) == str and model_cls or model_cls.__name__ # REVIEW: нужно использовать isinstance(model_cls, str), а не type() == if hasattr(self, attr_name): raise Exception("Multiple models for logs not supported.") setattr(self,attr_name, model_instance) # REVIEW: одна пустая строка - мало. Пробел после запятой забыл. def process_sites_file(file_path, task_id = None): # REVIEW: в именованных аргументов пробелы вокруг знака равенства не нужны """ Загрузка мест. Если task_id is not None также происходит добавление мест в задание """# REVIEW: после докстринга должна быть пустая строка log = [] spec = { 'code' : 0, 'type' : 1, 'supplier' : 2, 'latitude' : 3, 'longitude' : 4, 'address' : 5, 'description' : 6 } # REVIEW: жесть, читай выше про выравнивания try: for row_num, row_data in excel.iterate(file_path, spec): row_data['type'] = PlaceType.objects.get(name=row_data['type']) row_data['supplier'] = Supplier.objects.get(name=row_data['supplier']) # REVIEW: ислючения DoesNotExists надо прямо здесь обрабатывать, а то у тебя, получается, что любая ошибка весь процесс парсинга убивает # добавляем/обновляем места try: place = Place.objects.get(code=row_data['code']) #todo check and update if changed logEntry = LogEntry(LogEntry.UPDATED); # REVIEW: нафиг тут точка с запятой? Имя неправлиьно, для переменных не нужен camel case except Place.DoesNotExist: place = Place(**row_data) place.save() logEntry = LogEntry(LogEntry.CREATED); logEntry.add_related_model(Place, place) # добавляем/обновляем места в задании if task_id is not None: pass #todo log.append(logEntry) pass # REVIEW: pass лишний except: # REVIEW: голый except - зло. # todo: log exception message log.append(LogEntry(LogEntry.ERROR), 'ошибка при обработке.') # REVIEW, а чего строка не юникодная? return log