Tutorial - Criando um produto para Plone usando Archetypes
Módulo Install.py
O módulo Install.py se localiza dentro da pasta Extensions do nosso produto. Dentro deste módulo há um método externo chamado de install, que será chamado quando instalamos o produto em um portal Plone. Este é o método que possui o script de instalação do produto. É neste método externo que colocaremos rotinas tais como:
- Instalar nossos tipos na portal_types tool
- criação de vocabulário dinâmicos com o ATVocabularyManage;
- Verificar e instalar, se for o caso, os produtos dos quais o nosso produto depende;
Outro método externo que existe neste módulo é o uninstall que é responsável por desistalar todas as configurações realizadas no install.
import os.path
import sys
from StringIO import StringIO
from sets import Set
from App.Common import package_home
from Products.CMFCore.utils import getToolByName
from Products.CMFCore.utils import manage_addTool
from Products.ExternalMethod.ExternalMethod import ExternalMethod
from zExceptions import NotFound, BadRequestfrom Products.Archetypes.Extensions.utils import installTypes
from Products.Archetypes.Extensions.utils import install_subskin
from Products.Archetypes.config import TOOL_NAME as ARCHETYPETOOLNAME
from Products.Archetypes.atapi import listTypes
try:#CMFDynamicViewFTI é um produto para visualizações dinâmicas no Plone.
#Este produto adiciona um nova classe FTI (informação de fabricação de tipo).
#A FTI contém duas novas propriedades: defualt_view e suppl_views.
#Com isto o usuário poderá visualizar um contéudo de formas diferentes.
from Products.CMFDynamicViewFTI.migrate import migrateFTIs
except:
HAS_DYNAMIC_VIEW_FTI = True
else:
HAS_DYNAMIC_VIEW_FTI = False
from Products.LocadoraVeiculos.config import PROJECTNAME
from Products.LocadoraVeiculos.config import product_globals as GLOBALSdef install(self):
""" Método externo para instalação da Locadora de Veículos """
out = StringIO()
print >> out, "Installation log of %s:" % PROJECTNAME# Se o 'config.py' possui uma lista de dependências, o código abaixo
# tenta instalá-los. DEPENDENCIES é importado de config.py.
try:
from Products.LocadoraVeiculos.config import DEPENDENCIES
except:
DEPENDENCIES = []
portal = getToolByName(self,'portal_url').getPortalObject()
quickinstaller = portal.portal_quickinstaller
for dependency in DEPENDENCIES:
print >> out, "Installing dependency %s:" % dependency
quickinstaller.installProduct(dependency)
get_transaction().commit(1)classes = listTypes(PROJECTNAME)
installTypes(self, out,
classes,
PROJECTNAME)
install_subskin(self, out, GLOBALS)
# O método migrateFTIs converte um simples FTI para um
# DynamicViewFTI
if HAS_DYNAMIC_VIEW_FTI:
migrated = migrateFTIs(self, product=PROJECTNAME, fti_meta_type='Locadora')
print >>out, "Switched to DynamicViewFTI: %s" % ', '.join(migrated)
# Criando um vocabulário em portal_vocabulariesatvm = getToolByName(self, ATVOCABULARYTOOL)
vocabs = {}
vocabs['tipos_de_carro'] = (
('passeio', u'Passeio'),
('carga', u'Cargo'),
('transporte', u'Transporte'),
)for vkey in vocabs.keys():
# cria um vocabulário caso não exista:
vocabname = vkey
if not hasattr(atvm, vocabname):
# print >>out, "adding vocabulary %s" % vocabname
atvm.invokeFactory('SimpleVocabulary', vocabname)
vocab = atvm[vocabname]
for (ikey, value) in vocabs [vkey]:
if not hasattr(vocab, ikey):
vocab.invokeFactory('SimpleVocabularyTerm', ikey)
vocab[ikey].setTitle(value)
# Tenta instalar o método de instalação do workflow
# dentro de 'InstallWorkflows.py', método 'installWorkflows'
try:
installWorkflows = ExternalMethod('temp',
'temp',
PROJECTNAME+'.InstallWorkflows',
'installWorkflows').__of__(self)
except NotFound:
installWorkflows = None
if installWorkflows:
print >>out,'Workflow Install:'
res = installWorkflows(self,out)
print >>out,res or 'no output'
else:
print >>out,'no workflow install'
# abilita portal_factory para os tipos informado
factory_tool = getToolByName(self,'portal_factory')
factory_types=[
"Locadora",
"Carro",
"Aluguel",
"Cliente",
"ClienteEspecial",
] + factory_tool.getFactoryTypes().keys()
factory_tool.manage_setPortalFactoryTypes(listOfTypeIds=factory_types)
if install:
print >>out,'Custom Install:'
res = install(self)
if res:
print >>out,res
else:
print >>out,'no output'
else:
print >>out,'no custom install'
return out.getvalue()