A questo punto è arrivato il momento di aggiungere della logica applicativa al nostro modulo. Per farlo possiamo sfruttare i bottoni che abbiamo aggiunto nella sezione precedente relativa alle viste.
Nella precedente sezione abbiamo aggiunto due bottoni per invocare delle funzioni Python sul nostro backend. Riporto qui il codice interessato per comodità.
<button
name="do_toggle_button"
type="object"
string="Toggle Done"
class="oe_highlight"/>
In questo tag stiamo definendo alcuni attributi, vediamoli nel dettaglio:
Per altre informazioni fai riferimento alla documentazione ufficiale di Odoo
Quindi avendo definito un bottone con type=object e name=do_toggle_button non ci rimane che aggiungere questo metodo alla classe Python che rappresenta il modello. Apriamo quindi il file models/task_model.py e aggiungiamo un metodo alla classe:
# In TodoTask class add this method
def do_toggle_button(self):
for todo in self:
todo.is_done = not todo.is_done
Poche righe, ma tanti concetti.
Odoo è un software scritto con una logica API first, che significa che il codice che scrivete nel backend (in Python) è completamente slegato da quello che avviene nel frontend (che invece è scritto in Javascript). Ogni funzione che volete esporre al frontend deve essere esposta come un API JSONRPC (un protocollo RPC di qui potete trovare maggiori infomazioni su internet).
Ogni volta che viene dichiarato un metodo su un modello quel metodo puo essere eseguito su uno o più record alla volta tramite api. Quindi potete invocare questo metodo su un solo record todo in una chiamata come su 100 o 1000.
Se non si vuole esporre il metodo tramite api è sufficiente utilizzare il prefisso _ sul nome del medoto.
Il self dell’oggetto rappresenta non un istanza sola, ma un RecordSet che è una struttura di odoo che raggruppa oggetti dello stesso tipo e ha il principale scopo di eseguire operazioni in batch ottimizzate su molti oggetti. Quindi ciclando sul self stiamo andando a lavorare su ogni record presente su cui è stata invocata la chiamata.
Per l’altro bottone invece:
<button
name="do_clear_done"
type="object"
string="Clear All Done"
class="oe_highlight"/>
Vediamo che abbiamo dichiarato che vogliamo invocare il metodo do_clear_done che andiamo a implementare nel nostro models/task_models.py come segue
def do_clear_done(self):
dones = self.search([("is_done", "=", True)])
dones.write({"active": False})
Con il metodo search andriamo a cercare i todo che ci interessano passandogli un domain per la ricerca e infine aggiorniamo il loro stato come inattivo.
I domain sono il principale metodo per effettuare ricerche nel database usando il framework di Odoo. Li vediamo più nel dettaglio successivamente.
A questo punto possiamo aggiornare le viste Odoo e provare le nostre nuove funzioni
$ docker compose run odoo upgrade todo_app
Con quest’ultimo passaggio abbiamo terminato la nostra panoramica delle funzionalità base di un modulo Odoo. Rimane una piccola macchia che ci permette però di andare a guardare un ultimo aspetto riguardante i nostri modelli.
Se ci fate caso, avviando il server di odoo, viene visualizzato un WARNING di questo tipo:
WARNING odoo odoo.modules.loading: The models ['todo.task'] have no access rules in module todo_app, consider adding some, like:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
La ragione di questo avviso è legata al meccanismo delle regole di accesso ai dati di Odoo, vediamo come funzionano e come risolvere nella prossima sezione.