Tutorial - Criando um produto para Plone usando Archetypes
Analisando o módulo Locadora.py
Locadora.py
A classe locadora nada mais é do que uma subclasse da classe BaseFolder. É um tipo folderish que armazenará objetos do tipo cliente, clienteespecial, aluguel e carro.
A partir do Plone 2.1 podemos definir diferentes views para um tipo. O termo utilizado é Dynamic views. Para isto precisamos informar quais são as diferentes views (suppl_views e default_view) que estarão disponíveis quando o tipo for instalado. Dynamic views permite o usuário selecionar diferentes layouts para cada tipo. Para permitir este dinamismo foi definido uma classe chamada CMFDynamicViewFTI, que é uma extensão do CMF FTI(Facotory Type Information). Se olharmos na portal_types veremos vários tipos com ícones azuis e outros com ícones amarelos. Os amarelos utilizam CMFDynamicFTI.
Outro conceito novo que aparece no Plone 2.1 é o aliases. Aliases trabalha junto com as actions. No Plone 2.0, customizar a action view significava criar uma pagetemplate de visualização para um determinado tipo. Métodos aliases e actions permitem um padronização das URLs. Métodos aliases mapeiam um action para uma pagetemplate. Enfim, podemos editar objetos de diferentes tipos utilizando URLs padronizadas: path/object/edit.
from AccessControl import ClassSecurityInfo
from Products.Archetypes.atapi import *
from Products.LocadoraVeiculos.config import *
from Products.LocadoraVeiculos.validators import *
schema = Schema((
StringField(
name='CNPJ',
widget=StringWidget(
label='Cnpj',
label_msgid='LocadoraVeiculos_label_CNPJ',
i18n_domain='LocadoraVeiculos',
),
validators=('isCNPJ',)
),
TextField(
name='endereco',
widget=TextAreaWidget(
rows="4",
cols="50",
label="Endereço",
label_msgid='LocadoraVeiculos_label_endereco',
i18n_domain='LocadoraVeiculos',
)
),
),
)
Locadora_schema = BaseFolderSchema.copy() + schema.copy()
class Locadora(BaseFolder):
security = ClassSecurityInfo()
__implements__ = (getattr(BaseFolder,'__implements__',()),)
archetype_name = 'locadora de veículos'
meta_type = portal_type = 'Locadora'
# Por ser um tipo de pasta, a classe locadora
# pode contem outros objetos.
# A diferença que é que há um filtro de tipos que ela
# pode conter
allowed_content_types = ['Carro', 'Cliente', 'Aluguel', \
'ClienteEspecial']
filter_content_types = 1
# Esta propriedade informa que a classe locadora irá aparecer
# na caixa de adcionação de itens
global_allow = 1
immediate_view = 'locadora_view'
#Dynamic Views
default_view = 'locadora_view'
suppl_views = ('resumo_locadora_view',’outra_pagetemplate_view’)
typeDescription = "Locadora de Veículos"
typeDescMsgId = 'description_edit_locadora'
# Além das abas comuns de um folder, queremos que apareçam mais
# outras duas abas: Carros e Clientes.
# Para fazer isto devemos criar uma propriedade action conforme
# código abaixo.
actions = (
{'action': "string:${object_url}/carros_view",
'category': "object",
'id': 'carros_view',
'name': 'Carros',
'permissions': ("View",),
'condition': 'python:1'
},
{'action': "string:${object_url}/clientes_view",
'category': "object",
'id': 'clientes_view',
'name': 'Clientes',
'permissions': ("View",),
'condition': 'python:1'
},
)
_at_rename_after_creation = True
schema = Locadora_schema
aliases = {
'(Default)' : '(dynamic view)',
'view' : 'locadora_view',
'index.html' : '(dynamic view)',
'edit' : 'atct_edit',
'sharing' : 'folder_localrole_form',
'gethtml' : '',
'mkdir' : ''
}
registerType(Locadora,PROJECTNAME)