пятница, 4 февраля 2011 г.

О использовании reference_catalog

 # Общая часть
from Products.PythonScripts.standard import html_quote
from Products.CMFCore.utils import getToolByName
request = container.REQUEST
RESPONSE =  request.RESPONSE
urltool = getToolByName(context, "portal_url")
portal = urltool.getPortalObject()
catalogtool = getToolByName(context, "portal_catalog")
lcurses = [i.getObject() for i in catalogtool.searchResults(portal_type = 'Tema')]
refCatalog = getToolByName(portal, 'reference_catalog')
uid_catalog=getToolByName(portal, 'uid_catalog')
#Пример 1
for item in lcurses:
    refs = refCatalog.getReferences(item, 'content_source')
    print item.title_or_id()+'********************'
    for i in refs:
        print i.targetUID, i.sourceUID, i.relationship
        print uid_catalog(UID=i.targetUID), uid_catalog(UID=i.sourceUID)
        a=[k.getObject().getId() for k in uid_catalog(UID=i.targetUID)][0]
        b=[k.getObject().getId() for k in uid_catalog(UID=i.sourceUID)][0]
        print a, b
    print "##############################"
#Пример 2
    for i in refs:
        print i.targetUID, i.sourceUID, i.relationship
        print refCatalog.lookupObject(i.targetUID), refCatalog.lookupObject(i.sourceUID)
        a=refCatalog.lookupObject(i.targetUID)
        b=refCatalog.lookupObject(i.sourceUID)
        print a.getId(), b.getId()

return printed

каталог 'reference_catalog' возвращает объекты со свойствами:
 sourceUID -UID объекта -источника  связи
 targetUID  -UID связанного объекта,
 relation - имя связи
метод getReferences(sourceUID, relation, targetUID) позволяет получать поднаборы связей,  настраивая параметры метода.
Поскольку возвращаться  будут UID объектов, то для получения Id нужно использовать или каталог 'uid_catalog' (1 пример), или сам каталог 'reference_catalog'(2 пример). В примере приведен код для объектов типа Thema и LearnObject, связанных между собой связью 'content_source'.
Если у объекта есть поле типа
    ReferenceField(
        name='source',
        widget=ReferenceBrowserWidget(
            label='Source',
            label_msgid='LearnCurse_label_source',
            i18n_domain='LearnCurse',
        ),
        allowed_types=('LearnObject','Document','File'),
        multiValued=1,
        relationship='content_source',
    ),
то список  связанных этим отношением объектов можно получить как self.getИмя_поля. В данном примере self.getSource() - если в классе, или context.getSource() в классе вида и в виде.

6 комментариев:

  1. Вопрос: С чего следует начать изучение системы Plone чтобы понять о чем речь в этом "блоге"?
    Предвидя ответ, второй вопрос: Почему же тогда сий "блог" (если это можно назвать блогом) пострен столь неграмотно (неграмотностью в данном контексте автор подразумевает отсутствие структуры информации)?

    ОтветитьУдалить
  2. 1. Начать стоит c установкb Plone, знакомства с интерфейсом и создания простых сайтов.
    2. Следущий этап - изучения языка программирования Python и использования материалов с www.plone.org и других подобных сайтов.
    3. Блог создавался как место общения преподавателя и студентов. Вопросы возникают у студентов без всякой системы, ответы соответствуют вопросам.

    ОтветитьУдалить
  3. Почему бы тогда не составить хороший информационный контент, поэтапный, чтобы у студентов возникало меньше вопросов? Насколько понимаю у Вас имеются необходимые для этого материалы.
    А большим плюсом станет наличие каких-нибудь практических заданий с сортировкой по уровню сложности.
    Можно ассоциировать данное предложение с квестом (интересно, понятно, со смыслом, ну и конечно - результат).
    Также можно использовать тестовый ресурс содержащий ошибки, либо требующий "доведения до ума" как домашнее задание для учащегося (естественно с разделением системы прав).
    Ну это так, предложение из личных предпочтений.

    ОтветитьУдалить
  4. Это следует воспринимать как заказ на учебник? Если Вы готовы его оплатить - то я согласен создать такое произведение. Если Вы так хорошо знаете как это делать , то почему бы не сделать это лично? Я пока решил остановиться на тех двух книгах, которые я написал по данной тематике.

    ОтветитьУдалить
  5. Это следует воспринимать как рекомендацию, пожелание для повышения отдачи от учащихся и интерес к развитию проекта. Если в Вашей голове все сводится только к отсосу бабла, то результатов в такой работе не достичь.
    Я заинтересован веб-технологиями, потому ожидал от курса большей пользы. Был готов помочь в развитии проекта (пусть не деньгами, а делом, и технической стороной вопроса).
    Весьма огорчен таким отношением к любимому делу (если оно для Вас таковым являлось хоть однажды).

    ОтветитьУдалить
  6. 1. Не стои хамить, не зная было ли получено какое-либо бабло.
    2. Не все делается на альтруизме, исходя из каких соображений я должен поступать как Вы мне советуете?
    3. Это мой личный блог, а не корпоративный и не сайт проекта.
    4. Желающий помочь не скрывает своего имени.
    5. Замечание о курсе весьма интересно. Если Вы один из моих студентов, то для них я всегда открыт и адреса моих контактов известны. Если нет, то почему внутренние материалы университета я должен отдавать кому-либо?
    6. Об отношении к любимому делу - элементарный поиск по сети покажет МОЕ отношение и результаты.

    ОтветитьУдалить

Всероссийский конкурс  научно-технологических проектов страница конкурса https://dm-centre.ru/sirius-konkurs-projectov Цель конкурс...