Estendere i Dati

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.

Modificare i Menuitem e le Action

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:

menuactions

Modficare le regole di sicurezza

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>

Continua

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