Migração do Portal Modelo 3
O Portal Modelo 2.0 foi criado utilizando a versão 2.5 do Plone, enquanto o Portal Modelo 3.0 é construído sobre a versão 4.3 do Plone. No período contido entre o lançamento do Portal Modelo 2 e do Portal Modelo 3 o Plone teve 8 versões e 55 releases e, para qualquer software, uma atualização com tantos passos intermediários torna-se complexa e deveria ser muito bem estudada.
É importante lembrar que a equipe de desenvolvimento do Plone tem dedicado um cuidado especial ao tópico da atualização de versões e que se estivéssemos falando apenas de conteúdos criados com os tipos de conteúdo padrão do Plone a migração entre as versões seria apenas uma questão de copiar a base do site antigo para o site novo e ativar o mecanismo de migração contido no próprio Plone.
Porém, o Portal Modelo 2 continha diversos produtos adicionais (de terceiros), como por exemplo o PlonePopoll, CMFSin, PloneGazette, Poi e etc, e estes foram descontinuados ou não possuem um mecanismo de migração completo e confiável. Isto, somado ao fato de que a própria arquitetura da informação do Portal Modelo 3 foi reestruturada, elimina uma migração utilizando apenas o mecanismo padrão do Plone.
A abordagem detalhada neste documento para realizar esta migração entre diferentes versões do Portal Modelo é a de exportarmos todo o conteúdo para um formato intermediário, realizar a serialização dos dados do portal como arquivos em formato JSON no sistema de arquivos, e realizar a importação dos mesmos em uma nova estrutura com o Portal Modelo 3 instalado, usando um mecanismo disponível nessa nova versão.
Exportação dos Dados
Para a realização da exportação dos dados de um Portal Modelo 2 existente, é preciso incluir mais dois pacotes Python na sua instalação: simplejson e collective.jsonify. Vamos assumir neste tutorial que a instalação do Portal Modelo 2 foi feita através do seu instalador padrão e, portanto, há um Python independente só para o portal. Se for diferente disso, você deverá referenciar nos comandos abaixo o Python que roda o portal.
Como o Portal Modelo 2 utiliza o Python 2.4 é preciso garantir que a versão do simplejson seja a 2.1.0, que é a compatível com esta versão do Python, e isto é feito durante a instalação do pacote, usando o comando easy_install do mesmo interpretador Python usado para a execução do portal. A versão do easy_install disponível no Python do Portal Modelo 2 é a 0.6 e, antes disso, será preciso atualizá-la para a 1.4.2, que é mais recente versão compatível com o Python 2.4:
$ cd /var/interlegis/PortalModelo-2.0/Python-2.4/bin $ sudo ./easy_install -U 'setuptools==1.4.2'
Só então será possível instalar o simplejson:
$ sudo ./easy_install -Z 'simplejson==2.1.0'
Caso o comando easy_install não esteja disponível, sua instalação deverá ser feita da seguinte maneira:
$ cd /tmp $ wget --no-check-certificate https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py $ sudo python ez_setup.py
Para a instalação do pacote collective.jsonify é necessário baixá-lo do repositório GitHub, descompactá-lo e então instalá-lo no mesmo interpretador Python do Portal Modelo 2:
$ mkdir /tmp/collective.jsonify $ cd /tmp/collective.jsonify $ wget --no-check-certificate https://github.com/collective/collective.jsonify/archive/master.zip $ unzip master.zip $ cd collective.jsonify-master $ sudo /var/interlegis/PortalModelo-2.0/Python-2.4/bin/python setup.py install
Com os pacotes necessários instalados, podemos executar a exportação do conteúdo do Portal Modelo 2 utilizando o script exporta_pm.py exibido a seguir:
# -*- coding: utf-8 -*- from AccessControl.SecurityManagement import newSecurityManager from collective.jsonify import get_item import simplejson as json import os def get_children(path): children = ct.searchResults(path={'query': path, 'depth': 1}, sort_on='getObjPositionInParent') if children: data = [{'id': b.getId, 'title': b.Title, 'portal_type': b.portal_type} for b in children] if not os.path.exists('dados%s' % path): os.makedirs('dados%s' % path) arq = open('dados%s/children.json' % path, 'wb') arq.write(json.dumps(data)) arq.close() newSecurityManager(None, app.acl_users.getUserById('admin')) # noqa site = app.portal # noqa path = '/portal' ct = site.portal_catalog uid_catalog = site.uid_catalog all_uids = uid_catalog() p_to_uid = dict([('%s/%s' % (path, b.getPath()), b.UID) for b in all_uids]) get_children(path) results = ct.searchResults(path=path) fail = [] for brain in results: obj = brain.getObject() data = get_item(obj) path = brain.getPath() if not os.path.exists('dados%s' % path): os.makedirs('dados%s' % path) arq = open('dados%s/data.json' % path, 'wb') arq.write(data) arq.close() get_children(path) try: uid = p_to_uid[path] except: fail.append(path) print uid, path, len(data) if fail: print 'Failed: %s' %fail
Para cada site a ser exportado deve-se alterar as variáveis site e path, substituindo o valor portal pelo valor adequado (o nome curto do site Plone a ser migrado). Se o site estiver dentro de uma pasta, será necessário informar o path completo da pasta nas duas variáveis. Este script deve ser criado no diretório raiz da instância do Portal Modelo 2 e para seu funcionamento deve-se criar um diretório chamado dados, neste mesmo local.
A execução do script deve ser feita utilizando-se o comando zopectl, conforme sequência abaixo:
$ cd /var/interlegis/PortalModelo-2.0/instances/client1 $ wget --no-check-certificate https://colab.interlegis.leg.br/raw-attachment/wiki/MigracaoPortalModelo/exporta_pm.py $ sudo mkdir dados $ sudo ./bin/zopectl stop $ sudo ./bin/zopectl run exporta_pm.py
Ao término da execução teremos replicada toda a estrutura de objetos do Portal Modelo, referenciado no script acima, exportados como arquivos JSON, dentro do diretório <instancia>/dados/<id_do_site>.
Importação dos Dados
A importação dos dados é implementada no pacote interlegis.portalmodelo.policy utilizando-se do mecanismo chamado Transmogrifier. Foi criada uma pipeline chamada portalmodelo20 que contempla a migração dos conteúdos para dentro do Portal Modelo 3.0.
Para seu funcionamento é necessário que esteja definida uma variável de ambiente chamada SITE_EXPORT indicando onde estão os arquivos da exportação dos dados, por exemplo:
$ export $SITE_EXPORT=/home/interlegis/dados/cm_brasopolis/
A execução da pipeline é feita, via navegador, ao acessar o endereço http://<site>/@@importa-pm20. Este endereço existe apenas para usuários autenticados no portal e autorizados com o papel de Manager. Tente sempre realizar este acesso diretamente na instância de produção -- sem passar por servidores web e/ou proxies -- pois como o procedimento de importação toma um tempo considerável é provável que ocorra um timeout de qualquer servidor intermediário.
Considerações
O processo de migração dos dados foi testado com Portal Modelo 2.0 e o conteúdo gerado com ele. Caso existam pacotes adicionais e/ou personalizações feitas sobre a solução, não é garantido o sucesso da migração.
Como houve a alteração da arquitetura da informação entre as versões 2.0 e 3.0 do Portal Modelo, trabalhamos para que a migração dos dados seguisse este novo padrão, porém é recomendado que o gestor do portal faça uma análise minuciosa do conteúdo migrado.
Layouts e personalizações visuais do design do site não serão levadas para o novo ambiente, pois implicam em mudanças visuais e estruturais de interface que não têm como ser automatizadas, já que no Portal Modelo 3 as customizações de layout são feitas utilizando-se o Diazo com temas empacotados e importados no portal.