Blog
World Plone Day vem aí
A edição 2010 do World Plone Day está chegando. E como já virou tradição, a Equipe da Simples Consultoria vai realizar o evento aqui em São Paulo no dia 28 de abril.
Nos anos anteriores já tivemos palestras, sprints e até a construção de um site inteiro em um único dia. O formato deste ano ainda não foi decidido, mas já temos diversas idéias para fazer um World Plone Day melhor do que nunca.
Você tem alguma idéia? Deixe aí nos comentários o que você gostaria de ver no World Plone Day 2010.
Anote a data na sua agenda e fique atento ao nosso Blog para saber das novidades.
Sprint de Plone 4 na Campus Party
A equipe da Simples Consultoria vai realizar um Sprint de Plone nessa quinta-feira (28/01/10) dentro da Campus Party. O objetivo deste encontro é garantir que todos os produtos adicionais mantidos pela Simples Consultoria estejam prontos para o Plone 4.
Quem estiver disposto a participar basta procurar nossa equipe na área dedicada ao Software Livre.
Para localização mais precisa na hora do evento, acompanhe a Simples Consultoria no Twitter.
E quem ainda não conhece o Plone é só aparecer para ser apresentado ao mais completo CMS Open Source do mercado.
Mais informações sobre a Campus Party: http://www.campus-party.com.br
CMFContentPanels: Novas posições sem dor nas colunas
O CMFContentPanels é um produto bastante usado em site em Plone para a montagem e gerenciamento de páginas iniciais, especialmente em portais de notícia ou com bastante conteúdo. Algumas vezes surge a necessidade de uma disposição um pouco diferente dos destaques. Este breve tutorial mostrará como usar um recurso não muito conhecido do CMFContentPanels que permite a exibir uma linha com 1 coluna e logo abaixo outra linha com duas colunas, tal como mostrado na figura a seguir:

Basicamente o que vamos fazer é criar um painel de conteúdo dentro do outro. Para isso, siga os passos abaixo:
1 - Crie um Painel de Conteúdo novo.

2 - Neste Painel de Conteúdo inclua uma nova página, clicando no ícone semelhante a uma folha de papel no canto superior direito.
Com isso você terá um novo painel com o qual trabalhar:

3 - No primeiro painel (Page 1), delete uma coluna. Para isso, basta clicar no ícone vermelho no topo da coluna.
Com isso você já tera uma linha com 1 coluna e uma segunda linha com 2 colunas.

3 - Adicione os destaques em cada uma delas, e o resultado será algo próximo a imagem a seguir.
Novo Produto - Hot Sites
A possibilidade de criar hot sites, é uma solicitação cada vez mais frequente entre nossos clientes.
Para atendermos essa crescente demanda criarmos um produto que já está em uso em 2 clientes.
Simplificando o problema
Além disso, permitimos além de uma página que ele use todo o gerenciamento de conteúdo do Plone, pastas e conteúdos, portlets, e tudo mais.
Solução Simples
Para chegarmos a solução usamos os seguintes itens.
- Usar o subtyper, pois não queríamos um novo tipo só para isso
- Para sumir com a aparência padrão do Plone:
- Nova skin, que é trocada via regra de acesso (access rule)
- Ocultar os viewlets do topo e rodapé
- Ocultar os portlets por padrão, pode-se habilitar os portlets desejados posteriormente
- Para simplificar para o usuário, já colocamos um conteúdo modelo como visão padrão do hot site, que é escolhido pelo próprio usuário, pode ser um Flash, um Content Panel ou até mesmo uma Página.
- Ainda pensando na facilidade de uso, atribuímos, por padrão, o workflow de um estado localmente no hot site, ou seja, criou o conteúdo já está no ar.
Content Rules: regras de conteúdo no Plone
Content Rules, em português, Regras de Conteúdo é um poderoso recurso de gestão de conteúdo disponível a partir do Plone 3. Trata-se de uma maneira inteligente de tratar o conteúdo de seu site por meio de gatilhos e ações que automaticamente fazem coisas sempre que um conteúdo é criado, deletado ou modificado.
Nada melhor do que um exemplo para esclarecer. É comum depois que um site esteja pronto e entregue ao cliente que a arquitetura da informação planejada seja gradualmente desrespeitada pelos usuários na correria do dia a dia. Depois de alguns meses temos a raiz do site cheia de arquivos de difícil identificação, sem falar de conteúdos duplicados espalhados por toda parte. Pois bem, o Content Rule permite um controle maior da organização sem delegar ao usuário final novas responsabilidades. Podemos facilmente escrever uma regra de modo que toda vez que uma notícia for publicada em qualquer lugar do site ela seja movida para a pasta de notícias. Da mesma forma você pode definir que todo o evento criado seja imediatamente copiado para a pasta 'Agenda' de seu site ou ainda sempre que uma imagem for adicionada no portal ela seja copiada para o seu banco de imagens local. Na prática é como se o site tivesse uma faxineira para organizar a bagunça que é feita como conseqüência da rotina de trabalho e desatenção dos usuários finais.
Por padrão o Plone pode aplicar as regras de conteúdo para os seguintes eventos:
- Quando um objeto é Adicionado
- Quando um objeto é modificado
- Quando um objeto é removido
- Quando o estado do workflow do objeto é alterado.
A estes gatilhos podemos especificar condições como a seguir:
- Aplicar a regra para um tipo de conteúdo específico (noticia, evento. imagem, etc...)
- Aplicar a regra para uma extensão de arquivo em especial (*.doc, *.pdf, *.wmv, etc...)
- Aplicar a regra para um estado de workflow em particular (privado, esboço, publicado, etc..)
- Aplicar a regra para grupos específicos de usuário (administradores, usuários autenticados, etc..)
- Aplicar a regra para usuários que tenham um papel em particular (contribuidores, revisores, membros, etc..)
Por fim, satisfeitas as condições que especificamos podemos aplicar as seguintes ações:
- Exibir uma mensagem de registro do sistema
- Notificar usuário
- Copiar para pasta
- Mover para pasta
- Deletar objeto
- Alterar estado de workflow
- Mandar um e-mail
Importante ressaltar que tudo isso é feito na interface do próprio Plone, sem a necessidade de escrever códigos complicados ou mesmo de realizar alterações na ZMI ou no filesystem. Vejamos a seguir um exemplo simples de como criar um Conte Rule para organizar as noticias num plonesite.
Criando a sua Regra de Conteúdo
Neste exemplo mostraremos como criar uma regra de conteúdo para que todo item do tipo notícia seja movido para a pasta de Notícias de nosso site. Isso é feito em quatro fáceis etapas:
- Adicionar uma nova regra
- Configurar as condições
- Configurar a ação desejada
- Aplicar a regra as pastas do site
1. Adicionar uma nova regra
Logue-se em seu plonesite e vá ate as “Configurações do site” e sem seguida clique em “Regras de Conteúdo”. Você verá uma página como a representada abaixo. Clique no botão “Adicionar Regra de Conteúdo.”

