Vous êtes sur la page 1sur 22

PyCoffe

Você conhece DTML mas


não sabe como fazer
para aplicar o mesmo em
ZPT? Na seção PyCoffe
deste mês você tem um
tutorial que mostra
como se faz.

Migração
como fazer uma migração
de versões antigas para
novas versões de zope e
plone.
Editorial

Finalmente... Expediente
Arte Fabiano Bispo

É um prazer poder finalmente presentear você com conteúdo de Diagramação Thiago M.


qualidade, como o que iremos oferecer a partir desta primeira edição Figueiredo | Cleber J. Santos
digital da PZPzine.
Colaborador Paula Graciela |
Após meses de trabalho chega nas comunidades pzp aquela que deverá Juan Osores | João Paulo
ser sua revista digital sobre Python, Zope e Plone: Contamos com a sua Carusi | Federico Vazquez
opinião e contribuição para mantermos sempre um ótimo conteúdo e
Projeto Grafico Fernando
relacionamento para com as comunidades pzp. Bertolo | Thiago M. Figueiredo

A PZPzine trará Bimestralmente até você temas que atendam aos


interesses da nossa comunidade de usuários e desenvolvedores pzp, bem
como aos demais interessados nas tecnologias desenvolvidas a partir das
ferramentas Zope, Plone e a linguagem Python. Deste modo, a sua A PZPzine é uma produção
composição consistirá tanto de artigos de autoria internacional quanto da Seven Plonet
nacional – provenientes de artigos publicados na internet, listas de
discussões, já publicados focando, entretanto, as nossas necessidades Email da redação
locais. redacao@pzpzine.com

Cleber J. Santos
A PZPzine é, então, uma publicação de caráter técnico, dirigida a um cleber@pzpzine.com
público diversificado, uma vez que está segmentada em assuntos
corporativos envolvendo software livre desenvolvidos a partir de Thiago M. Figueiredo
tecnologias como Python, Zope e Plone, no intuito de auxiliar thiago@pzpzine.com
desenvolvedores e empresas a tomarem decisões sobre as tecnologias que
farão parte de seu alvo de investimentos e desenvolvimento, e tutoriais
voltados para engenheiros e administradores de sistemas, analistas, Apoio
técnicos e usuários iniciantes.

Como leitor, de agora em diante você estará integrado a uma rede de


informações dedicada a distribuir conhecimento e expertise técnico.
Esperamos que você goste!

2
Índice

− Como se fosse a primeira vez..........................................................04


Oferece uma explicação básica sobre os três temas principais que a revista aborda.

− Python prazer em conhecer.............................................................08


Este tutotial aborda sobre a linguagem python, com alguns exemplos bacanas.

− Técnico...............................................................................16
Na área técnica deste mês tem um tutorial sobre migração que exiplica como fazer uma
migração de versões antigas para novas versões de zope e plone.

− Faq...................................................................................20
As mais freqüentes perguntas feitas pela net.

− PyCoffe...............................................................................21
Você conhece DTML mas não sabe como fazer para aplicar o mesmo em ZPT? Na seção PyCoffe
deste mês você tem um tutorial que mostra como se faz.
Como se fosse a primeira vez
Se você leu leu e ainda não entendeu patavinas sobre o que esta revista fala,
experimente ler esses quadros, eles explicam o básico sobre o tema que trataremos
nas próximas páginas

PYTH
Python
Python tem algumas
ZOPE PLONE
Zope Plone
Zope é um servidor de Plone é um *sistema de
vantagens, sendo uma aplicações web de código gerenciamento de conteúdo
linguagem universal[1]. Um aberto, ele é escrito com a (CMS, de Content Management
dos principais fatores é linguagem Python. Zope System)*[1], livre e de
que python combina os três significa "Z Object código aberto, em Python,
paradigmas de programação Publishing Environment uma linguagem de programação
atuais em um só. (Ambiente de Publicação de livre e que roda sobre um
Objetos)”. Servidor de Aplicações Zope
Python pode ser usado como e sobre o *framework
uma linguagem orientada a Muitas tarefas de CMF(Contente Management
objeto[2], como C++ ou administração de um servidor Framework)*[2]
Java, ou como uma linguagem Zope podem ser realizadas
orientada a através de uma interface O Plone pode ser usado para
procedimentos[3], como web. Os objetos que o Zope a construção de portais de
Pascal ou C. publica na Web são escritos informação em intranets,
em linguagem Python, e extranets e na internet, ele
Ao mesmo tempo é uma tipicamente armazenados num já vem com um sistema de
linguagem de script[4] como banco de dados orientado a segurança e funções pré-
Php ou Perl, seus programas objetos, o ZODB[1], que é configuradas, o chamado
sequer precisam ser integrado ao sistema. workflow[3], um conjunto de
compilados pelo usuário. Objetos básicos, tais como tipos de conteúdo e suporte
Isso mesmo! Python pode ser documentos, a várias línguas (Idiomas).
usado no desenvolvimento

