Как обновить любое представление из кода Python до завершения рендеринга в Odoo? - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблема с передачей значения для аргумента colors в моем элементе view.Итак, у меня есть моя модель, которая имеет функцию для возврата цветов:

class MyTask(models.Model):
     _inherit = "project.task"
     is_special=fields.Boolean()     

     @api.model
     def get_colors(self):
          return 'red: is_special == true;'

И у меня также есть мой вид, который выглядит так:

<record id="my_module_timeline" model="ir.ui.view">
<field name="model">project.task</field>
<field name="type">timeline</field>
<field name="arch" type="xml">
    <timeline date_start="date_start"
            date_stop="date_end"
            default_group_by="project_id"
            event_open_popup="true"
            colors= <-- how can i get the value from my model get_colors() function?
            >
    </timeline>
</field>

colors аргумент должен быть строкой, и он не может быть полем модели.Я перепробовал много вариантов, чтобы получить эту строку из функции модели, но без хороших результатов. Элемент

<timeline> является просто примером, он также может быть деревом, календарем и т. Д. Для тестов я получил его из:

https://github.com/OCA/web/tree/11.0/web_timeline

Это возможно таким образом?

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете использовать метод fields_view_get для динамического обновления представления из кода Python (до отображения представления).Это только один пример, который я нашел в Odoo:

@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    res = super(MailThread, self).fields_view_get(
        view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
    )
    if view_type == 'form':
        doc = etree.XML(res['arch'])
        for node in doc.xpath("//field[@name='message_ids']"):
            # the 'Log a note' button is employee only
            options = safe_eval(node.get('options', '{}'))
            is_employee = self.env.user.has_group('base.group_user')
            options['display_log_button'] = is_employee
            # save options on the node
            node.set('options', repr(options))
        res['arch'] = etree.tostring(doc, encoding='unicode')
    return res

Поместите его в свою модель.Найдите узел с doc.xpath и обновите его с node.set

...