[ppa-qps-devel] Field Types Config
Brought to you by:
ods
From: Alexey M. <co...@py...> - 2004-06-08 02:02:47
|
Денис описал новую возможную конфигурацию для полей: http://ppa.python.ru/QpsDocs_2fToDo_2fFieldTypesConfig Мне она понравилось, но от позорных itemFieldsOrder, stream.allItemFields и так далее пора избавляться. Предлагаю ввести в обиход некий дополнительный объект, контроллер конфига полей, например: class Fields(object): "Storage for table fields" def __init__(self, config): self.__config = config def order(self): "Returns a list of ordered field names" return [fn for fn, ft in self.__config] def getStorable(self): "Returns a Fields object for storable fields" return Fields(self.filterByAttribute('store')) def getDeletable(self): "Returns a Fields object for deletable fields" return Fields(self.filterByAttribute('delete')) def getIDField(self): "Returns ID field type" return dict(self.__config)['id'] def filterByAttribute(self, attr): "Filters config by ft attribute" return [(fn, ft) for fn, ft in self.__config if hasattr(ft, attr)] def __repr__(self): return repr(self.__config) def __iter__(self): return iter(self.__config) И хранить его в Stream.fields (или itemFields, см. ниже). В Item же завести кешированный атрибут, по умолчанию берущий конфигурацию полей из потока, и вдальнейшем везде использовать его вместо item.stream.allItemFields: def fields(self): return stream.fields fields = qUtils.CachedAttribute(fields) Ибо это добавляет изрядной гибкости. Атрибуты itemFieldsOrder, allItemFields, itemExtFields ликвидировать. Остался еще allStreamFields. Stream.streamFields? Или все же обычные поля в Stream.itemFields, а allStreamFields в Stream.fields? Вот еще одна полезность: def fields(self): """Returns Fields object initialized with new-style config, calculated from current configuration""" config = [] itemFieldsOrder = ['id']+self.itemFieldsOrder for fn in itemFieldsOrder: config.append((fn, self.allItemFields[fn])) # work around about fields not listed in itemFieldsOrder for fn, ft in self.allItemFields.items(): if fn not in itemFieldsOrder: logger.info("WARNING! field %s for table %s is not listed " \ "in itemFieldsOrder", fn, self.tableName) config.append((fn, ft)) return Fields(config) fields = qUtils.CachedAttribute(fields) -- co...@py... CRV-RIPN |