Você entrará agora
na página de inclusão da nova regra. Vamos entrar os dados para
nossa regra de notícias como na ilustração a seguir:

Na janela “Adicionar condição”, escolha a opção “Content type” e clique em adicionar. Na página seguinte, escolha o item “Notícias” e salve, como demonstrado na ilustração.

2. Configurar as condições
Clique
em Organizador de Notícias. Iremos agora configurar as condições e
as ações de nossa regra. Você deverá estar vendo a seguinte
página:

Na janela “Adicionar condição”, escolha a opção “Content type” e clique em adicionar. Na página seguinte, escolha o item “Notícias” e salve, como demonstrado na ilustração.

3. Configurar a ação desejada
De volta a página de configuração da nossa regra de conteúdo em Adicionar ação, escolha agora a opção “Move to folder” e clique em “adicionar”

Seleciona a pasta, “Noticias” e salve as alterações:

4 Aplicar a regra as pastas do site
Nossa regra de conteúdo esta criada. Precisamos
agora apenas aplicá-la ao site. No nosso exemplo aplicaremos esta
regra na raiz, de modo que seja herdada por todas as subpastas, mas
poderíamos também aplicar regras apenas a subpastas específicas.
Para isso vá até a
raiz de seu site e clique na aba “Regras”. Selecione então nosso
“Organizador de Notícias” e clique em Adicionar:
Selecione
gora nossa regra na lista que vai aparecer e então clique em
“aplicar a subpastas”
Nosso “Organizador de Notícias” está pronto e funcinal. Faça um teste agora criando uma notícia em qualquer pasta do site. Se você seguiu corretamente os passos verá que estes itens sempre serão movidos para a página de notícias do site.
Criando novos eventos e ações
Vimos com
criar uma regra simples, mas o poder do Content Rule é bem maior do
que um mero organizador de conteúdo. É um recurso fácil de
aprender que está sendo estendido pela comunidade de desenvolvedores
para ficar ainda mais poderoso. Já é possivel por exemplo encontrar
produtos como o collective.contentrules.webservices que permite a
publicação de anúncios no Twitter e em outros sites semelhantes.
Veremos agora como cria ruma nova condição que verifica as Palavras Chaves de um conteúdo. Embora esse exemplo mostre como criar um novo tipo de conteúdo, o processo de criar uma nova ação é muito similar. Sempre que as diferenças entre estes dois processos ocorrerem elas serão especificadas.
Criando um pacote
Em primeiro lugar é preciso criar um novo pacote
onde colocaremos nossa nova condição. Usaremos um pacote egg e
instalaremos ele em nosso buildout.
No diretório src; de seu
produto:
$ cd src
$ paster create -t plone collective.keywordcondition
Selected and implied templates:
ZopeSkel#basic_namespace A project with a namespace package
ZopeSkel#plone A Plone project
Variables:
egg: collective.keywordcondition
package: collectivekeywordcondition
project: collective.keywordcondition
Enter namespace_package (Namespace package (like plone)) ['plone']: collective
Enter package (The package contained namespace package (like example)) ['example']: keywordcondition
Enter zope2product (Are you creating a Zope 2 Product?) [False]: False
...
Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: False
Atenção a pergunta sobre o namespace e name de
seu pacote (package), no nosso exeplo correspondendo ao egg name
collective.keywordcondition. Atenção também ao zope2products
status que no caso deve ser Falso, pois não precisaremos do Generic
Setup ou outro comportamento do Zope2. por fim, zip-safe deve ser
falso também, como em todos os pacotes do Zope.
Em seguida
instale como um egg em seu buildout de modo que o Zope reconheça seu
pacote. faça isso editando o arquivo buildout.cfg:
[buildout]
...
eggs =
...
collective.keywordcondition
developer =
...
src/collective.keywordcondition
...
[instance]
...
zcml =
...
collective.keywordcondition
Rode novamente seu buildout.
Adicionando uma condição
Uma condição do Content Rule consiste em:
1
- Uma interface que descreve os aspectos configuraveis da condição
2
- Um objeto permanente usado para armazenar as configurações da
condição
3 - Um adaptador usado para executar a condição
quando a regra é executada
4 - Um view e um view de edição que
permite que o usuário configure as condições.
Tudo isso
será colocado em um arquivo que chamaremos no nosso exemplo de
keyword.py dentro do pacote collective.keyword
Em primeiro
ligar vamos importar alguns elementos importantes:
from persistent import Persistent
from OFS.SimpleItem import SimpleItem
from zope.interface import implements, Interface
from zope.component import adapts
from zope.formlib import form
from zope import schema
from zope.app.component.hooks import getSite
from zope.component.interfaces import IObjectEvent
from plone.contentrules.rule.interfaces import IExecutable, IRuleElementData
from plone.app.contentrules.browser.formhelper import AddForm, EditForm
from Acquisition import aq_inner
from collective.keywordcondition import MessageFactory as _
Perceba que usamos o MessageFactory para fins de tradução. Ele é definido em __initi__.py no nosso pacote collective.keywordcondition:
from zope.i18nmessageid import MessageFactory
MessageFactory = MessageFactory('collective.keywordcondition')
Agora, definimos a interface usado zope.schema, que descreve os aspectos configuráveis de nosso condição. No nosso caso, uma lista de palavras chave. O título, descrição e outros metadados serão usados por zope.formlib nos formulários de edição e adição. Veja o pacote zope.schema para mais informações sobre como cada campo é usado.
class IKeywordCondition(Interface):
"""Interface for the configurable aspects of a keyword condition.
This is also used to create add and edit forms, below.
"""
keywords = schema.Tuple(title=_(u"Keywords"),
description=_(u"The keywords to check for."),
required=True,
value_type=schema.TextLine(title=_(u"Keyword")))
Agora, criaremos a implementação de armazenamento da condição:
class KeywordCondition(SimpleItem):
"""The actual persistent implementation of the keyword condition element.
Note that we must mix in SimpleItem to keep Zope 2 security happy.
"""
implements(IKeywordCondition, IRuleElementData)
keywords = []
element = "collective.keywordcondition.Keyword"
@property
def summary(self):
return _(u"Keywords contains: ${names}", mapping=dict(names=", ".join(self.keywords)))
As variáveis da palavra chave, definem o valor padrão do campo na interface IKeywordCondition já mencionada. O elemento especificada apenas um nome para esse elemento da regra (condições e ações costumam ser chamados de elementos da regra (element rule). Por convenção este nome possui o nome do pacote separado por um ponto de modo a garantir que seja único. O nome do elemento será referenciado novamente mais tarde no arquivo configure.zcml
O objeto de armazenagem deve também
implementar uma propriedade summmary. Ela é usada para no Painel de
Controle termos um resumo do que a condição faz.
O Executor
Depois de definir a condição de
armazenamento, definimos o executor:
class KeywordConditionExecutor(object):
"""The executor for this condition.
This is registered as an adapter in configure.zcml
"""
implements(IExecutable)
adapts(Interface, IKeywordCondition, IObjectEvent)
def __init__(self, context, element, event):
self.context = context
self.element = element
self.event = event
def __call__(self):
context = aq_inner(self.event.object)
keywords = frozenset()
try:
keywords = frozenset(context.Subject())
except (AttributeError, TypeError,):
# The object doesn't have a Subject method
return False
return (len(keywords.intersection(self.element.keywords)) > 0)
É simples adaptar o tipo de objeto de conteúdo por contexto (nesse caso, não nos interessa que tipo de objeto será usado, assim especificamos Interface, que é a interface mais genérica de todas), o tipo de condição (nossa interface recém definido IKeywordCondition) e o tipo de evento ( no nosso caso IObjectevent, uma interface genérica que descreve eventos sobre objetos.
ATENÇÃO: É possível sobrescrever implementações do executor para diferentes contextos ou eventos através do registro de novos adaptadores.
O executor tem ainda um método importante, o __call__9) que é chamado durante a execução da regra, Ele deve retornar verdadeiro ou falso. Em caso de True, a execução continua, par a a próxima condição ou ação, caso contrário o processo é abortado.
Se você está criando um action seu adaptador é quem farpa o verdadeiro trabalho da ação. Ele também deve retornar true ou false para indicar se o processo pode continuar.
Perceba como o executor é escrito de uma maneira defensiva, afinal as regras podem ser invocada para uma variedade de eventos e circunstancias.
Formulários
Finalmente devemos definir os formulários de
inclusão e edição que usaremos para criar ou modificar nossa nova
condição. Usaremos a biblioteca zope,formlib e nossa interface
IkeywordCondition da seguinte maneira:
class KeywordAddForm(AddForm):
"""An add form for portal type conditions.
"""
form_fields = form.FormFields(IKeywordCondition)
label = _(u"Add Keyword Condition")
description = _(u"A keyword condition makes the rule apply only to content with certain keywords.")
form_name = _(u"Configure element")
def create(self, data):
c = KeywordCondition()
form.applyChanges(c, self.form_fields, data)
return c
class KeywordEditForm(EditForm):
"""An edit form for portal type conditions
"""
form_fields = form.FormFields(IKeywordCondition)
label = _(u"Edit Keyword Condition")
description = _(u"A keyword condition makes the rule apply only to content with certain keywords.")
form_name = _(u"Configure element")
As classes AddForm e EditForm prestam suporte
ao plone.app.contenrules com os boões e validadores padrão.
Configurando o componente
Com o código no lugar devemos agora registrar
nosso componente no configure.zcml
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
xmlns:plone="http://namespaces.plone.org/plone"
xmlns:five="http://namespaces.zope.org/five"
i18n_domain="collective.keywordcondition">
<include package="plone.contentrules" />
<include package="plone.contentrules" file="meta.zcml" />
<!-- the keyword condition -->
<adapter factory=".keyword.KeywordConditionExecutor" />
<browser:page
for="plone.app.contentrules.browser.interfaces.IRuleConditionAdding"
name="collective.keywordcondition.Keyword"
class=".keyword.KeywordAddForm"
permission="cmf.ManagePortal"
/>
<browser:page
for="collective.keywordcondition.keyword.IKeywordCondition"
name="edit"
class=".keyword.KeywordEditForm"
permission="cmf.ManagePortal"
/>
<plone:ruleCondition
name="collective.keywordcondition.Keyword"
title="Keyword"
description="Apply only when the current content object has one of the given keywords"
for="*"
event="zope.component.interfaces.IObjectEvent"
addview="collective.keywordcondition.Keyword"
editview="edit"
/>
</configure>
Aqui em primeiro lugar importamos os elementos
de configuração necessários de plone.app.contentrules e
registramos nosso adaptador, e os views de inclusão e edição. O
nome do view de inclusão deve corresponder ao nome do elemento
(collective.keywordcondition.Keyword no nosso caso) conforme
fora definido na classe. O nome da edição deve ser sempre
edit
Finalmente registraremos o tipo de condição:
Atenção:
Quando criando uma ação use a diretiva <plone:ruleAction />.
Ela usa os mesmos atributos de <plone:ruleCondition/>
Novamente,
o nome deve corresponder ao definido na classe. O título e descrição
são usamos na interface do usuário.
Os atributos for e
event são usados para controlar quando o elemento está disponível.
Nesse caso, ele é disponível em todos os contextos de eventos e
objeto.
Muitos dos eventos registrados no Content Rules são
herdados de IObjectEvent. A interface simplesmente garante que haverá
um atributo de objeto no evento que contem o objeto para qual o
evento foi colocado. Se você quer restringir a condição para um
evento ou tipo mais específico você pode definir uma interface
diferente aqui. Isso geralmente só é necessário se você precisa
de informações adicionais para executar a condição.
Atenção: Deve haver pelo menos um adaptador aplicável ao evento na qual a condição ou ação for registrada.
Recuperando arquivos deletados no Plone
Deletou um arquivo ou uma pasta que não devia? Nem tudo está perdido. O Plone permite que o administrador veja o histórico de todas as ações feitas por seus usuários e dependendo do caso permite ainda a recuperação de conteúdos deletados.
Essa característica do sistema permite que você desfaça alterações feitas tanto nas configurações como no conteúdo de seus objetos. É uma tarefa relativamente simples, mas que pode eventualmente salvar o seu dia. Veja como fazer isso:
Primeiramente digite no final de sua url /undo_form
Fazendo isso você entrará na tela de Desfazer Ações. Note que esta é uma tela contextual, se você digital /undo_form logo depois da raiz do seu portal terá acesso a todas as últimas ações, se entrar numa área específica verá as ações apenas daquela pasta para dentro.
De qualquer forma você chegará a uma página semelhante a esta:

Agora é necessário encontrar a página que foi deletada. Ela poderá ser identificada no campo "Ação Realizada", que dará tanto o caminho até a pasta, seu título e a ação "Deleted", como no modelo abaixo:
Depois de ter encontrado a ação que apagou seu arquivo, você poderá desfazê-lo. Para isso selecione-o com o checkbox a esquerda da tabela e então clique no botão 'Desfazer' no final da página.
Não vai haver nenhuma página de resultados, depois de desfeita você deve voltar para a pasta em questão e o conteúdo recuperado já deverá estar lá lhe esperando.
É importante ressaltar que mesmo que uma ação seja exibida na tabela, isso não é certeza de que você poderá desfazê-la. Isso acontece porque algumas transações posteriores podem modificar a pasta em questão ou usar o mesmo id anterior. Por isso, lembre-se que esse é um recurso de emergência e nunca substituirá o cuidado que o usuário deve ter com seus arquivos.
Criando seu próprio repositório do Pypi
É incrível como ainda me impressiona o fato de eventos como o Plone Symposium South America, realizado em São Paulo, pode nos render ainda mais aprendizado, fora as amizades e trocas de experiências é claro ;)
A Arte do design para Plone
Essa semana tive a honra de ser um dos palestrantes do Plone Symposium South America, realizado em São Paulo, junto a grandes nomes da comunidade brasileira de Plone e de diversos palestrantes internacionais, como Alexander Limi e Eric Steele.
Em cerca de vinte minutos pude mostrar um pouco da experiência da Simples nos últimos anos e mostrar algumas lições que aprendemos em mais de 500 projetos realizados com Plone.
Para quem não teve a oportunidade de acompanhar, veja a seguir a a apresentação:
Plone Symposium South America: o Sprint
Está acontecendo neste exato momento o sprint do Plone Symposium South America. É curioso e muito gratificante ver pessoas de vários países trabalhando juntos para um objetivo em comum. Considerando que hoje é dia de Ação de Graças, a conversa do almoço com @cleberjsantos acabou nos lembrando de uma antiga narrativa bíblica que acho que pode fazer um paralelo interessante ao que está acontecendo hoje.
Para quem não sabe, a certa altura do livro de Gênesis, os habitantes da Babilônia decidem trabalhar juntos para construir uma torre tão alta e majestosa que levaria a humanidade a conquistar os céus. Um projeto ambicioso para a época diga-se de passagem. Por motivos que me escapam o Deus bíblico achou essa empreitada pretensiosa demais, e resolveu confundir um pouco as coisas. Subitamente, cada um dos trabalhadores começou a falar uma língua diferente, a confusão se instalou e o projeto não pode ser levado a diante. Essa é a origem bíblica dos vários idiomas humanos.
Acontece que o que foi um problema para os babilônicos da história não está sendo um problema aqui hoje. Estamos um pouco mais organizados depois de alguns milênios. Enquanto escrevo este post tenho ao meu redor pessoas de vários países diferentes e pelo menos três idiomas sendo usados. Mas isso não desanima ninguém, pelo contrário torna o ambiente ainda mais interessante.
O enfoque da 'Cayapa' é a internacionalização. Nosso objetivo é resolver alguns bugs e especificamente melhorar ainda mais a interface para os idiomas português e espanhol. É sempre bom lembrar que este sempre foi um ponto forte do Plone, contando hoje com mais de 40 idiomas suportados, incluindo diversos dialetos.
Vale ainda um especial agradecimento a presença de @limi, @esteele, @robertoallende e @macagua que vieram de seus países para nos dar essa força. Pessoas especiais que estão ajudando a fazer o mundo um lugar menor e ao mesmo tempo mais grandioso.
- Confira algumas fotos do Plone Symposium South America
Instalando o Plone 4 core-dev
Não dá para negar, o Plone vem evoluindo a cada dia desde seu lançamento, a quantidade de *commits* de códigos, correções, traduções, produtos, documentações e pessoas voltadas a melhoria do Plone em todas as áreas tem crescido muito.
Plone Autenticando com LDAP / Active Directory (AD)
Vamos aprender a configurar o Plone para autenticar os usuários com a base do AD do seu Windows Server, muito utilizado em intranets.
Nesse post vou apenas tratar a configuração do Plone com o AD, mas a mesma analogia serve para o LDAP com OpenLDAP, não vou abordar a configuração do AD nem do OpenLDAP, vamos assumir que os usuários já funcionam nesses ambientes, estamos apenas incluindo a intranet.
Configurando o Plone para autenticar com LDAP.
O Active Directory é uma base LDAP, mas com uma boa camada de interfaces gráficas por cima.
A maior dificuldade para configurar o AD no Plone é ter acesso aos "caminhos" dos objetos do AD na notação LDAP, pois é dessa forma que devemos configurar no Plone.
Para facilitar a nossa vida existe um aplicativo que nos fornece os dados na notação LDAP.
Obtendo os dados LDAP no seu Windows Server
No servidor AD baixe o ADSI.
Esse é um plugin para o MMC, aquele aplicativo onde configuramos o AD e vários outras coisas no Windows.
Extraia os 2 arquivos desse .zip para a pasta C:\Windows\system32 ou a pasta system32 do seu sistema que pode estar em outro caminho.
Execute o arquivo adsiedit.msc, para isso ou clique 2 vezes ou vá em Iniciar -> "Executar..." e digite: adsiedit.msc, o system32 está no PATH, portanto pode-se executá-lo diretamente
Deixe esse aplicativo aberto, pois vamos buscar alguns dados nele, abaixo está a explicação de como pegar os dados.
Agora vamos ao Plone, acesse a ZMI (URL de exemplo: http://servidor:8080/Plone/manage)
Em acl_users (dentro do Plone Site) instalar o ActiveDirectory Multi Plugin.

Configuração: Na tela que aparece ao criar ou em /Plone/acl_users/UsuarioIntranet/acl_users aba Configure
LDAP Server
O IP do seu servidor AD (LDAP), configura-se na criação ou em /Plone/acl_users/UsuarioIntranet/acl_users na aba LDAP Servers
10.75.76.2
Title
Um título qualquer para identificar esse conteúdo
Login Name Attribute
Windows Login Name (sAMAccountName)
User ID Attribute
Canonical Name (cn)
RDN Attribute
Canonical Name (cn)
Users Base DN
Caminho LDAP para o diretório onde ficam os usuário no seu AD (ou LDAP)
Lá no adsiedit, clique com o botão direito na pasta de usuários e clique em Propriedades e procure pelo atributo distinguishedName e copie-o para esse campo.
CN=Users,DC=simplesnet,DC=simplesconsultoria,DC=com,DC=br

Scope
SUBTREE
Group storage
Groups not stored on LDAP server
Group mapping (Applies to LDAP group storage only)
Automatically map LDAP groups to Zope roles
Groups Base DN
Caminho LDAP para o diretório onde ficam os grupos no seu AD (ou LDAP), nesse exemplo os grupos ficam junto com os usuários
Lá no adsiedit, clique com o botão direito na pasta de grupos e clique em Propriedades e procure pelo atributo distinguishedName e copie-o para esse campo.
CN=Users,DC=simplesnet,DC=simplesconsultoria,DC=com,DC=br
Scope
SUBTREE
Manager DN
Caminho LDAP do usuário que usaremos para acessar o AD (LDAP), pode ser um usuário comum, porém terá que ser como somente leitura
Lá no adsiedit, clique com o botão direito no usuário que fará a conexão ao AD e clique em Propriedades e procure pelo atributo distinguishedName e copie-o para esse campo.
CN=Luciano Pacheco,CN=Users,DC=simplesnet,DC=simplesconsultoria,DC=com,DC=br
Password
Senha do usuário informado no Manager DN (essa senha será usado no acesso ao LDAP)
Manager DN Usage
Always
Read-only
Verdadeiro se o usuário informado em Manager DN não for administrador no AD (LDAP)
User object classes
Utilize o padrão
top,person
Additional user search filter
Deixe Vazio
User password encryption
SSHA
Default User Roles
Qual é o papel padrão dos usuário do AD (LDAP). Por padrão usamos Member
Member
Testando
Depois de configurado acesse /Plone/acl_users/UsuarioIntranet/acl_users aba Users
Faça uma busca por um usuário que você saiba que exista no AD (LDAP), use admin que deve aparecer o Administrator ou Administrador. ;-)
Se achar o usuário já está praticamente funcionando. :-) Um viva para nós!
Mais uns detalhezinhos
Acesse /Plone/acl_users/UsuarioIntranet na aba Properties e configure:
groupid_attr para sAMAccountName
Mapeando propriedades do usuário para o AD
Acesse /Plone/acl_users/UsuarioIntranet/acl_users na aba LDAP Schema.
Já existem algumas propriedades padrão configuradas.
Vamos adicionar o e-mail como exemplo.
Na parte inferior da tela você pode adicionar novas propriedades.
LDAP Attribute Name
Nome do atributo do usuário lá no AD, verifique os atributos disponíveis através do adsiedit
Exemplo: mail
Friendly Name
Nome amigável para o usuário
Multi-valued
Nunca usei, mas deve ser algo como uma lista
Binary
Nunca usei, não sei qual seria o caso de uso
Map to Name (optional)
Nome que será utilizado dentro do Plone
Exemplo: email
Tratando CSS no Plone por seção, template ou id
Uma coisa que vira e mexe acaba aparecendo para todo webdesigners é a necessidade de tratar de maneira especial alguma seção ou mesmo alguma página específica do seu site. Seja por motivos de organização ou por questões puramente estéticas, não é difícil um cliente pedir para que uma seção tenha um cabeçalho próprio ou algum detalhe especial no layout para ser diferenciado do resto da página.
Como fazer isso sem precisar duplicar templates inteiros é uma questão que pode ser resolvida com facilidade no Plone. Por meio da linguagem ZPT o Plone já trás sempre em sua tag body algumas classes específicas.
O código, que se encontra no main_template é o seguinte:
<body tal:attributes="class string:${here/getSectionFromURL} template-${template/id};">
E quando visualizado por exemplo em uma notícia, fica assim:
<body class="section-news template-newsitem_view">
Ou seja, ele varia conforme o local do portal e o template usado. A primeira classe, .section-news, é aplicada dentro de todo diretório news. Esse comportamento se repete em todo portal. A segunda classe, .template-newsitem_view aparece em todos os templates de notícia.
Com o uso inteligente do css podemos agora tratar de maneira especial cada uma dessas situações. No exemplo abaixo, colocamos um cabeçalho próprio para toda a seção de notícias do site:
.section-news #portal-header {background: url(cabecalho-noticias.png) no-repeat;}
Apenas isso já dá um poder imenso para o designer mudar suas páginas e as diversas áreas do site. Mas existe ainda uma maneira de ser ainda mais pontual nessa customização. basta adicionar a linha destacada em negrito a tag body do main_template:
<body tal:attributes="id string:${here/id};
class string:${here/getSectionFromURL} template-${template/id};">
Após ser renderizado em uma página esta tag vai ganhar um id igual ao id do Plone e poderia aparecer assim:
<body id="quem-somos" class="section-institucional template-template-document_view">
É claro que não é sadio nem muito inteligente tratar todas as páginas de maneira independente, mas mesmo assim esse recurso pode ser bastante útil para situações muito específicas ou casos de emergência.
Sites governamentais utilizando CMS Open Source
Depois que retuitei uma mensagem do @MacYET recebi diversas mensagens de pessoas perguntando pela fonte das informações. A mensagem mostrava uma rápida comparação sobre os principais CMS Open Source do mercado e o número de sites governamentais em que eles eram utilizados:
RT @MacYET: Open Source software used by .gov sites: 46 in Drupal, 30 in Joomla, 17 in Wordpress, 234 in #Plone #ploneconf2009 #gov20
Como não encontrei a fonte, fiz uma pequena pesquisa e pelo que percebi, as informações foram coletadas diretamente nos sites das comunidades de cada um dos sistemas citados. Veja a tabela a seguir e compare os números com os links fornecidos:
| CMS | .gov sites |
url |
|---|---|---|
| Drupal | 43 | http://groups.drupal.org/local-government e http://tinyurl.com/drupal-gov |
| Joomla | 30 | http://tinyurl.com/joomla-gov |
| Wordpress | 17 | http://tinyurl.com/wordpress-gov |
| Plone | 234 | http://tinyurl.com/plone-gov |
Ou seja, as informações não são precisas, mas são fornecidas pelas próprias comunidades.
Esse assunto veio a tona depois que a Casa Branca adotou o Drupal, deixando toda a comunidade Drupal bastante empolgada com algumas excessões, que estão prevendo um desastre.
Prefiro não entrar no mérito desta discussão. Para nós, cabe festejar o grande número de websites governamentais feitos com o Plone. Boa parte deles são brasileiros, principalmente depois que a dobradinha Zope e Plone se tornou a principal recomendação do Governo Federal, como pode ser visto na cartilha publicada pelo Governo Federal.
E isso ainda sem falar do projeto Interlegis, que não está incluído nesse número. Só no Interlegis são mais de 120 câmaras municipais que tem seus sites feitos em Plone.
Quem ainda não segue, aproveite para acompanhar no twitter o meu perfil e o da Simples:
- Simples Consultoria: http://twitter.com/simplesconsult
- Andre Nogueira: http://twitter.com/agnogueira
Coleções e Plone 3.3.1 - Bug e atualização
Estava ministrando treinamento de Plone durante este sábado quando, ao demonstrar as maravilhas que podem ser realizadas com o tipo Coleção (Collections, Topic, Smart Folder, Pasta Esperta e por aí vai), deparei-me com um bug introduzido com o release 1.3.3 do Products.ATContentTypes.