4
Como se fosse a primeira vez

PYTH
de aplicações web ou para
escrever softwares, não há
pré-declaração de variáveis,
e os tipos das variáveis são
determinados dinamicamente,
ZOPE PLONE
imagens e templates (modelos
de páginas) podem ser
criados ou modificados via
web. Objetos especializados,
tais como wikis, blogs, e
Há vários desenvolvedores,
escritores, e pessoas que
testam o Plone de todas as
partes do mundo,
contribuindo todos os dias
seu controle de bloco é galerias de fotos estão com o Plone.
feito apenas por indentação, disponíveis como componentes
ou seja, não há adicionais chamados products Enganan-se os que pensam que
delimitadores. (Produtos). o Plone é um software, pois
o Plone depende do Zope para
Além de oferecer tipos de Suas características são rodar e o Zope que por sua
alto níveis como (strings, diversas, mas não caberia vez depende do Python para
listas, tuplas, dicionários, citar todas. O zope funcionar como um servidor
arquivos e classes). Também diferente de muitos sistemas de aplicações Web,
suporta múltipla herança[5], é formado por objetos em um normalmente para sistemas
conecta-se a banco de dados banco de dados em vez de operacionais como no caso do
e pode usar vários arquivos, este tipo de Windows, você pode baixar o
protocolos de comunicações. abordagem permite alavancar Plone em forma de um
as vantagens do paradigma de executável *.exe, mas na
Assim como java, o código- objetos, como verdade está sendo instalado
fonte de um programa em encapsulamento. O Zope o Zope + o CMF e todos os
Python é convertido em associa URLs a objetos componentes para o que Plone
bytecode[6]. Este código utilizando a hierarquia de funcione. E para que tudo
também é executado por uma partes (composição), os funcione é necessário que o
máquina virtual, mas python métodos são considerados usuário tenha o Python já
é bem mais rápido que java. como partes dos objetos. instalado no sistema.
1 Linguagem universal, é O Zope fornece dois Então a maneira correta de
única,de entendimento para mecanismos para a criação de definir o Plone é como um
todos. templates: Dynamic Template produto[4] do Zope, isso
Markup Language (DTML: mesmo, o Plone funciona como
2 Orientação a objetos, Linguagem Dinâmica de um produto que roda dentro
também conhecida como Marcação de Templates), do Zope e que por sua vez

5
Como se fosse a primeira vez

PYTH
programação Orientada a
Objetos (POO) ou ainda em
inglês Object-Oriented
Programming (OOP) é um
paradigma de análise,
projeto e programação de
ZOPE PLONE
e Zope Page Templates (ZPT:
Templates de Páginas Zope).

DTML é uma linguagem baseada


em tags que permite
implementar lógica simples
também contém produtos que
rodam apenas dentro do Plone.

1 Sistema de Gerenciamento
de Conteúdo - SGC, do inglês
Content Management Systems -
sistemas de software baseado em templates, através de CMS, é um gerenciador para
na composição e interação laços, condicionais e websites, portais e
entre diversas unidades de inserção de variáveis, no intranets, cujo objetivo é
software chamadas de objetos. entanto, o DTML apresenta estruturar e facilitar a
alguns problemas comuns às criação, administração,
3 Procedimentos, também linguagens deste tipo: os distribuição, publicação e
conhecidos como rotinas, templates não podem ser disponibilidade da
subrotinas, métodos, ou verificados por validadores informação.
funções (que não devem ser HTML, e a inclusão
confundidas com funções indiscriminada de lógica nos 2 No desenvolvimento do
matemáticas, mas são templates resulta em código software, um framework ou
similares àquelas usadas na pouco legível e difícil de arcabouço é uma estrutura de
programação funcional) manter. suporte definida em que um
simplesmente contém um outro projeto de software
conjunto de passos ZPT é uma uma tecnologia que pode ser organizado e
computacionais a serem ataca estes problemas. desenvolvido. Um framework
executados. Um dado Templates ZPT são formadas pode incluir programas de
procedimento pode ser por XML ou HTML válido, nas suporte, bibliotecas de
chamado a qualquer hora quais toda a codificação é código, linguagens de script
durante a execução de um feita através de atributos e outros softwares para
programa, inclusive por dentro dos tags já ajudar a desenvolver e
outros procedimentos ou por existentes nestas linguagens. juntar diferentes
si mesmo. componentes de um projeto de
Tais atributos utilizam um software.
4 Também chamada (linguagem espaço de nomes especial,
de computador interpretada) denominado tal: 3 Workflow pode ser definido
são linguagens de programação como a seqüência de passos

6
Como se fosse a primeira vez

