До не давних пор исключение NotYet при работе утилиты IIntIds не доставляло мне особых проблем, всегда удавалось решить проблему малой кровью.
Но сегодня пришлось всерьёз заняться пакетом zope.intid, что бы решить проблему с этим исключением в большинстве случаев.
Вот какие пути решения проблемы я реализовал:
- маркер INotIntIds - объекты с этим маркером игнорируются утилитой IIntIds;
- отложенная регистрация объектов в утилите IIntIds - объекты для которых возникает исключение NotYet сохраняются в специальный словарик, и в момент, когда один из их предков всё же будет добавлен в ZODB, они будут зарегистрированы.
Не реализованной осталась только функция очистки словарика отложенных объектов от оставшегося там мусора (например в случае если объекты так и не были добавлены в ZODB).
Пока что вижу только два варианта для вызова этого функционала:
- при закрытии текущей транзакции - к сожалению беглый поиск по исходникам не обнаружил вызов в этот момент какого либо события, на которое можно было бы подцепиться;
- обработчик события IEndRequestEvent - минус этого решения в том, что придётся добавить в зависимости пакет zope.app.publication.
Как вариант рассматриваю условную регистрацию в zcml обработчика события IEndRequestEvent в случае если установлен пакет zope.app.publication. Тогда можно будет не добавлять его в зависимость, а способ вызова обработчика при отсутствии zope.app.publication оставить на совесть разработчика.
Если у кого то есть по этому поводу какие то соображения - буду рад их почитать.
PS: Про исключение NotYet я более подробно писал тут