quickinstaller.installProduct «устанавливает» вещи, которые даже не существуют.Как я могу поднять исключение? - PullRequest
1 голос
/ 13 июля 2011

У меня есть config.py в моем продукте, имеющем:

DEPENDENCIES = ['bbbbbbbbbbbb'] #This doesn't exist

А по моему setuphandlers.py:

for dependency in DEPENDENCIES:
    if not quickinstaller.isProductInstalled(dependency):
        quickinstaller.installProduct(dependency)

А теперь у меня есть запись bbbbbbbbbbbb на вкладке "Содержание" моего portal_quickinstaller. (http://localhost:8080/Plone/portal_quickinstaller/manage_main).

Что я должен сделать, чтобы раздел зависимостей «жаловался» (вызывать исключение, что угодно), если зависимость не существует? Спасибо!

РЕДАКТИРОВАТЬ : Я нашел хак с помощью quickinstaller.getProductVersion: если ничего не приходит, его не существует. Есть ли другой способ?

Ответы [ 3 ]

2 голосов
/ 14 июля 2011

Вы можете использовать что-то вроде этого:

def install_dependencies(site):
    """Install required products"""

    qi = getToolByName(site, 'portal_quickinstaller')
    for product in DEPENDENCIES:
        if not qi.isProductInstalled(product):
            if qi.isProductInstallable(product):
                qi.installProduct(product)
            else:
                raise "Product %s not installable" % product
1 голос
/ 14 июля 2011

Обычный способ объявления deps - использовать metadata.xml:

<metadata>
    <dependencies>
        <dependency>profile-plone.app.iterate:plone.app.iterate</dependency>
    </dependencies>
</metadata>

. Это добавит пакет plone.app.iterate, так как его имя профиля установки - plone.app.iterate.Подавляющее большинство из них называется default, например:

<metadata>
    <dependencies>
        <dependency>profile-plone.app.jquerytools:default</dependency>
        <dependency>profile-archetypes.referencebrowserwidget:default</dependency>
        <dependency>profile-plone.app.imaging:default</dependency>
        <dependency>profile-plone.app.registry:default</dependency>
        <dependency>profile-plone.portlet.collection:default</dependency>
    </dependencies>
</metadata>

Конечно, это работает, только если продукт, который вы пытаетесь установить, имеет профиль Generic Setup, но все, кроме самого старого, делают это.

0 голосов
/ 14 июля 2011

Полагаю, это зависит от того, почему у вас может быть продукт, которого не существует.

Обычно вы не будете тестировать это здесь - вы поместите свою зависимость в setup.py, а затем вашСбой сборки, если продукт не существует.

Если, тем не менее, у вас есть продукт, который может использовать второй продукт, если он существует (например, SQLAlchemy требуется одно или несколько яиц Python DBAPI, но не конкретный), то я думаю, что вам нужно сделатьобычное: заключаться в том, чтобы обернуть импорт какого-либо модуля в продукт с помощью try / кроме и не выполнять установку в случае сбоя импорта.

...