Você está na página 1de 7

Para este tutorial será tomado como base o módulo ud_transporte

Índice
Localização dos módulos openERP
Estrutura de um módulo
Conteúdo do __init__.py
Conteúdo do __openerp__.py
Parte do conteúdo de transporte.py
Partes do conteúdo de transporte_view.xml
Alguns menuitem
Uma action
Tipo de Visão: tree
Tipo de visão: form
Filter (ou search)
Tipo de visão: calendar

Localização dos módulos openERP


Por padrão os módulos desenvolvidos para o openERP ficam na pasta addons a qual
fica dentro de server:
/server/openerp/addons

Estrutura de um módulo
Esta é a estrutura básica de um módulo no openERP:
● name_modulo (pasta):
○ __init__.py
○ __openerp__.py
○ transporte.py
○ transporte_view.xml

Cada item de um módulo tem funções específicas. É no __init__.py que indica-se quais
arquivos .py (o controller que é ao mesmo tempo a model) serão importados pelo server na
hora que este módulo tiver sido instalado.

No arquivo __openerp__.py define-se as propriedades do módulo, como quais arquivos


.xml ele vai precisar atualizar quando o módulo for atualizado, dentre outros arquivos:
javascript, css. Além disso, outras propriedades devem ser adicionadas: name, version,
category, sequence, description, author, depends e etc. Essas propriedades estão dentro de
um dicionário.
É dentro do arquivo transporte.py que está a lógica programacional criada pelo
programador. Dentro desses arquivos alguns import são úteis: fields e osv do pacote osv.
Nele, cria-se as classes do módulo com seus campos e funções. Há algumas obrigações ao
criar uma classe; toda classe deve herdar da classe osv.osv e é necessário atribuir valor as
seguintes variáveis:
● _name
○ Sempre conforme este modelo: ud.transporte.veiculo
○ Este modelo de _name é útil para hierarquizar as classes existentes no
módulo e também em outros módulos. A hisrarquização é, como notado,
feita por meio do ponto.
● _columns
○ - Nesta variável dicionário são criados os campos a seres adicionados ao
banco de dados do módulo e que serão referenciadas no
transporte_view.xml
Algumas outras variáveis básicas são úteis, mas sua criação não é obrigatória:
● _defaults
○ Define-se valores padrões para os campos criados em columns
● description
○ Descreve a o propósito da classe. Seu preenchimento é útil.
Ao final da criação de uma classe, esta deve ser chamada.

O arquivo transporte_view.xml serve para definir a parte visual do módulo (ou


especificamente) da aplicação, que neste caso é transporte.py.
Todo arquivo .xml obrigatoriamente deve conter as seguintes tags:
1. <?xml version="1.0"?>
2. <openerp>
3. <data>
4. <!-- Todo o conteúdo
5. --------------------------------
6. --------------------------------
7. --------------------------------
8. -->
9.
10. </data>
11. </openerp>

Os itens básicos de uma view são:


● menuitem
○ Que a pode ou não chamar uma action;
● record
○ Onde o tipo de view pode ser definida. Tipos básicos:
■ ir.actions.act_window (ACTION);
■ ir.ui.view (Tipo de visão)
● form;
● tree;
● calendar;
● etc.
Conteúdo do __init__.py
1. import transporte
2.

Conteúdo do __openerp__.py
1. {
2. 'name': 'Transporte',
3. 'version': '1.0.1',
4. 'category': 'transport',
5. "sequence": 6,
6. 'description': """
7. Responsavel pelo controle de transporte
8. """,
9. 'author': 'LAMP',
10. 'images': [],
11. 'depends': ['base','ud'],
12. 'init_xml': [],
13. 'update_xml':
['transporte_view.xml','security/ud_transporte_security.xml',
14. 'security/ir.model.access.csv'
15. ],
16. 'demo_xml': [
17. ],
18. 'test': [
19. ],
20. 'installable': True,
21. 'application': True,
22. # Web client
23. 'js': [],
24. 'css': []
25.}
Parte do conteúdo de transporte.py
1. class manutencao(osv.osv):
2. _name = 'ud.transporte.manutencao'
3.
4. STATUS_MANUTENCAO_CHOICES = (
5. ('aberta',u'Aberta'),
6. ('concluida',u'Concluída'),
7. )
8.
9. _columns = {
10. 'veiculo':fields.many2one('ud.transporte.veiculo', 'Veículo',
required=True),
11. 'descricao_manutencao':fields.text('Descrição'),
12. 'data_entrada':fields.date('Entrada'),
13. 'data_saida':fields.date('Saída'),
14. 'custo_manutencao':fields.float('Custo'),
15. 'state':fields.selection(STATUS_MANUTENCAO_CHOICES, 'Status'),
16. }
17.
18.
19. def button_open(self, cr, uid, ids, context=None):
20. return self.write(cr, uid, ids, {'state': 'aberta'})
21. def button_finished(self, cr, uid, ids, context=None):
22. return self.write(cr, uid, ids, {'state': 'concluida'})
23.
24. _defaults = {
25. 'state':lambda *a:'aberta',
26. 'data_entrada': lambda *a:time.strftime("%Y-%m-%d"),
27. }
28.
29.
30. manutencao()

Partes do conteúdo de transporte_view.xml


