Форум сайта python.su
Поскольку прошлые темы зафлудились, разложу тут всё по полочкам.
———————
Класс Thing
———————
Интерфейс:
class IThingSchema(Interface):
name = TextLine(
title=u"name",
default=u"",
required=True)
cost = Float(
title=u"cost",
default=0.0,
required=True)
class IThing(IThingSchema):
pass
class Thing(BTreeContainer):
implements(IThing, IThingSchema)
name=u""
cost=0
<interface
interface=".interfaces.IThing"
type="zope.app.content.interfaces.IContentType"/>
<interface
interface=".interfaces.IThingSchema"
type="zope.app.content.interfaces.IContentType"/>
<class class=".thing.Thing">
<require
interface=".interfaces.IThing"
permission="zope.Public"
/>
<require
set_schema=".interfaces.IThingSchema"
permission="zope.Public"
/>
<require
interface="zope.container.interfaces.IReadContainer"
permission="zope.Public"
/>
<require
interface="zope.container.interfaces.IWriteContainer"
permission="zope.Public"
/>
</class>
class ITBoolInfoSchema(Interface):
name = TextLine(
title=u"",
default=u"",
required=True)
description = TextLine(
title=u"",
default=u"",
required=False)
props = Dict(
title=u"",
key_type = TextLine(title=u""),
value_type = List(title=u"", value_type = TextLine()),
required=False)
class ITBoolInfo(ITBoolInfoSchema):
def createProp(self, object):
pass
class TBoolInfo(Persistent):
implements(ITBoolInfo, ITBoolInfoSchema)
name=u""
description=u""
props={}
<interface
interface=".interfaces.ITBoolInfoSchema"
type="zope.app.content.interfaces.IContentType"/>
<interface
interface=".interfaces.ITBoolInfo"
type="zope.app.content.interfaces.IContentType"/>
<class class=".tbool.TBoolInfo">
<require
interface=".interfaces.ITBoolInfo"
permission="zope.Public"
/>
<require
set_schema=".interfaces.ITBoolInfoSchema"
permission="zope.Public"
/>
<require
interface="zope.container.interfaces.IReadContainer"
permission="zope.Public"
/>
<require
interface="zope.container.interfaces.IWriteContainer"
permission="zope.Public"
/>
</class>
def updateProps(self, lastvalue):
for pc in self.getPropcontainers(self.context.__parent__.__parent__,[]):
for prop in pc.values(): // prop - объект TBoolInfo
if prop.name == self.context.name:
if self.context.__parent__ in prop.props.get(lastvalue, []): // self.context.__parent__ - объект Thing
prop.props[lastvalue].remove(self.context.__parent__)
if prop.props.has_key(self.context.value):
prop.props[self.context.value].append(self.context.__parent__)
else:
prop.props[self.context.value] = [self.context.__parent__]
Отредактировано (Сен. 30, 2010 17:31:47)
Офлайн
LightOfMooNА список, к которому вы добавляете значение, на этот момент уже создан?
ForbiddenAttribute: ('append', )
Офлайн
да
более того, оно работает, если добавить
prop = removeSecurityProxy(prop)
Отредактировано (Сен. 30, 2010 17:47:33)
Офлайн
Как по мне это не очень удачное решение хранить в дикте обьекты (может для этого лучше подойдет persistent.dict.PersistentDict)
Лучше всего будет сделать ваш класс TBoolInfo контейнером и хранить то что внутри props внутри TBoolInfo как контейнера, тогда и с правами не должно возникнуть проблем.
Офлайн
Если бы проблема была из-за хранения объектов…
def updateProps(self, lastvalue):
for pc in self.getPropcontainers(self.context.__parent__.__parent__,[]):
for prop in pc.values():
if prop.name == self.context.name:
if self.context.__parent__ in prop.props.get(lastvalue, []):
prop.props[lastvalue].remove(self.context.__parent__)
if prop.props.has_key(self.context.value):
prop.props[self.context.value].append('123')
else:
prop.props[self.context.value] = ['123']
Отредактировано (Сен. 30, 2010 18:14:00)
Офлайн
if prop.props.has_key(self.context.value):
_props = prop.props.get(self.context.value)
_props.append(self.context.__parent__)
prop.props = _props
Офлайн
Сделайте пожалуйста следующее:
К примеру после строчки "prop.props.append('123')“ поставьте ”import pdb; pdb.set_trace()" и в трейсе выведите:
print type(prop.props)
Как я подозреваю результатом будет какой-то SecurityProxied обьект права на который вы не давали.
В случае когда делать TBoolInfo как контейнер, prop даст вам обьект для которого вы сможете дать права на чтение/запись, но это мое предположение …
Иначе накакого варианта кроме использования removeSecurityProxy я не вижу …
Отредактировано (Сен. 30, 2010 19:25:04)
Офлайн
SleepwalkerПоставил перед, иначе код не проходит.
после строчки "prop.props.append('123')“ поставьте ”import pdb; pdb.set_trace()" и в трейсе выведите:
print type(prop.props)
…
Офлайн
Ну вот … По сути это list обернутый в security Proxy, а т.к. вы нигде для него в zcml не прописывали require permission … то и сделать с ним ничего нельзя. Поэтому советую пересмотреть свою архитектуру или используйте removeSecurityProxy
Офлайн
Можно для него как-то прописать permission?
Архитектуру сложно изменить, поскольку как я уже говорил, там будет словарь списков с идентификаторами объектов. Суть его в ускорении поиска. Т.е. если у объекта “стул” размер равен “200”, то по ключу сразу можно достать список идентификаторов всех стульев с размером “200”, и по нему уже сформировать список объектов (образно).
Использование removeSecurityProxy вызывает другую ошибку при изменении объекта:
if prop.props.has_key(self.context.value):
prop.props[self.context.value].append(self.context.__parent__)
prop.name='123'
Офлайн