Строение фреймворка.

Читая документацию бывает очень трудно понять из каких компонентов состоит фреймворк odoo и как они взаимодействуют между собой

Глобально система состоит из 3-х больших частей:

Т.е. если упростить все действия пользователь совершает в браузере, который по http протоколу взаимодйествует с сервером, который в свою очередь все данные хранит в БД

База данных

Начнем с БД, т.к. с точки зрения фреймворка, мы с базой почти не взаимодействуем. Все обращения за данными и сохранения в базу происходит под капотом. Есть возможность выполнять SQL запросы в базу, но это частные случаи, которые применяются в ограниченном количестве сценариев. В стандартной ситуации вы можете даже не догадываться что происходит обращение к БД. Все настройки, и обновления значений в базе делает фреймворк. Тем не менее при разработке на odoo придется учитывать наличие БД, т.к. odoo это система управляемая с помощью данных. Почти все действия подразумевают обращения к таблицам и их записям.

Сервер odoo

Сервер предствляет из себя весьма комплексную систему состоящую из следующих Абстракций:

Так же система сама по себе состоит из модулей. Каждый модуль может иметь все вышеуказанные компоненты внутри себя. Т.е. внутри системы есть реестр где хранится вся информацию об этих компонентах, при этом каждый модуль добавляет в этот самый реестр указанные внутри него компоненты

Используемые в odoo абстракции делятся на 3 типа:

Более того, для в платформе присутствуют еще вспомогательные подсистемы, которые могут использоваться в различных сценариях

  • Генератор шаблонов Qweb. Ключевой момент - из документации это не явно следует, но существует 2 разных генератора шаблонов с одним именем qweb:

    1. Генератор шаблонов, который выполняется на стороне сервера и написан на python
    2. Генератор шаблонов, который выполняется на стороне браузера и написан на JavaScript

    Оба этих генератора используют одни и те же инструкции и команды, но есть ряд отличий, которые надо учитывать в зависимости от используемого генератора Генератор шаблонов используется, как правило, для формирования html форм, страниц и компонентов. Может применяться для создания печатных форм, почтовых сообщений, индивидуальных веб страниц, виджетов JS клиента и в остальных подобных местах

  • Механизм создания отчетов(Не печатных форм). В платформе odoo есть ряд инструментов которые позволяют создавать так называемые Pivot отчеты а так же строить на их основании Графики

  • Система поиска, она реализована в виде отдельного представления, тем не менее это полноценный вспомогательный компонент со своим инструментарием и широким кругом возможностей

  • Модель безопасности. Встроенная система разграничения прав доступа внутри системы odoo

  • Механизм хранения ссылок на записи

  • Система переводов

  • Мощная система взаимодействия с электронной почтой

  • Система хранения файлов

Модули

Примерная структура модуля

addons/plant_nursery/
|-- __init__.py
|-- __manifest__.py
|-- controllers/
|   |-- __init__.py
|   |-- plant_nursery.py
|   |-- portal.py
|-- data/
|   |-- plant_nursery_data.xml
|   |-- plant_nursery_demo.xml
|   |-- mail_data.xml
|-- models/
|   |-- __init__.py
|   |-- plant_nursery.py
|   |-- plant_order.py
|   |-- res_partner.py
|-- report/
|   |-- __init__.py
|   |-- plant_order_report.py
|   |-- plant_order_report_views.xml
|   |-- plant_order_reports.xml (report actions, paperformat, ...)
|   |-- plant_order_templates.xml (xml report templates)
|-- security/
|   |-- ir.model.access.csv
|   |-- plant_nusery_groups.xml
|   |-- plant_nusery_security.xml
|   |-- plant_order_security.xml
|-- static/
|   |-- img/
|   |   |-- my_little_kitten.png
|   |   |-- troll.jpg
|   |-- lib/
|   |   |-- external_lib/
|   |-- src/
|   |   |-- js/
|   |   |   |-- widget_a.js
|   |   |   |-- widget_b.js
|   |   |-- scss/
|   |   |   |-- widget_a.scss
|   |   |   |-- widget_b.scss
|   |   |-- xml/
|   |   |   |-- widget_a.xml
|   |   |   |-- widget_a.xml
|-- views/
|   |-- assets.xml
|   |-- plant_nursery_menus.xml
|   |-- plant_nursery_views.xml
|   |-- plant_nursery_templates.xml
|   |-- plant_order_views.xml
|   |-- plant_order_templates.xml
|   |-- res_partner_views.xml
|-- wizard/
|   |--make_plant_order.py
|   |--make_plant_order_views.xmlT

Как было описано выше - модуль это строительный блок платформы odoo, которы содержит в себе все необходимые абстракции, статические ресурсы и с использованием вспомогательных подсистем. Т.е. каждая абстракция, которая описана в нашем модуле будет иметь внутри себя ссылку на имя модуля. Именем модуля является имя каталога в котором находится манифест файл и все остальные файл которые содержат в себе описание абстракций. Любая абстракция которая описывается с помощью xml файл с данными, имеет уникальный id внутри модуля. Для того, чтобы обратиться к этим данным внутри платформы надо знать что полный id абстракции будет имя_модуля.id_записи_абстракции

Модель

Модель - базовая абстракция платформы odoo. Если очень сильно упростить, то почти вся разработка, касающаяся серверной части, это работа с моделями. В odoo модель - это python класс, которому соответствует таблица в базе данных(на самом деле это не обязательное условие, и модель может не иметь таблицы, но в 99% случаев таблица у модели есть). Имя таблицы в БД это имя модели с где точки . заменены на подчеркивания _.

Т.е. если имя модели model.name то имя таблицы в БД будет model_name.

Класс модели имеет атрибуты в виде классов полей. Если перейти по ссылке, то можно увидеть описание всех типов полей, которые используются в odoo

Так, же помимо атрибутов в виде полей класс модели может иметь и методы, в которых и происходят основные вычисления бизнес логики. Помимо этого, любая модель наследует базовые методы от системного класса odoo.models.Model

Для новичков еще присутствует не очевидный момент: Когда во время работы исполняется метод модели, то в этот момент вы работаете не с классом, а с его экземпляром.

Экземпляр класса модели называется - Набор Записей он же НЗ или рекордсет. Т.е. в момент выполнения функции в ссылке на исполняемый экземпляр класса модели self находятся объекты записей таблицы БД с которыми идет работа. Объект записи это по сути НЗ который содержит в себе значения всех полей таблицы, которая соответствует текущей модели. НЗ бывает 3-х видов:

  1. НЗ без записей и тогда вы не сможете получить доступ к данным, но сможете запустить все методы доступные в модели
  2. НЗ с одной записью, в этом случае нам доступны все методы класса и значения полей этой записи примерно таким образом:
    record_value = self.field_name
    
  3. НЗ с множеством записей. В этом случае для того, чтобы получить доступ к значениям полей нужной записи необходимо проитерировать данный НЗ и уже работать с каждой записью внутри цикла отдельно:
    for record in self:
    	if record.id == 12:
    		record_value = record.field_name
    

Все остальные детали хорошо описаны в документации

JS Клиент

Все что нужно знать об этой части написано тут и тут. Основной принцип работы JS клиента - обращение к серверу odoo с помощью API. В системе есть URI /web/dataset/call_kw который принимает json строку с именем модели, именем функции внутри модели и ее параметрами , и может выполнить эту функцию и вернуть ответ в виде json строки. Таким образом реализован универсальный механизм взаимодействия JS клиента и серверной части написанной на Python.

Обсуждение

Обсудить, указать на ошибки и опечатки можно здесь