Alguns menuitem
1. <menuitem name="Transporte" id="menu_transporte"
2. web_icon="images/van.png"
web_icon_hover="images/van-hover.png"
3. sequence="0" icon="terp-partner"
4. action="solicitacao_form_act" />
5.
6. <menuitem id="menu_transporte_categorias" name="Categorias"
parent="menu_transporte" />
7.
8. <menuitem id="menu_veiculos" name="Veículo"
9. parent="menu_transporte_categoria”
action="ud_vehicles_form_act" />
Uma action
1. <record id="solicitacao_form_act"
2. model="ir.actions.act_window">
3. <field name="name">Solicitacao</field>
4. <field name="res_model">ud.transporte.solicitacao</field>
5. <field name="view_type">form</field>
6. <field name="view_mode">tree,form,calendar</field>
7. </record>

Tipo de Visão: tree

1. <record id="ud_solicitacao_tree" model="ir.ui.view">


2. <field name="name">ud.transporte.solicitacao.tree</field>
3. <field name="model">ud.transporte.solicitacao</field>
4. <field name="type">tree</field>
5. <field name="arch" type="xml">
6. <tree
string="Solicitação"colors="orange:state=='aguardando';blue:state=='defe
rido';darkgreen:state=='deferidocomcusteio';grey:state=='indeferido'"
toolbar="1">
7. <field name="name" />
8. <field name="solicitante_data_hora_entrada" />
9. <field name="local_saida" />
10. <field name="solicitante_data_hora_saida" />
11. <field name="local_destino" />
12. <field name="solicitante_telefone" />
13. <field name="state"
statusbar_visible="aguardando,deferido,deferidocomcusteio,indeferido" />
14. <button name="button_deferido" states="aguardando"
type="object" string="Deferido"
icon="gtk-go-forward"groups="base.group_transporte_manager" />
15. <button name="button_deferido_com_custeio"
states="aguardando" type="object" string="Deferido com custeio"
icon="gtk-jump-to" groups="base.group_transporte_manager" />
16. <button name="button_indeferido" states="aguardando"
type="object" string="Indeferido"
icon="gtk-dialog-authentication"groups="base.group_transporte_manager
" />
17. </tree>
18. </field>
19. </record>
Tipo de visão: form
1. <record id="ud_solicitacao_form" model="ir.ui.view">
2. <field name="name">ud.transporte.solicitacao.form</field>
3. <field name="model">ud.transporte.solicitacao</field>
4. <field name="type">form</field>
5. <field name="arch" type="xml">
6. <form string="Solicitação">
7. <separator string="Solicitação" colspan="4" />
8. <group col="2">
9. <field name="name" default_focus="1"/>
10. <field name="responsavel" />
11. </group>
12. <group col="2">
13. <field name="solicitante_data_hora_entrada" />
14. <field name="solicitante_data_hora_saida" />
15. </group>
16. <separator string="Informações adicionais" colspan="4"/>
17. <notebook colspan="3">
18. <page string="Outros detalhes">
19. <field name="local_saida" />
20. <field name="local_destino" />
21. <newline />
22. <field name="qtd_passageiros" />
23. <newline />
24. <field name="solicitante_email" widget="email" />
25. <field name="solicitante_telefone" />
26. <newline />
27. <field name="objetivo" colspan="4" rowspan="1"/>
28. </page>
29. <page string="Passageiros" >
30. <field name="passageiro_ids"
colspan="4" widget="many2many" nolabel="1" />
31. </page>
32. <page string="Notas">
33. <field colspan="4" name="notes" nolabel="1"
height="20"/>
34. </page>
35. </notebook>
36. </form>
37. </field>
38. </record>
Filter (ou search)
1. <record id="view_solicitacao_filter" model="ir.ui.view">
2. <field name="name">ud.transporte.solicitacao.select</field>
3. <field name="model">ud.transporte.solicitacao</field>
4. <field name="type">search</field>
5. <field name="arch" type="xml">
6. <search string="Lista de solicitações">
7. <field name="name" string="Nome do solicitante" />
8. <field name="local_saida" />
9. <field name="local_destino"/>
10. <field name="tipo_curso"/>
11. <field name="state"
groups="base.group_transporte_manager" />
12. <newline/>
13. <group expand="0" string="Agrupar por...">
14. <filter string="Solicitante" icon="terp-accessories-archiver"
domain="[]" context="{'group_by':'name'}"/>
15. <filter string="Local de saida" icon="terp-gtk-jump-to-rtl"
domain="[]" context="{'group_by':'local_saida'}"/>
16. <filter string="Local de destino"
icon="terp-stock_effects-object-colorize" domain="[]"
context="{'group_by':'local_destino'}"/>
17. <filter string="Status"
icon="terp-stock_effects-object-colorize" domain="[]"
context="{'group_by':'state'}"/>
18. </group>
19. </search>
20. </field>
21. </record>

Tipo de visão: calendar


1. <record model="ir.ui.view" id="view_solicitacao_calendar">
2. <field name="name">ud.transporte.solicitacao.calendar</field>
3. <field name="model">ud.transporte.solicitacao</field>
4. <field name="type">calendar</field>
5. <field name="priority" eval="2"/>
6. <field name="arch" type="xml">
7. <calendar string="Visão por calendário"
date_start="solicitante_data_hora_entrada"
date_stop="solicitante_data_hora_saida"color="state">
8. <field name="name"/>
9. </calendar>
10. </field>
11. </record>