Ao tentar adicionar um critério a uma coleção, um bug na forma como o ATContentTypes gera a resposta à requisição feita via Ajax, faz com que se torne impossível selecionar qualquer valor da combo box.
Depois de uma longa producra (2 minutos, para ser exato) vi que o bug era conhecido. Na verdade, conhecido e resolvido, pois o Products.ATContentTypes tinha tido release 1.3.4 para resolver exatamente este problema.
Enquanto o Plone 3.3.2 não vem, com o fix já incluído, sugiro a todos que estejam com a versão 3.3.1 a marcarem a versão a ser usada -- versions.cfg do buildout deve resolver -- do Products.ATContentTypes para 1.3.4. Depois é só rodar o buildout novamente e reiniciar as instâncias.
Nova versão do Zope 2 na área - 2.12
Lançada nova versão do servidor de aplicação Zope 2.12
Parabéns ao RIO, Parabéns ao CPB
O assunto do final de semana aqui no Brasil foi o "Yes we créu", decorrência direta da escolha do Rio de Janeiro como sede dos Jogos Olímpicos e Paraolímpicos de Verão de 2016. Na Simples Consultoria também tivemos nossas comemorações.
Na última terça-feira trouxemos para a nossa carteira de clientes o Comitê Paraolímpico Brasileiro, responsável pelo desenvolvimento e valorização do esporte paraolímpico no país.
Será um trabalho longo e de reconstrução do site, mas no final este é o tipo de projeto que nos traz orgulho e celebração.
2016 está logo aí, nós vamos zelar para que o CPB esteja a altura da honraria do Rio de Janeiro.
Plone e Usabilidade: Tudo a ver
É interessante ver como o mundo dá voltas. Em 2005 a Simples Consultoria foi a responsável pela criação do site do World Usability Day brasileiro. Naquele momento se formava a UPA Brasil (Usability Professionals Association) e dois de nossos fundadores, Karyn Nassif e André Nogueira, estavam entre os líderes da iniciativa.
Não é necessário dizer que o site criado naquele ano foi feito com Plone. Repetimos a dose no evento seguinte e os resultados -- e a repercussão -- foram fantásticos. Recebemos diversas mensagens parabenizando pelo site -- principalmente pela sua acessibilidade -- e isto nos motivou bastante.
Por diversas razões não estivemos envolvidos com as edições 2007 e 2008 do WUD, mas eis que em 2009 temos, novamente, nosso trabalho em destaque. Desta vez na edição alemã do evento: http://worldusabilityday.de/ .
Qual não foi a nossa surpresa -- e alegria, claro -- ao ver o tema criado para o World Plone Day 2009 sendo utilizado para o site de um evento que nos é tão familiar.
Sucesso ao World Usability Day deste ano, que será dia 12 de novembro, e esperamos ver notícias da edição brasileira.
Atributos de atalho no CSS
Hoje vamos falar de um conceito extremamente simples de css mas que passa batido por algumas pessoas. Um conceito que quando começar a ser aplicado dará ao seu código uma aparência muito mais profissional. Basicamente, trata-se de uma forma de dizer mais falando menos ou, se preferir, de codificar mais escrevendo menos. Vamos a ela.
Primeiro, considere o código abaixo:
p {
font-size: 12px;
font-family: Arial;
font-weight: bold;
line-height: 1.5em;
font-style: italic;
font-variant: small-caps;
}
Note que este mesmo código pode ser escrito encapsulando todos os atributos em um único atributo 'font':
p {font: 1em/1.5em bold italic small-caps Arial;}
Sete linhas a menos! O atributo font é uma propriedade de atalho que permite que todos aqueles atributos sejam definidos de uma só vez. Se algum deles foi omitido então é assumido o seu valor padrão.
Outros exemplo interessante:
#box {
background-color: transparent;
background-image: url(imagem.png);
background-repeat: no-repeat;
background-attachment: scroll;
background-position-y: 10px;
background-position-x: 15px;
}
Compare com:
#box { background:transparent url(imagem.png) no-repeat scroll 10px 15px; }
Muito melhor, não é? É claro que estes são exemplos extremos mas de linha em linha seu código pode ficar consideravelmente menor no final do projeto se você se lembrar desta dica que é fácil, mas bastante poderosa.
Como usar jQuery no Plone
jQuery oferece uma vasta gama de possibilidades e recursos que podem ser amplamente usados pelos desenvolvedores web. De fato, ele é tão útil que já vem pré-instalado no Plone. No entanto o processo exato de instalação de um add-on pode ser um pouco confuso para quem não tem experiência. Pensando nisso separamos aqui o procedimento de uma maneira simplificada:
Em primeiro lugar suba para o seu site o add-on que quer instalar. Atenção, como mencionado acima, não é preciso subir novamente o arquivo jquery.js, pois este já está instalado no Plone.
O segundo passo é renomear o seletor '$' que vem na imensa maioria dos add-ons e mudá-lo para 'jq' ou 'jQuery'. Isso é importante para que o script não entre em conflito com outros scripts que já estajam instalados e operantes no Plone. Então, por exemplo se a chamada está $(”#portal-logo”), deve ficar jq(”#portal-logo”) ou jQuery(”#portal-logo”).
Depois disso entre na ZMI e em seu plonesite acesse o portal_javascripts. É aqui que são feitos os registros dos javascripts usados no seu site. Em ID/URL coloque o nome do seu arquivo. Deixe as opções Condition e Conditional Comment em branco e o tipo de compreensão 'safe'. A opção Merging allowed deve estar desabilitada também.
Vale dizer que o processo acima só funcionará para scripts bem feitos. Se eventualmente você se deparar com um add-on que insiste em não funcionar, existe ainda a última opção de registrar ele diretamente no template em que você o quer. No main_template temos um slot destinado para estas inclusões de javascript. Se este for o seu caso, esta é uma maneira prática de fazer isso:
<script type="text/javascript" tal:attributes="src string:$portal_url/SEU-JAVASCRIPT.js" ></script>
Plone nas eleições 2010
O ano que vem promete ser um ano extremamente agitado e complicado para todos. Além de nossos numerosos feriados e do carnaval, teremos dois eventos que prometem parar o país: a Copa do Mundo de Futebol e as Eleições. Mas estes eventos que tradicionalmente deixam apreensivos muitos empresários, desta vez prometem esquentar a economia.
A Copa do Mundo deve dar o impulso que ainda falta para a Televisão Digital acontecer no Brasil. Como consequência direta devemos acompanhar o aumento da venda de conversores e de televisões LCD de alta definição, principalmente os modelos Full HD. E como consequência indireta espero também que a Copa seja palco de muitas inovações com relação a interatividade da TV digital, praticamente inexistente hoje, e diversas novidades na integração da TV com aplicações web como por exemplo o twitter e outras redes sociais.
Eleições
No lado das eleições, as mudanças na legislação eleitoral prometem agitar a web e todos os seus profissionais. Apesar de ainda estar tramitando no Senado, tudo indica que a nova lei eleitoral será aprovada com facilidade mudando as regras já para 2010.
A novas regras irão premitir o uso livre de blogs e redes sociais, não restringindo mais o candidato apenas ao seu site com um domínio .can.br como era feito na última eleição. Além de poder usar um domínio .com ou .com.br o candidato poderá fazer campanha no twitter, orkut e no youtube por exemplo, e ainda contar com a disposição e apoio de blogueiros engajados. Entretanto ainda fica proibido o uso de publicidade, seja com banners, link pratocinados e posts pagos.
Já da pra imaginar a quantidade e erros e mal uso das ferramentas que vamos encontrar por aí e também o enorme trabalho que o Tribunal Eleitoral terá para avaliar e punir o descumprimento dessas leis.
E outra grande mudança que vai praticamente "obrigar" que todo candidato tenha um site bem feito é a liberação das doações de pessoas físicas para a campanha através de cartão de crédito. Todo cidadão poderá fazer doações individuais ao seu candidato através de cartões de crédito, desde que essa doação não ultrapasse 10% de sua renda.
Plone para presidente
Nesse cenário o Plone aparece como a solução ideal para o desenvolvimento de sites para candidatos na eleição de 2010. Além da sua já comprovada excelência no gerenciamento de conteúdo, hoje o Plone é um CMS completo, que conta com diversos recursos que permitem criar um site completo para um candidato de maneira fácil e rápida, como ferramentas para a criação de formulários, enquetes, monitoramento e integração com redes sociais (youtube, twitter entre outros), newsletter, blogs e moderações de comentários.
E além de todos esses recursos, a partir de agora o Plone ainda pode contar com o Getpaid, um produto que faz a integração do site Plone com diversos meios de pagamentos online, possibilitando ao candidato a criar uma área de deações para a campanha dentro do seu próprio site.
Com a nova lei e o Plone, um site para um candidato deixa de ser uma ferramenta importante e passa a ser um investimento indispensável para as próximas eleições.

