Latest posts on BB редактирование объекта topichttps://python.su/forum/topic/8625/2010-09-30T20:34:29+03:00Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T20:34:29+03:00LightOfMooN56796Проблема с сохранением решилась следующей конструкцией:<br/><div class="code"><pre>prop.props=prop.props.copy()</pre></div>P.S. Почему-то мне кажется, что это не есть хорошо в плане потребления ресурсов
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T14:49:16+03:00regall56747IThing наследуется от IContainer. Разделите их. Сделайте IThing(IThingSchema, IContainer), где IThingSchema - то, что у вас сейчас.<br/>Потом для класса Thing установите права на IReadContainer, и IWriteContainer, которые нужны для считывания и записи в контейнер.
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T14:48:03+03:00LightOfMooN56746<div class="code"><pre> else:<br/> prop.props[self.context.value] = ['123']</pre></div>>> prop.props = <br/>ForbiddenAttribute: ('__setitem__', {})<br/>Так что, думаю, Thing не при делах)
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T14:45:04+03:00LightOfMooN56745класс Thing<br/>интерфейс:<br/><div class="code"><pre>class IThing(IContainer):<br/><br/> name = TextLine(<br/> title=u"name",<br/> default=u"",<br/> required=True)<br/> cost = Float(<br/> title=u"cost",<br/> default=0.0,<br/> required=True)</pre></div>класс:<br/><div class="code"><pre>class Thing(BTreeContainer):<br/> <br/> implements(IThing)<br/> <br/> name=u""<br/> cost=0</pre></div>zcml:<br/><div class="code"><pre><interface<br/> interface=".interfaces.IThing"<br/> type="zope.app.content.interfaces.IContentType"/><br/><br/><class class=".thing.Thing"><br/><require<br/> interface=".interfaces.IThing"<br/> permission="zope.Public"<br/> /><br/><require<br/> set_schema=".interfaces.IThing"<br/> permission="zope.Public"<br/> /><br/></class></pre></div>
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T14:27:33+03:00Sleepwalker567431. Когда пишете “prop.props = _props”, то уже “prop._p_changed = 1” не нужно, т.к. идет явный сетатр.<br/><br/>2. Не понятно что вы делаете этой строчкий кода:<br/><div class="code"><pre>ObjectModifiedEvent(prop)</pre></div>В таком случае должно быть:<br/><div class="code"><pre>from zope.event import notify<br/><br/>notify(ObjectModifiedEvent(prop))</pre></div>3. Что за класс intershop.content.thing.thing.Thing. Мне почему-то кажется что на него неверно права проставлены … Можно увидеть zcml и интерфейс класса??
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T14:13:52+03:00LightOfMooN56742<div class="code"><pre> prop = removeSecurityProxy(prop)<br/> _props = copy(prop.props)<br/> print lastvalue<br/> if self.context.__parent__ in _props.get(lastvalue, []):<br/> _props[lastvalue].remove(self.context.__parent__)<br/> if _props.has_key(self.context.value):<br/> _props[self.context.value].append(self.context.__parent__)<br/> else:<br/> _props[self.context.value] = [self.context.__parent__]<br/> prop.props = _props<br/> prop._p_changed = 1<br/> ObjectModifiedEvent(prop)</pre></div>classmeta <class ‘intershop.content.props.tbool.tbool.TBool_Info’> <br/>self <ZODB.serialize.ObjectWriter instance at 0x033A99B8><br/> <br/>state {'description': u'\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e1', ‘name’: u'\u0441\u0432\u043e\…<br/>u0439\u0441\u0442\u0432\u043e1', ‘props’: {False: }} <br/><br/><br/>classmeta <class ‘intershop.content.props.tbool.tbool.TBool_Info’> <br/>self <ZODB.serialize.ObjectWriter instance at 0x033A99B8><br/> <br/>state {'description': u'\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e1', ‘name’: u'\u0441\u0432\u043e\…<br/>u0439\u0441\u0442\u0432\u043e1', ‘props’: {False: }} <br/><br/><br/><< self._p.clear_memo()<br/> self._p.dump(classmeta)<br/> self._p.dump(state)<br/> self._file.truncate()<br/> return self._file.getvalue()>> self._p.dump(state)<br/>UnpickleableError: Cannot pickle <type ‘zope.security._proxy._Proxy’> objects<br/><br/>Не может взять атрибут?
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T13:48:55+03:00regall56738Если у вашего объекта есть атрибут-словарь или список, при внесении изменений внутри списка, система не поймет, что изменения произошли, так как ссылка на этот <br/>атрибут осталась старая<br/><div class="code"><pre>from copy import copy<br/>_props = copy(prop.props)<br/>.... # Делаем все необходимое с _props<br/>prop.props = _props</pre></div>
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-30T13:42:19+03:00LightOfMooN56736кусок кода:<br/><div class="code"><pre> if self.context.__parent__ in prop.props.get(lastvalue, []):<br/> prop.props[lastvalue].remove(self.context.__parent__)<br/> if prop.props.has_key(self.context.value):<br/> prop.props[self.context.value].append(self.context.__parent__)<br/> else:<br/> prop.props[self.context.value] = [self.context.__parent__]<br/> prop._p_changed = 1<br/> ObjectModifiedEvent(prop)</pre></div>Не смотря на “prop._p_changed = 1” и “ObjectModifiedEvent(prop)” всеравно не сохраняет =(<br/><br/>Объект персистентный (class TBool_Info(Persistent))
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T14:28:48+03:00Sleepwalker56625Еще бывают случаи когда мы изменяем у обьекта поле типа list.<br/><br/>Тогда еле написать (считае что type(value) - list ):<br/><div class="code"><pre> self.context.value.append(some_object)</pre></div>не сработает (теоретически :) ).<br/><br/>Следует в таких случаях явно говорить что обьект изменен:<br/><div class="code"><pre>self.context._p_changed = 1</pre></div>Ну это в том случае есле вы работаете с ZODB.
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T13:42:48+03:00regall56622<blockquote><em>LightOfMooN</em><br/>ект не персистентентный</blockquote>Было предположение =)
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T13:37:16+03:00LightOfMooN56621нашёл проблему..<br/>тупанул нипадецки<br/>объект не персистентентный
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T13:34:00+03:00regall56620Можно узнать, что такое self.context, и что такое self.context.values()?
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T13:27:56+03:00LightOfMooN56618проверил, ошибся.<br/><div class="code"><pre>self.context.value = True</pre></div>так значения тоже не сохраняются
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T13:03:43+03:00LightOfMooN56617А почему напрямую transaction.commit() не работает?<br/><br/><div class="code"><pre>from zope.event import notify<br/>from zope.lifecycleevent import ObjectModifiedEvent<br/><br/> for i in self.context.values():<br/> i.name = u'hello world'<br/> notify(ObjectModifiedEvent(i))</pre></div>так тоже не работает =(<br/>после перезагрузки возвращаются предыдущие значения
Веб-технологии :: Zope/Plone/Bluebream :: BB редактирование объекта
2010-09-28T13:02:03+03:00regall56616Попробуйте notify<br/><div class="code"><pre>from zope.event import notify<br/>...<br/>for i in self.context.values():<br/> i.name = u'hello world'<br/> notify(ObjectModifiedEvent(i))</pre></div>