PYTH
executadas em um
interpretador. Por esse
motivo, os scripts, que são
as instruções formais
escritas com as linguagens
interpretadas.
ZOPE PLONE
Template Attribute Language
(Linguagem de Atributos para
Templates), e assim são
compatíveis com as
especificações do W3C e com
as principais ferramentas de
necessários para que se
possa atingir a automação de
processos de negócio, de
acordo com um conjunto de
regras definidas.

edição de HTML. O ZPT 4 Componentes adicionais que


5 A Herança Múltipla é o proporciona apenas um funcionam a partir de uma
princípio, implementado em conjunto limitado de aplicação específica.
algumas linguagens de recursos, estimulando os
programação orientadas a programadores a implementar
objetos, que possibilita o a lógica em scripts Python à
compartilhamento de parte, que são apenas
atributos e operações de invocados (e não incluídos)
duas ou mais classes em uma nos templates, também
subclasse. fornece suporte à
internacionalização e
6 Traduzindo ao pé da letra, localização de aplicativos
código em bytes - não web, proporcionando a
confundir com código-máquina substituição de mensagens
é o resultado de um processo por versões previamente
semelhante ao dos traduzidas em múltiplas
compiladores de código fonte línguas.
que não é imediatamente
executável. Em oposição o 1 Zope Object Data Base (ou
bytecode irá ser ZODB) é um banco de dados
interpretado numa máquina transacional orientado a
virtual que fará a execução. objetos livre usado pelo
servidor de aplicação Zope.

7
Python - prazer em conhecer

Python
UM POUCO DE HISTÓRIA

Python foi criada por Guido


van Rossum em 1991 nos Países
Baixos como uma linguagem de
scripts para o sistema
operacional distribuído
Amoeba a partir da linguagem
ABC, que tinha um foco em
usuários como físicos,
engenheiros e lingüistas.

Hoje é usada em diversas


ALGUÉM ME EXPLIACA O QUE É CARACTERÍSTICAS áreas, como servidores de
aplicação e computação
PYTHON!? gráfica. Está disponível como
# Tipos dinâmicos de variáveis,
linguagem script em
U
retornos de funções e parâmetros, que
ma linguagem de programação de aplicações como OpenOffice
são inferidos pelo interpretador. A
alto-nível interpretada, tipagem também é forte, pois os
(Python UNO Bridge) e pode
interativa, orientada a objetos, de ser utilizado em Stored
valores e objetos têm tipos bem Procedures no banco de dados
tipagem dinâmica e forte. definidos e não sofrem coerções como PostgreSQL (PL/Python).
em linguagem C ou Perl.
A linguagem foi projetada com a O nome Python teve a sua
filosofia de enfatizar a importância # Orientada a objetos ainda que origem no grupo humorístico
do esforço do programador sobre o suporte outros paradigmas, como a britânico Monty Python,
programação funcional e modular. criador do programa Monty
esforço computacional. Prioriza a
Python's Flying Circus,
legibilidade do código sobre a embora muitas pessoas façam
# Coletor de lixo automático,
velocidade ou expressividade. Combina associação com o réptil do
gerência de memória pelo
uma sintaxe concisa e clara com os mesmo nome (em português,
interpretador, semelhante como Ruby, Pitão).
recursos poderosos de sua biblioteca Perl e Tcl.
padrão e por módulos e frameworks
desenvolvidos por terceiros. # Portável, disponível para
praticamente qualquer sistema
operacional.

# Extensível para implementação em


conjunto com outras linguagens, como
C.

8
Python - prazer em conhecer

INTERPRETADOR INTERATIVO em tokens. Abaixo um exemplo de permutação,


retirado do capítulo 2.1 sobre
O interpretador interativo é uma Todo programa é dividido em Estrutura de linhas na Análise
característica diferencial da linhas lógicas que é separada léxica do Manual de Referência
pelo token NEWLINE ou NOVA da linguagem (Language Reference
linguagem, porque há a
LINHA, as linhas físicas são Manual):
possibilidade de testar e
trechos de código divididos pelo
modificar o código de um caractere ENTER. Linhas lógicas
programa antes de iniciar a não podem ultrapassar linhas
compilação ou incluí-las nos def perm(l):
físicas com exceção de junção de
programas, por if len(l) <= 1:
linhas, por
return[1]
r = [ ]
Exemplo: Exemplo:
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
... if resultado > 2 \
for x in p:
>>> 1+1 and 1 <= 5 \
r.append(l[i:i+1]+x)
2 and 2 < 5
return r
>>> print ('Resultado: %f') % (d)
>>> a = 1+1
>>> print a
2 INDENTAÇÃO
indentar [Do ingl. (to) indent <
ou fr. endenter (v. endentar).]
Verbo transitivo direto. 1.Fazer
depressão, ou chanfradura em
forma de dente, em. 2.Espacejar
eses_do_ano = linha, parágrafo, etc. da margem
ANÁLISE LÉXICA ['janeiro','fevereiro', esquerda para a direita em
'março', 'abril', (folha a ser impressa,
No capítulo 2 do Manual de 'maio', dactilografada, etc.). A
Referência da Linguagem 'junho', 'julho', 'agosto', Indentação endentação é uma
Python diz que a análise 'setembro', característica peculiar na
léxica é uma análise do 'outubro', 'novembro', linguagem, os blocos são
interpretador em si, os 'dezembro'] delimitados explicitamente em
programas são lidos por um Linguagem C e PHP por chaves, em
parser, que divide o código Fortran pelo then e endif e no
9
Python - prazer em conhecer

