Найти - Пользователи
Полная версия: BB ForbiddenAttribute
Начало » Zope/Plone/Bluebream » BB ForbiddenAttribute
1 2
LightOfMooN
Поскольку прошлые темы зафлудились, разложу тут всё по полочкам.
———————
Класс 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
ZCML:
<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>
———————
Класс TBoolInfo:
———————
Интерфейс
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={}
ZCML:
<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__]
Функция вызывает ошибку:
>> prop.props.append(self.context.__parent__)
ForbiddenAttribute: ('append', )

В чём проблема? =)
regall
LightOfMooN
ForbiddenAttribute: ('append', )
А список, к которому вы добавляете значение, на этот момент уже создан?
LightOfMooN
да
более того, оно работает, если добавить
prop = removeSecurityProxy(prop)
Но это не есть хорошо
Sleepwalker
Как по мне это не очень удачное решение хранить в дикте обьекты (может для этого лучше подойдет persistent.dict.PersistentDict)

Лучше всего будет сделать ваш класс TBoolInfo контейнером и хранить то что внутри props внутри TBoolInfo как контейнера, тогда и с правами не должно возникнуть проблем.
LightOfMooN
Если бы проблема была из-за хранения объектов…
    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']
Даже так не работает. Та же ошибка:
>> prop.props.append('123')
ForbiddenAttribute: ('append', )

P.S. а про объекты - да. В будущем там будут лежать только uid. Но это следующая ступень, уже после решения текущих проблем.
LightOfMooN
                    if prop.props.has_key(self.context.value):
_props = prop.props.get(self.context.value)
_props.append(self.context.__parent__)
prop.props = _props
>> _props.append(self.context.__parent__)
ForbiddenAttribute: ('append', )
Sleepwalker
Сделайте пожалуйста следующее:

К примеру после строчки "prop.props.append('123')“ поставьте ”import pdb; pdb.set_trace()" и в трейсе выведите:

print type(prop.props)

Как я подозреваю результатом будет какой-то SecurityProxied обьект права на который вы не давали.

В случае когда делать TBoolInfo как контейнер, prop даст вам обьект для которого вы сможете дать права на чтение/запись, но это мое предположение …

Иначе накакого варианта кроме использования removeSecurityProxy я не вижу …
LightOfMooN
Sleepwalker
после строчки "prop.props.append('123')“ поставьте ”import pdb; pdb.set_trace()" и в трейсе выведите:
print type(prop.props)
Поставил перед, иначе код не проходит.
Вывело следующее:
<type ‘zope.security._proxy._Proxy’>
Sleepwalker
Ну вот … По сути это list обернутый в security Proxy, а т.к. вы нигде для него в zcml не прописывали require permission … то и сделать с ним ничего нельзя. Поэтому советую пересмотреть свою архитектуру или используйте removeSecurityProxy
LightOfMooN
Можно для него как-то прописать permission?
Архитектуру сложно изменить, поскольку как я уже говорил, там будет словарь списков с идентификаторами объектов. Суть его в ускорении поиска. Т.е. если у объекта “стул” размер равен “200”, то по ключу сразу можно достать список идентификаторов всех стульев с размером “200”, и по нему уже сформировать список объектов (образно).

Использование removeSecurityProxy вызывает другую ошибку при изменении объекта:
                    if prop.props.has_key(self.context.value):
prop.props[self.context.value].append(self.context.__parent__)
prop.name='123'
UnpickleableError: Cannot pickle <type ‘zope.security._proxy._Proxy’> objects
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB