Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 30, 2010 17:29:05

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Поскольку прошлые темы зафлудились, разложу тут всё по полочкам.
———————
Класс 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', )

В чём проблема? =)



Отредактировано (Сен. 30, 2010 17:31:47)

Офлайн

#2 Сен. 30, 2010 17:43:22

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

LightOfMooN
ForbiddenAttribute: ('append', )
А список, к которому вы добавляете значение, на этот момент уже создан?



Офлайн

#3 Сен. 30, 2010 17:43:52

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

да
более того, оно работает, если добавить

prop = removeSecurityProxy(prop)
Но это не есть хорошо



Отредактировано (Сен. 30, 2010 17:47:33)

Офлайн

#4 Сен. 30, 2010 18:07:23

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Как по мне это не очень удачное решение хранить в дикте обьекты (может для этого лучше подойдет persistent.dict.PersistentDict)

Лучше всего будет сделать ваш класс TBoolInfo контейнером и хранить то что внутри props внутри TBoolInfo как контейнера, тогда и с правами не должно возникнуть проблем.



Офлайн

#5 Сен. 30, 2010 18:12:15

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Если бы проблема была из-за хранения объектов…

    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. Но это следующая ступень, уже после решения текущих проблем.



Отредактировано (Сен. 30, 2010 18:14:00)

Офлайн

#6 Сен. 30, 2010 18:52:08

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

                    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', )



Офлайн

#7 Сен. 30, 2010 19:23:39

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Сделайте пожалуйста следующее:

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

print type(prop.props)

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

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

Иначе накакого варианта кроме использования removeSecurityProxy я не вижу …



Отредактировано (Сен. 30, 2010 19:25:04)

Офлайн

#8 Сен. 30, 2010 19:30:55

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Sleepwalker
после строчки "prop.props.append('123')“ поставьте ”import pdb; pdb.set_trace()" и в трейсе выведите:
print type(prop.props)
Поставил перед, иначе код не проходит.
Вывело следующее:
<type ‘zope.security._proxy._Proxy’>



Офлайн

#9 Сен. 30, 2010 19:38:41

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Ну вот … По сути это list обернутый в security Proxy, а т.к. вы нигде для него в zcml не прописывали require permission … то и сделать с ним ничего нельзя. Поэтому советую пересмотреть свою архитектуру или используйте removeSecurityProxy



Офлайн

#10 Сен. 30, 2010 19:49:27

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB ForbiddenAttribute

Можно для него как-то прописать 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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version