Pascal pelo begin e end. Exemplo:

Em Python, blocos de código são # Indentação correta:


delimitados por espaços formando
uma indentação visual, não def valor1():
existem símbolos de "abre" e while True:
"fecha", mas requer uma try:
tabulação padronizada de c=int(raw_input('Primeiro Valor:'))
espaços, em outras linguagens return c
como C/C++ ou JavaScript, a except ValueError:
endentação não é necessária print 'Inválido!'
devido os delimitadores de
blocos, utiliza-se somente para
melhor visualização, enquanto em # Indentação incorreta:
Python, a endentação é
obrigatória. def valor1():
while True:
Usando um editor de texto comum try:
é muito fácil existir erros de c = int(raw_input('Primeiro Valor: '))
endentação, o recomendado é return c
configurar o editor conforme a except ValueError:
análise léxica do Python ou print 'Inválido!'
utilizar uma IDE. Todas as IDE’s
Python fazem endentação
automática. O código está correto para os dois exemplos, mas o analisador léxico irá
verificar se o INDENT e o DEDENT estão coerentes, o analisador
reconhecerá os keywords "def", "try", "exception", "self", "return",
"print", "input" e as strings entre aspas simples e a endentação, se não
houver problemas o programa irá rodar normalmente, senão apresentará a
exceção: "Seu programa está com erro no bloco de endentação".

10
Python - prazer em conhecer

biblioteca padrão da linguagem e representam este objeto. Quando


COMPILADOR DE BYTECODE existem módulos de terceiros que a classe é atribuída a outro
tornam o bytecode mais confuso, objeto, este objeto é chamado de
A linguagem é de muito alto-
nível, como já dito, mas ela tornando a descompilação instância da classe. Os métodos,
também pode compilar seus ineficaz. que também são definidos para
programas para que a próxima vez programação orientada a objetos,
que o executar não precise Normalmente, o Python trabalha são funções dentro de uma
compilar novamente o programa, com dois grupos de arquivos: classe. Todos os métodos ou
reduzindo o tempo de carga na atributos da classe recebem uma
execução. referência a uma instância da
1. Os módulos do núcleo da
própria classe como seu primeiro
linguagem, sua biblioteca padrão argumento. A convenção é que se
Utilizando o interpretador e os módulos independentes,
interativo não é necessário a chame este argumento self. Assim
criados pelo usuário. os métodos são chamados
criação do arquivo de Python
compilado, os comandos são objeto.método(argumento1,
executados interativamente. 2. No núcleo do interpretador argumento2, ...) e são definidos
Porém quando um programa ou um existe o analisador léxico, o iguais a uma função, como
módulo é evocado, o analisador sintático que utiliza método(self, argumento1,
interpretador realiza a análise Estruturas de Objetos (tempo de argumento2, ...). Veja que o
léxica e sintática, compila o execução), o Compilador que parâmetro self irá conter uma
código de alto-nível se referência para o objeto
aloca memória (tempo de
necessário e executá-lo na definido em objeto quando for
execução) e depois do Avaliador
máquina virtual Python. efetuada esta chamada. Os
de código que modifica o estado atributos da classe (ou variável
atual do programa (tempo de da classe) podem ser acessados
O bytecode é armazenado em
execução), mostrando resultado em qualquer lugar da classe, e
arquivos com extensão .pyc ou
para o usuário. os atributos de instância (ou
.pyo (bytecode otimizado)
variável de instância) devem ser
O bytecode da linguagem também é ORIENTAÇÃO A OBJETO declarados dentro dos métodos
de alto-nível, ou seja, é mais utilizando a referência à
legível aos seres humanos que o instância atual (self).
# Classes: Criamos o objeto
código de byte do C, por classe com “class nome:”, ela é
exemplo. Para descompilar um composta de atributos que
código de byte é utilizado o
módulo dis da

11
Python - prazer em conhecer

Exemplo: Encapsulamento: Encapsulamento é


