Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 29, 2010 00:18:21

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

BB удаление из списка

    def updateProps(self, lastvalue):
name = self.context.name
for pc in self.getPropcontainers(self.context.__parent__.__parent__,[]):
for prop in pc.values():
if prop.name == name:
list=prop.props[lastvalue]
list.remove(self.context.__parent__)
prop.props[lastvalue]=list
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__]
Выдаёт следующую ошибку:
ForbiddenAttribute: ('remove', )

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



Офлайн

#2 Сен. 29, 2010 01:12:56

astoon
От:
Зарегистрирован: 2007-04-09
Сообщения: 335
Репутация: +  2  -
Профиль   Отправить e-mail  

BB удаление из списка

Проблема в другом месте, не в приведенном куске коде.
Впрочем, можете поставить zope.security.proxy.getObject(…).remove(…)



Офлайн

#3 Сен. 30, 2010 12:53:21

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

BB удаление из списка

так работает:

prop = removeSecurityProxy(prop)
prop.props[self.context.value] = self.context.__parent__
а вот так нет:
prop.props[self.context.value] = self.context.__parent__
Вызывает
>> prop.props =
ForbiddenAttribute: ('__setitem__', {})

Опять что-то с пермишнами не так?

prop - это объект TBool_Info
props - атрибут вида {:}, т.е. словаря со списками по ключу

В интерфейсах объявление абсолютно дурацкое, чисто чтоб система отвалила. Может из-за этого?
class ITBool_Info(Interface):

name = TextLine(
title=u"",
default=u"",
required=True)
description = TextLine(
title=u"",
default=u"",
required=False)
props = TextLine(
required=False)
Вот класс:
class TBool_Info(Persistent):

implements(ITBool_Info)

name=u""
description=u""
props={}



Офлайн

#4 Сен. 30, 2010 13:45:33

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

BB удаление из списка

1. props у вас, вроде как словарь, но в интерфейсе почему-то TextLine. Естественно, у TextLine нет атрибута __setitem__. Сделайте в интерфейсе Dict.
2. Название класса TBook_Info уж никак не по pep8 =).



Офлайн

#5 Сен. 30, 2010 14:32:54

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

BB удаление из списка

    props = Dict(
value_type=List(),
required=False)
                    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(self.context.__parent__)
else:
prop.props[self.context.value] = [self.context.__parent__]
>> prop.props =
ForbiddenAttribute: ('__setitem__', {})

                    prop = removeSecurityProxy(prop)
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(self.context.__parent__)
else:
prop.props[self.context.value] = [self.context.__parent__]
Работает идеально =(



Офлайн

#6 Сен. 30, 2010 14:52:13

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

BB удаление из списка

переделывание поля на Dict привело к ошибке при создании экземпляра объекта:
ComponentLookupError: ((<zope.schema._field.Dict object at 0x03568310>, <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D1%8B/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B%20%D0%BF%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8F/propcontainer/add_tboolinfo>), <InterfaceClass zope.formlib.interfaces.IInputWidget>, u'')

Поэтому и ставил TextLine =)



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

Офлайн

#7 Сен. 30, 2010 14:58:30

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

BB удаление из списка

LightOfMooN
переделывание поля на Dict привело к ошибке при создании экземпляра объекта:
key_type и value_type указали? Если нет, то естетственно, что BB не может найти соответствующий виджет

Пример:
props = Dict(title = '', key_type = TextLine(), value_type = TextLine())



Офлайн

#8 Сен. 30, 2010 15:05:42

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

BB удаление из списка

да, указал:

    props = Dict(
title=u"",
key_type=TextLine(),
value_type=List(),
required=False)
Ошибка вылазиет всеравно
ComponentLookupError: ((<zope.schema._field.Dict object at 0x033747D0>, <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D1%8B/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B%20%D0%BF%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8F/propcontainer/add_tboolinfo>), <InterfaceClass zope.formlib.interfaces.IInputWidget>, u'')



Офлайн

#9 Сен. 30, 2010 15:09:31

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

BB удаление из списка

В List тоже value_type надо указывать.



Офлайн

#10 Сен. 30, 2010 15:18:03

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

BB удаление из списка

    props = Dict(
title=u"",
key_type = TextLine(),
value_type = List(value_type = TextLine()),
required=False)
ComponentLookupError: ((<zope.schema._field.Dict object at 0x03411190>, <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D1%8B/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B%20%D0%BF%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8F/propcontainer/add_tboolinfo>), <InterfaceClass zope.formlib.interfaces.IInputWidget>, u'')



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version