astoonспасибо astoon за наставления, исправил на форуме и в п. 1).
misha111Вы это делаете через
Теперь обратная ситуация, когда из вложенных объектов нужно вызвать методы родительского объекта.
класс2.__parent__.метод_класса1
misha111Наверное, не весьма удачным, по крайней мере складывается такое впечатление, лично у меня за 2 года плотной работы с Zope3 таких проблем не возникало, может стоит пересмотреть архитектуру, или хотя бы привести концептуально то, что есть у вас, а тут уж помогут =) ?
Такая накрученность не потому, что я любитель накрутить, просто пытаюсь переделать проект таким образом, возможно, не весьма удачным.
misha111Немного не так. Класс есть класс, объект класса создается в момент, когда его добавили в ZODB через ZMI. Объекты в ZODB сохраняются как pickle (почитать про пакет cPickle) и просто “поднимаются” оттуда, если в виде явно, например с помощью getUtility, или неявно, если объект является контекстом вида, присутствует (технически вид - это мультиадаптер: context, request адаптируются к XHTML коду); или если создана собственная директива, которая создает глобальный объект класса, который создается при выполнении директивы и остается в памяти все время, пока живет сервер.
создаются, насколько я понял именно в момент обращения к какой либо странице.
misha111Тоже нет. ZPT страницы такие же персистентные объекты базы данных, как и например объекты класса1, на которые можно создать виды (например директивой <page … />) и которые в этом случае являются контекстом, в случае если <page .. /> регистрируется на конкретный интерфейс, то это уже не ZPT, а вид объекта.
И естественно во всём этом управляют zpt страницы
misha111Вообще ничего не понял, какая задача, перечитав пост три раза, можешь описать задачу, которая стоит или, если это коммерческая тайна, хотя бы описать как то доходчивее, что ли … =)
От такое накрученное я выдумал, если у кого нибудь конечно есть более простое решение - буду чрезвычайно рад выслушать.
regallда да, я заметил неправильность в формулировке, исправил. Классы, к счастью, описаны статически, динамические только объекты статических классов.
создаются, насколько я понял именно в момент обращения к какой либо странице.
misha111Ну, тут интересует, как в виде для zpt страницы получен “класс1”.
и из zpt страници попробовал вызвать view.класс1.метод1() - пишет что запрешённый аттрибут метод1
from zope.security.proxy import removeSecurityProxy
класс1 = removeSecurityProxy(класс1)
from zope.proxy import removeAllProxies
класс1 = removeAllProxies(класс1)
misha111Естественно, это обусловлено политикой безопасности фреймворка
если не назначать прав, то пишет forbidden attribute на method2
parent_publication = Choice(vocabulary = class1_publications)
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from zope.app.intid.interfaces import IIntIds
def class1_publications():
intid = getUtility(interface = IIntIds)
.... # получаем все публикации класс1 в переменную all_pubs
return SimpleVocabulary(Simpleterm(id = intid.getId(pub), title = pub.title, value = intid.getId(pub)) for pub in all_pubs)
regallДа, так и было, вкладывал объекты друг в друга. Решили что этим заниматься не нужно, и весь функционал, из за которого делалось вложение повыносил из публикуемых классов, и собрал в не публикуемые, которые подключаются к публикуемым и всё хорошо бы, но при вынесении методов обнаружились такие методы, которые используются в как минимум двух публикуемых классах, и вызываются из zpt страниц. Я решил собрать такие методы в один класс и подключать при необходимости. Но опять же проблема
Естественно, это обусловлено политикой безопасности фреймворка
P.S. Насколько я понял, вам просто важно связать два контент-объекта. Вложение объектов - это не самый хороший подход. Лучше их связывать или через персистентные __weakref__'ы или по id, например добавив в схему класс2 поле
regallОписанный вами способ про персистентные __weakref__'ы или по id, прочитал. Он мне показал сложноватым, и ещё неизвестно какие подводные камни могут появиться, буду это пробовать если вообще ничего по проще не получится.
если не назначать прав, то пишет forbidden attribute на method2