Ferramentas Pessoais
Você está aqui: Home Blog

Blog

World Plone Day vem aí

por André Nogueira em 11/03/2010 18:44
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.

 

| Comentários

Sprint de Plone 4 na Campus Party

por André Nogueira em 27/01/2010 18:25
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

| Comentários

CMFContentPanels: Novas posições sem dor nas colunas

por Thiago Tamosauskas em 20/01/2010 11:42
Categoria: CMFContentPanels, Plone


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:

cpp5.png

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.

cpp1.png
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:

cpp2.png

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.

cpp3.png

3 - Adicione os destaques em cada uma delas, e o resultado será algo próximo a imagem a seguir.
cpp4.png

| Comentários

Novo Produto - Hot Sites

por Luciano Pacheco em 29/12/2009 18:03

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

 
A solução em si é relativamente simples, a grande sacada foi concebida após alguns debates para um projeto urgente, onde eu, o Daniel e Érico chegamos a conclusão:
 
O que é um hot site ?
Uma pasta onde o usuário pode criar uma página, normalmente um Flash, e sem ter a aparência normal do restante do Plone site. 

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.

  1. Usar o subtyper, pois não queríamos um novo tipo só para isso
  2. Para sumir com a aparência padrão do Plone:
    1. Nova skin, que é trocada via regra de acesso (access rule)
    2. Ocultar os viewlets do topo e rodapé
    3. Ocultar os portlets por padrão, pode-se habilitar os portlets desejados posteriormente
  3. 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.
  4. 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. 
 
Para maiores detalhes visite a página do produto no pypi e o repositório svn:
 
 
| Comentários

Content Rules: regras de conteúdo no Plone

por Thiago Tamosauskas em 21/12/2009 11:05
Categoria: Plone, Content Rules
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:

  1. Adicionar uma nova regra
  2. Configurar as condições
  3. Configurar a ação desejada
  4. 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.”

fig1.gif

 
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:


fig2.gif

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.

fig3.gif

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:

fig4.gif

 

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.

fig5.gif

 

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”

fig6.gif

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


fig7.gif

 

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:

fig8.gif

Selecione gora nossa regra na lista que vai aparecer e então clique em “aplicar a subpastas”

fig9.gif

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.


Fontes:
http://plone.org/documentation/tutorial/creating-content-rule-conditions-and-actions/tutorial-all-pages

http://www.slideshare.net/wooda/kamon-ayeva-let-the-machine-work-for-you-using-plone-content-rules-for-more-productivity/

 

| Comentários

Recuperando arquivos deletados no Plone

por Thiago Tamosauskas em 17/12/2009 18:05
Categoria: CMS, 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:

undo.gif


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:

undo2.gif

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.

| Comentários

Criando seu próprio repositório do Pypi

por Cleber J Santos em 01/12/2009 11:25

É 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 ;)

Criando seu próprio repositório do Pypi | Comentários

Leia mais…

A Arte do design para Plone

por André Nogueira em 28/11/2009 09:13

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:

 

Mais informações sobre o Plone Symposium visite: http://www.plonesymposium.com.br

 

| Comentários

Plone Symposium South America: o Sprint

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.

| Comentários

Instalando o Plone 4 core-dev

por Cleber J Santos em 18/11/2009 15:52

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.

Instalando o Plone 4 core-dev | Comentários

Leia mais…

Plone Autenticando com LDAP / Active Directory (AD)

por Luciano Pacheco em 12/11/2009 13:50
Categoria: Desenvolvimento, Plone
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.

Configurando o LDAP

 

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

distinguishedName


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

 

Propriedades do usuário

 

 


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

| Comentários

Tratando CSS no Plone por seção, template ou id

por Thiago Tamosauskas em 10/11/2009 10:05
Categoria: Webdesign, Plone, CSS
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.

| Comentários

Sites governamentais utilizando CMS Open Source

por André Nogueira em 30/10/2009 10:15

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:

| Comentários

Coleções e Plone 3.3.1 - Bug e atualização

por Érico Andrei em 12/10/2009 03:16

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.

Critérios em coleções

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.

 

| Comentários

Nova versão do Zope 2 na área - 2.12

por Luciano Pacheco em 06/10/2009 11:21

Lançada nova versão do servidor de aplicação Zope 2.12

Nova versão do Zope 2 na área - 2.12 | Comentários

Leia mais…

Parabéns ao RIO, Parabéns ao CPB

por Érico Andrei em 06/10/2009 01:02
Categoria: Plone, Clientes

Comitê Paraolímpico BrasileiroO 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.

| Comentários

Plone e Usabilidade: Tudo a ver

por Érico Andrei em 17/08/2009 10:54

World Usability Day É 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.

| Comentários

Atributos de atalho no CSS

por Thiago Tamosauskas em 05/08/2009 09:20
Categoria: Webdesign, CSS
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.

| Comentários

Como usar jQuery no Plone

por Thiago Tamosauskas em 24/07/2009 16:16
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>

| Comentários

Plone nas eleições 2010

por André Nogueira em 15/07/2009 16:42
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.

| Comentários
Ações do documento