L'ORM di Odoo permette di creare modelli complessi composti da attributi basa su tipi di campi semplici. Questi campi mappano direttamente sul database e, in base al tipo, possono avere comportamenti differenti a livello di interfaccia utente. I campi di testo verranno renderizzati come semplici tag <input>, le date presenteranon un calendario, le selezioni multiple un tag <select> e così via.
Ogni tipo di campo ha può accettare una serie di parametri che variano il suo comportamento. Per il dettaglio completo delle loro specifiche rimandiamo alla documentazione ufficiale di Odoo.
Di seguito facciamo una panoramica dei principale di di campi non relazionali che possono essere utilizzati:
Quando viene dichiarato un campo è possibile, a volte necessario, passargli degli argomenti. Alcuni tipi di campo hanno argomenti specifici per cui rimandiamo alla documentazione, ma altri sono piuttosto comuni e utilizzati spesso:
Meritano di essere citati anche:
Alcuni nomi di campi non vanno utilizzati perchè vengono automaticamente istanziati da Odoo:
Altri nomi di campi vengono utilizzati dal framework per sveltire alcune operazioni, non è quindi oppurtuno utilizzarli in contesti diversi da quello per cui sono stati pensati:
Andiamo a modificare il nostro modello TodoTask arricchendolo con nuovi campi (e nuovi tipi di campo) così da vedere nella pratica come vengono utilizzati.
Apriamo il file models/task_task.py del modulo task_plus/ e modifichiamo la classe di conseguenza:
class TodoTask(models.Model):
_inherit = 'todo.task'
state = fields.Selection([
('draft', 'Draft'),
('progress', 'In Progress'),
('completed', 'Completed'),
('canceled', 'Canceled'),
], string='Stato', default='draft')
completed_date = fields.Datetime(string='Date Done', states={
'completed': [('readonly', True)],
'canceled': [('readonly', True)]
})
worked_hours = fields.Float(string='Worked Hours')
description = fields.Html(string='Description')
internal_notes = fields.Text(string='Internal Notes')
Aggiungiamo questi campi alle nostre viste, nel file views/task_task.xml
<record model="ir.ui.view" id="todo_task_form_view_inherited">
<field name="name">todo.task.form</field>
<field name="model">todo.task</field>
<field name="inherit_id" ref="todo_app.todo_task_form_view"/>
<!-- ...search and modify XML tags... -->
<field name="arch" type="xml">
<!-- at the end of the header add a widget for the state -->
<header position="inside">
<field name='state' widget='statusbar' clickable="1"/>
</header>
<!-- after deadline_date field add ... -->
<field name='deadline_date' position='after'>
<field name='completed_date'/>
<field name='worked_hours' />
</field>
<!-- after group with name 'group_top' add -->
<group name="group_top" position="after">
<group>
<field name="description"/>
</group>
</group>
</field>
</record>
Dei modelli isolati però non sono molto utili vedimamo quindi come lavorare con i campi relazionali