a proteção dos atributos ou
métodos de uma classe. No Python
class A: não existe proteção dos membros
a = 1 # atributo publico de uma classe ou instância pelo
interpretador. Convenciona-se
class B(A): que atributos com o nome
_c = 3 # atributo considerado privado começando com um _ são de uso
privado da classe, mas não há um
def __init__(self): policiamento do interpretador
print self.a contra acesso a estes atributos.
print self._c Uma exceção são nomes começando
com __, no caso em que o
a = A() interpretador modifica o nome do
print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe B''? atributo.
# Falso.
Exemplo:
a = B() # Instancía o ''objeto a'' na ''classe B'' e imprime os
# atributos da classe.
print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe class A:
# B''?Verdadeiro. a = 1 # atributo publico
_b = 2 # atributo de uso
b = B() # Instancía o ''objeto b'' na ''classe B'' e imprime os # privado
# atributos da classe. __c = 3 # atribute de uso
print isinstance(b, B) # ''Objeto b'' é uma instância da ''classe B''? # privado, tem o nome
# Verdadeiro. # modificado para _A__c

b = A() # Instancía o ''objeto b'' na ''classe A''. a = A()


print isinstance(b, A) # ''Objeto b'' é uma instância da ''classe A''? print a.a # imprime 1
# Verdadeiro. print a._b # válido, mas
# desencorajado
print a.__c # inválido,
# atributo inexistente
print a._A__c # válido, mas
# *fortemente* desencorajado

12
Python - prazer em conhecer

# O polimorfismo condiz com a reutilização de código, funções semelhantes


