A differenza delle viste i file xml contenenti dati, come le action, i menu, oppure le security rules, non hanno l’elemento arch e non possono quindi essere modificati utilizzanto XPath. Ma possono comunque essere modificati, rimpiazzando i valori contenuti nei loro campi.
Ogni volta che dichiariamo un <record id=“x” model=“y”> Odoo effettua una insert o una update nel database, quindi riutilizzando gli stessi id possiamo andare ad aggiornare i dati inseriti dai moduli genitori.
Vediamo nel dettaglio cosa significa.
Per fare un esempio modifichiamo l’elemento del menu creato dalla todo_app andando a modificare la sua stringa in I miei Todo. Per farlo possiamo aggiungere in fondo al file views/task_views.xml
<!-- Edit menu item -->
<record id="todo_app.menu_todo_task" model="ir.ui.menu">
<field name="name">I miei Todo</field>
</record>
Possiamo anche modificare la action che abbiamo creato precedentemente. Le action possono avere un parametro context opzionale che va a modificare il comportamento della stessa, per esempio aggiungendogli dei valori di default che verranno utilizzati per popolare field o filters. Quello che faremo sarà modificare la action per far si che venga visualizzata la pagina della lista Todo con il filtro I miei Task preselezionato. Aggiungiamo quindi in fondo al file views/task_task.xml
<!-- Edit action -->
<record id="todo_app.action_todo_task" model="ir.actions.act_window">
<field name="context">{'search_default_filter_my_tasks': True}</field>
</record>
Se abbiamo fatto tutto correttamente dopo un upgrade del modulo
$ docker compose run odoo upgrade todo_user
dovremmo vedere:
La nostra applicazione precedente permette agli utenti di vedere solo i Task creati da loro stessi. Ora vogliamo che i task siano accessibili all’incaricato e a tutti i follower del task. Come per i menuitem e le actions andremo a sovrascriere la regola precedentemente creata modificando il suo campo domain_force.
Essendo una regola di sicurezza, per convenzione, la metteremo nella sottocartella security/ in un file che chiameremo task_access_rules.xml
todo_user/
models/
__init__.py
task.py
views/
todo_task.xml
security/
task_access_rules.xml
__init__.py
__manifest__.py
che andremo successivamente ad aggiungere anche al manifesto dell’applicazione:
{
'name': 'Multiuser TODO',
'description': 'Extend Todo app to work in a multiuser environment',
'author': 'Imthe Author',
'license': 'LGPL-3',
'depends': ['todo_app'],
'data': [
'security/task_access_rules.xml', # <-- Add this line
'views/task_views.xml'
]
}
Il contenuto del file per la regola di accesso sarà quindi il seguente:
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<record model="ir.rule" id="todo_app.todo_task_user_rule">
<field name="name">todo.task.user.rule</field>
<field name="model_id" ref="model_todo_task"/>
<field name="groups" eval="[4, ref('base.group_user')]"/>
<field name="domain_force">
['|', ('user_id', 'in', (user.id, False)),
('message_follower_ids', 'in', [user.partner_id.id])]
</field>
</record>
</data>
</odoo>
Abbiamo parlato di Follower, perchè mettevamo le basi per la prossima funzionalità: aggiungere un pizzico di social networking dando agli utenti la possibilità di commentare e seguire l’evoluzione dei nostri task. Questa è una funzionalità già presente in Odoo implementarla ci permette di vedere come riutilizzare il codice di terzi moduli