Форум сайта python.su
Похоже, эта ошибка именно из-за того, что в список добавляется объект, к которому применён removeSecurityProxy
Отредактировано (Сен. 30, 2010 19:53:44)
Офлайн
Ну как прописать пермишн для листа я не заню (возможно и нельзя). А вот для чего создавать словарь списков с идентификаторами обьектов никак не пойму … Для этих целей есть же zope.app.intid (хотя кажись в bluebream это zope.intid). Она автоматически создаст индекс для всех обьектов которые вы будете создавать и для ускорения поиска ее и спользуют (в связке с zope.catalog)
Офлайн
В словаре лежат ключи промежуточных запросов и идентификаторы объектов. Идентификаторы объектов в свою очередь будут генерироваться через intid.
Пример структуры:
объект-свойство “размер”:
{'200см':, '500см:'}
Таким образом, если нам надо выпонить поиск по атрибуту “размер” равному “200”, мы напрямую запрашиваем данные по ключу и получаем список инентификаторов объекта, на основе которых и получим сами объекты.
Отредактировано (Сен. 30, 2010 22:13:00)
Офлайн
Кстати, почему-то не обратил внимания, но при добавлении объекта Thing он также добавляется в список prop.props, и всё работает идеально:
Вот код:
def createProp(self, object): // object - объект Thing
tbool = TBool()
namechooser = INameChooser(object)
number = namechooser.chooseName('atr', tbool)
tbool.name = self.name
tbool.description = self.description
tbool.value = False
object[number] = tbool
if self.props.has_key(tbool.value):
self.props[tbool.value].append(object) // self - объект TBoolInfo
else: self.props[tbool.value]=[object]
Офлайн
Есть предположение что в этом случае вы обращаетесь к props из самого класса (self.props) и соответственно он не обернут в security proxy. Хотя никогда не исследовал такого. Интересно будет проверить.
Офлайн
LightOfMooNТак для этого и созданны поисковыие индексы каталога. Они индексируют нужные вам аттрибуты и потом вы по ним выполняете поиск.
В словаре лежат ключи промежуточных запросов и идентификаторы объектов. Идентификаторы объектов в свою очередь будут генерироваться через intid.
Пример структуры:
объект-свойство “размер”:
{'200см':, '500см:'}
Таким образом, если нам надо выпонить поиск по атрибуту “размер” равному “200”, мы напрямую запрашиваем данные по ключу и получаем список инентификаторов объекта, на основе которых и получим сами объекты.
Офлайн
Но они индексируют глобально, а мне надо локально для каждого раздела, причём названия атрибутов могут совпадать, а типы атрибутов различаться.
Отредактировано (Сен. 30, 2010 23:04:24)
Офлайн
LightOfMooNОни индексируют так, как вы напишете.
Но они индексируют глобально, а мне надо локально для каждого раздела, причём названия атрибутов могут совпадать, а типы атрибутов различаться.
Офлайн
В конечном итоге проблему решил добавлением небольших методов в класс:
def addThing(self, val, obj):
obj = removeSecurityProxy(obj)
self.props=self.props.copy()
self.props[val].append(obj)
def delThing(self, val, obj):
obj = removeSecurityProxy(obj)
self.props=self.props.copy()
self.props[val].remove(obj)
Офлайн