.... definição das classes
em várias partes do software é fato que ocorram então definimos esta
Pessoa e PessoaCPF ...
função como uma biblioteca, e todas as outras funções que precisarem
desta, a chamam sem a necessidade de reescrevê-la.
a = Pessoa('Leonardo', 22)
b = PessoaCPF('122.333.332-
Exemplo:
1', a)
class Pessoa:
print a.nome # imprime
def __init__(self, nome ='', idade=0): # Leonardo
self.nome = nome print a.idade # imprime 22
self.idade = idade print b.CPF # imprime
# 122.333.332-1
def getIdade(self):
return self.idade
PLATAFORMAS DISPONÍVEIS
class PessoaCPF(Pessoa):
Está disponível para as mais
def __init__(self, CPF, nome='', idade=0):
diversas plataformas, desde Unix
Pessoa.__init__(self, nome, idade)
(Linux, FreeBSD, Solaris, MacOS
self.CPF = CPF
X etc.), Windows, .NET, versões
antigas de MacOS até consoles de
videogames ou mesmo alguns
a = Pessoa()
celulares, como a série 60 da
Pessoa.__init__(a, 'Leonardo', 22)
Nokia e palmtops.
b = PessoaCPF('122.333.332-1', nome='', idade=0)
Para algum Sistema Operacional
não suportado, basta que exista
print a.nome # imprime Leonardo
um compilador C disponível e
print a.idade # imprime 22
gerar o Python a partir do
print b.CPF # imprime 122.333.332-1
fonte. O código fonte é
traduzido pelo interpretador
para o formato bytecode, que é
multiplataforma e pode ser
Alternativamente, pode-se fazer uso da herança se expor o método __init__ executado e distribuído sem
fonte original.

13
Python - prazer em conhecer

EXEMPLOS DE CÓDIGO

Uma das características mais marcantes da linguagem, a sintaxe do Python é clara, concisa e elegante, o que
facilita a manutenção e garante a produtividade.
# Enviando e-mail:
Exemplos:
# O tradicional "Hello, world":
import smtplib
server = smtplib.SMTP('mail.xx.net')
print 'Olá, mundo!'
# Envio de e-mail da conta @xy para a conta @xx
# Imprimindo uma lista ordenada com os
itens com a primeira letra em maiúscula: server.sendmail('leonardo@xy.com', 'leonardo@xx.net',
"""To: leonardo@xx.net
lista = ['laranja', 'banana', 'uva'] From: leonardo@xy.com
lista.sort() Subject: Teste de envio de email
Estou lhe enviando este email como um teste.
for item in lista: """)
print item.capitalize()
server.quit()
print 'Envio OK'
# Contando palavras em um arquivo:

arquivo = file('text.txt')
palavras = arquivo.read().split()
unicas = set(palavras)

print 'Palavras: %d. Tirando as repetidas: %d' % (len(palavras), len(unicas))


# Cálculos matemáticos:

>>> from math import * >>> log(x)


>>> x = 5 1.6094379124341003
>>> sqrt(x)
2.2360679774997898 >>> cos(x)
>>> sin(x) 0.28366218546322625
-0.95892427466313845

14
Python - prazer em conhecer

IMPLEMENTAÇÕES

Python possui diversas implementações. Entre elas estão:

* CPython é a implementação original e a mais conhecida, disponível para várias plataformas no site oficial

(www.python.org)

* IronPython é a implementação para .NET, patrocinada pela Microsoft (www.ironpython.com)

* Stackless Python é a variante do CPython que permite multi-tarefa sem o uso de threads, o nome se deve a

tentativa de eliminar o stack da linguagem C (www.stackless.com)

* Jython é a implementação em Java (www.jython.org)

* Pippy é um porte do Python para Palm (pippy.sourceforge.net)

* PyPy é a linguagem Python totalmente escrito em Python (codespeak.net/pypy)


* Pys60 é um porte do Python para Symbian.

LICENÇA FONTE
Python possui uma licença Open Source aprovada pela Este arquivo foi desenvolvido utilizando material
OSI e compatível com a GPL, porém menos restritiva. Wikipedia.
Sua licença prevê (entre outras coisas) que binários
da linguagem sejam distribuídos sem a necessidade de No link principal
fornecer o código-fonte junto. Para maiores (http://pt.wikipedia.org/wiki/Python) podem ser
detalhes, visite Python Software Foundation License encontrados mais informações como: Empresas que
utilizam Python e sofwares que utilizam a
técnologia. Aconselhamos o acesso para as pessoas
que necessitem de informações mais específicas.

15
Tecnico

Migração
1- Vamos fazer backup do arquivo Este material foi escrito
E ste material tem como o
objetivo oferecer uma noção básica Data.fs de nosso site da versão Plone
durante uma migração real, e
aprimorado após erros e mais
de como proceder durante uma migração 2.0.5 localizado em
erros, utilizamos uma versão
de versões de Plone, é sempre complexo ($INSTANCEHOME/var). Você pode
de Zope e Plone bastante
falar sobre migração e que exige muitos utilizar um script python chamado
antiga (Zope 2.7.8 + Plone
cuidados. Porém esperamos poder repozo.py localizado em
2.0.5) e migramos para a
oferecer uma noção de como proceder (ZOPE_HOME/bin/repozo.py), também ao
versão mais recente (Zope
nesses casos. final do artigo estaremos
2.9.6 + Plone 2.5.1).
disponibilizando um arquivo chamado
Chega de lenga, lenga e vamos ao que repozo.sh, é um shell que automatiza o
A migração se deu a diversos
nos interessa. processo de backup.
fatores, um deles é que o
tamanho do ZODB era limitado

Notas: 2- Após ter feito o backup, vamos a 2GB, fora a questão de usar
archetypes, isso foi um
a - Antes de mais nada assegure-se de começar a brincadeira, copie o arquivo
alívio, pois as novas versões
ter feito backup de todos os arquivos Data.fs de seu site para dentro do
de Plone já vinham suportadas
do seu site. diretório var da nova instância que
com archetypes.
vai conter a nova versão de Plone,
b - Jamais aplique um processo desses como exemplo irei usar um arquivo
em um servidor de produção, faça tudo chamado (Data.migracao.fs).
em uma máquina local

c - Tenha em mãos uma boa xícara de 3- Antes de dar um start no zope,


café :D vamos editar o arquivo zope.conf de
nossa nova instância, para receber o
site a ser migrado. Dentro do
diretório etc da nova instância edite

16
Tecnico

o arquivo zope.conf utilizando seu Feito isso salve e saia do arquivo


editor favorito, procure pela linha: <zodb_db main> ($INSTANCEHOME/etc/zope.conf),
# Main FileStorage database start o zope e logue-se como manage.
<filestorage>
<zodb_db main> path $INSTANCE/var/Data.fs
# Main FileStorage database
<filestorage>
</filestorage> 4- Agora vamos adicionar o ponto
mount-point / de montagem para nosso site,
path $INSTANCE/var/Data.fs </zodb_db> selecione no select box a seguinte
</filestorage> opção 'ZODB Mount Point' e clique
mount-point / <zodb_db temporary> em add. Na tela que aparecer
</zodb_db> # Temporary storage database selecione a entrada que condiz com
(for sessions) nossas configurações:
Abaixo dessa entrada terá uma outra <temporarystorage>
name temporary storage for Path Database Status
com o nome de 'temporary', nós
iremos adicionar uma entrada sessioning
/migracao migracao Ready to creaate
parecida, para nosso site, copie e </temporarystorage>
cole abaixo da entrada temporary o mount-point /temp_folder
seguinte trecho de código; container-class E clique em Create selected mount
Products.TemporaryFolder.Temporar points, isso vai criar um novo
yContainer ponto montagem já com o Plone site
<zodb_db migracao> </zodb_db> dentro, em outras palavras, ele vai
# Main FileStorage database
criar uma pasta com um Plone site
<filestorage> <zodb_db migracao> dentro, este Plone Site está ainda
path # Main FileStorage database na versão 2.0.5.
$INSTANCE/var/Data.migracao.fs <filestorage>
</filestorage> path
mount-point /migracao
</zodb_db>
$INSTANCE/var/Data.migracao.fs 5- Note que dentro do Plone site
</filestorage> existem objetos quebrados, estes
mount-point /migracao são objetos que deixaram de ser
O seu arquivo deve ficar parecido </zodb_db> suportados pela nova versão, ou que
com este; foram atualizados. Localize uma
Como não é o foco deste artigo ferramenta chamada
explicar as configurações do zope, (portal_migration), note que seu
não iremos comentar sobre as linhas ícone tem um ponto de exclamação
acima, você encontra mais detalhes vermelho, isso significa que o site
no site do zope[1]. precisa ser migrado.

17
Tecnico

6- Clique na ferramenta quantidade de dados que você tem,


então aproveite para colocar mais
13- Estamos chegando ao final de
(portal_migration) dentro dela nossa migração, volte a raiz do seu
café na xícara.
clique na (Migrate), na aba temos site Plone, clique no objeto
duas informações importantes, que chamado portal_atct, agora iremos
são: 10- Agora que recatalogamos os migrar os tipos do Plone para os
novos tipos baseados em archetype,
objetos, vamos reindexa-los, então
Instance version: 2.0.5 (Versão do essa ferramenta vai evitar que ao
entre na aba Indexes e então clique
nosso Plone Site) acessar qualquer objeto de nosso
no botão Select All e logo em
File system version: 2.5.1 (Versão novo ambiente dê aquele erro chato
seguida em Reindex.
de Plone Site que existe no de *recursion error*, primeiro
servidor). vamos entender o por que deste erro
11- Feito a recatalogação e e depois a solucionatíca! :D

7- Clique no botão Upgrade, isso indexação dos objetos, nos temos


que recatalogar os IDS dos objetos,
14- Este erro é causado por que
demora alguns minutos dependendo da então de volta a raiz do Plone,
quantidade de dados que você tem a estamos tentando importar um índice
note que foi criado um objeto
ser migrado, então é hora de você non-Archetypes-baseado (Objetos que
chamado uid_catalog, clique nele,
aproveitar a xícara de café ;). não são baseados em Archetypes), em
1° clique na aba Rebuild catalog,
um local que tenha os novo tipos
este deve demorar um pouco, 2°
Archetypes-based (Tipos baseados em
8- Após a xícara de café, teremos Clique na Aba Advanced e no botão
Update Catalog e por final clique
Archetypes) novos como padrão,
podemos ainda importar os tipos
na tela um trace do que foi na aba Indexes e clique no botão
migrado, eu sugiro dar um restart como usual, mas precisamos realizar
Select All e Reindex.
na instância, efetuando os passos algumas etapas para migrar eles ao
acima, já teremos quase tudo novos tipos AT-based types, por
migrado, agora é hora de migrar os
tipos antigos para os novos tipos
12- Ainda não terminou, entre no isso temos o portal_atct.
objeto reference_catalog localizado
do Plone. Nota rápida, o uso da ferramenta
também na raiz do Plone e repita o
portal_atct não é requerida para a
9- Voltando a raiz de seu Plone processo do item 11 (1° clique na
aba Rebuild catalog, este deve
migração, mas é recomendável.
entre em portal_catalog, na aba demorar um pouco, 2° Clique na Aba
Advanced clique no botão Update
Catalog, isso vai servir para que
Advanced e no botão Update Catalog
e por final clique na aba Indexes e
15- Clique na ferramenta
todos os objetos sejam portal_atct, depois na aba Type
clique no botão Select All e
recatalogados, claro este passo Migration e no botão Fix da sessão
Reindex).
também deve demarar dependendo da (Fix portal type names) aqui iremos

18
Tecnico

reparar os nomes dos tipos, para


invocar o reparo de código,
17- Este passo não é necessário, somente se após a migração você receber
um *Site Error* do tipo *isDefaultPageInFolder*, então afim de evitar este
certifique-se que o portal_type vai
erro, basta entrar na pasta (portal_skins/custom) e adicionar um
receber o CMF based Document.
script(python), com o id 'isDefaultPageInFolder', copie e cole no corpo do
script o conteúdo e salve;
16- Depois que os typos CMF Types from Products.CMFCore.utils import getToolByName
foram reparados podemos migra-los de
CMF para ATContentTypes, então na
aba Type Migration clique no botão ptool = getToolByName(context, 'plone_utils')
Migrate, ao final só para garantir
prepare outra xícara de café :D, e return ptool.isDefaultPage(context)
repita novamente os processos de
catalogação e indexação dos passos
9, 10 e 11.

AUTO R
LICENÇA

Python possui uma licença Open Source aprovada pela Cleber J Santos - cleber_jsantos@yahoo.com.br
OSI e compatível com a GPL, porém menos restritiva.
Sua licença prevê (entre outras coisas) que binários Militante na aposta ao Software Livre desde
da linguagem sejam distribuídos sem a necessidade de 2002, após tentativas frustradas em ferramentas
fornecer o código-fonte junto. Para maiores Web que não atendiam as necessidades migrou para
detalhes, visite Python Software Foundation License Zope, Python e Plone, ferramentas o qual se
dedica e atualmente atua, passou também a ser
sua aposta para uma Web mais dinâmica e
funcional.

19
FAQ

FAQ Fre q ue ntl y Pe rguntas


As k e d m ais
Que s tions fre q üe nte s

2 - Existe algum album de foto 5 - Como faço para tirar os icones


F AQs, ou Frequently Asked
Questions, são aquelas
estável? da barra de navegação?

perguntinhas feitas freqüentemente Sim o CMFPhotoAlbum Entre em ploneCustom.css e coloque


e que ficam na cabeça, e em um link para o album: as seguintes linhas no css
nível em todos. Abaixo estão http://www.zope.org/Members/cleber_j
apresentadas algumas perguntas e santos/CMF%20Photo%20Album .navTreeItem a,
respostas freqüentes sobre Python, .navTreeItem a:hover,
Zope e Plone que colhemos com base 3 - O Plone 3 esta com muito .navTreeItem div {
nos nossos passeios por fóruns e bundles? background-image: none !important;
listas online de discussão e nas }
nossas experiências do dia a dia. Plone 3 está em beta, porém já
estamos utilizando ele em vários 6 - O que é CMS?
1 - Como chamar um Links Externos? projetos com muito sucesso.
( /Content Management Systems ou
<a href="" class="tile" 4 - Como posso reduzir os itens do Sistema de gerenciamento de
tal:attributes="href portlet_related a apenas 5 itens? conteúdo ) /CMS, é um gerenciador
obj/getRemoteUrl; para websites, portais e intranets,
title obj/Description"> context.portal_catalog(Subject = cujo objetivo é estruturar e
<tal:block replace="structure subjects,sort_on = 'portal_type', facilitar a criação, administração,
here/link_icon.gif"/> sort_order = 'reverse', distribuição, publicação e
<span sort_limit=5 ) [:5] disponibilidade da informação.
tal:replace="obj/pretty_title_or_id">
Plone 2.1 announced!
</span></a>

20
PyCoffee

PyCoffee
Em DTML (crie um DTML Method), a gente Passar de DTMLpara ZPT

Z eca: - Eae JP, beleza?


JP: - Opa! Beleza! O quê você manda?
pode fazer assim: pode ter muitos motivos
como: Utilizar os
<dtml-in produtos recentes do
Zeca: - Queria entender melhor como o expr="(['1','2','3','4','5','6','7','8','9' plone, buscar uma
Zope trabalha com loopings. ,'10'])"> integração mais
<dtml-var sequence-item> < "amigável" com o
JP: - Que bom cara, eu estava afim de </dtml-in> designer, sem que um
fazer um coffe-break mesmo, eu Use o range para criar a seqüência de 1 a tenha jogar o PC no
10 automaticamente. outro, ou apenas buscar
te explico isso enquanto preparo um café
<dtml-in expr="_.range(1,11)">
para "nóis"..., uma facilidade de
<dtml-var sequence-item> <
</dtml-in> internacionalização.
Esse tal de looping nada mais é do que
processar uma seqüência Seja como for, o
repetidamente, apresentando por partes Manjou? Estamos repetindo a seqüência, processo não é tão
separadas cada item dessa nesse caso dez vezes, e complicado assim, e o
seqüência. mostrando o que tem em cada parte da papo desse mês vai
seqüência separadamente. trazer alguns exemplos
Por exemplo, digamos que temos uma Não vou me limitar ao DTML, se você de conversão de quem
seqüência de números de 1 a 10 e quiser fazer o mesmo em ZPT crie precisa migrar de DTML
queremos que no final de cada item dessa um Page Template e faça assim: para PZT.
seqüência (de cada número),
seja colocado um sinal de menor:

21
PyCoffee

ZPT
<b tal:repeat="sequencia
python:range(1,11)" > <form>
<span tal:replace="sequencia"/> > <select>
</b> <option>-</option>
<div tal:repeat=" sequencia python:_.range(1,10)">
<option tal:condition=python:"'9' == sequencia" tal:replace="here.
Simples, não ? Me passa o açúcar sequencia" selected></option>
por favor... Utilizando dessa lógica </div>
já posso te mostrar um exemplo mais </select>
legal... </form>

Digamos que você queira criar um


select que liste os números de 1 a
10, e não só isso, queria também Gostei cara!
deixar selecionado por padrão o JP: - Do café?
número 9. Faça assim. Zeca: - Também cara... rss.
JP: - Bom velhinho, agora preciso voltar para o trabalho... Qualquer
DTML coisa e só chamar.. Abraços.

<form>
<select>
<option>-</option>
<dtml-in expr="_.range(1,10)">
<option <dtml-if "9 == AUTO R
_[('sequence-item')]">
selected</dtml-if>><dtml-var
sequence-item></option>
</dtml-in> João Paulo Carusi - jpcarusi@gmail.com
</select>
</form> Confia e aposta no zope desde 2001. Fiel e
satisfeito com a ferramenta, nunca sentiu a
necessidade de procurar outra solução web.
Tem como objetivo fortalecer o Zope no Brasil.

22

Vous aimerez peut-être aussi