Personal tools
You are here: Home Статьи FAQ & HOWTO Что делать, если буфер обмена мешает жить?
Document Actions

Что делать, если буфер обмена мешает жить?

by cray last modified 2007-08-31 17:13

Проблема возникает, преимущественно при отладке сайтов, и выглядит как внезапно возникающее на ровном месте исключение KeyError, NotFound или что-то в этом роде. При просмотре логов выясняется, что при отображении страницы Zope делает какое-то обращение к давно не существующему продукту, причем почему и зачем вы понять не можете, а у других ошибка не воспроизводится - что и является характерным признаком того, что у вас какая-то личная размолвка с буфером обмена.

Бывает, залогинишься в инстанцию и хоть руби ее хоть режь - System Crash да System Crash. Может быть все поломалось, а может буфер обмена проявляет неуместную инициативу. Не будем останавливаться на том, как избежать возникновения проблемы вообще (так как и сами не до конца понимаем еще), расскажем кратко в чем причина и как усмирить злопамятный сервис. При выполнении операций копирования и переноски объектов в стандартном виде контейнера, информация об этом объекте копируется в т.н. буфер обмена. После чего при каждом входе в любой другой контейнер проверяется возможность вставки этого объекта (по ограниченияем на контент-тип или другого рода). Если объект оказывается недоступен, причем, недоступен каким-то нехорошим образом, то операция проваливается и вид не отображается.

Как бороться - стереть данные из буфера обмена. Наверно есть нормальный и простой способ, но нижеследующий совет дал человек непростой, для которого Zope3-отладчик роднее вебинтерфейса. Проблему можно решить, почистив клипборд принципала, соответствующего данному пользователю. Для этого запускаем debugzope и выполняем следующий код:

 from zope.component import getUtility
 from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
 from zope.copypastemove.interfaces import IPrincipalClipboard
 import transaction
 IPrincipalClipboard(getUtility(IPrincipalAnnotationUtility, context=root).getAnnotationsById('<id принципала>')).clearContents()
 transaction.commit()

Как узнать
зависит от способа авторизации. Для менеджера его можно посмотреть в etc/principals.zcml (по умолчанию -- zope.manager), в других случаях обратитесь к местному авторитету :).

Powered by Plone CMS, the Open Source Content Management System