Структура модуля Odoo 18
Разработка модулей в Odoo 18 требует понимания структуры проекта, назначения файлов и папок, а также базовых механизмов, таких как модели, представления, права доступа и контроллеры. В этой статье подробно рассмотрим, как правильно организовать модуль, какие файлы необходимы и как они взаимодействуют между собой.
1. Общая структура модуля
Обычно модуль Odoo имеет следующую структуру:
my_module/ │── models/ │ ├── __init__.py │ ├── my_model.py │── views/ │ ├── my_model_views.xml │── data/ │ ├── my_model_data.xml │── security/ │ ├── ir.model.access.csv │── controllers/ │ ├── __init__.py │ ├── my_controller.py │── static/ │ ├── description/ │ │ ├── icon.png │ ├── src/ │── __init__.py │── __manifest__.py
2. __manifest__.py — Манифест модуля
Файл __manifest__.py содержит метаинформацию о модуле. Пример:
{ 'name': 'My Module', 'version': '1.0', 'summary': 'Пример модуля для Odoo 18', 'author': 'My Company', 'category': 'Custom', 'depends': ['base'], 'data': [ 'security/ir.model.access.csv', 'views/my_model_views.xml', 'data/my_model_data.xml', ], 'installable': True, 'application': True, }
Все возможные переменные в манифесте
- name — Название модуля.
- version — Версия модуля.
- summary — Краткое описание.
- description — Полное описание.
- author — Автор модуля.
- category — Категория модуля.
- depends — Список зависимостей.
- data — XML и CSV-файлы, загружаемые при установке.
- demo — Демо-данные.
- installable — Можно ли установить модуль.
- application — Является ли модуль приложением.
- auto_install — Автоматическая установка, если удовлетворены зависимости.
3. __init__.py — Инициализация модуля
Этот файл указывает Odoo, какие Python-файлы нужно загружать.
Файл my_module/__init__.py:
from . import models from . import controllers
Файл my_module/models/__init__.py:
from . import my_model
4. Модели (models/my_model.py)
Файл, описывающий модель данных.
from odoo import models, fields class MyModel(models.Model): _name = 'my.model' _description = 'Пример модели' name = fields.Char(string='Название', required=True) description = fields.Text(string='Описание') active = fields.Boolean(string='Активен', default=True)
5. Представления (views/my_model_views.xml)
Файл, описывающий интерфейс.
<odoo> <record id="view_my_model_form" model="ir.ui.view"> <field name="name">my.model.form</field> <field name="model">my.model</field> <field name="arch" type="xml"> <form> <sheet> <group> <field name="name"/> <field name="description"/> <field name="active"/> </group> </sheet> </form> </field> </record> <record id="view_my_model_tree" model="ir.ui.view"> <field name="name">my.model.tree</field> <field name="model">my.model</field> <field name="arch" type="xml"> <tree> <field name="name"/> <field name="active"/> </tree> </field> </record> <menuitem id="menu_my_model_root" name="My Module" sequence="1"/> <menuitem id="menu_my_model" name="My Model" parent="menu_my_model_root" action="action_my_model"/> <record id="action_my_model" model="ir.actions.act_window"> <field name="name">My Model</field> <field name="res_model">my.model</field> <field name="view_mode">tree,form</field> </record> </odoo>
6. Данные (data/my_model_data.xml)
Этот файл загружается при установке модуля.
<odoo> <record id="my_model_data1" model="my.model"> <field name="name">Пример 1</field> <field name="description">Описание примера 1</field> </record> </odoo>
7. Права доступа (security/ir.model.access.csv)
Файл задает права на модели.
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_my_model_user,access_my_model,my_module.model_my_model,,1,0,0,0
- perm_read — Чтение.
- perm_write — Запись.
- perm_create — Создание.
- perm_unlink — Удаление.
8. Контроллеры (controllers/my_controller.py)
Файл для обработки HTTP-запросов.
from odoo import http from odoo.http import request class MyController(http.Controller): @http.route('/my_module/data', type='json', auth='public') def get_data(self): records = request.env['my.model'].search([]) return [{'id': rec.id, 'name': rec.name} for rec in records]
9. Статические файлы (static/)
Используются для иконок, CSS, JS и изображений.
Пример:
- static/description/icon.png — иконка модуля.
- static/src/css/style.css — стили модуля.
Заключение
Мы разобрали структуру модуля Odoo 18, назначение файлов, а также привели примеры моделей, представлений, данных и прав доступа. Этот набор файлов образует минимальный, но функциональный модуль, который можно использовать в реальном проекте.
Структура Odoo-модуля: Полное руководство
Odoo-модуль состоит из множества файлов и папок, каждый из которых выполняет определенную функцию. В данной статье представлена подробная структура модуля Odoo 18, назначение файлов и папок, а также примеры их использования.
1. Основные компоненты Odoo-модуля
1.1 Бизнес-объекты (модели)
- Определены как классы Python.
- Автоматически сохраняются Odoo в базе данных.
1.2 Представления объектов (views)
- Определяют пользовательский интерфейс бизнес-объектов.
- Реализуются через XML-файлы.
1.3 Файлы данных (XML или CSV)
- Содержат метаданные моделей.
- Хранят конфигурационные данные, правила безопасности и демонстрационные данные.
1.4 Веб-контроллеры
- Обрабатывают HTTP-запросы от веб-браузеров.
- Управляют статическими данными, изображениями, CSS и JavaScript.
2. Типичная структура модуля
Папка / Файл | Назначение |
---|---|
__init__.py | Указывает Python, что каталог является модулем. |
__manifest__.py | Файл манифеста, содержащий метаданные модуля. |
models/ | Определения моделей Odoo (бизнес-логика). |
views/ | Определения пользовательских интерфейсов (XML). |
data/ | XML или CSV-файлы с данными для загрузки. |
security/ | Определения прав доступа (файлы CSV и XML). |
controllers/ | Веб-контроллеры для обработки HTTP-запросов. |
static/ | Статические файлы (CSS, JavaScript, изображения). |
wizards/ | Вспомогательные мастера для действий пользователей. |
reports/ | Определения отчетов (PDF, HTML). |
demo/ | Демонстрационные данные для модуля. |
i18n/ | Файлы переводов интерфейса. |
migrations/ | Скрипты миграции для обновления модуля. |
3. Файл манифеста (__manifest__.py)
Файл __manifest__.py содержит метаданные модуля. Он представляет собой словарь Python с основными атрибутами:
3.1 Основные атрибуты
- 'name': Название модуля.
- 'version': Номер версии.
- 'summary': Краткое описание.
- 'description': Полное описание модуля.
- 'author': Автор разработки.
- 'website': Веб-сайт автора или модуля.
- 'category': Категория модуля.
- 'depends': Список зависимых модулей.
- 'data': Список файлов данных (XML, CSV).
- 'demo': Файлы демонстрационных данных.
- 'installable': Доступность для установки (True/False).
- 'auto_install': Автоматическая установка (True/False).
- 'license': Лицензия.
- 'external_dependencies': Внешние зависимости.
- 'assets': Подключаемые веб-ресурсы (CSS, JS).
3.2 Пример манифеста
{ 'name': 'My Hostel Management', 'version': '1.0.0', 'summary': 'Manage Hostel easily', 'description': 'This module helps to manage hostel information.', 'author': 'Your Name', 'website': 'https://www.example.com', 'category': 'Services/Hostel', 'depends': ['base'], 'data': [ 'security/hostel_security.xml', 'security/ir.model.access.csv', 'views/hostel.xml', ], 'demo': ['data/demo.xml'], 'installable': True, 'auto_install': False, }
4. Файл __init__.py
Файл __init__.py сообщает Python, какие файлы следует включить в модуль.
4.1 Основной __init__.py
from . import models from . import controllers from . import wizards
4.2 Внутри models/__init__.py
from . import hostel from . import hostel_room
5. XML-файлы представлений (views/)
XML-файлы в папке views/ определяют интерфейс пользователей.
5.1 Основные элементы XML
- <odoo> — корневой тег.
- <data> — контейнер для записей данных.
- <record> — определение записи в базе данных.
- <menuitem> — создание пунктов меню.
- <act_window> — действия для открытия представлений.
- <form>, <tree>, <kanban> — виды представлений.
- <xpath> — модификация существующих представлений.
5.2 Пример файла views/hostel.xml
<odoo> <record id="action_hostel" model="ir.actions.act_window"> <field name="name">Hostel</field> <field name="res_model">hostel.hostel</field> <field name="view_mode">tree,form</field> </record> <menuitem id="hostel_main_menu" name="Hostel" sequence="1"/> <menuitem id="hostel_type_menu" name="Hostel" parent="hostel_main_menu" action="action_hostel" sequence="1"/> <record id="view_hostel_form_view" model="ir.ui.view"> <field name="name">hostel.hostel.form.view</field> <field name="model">hostel.hostel</field> <field name="arch" type="xml"> <form string="Hostel"> <sheet> <group> <field name="name" required="1"/> <field name="hostel_code"/> </group> </sheet> </form> </field> </record> </odoo>
6. Файлы безопасности (security/)
6.1 ir.model.access.csv
CSV-файл определяет права доступа к моделям.
Формат CSV
id | name | model_id:id | group_id:id | perm_read | perm_write | perm_create | perm_unlink |
---|---|---|---|---|---|---|---|
access_hostel_manager | hostel.room.manager | model_hostel_room | group_hostel_manager | 1 | 1 | 1 | 1 |
access_hostel_user | hostel.room.user | model_hostel_room | group_hostel_user | 1 | 0 | 0 | 0 |
7. Определение моделей (models/)
7.1 Основные атрибуты моделей
- _name — техническое имя модели.
- _description — описание.
- _inherit — наследование.
- _order — сортировка записей.
- fields.Char(), fields.Integer(), fields.Many2one() — определение полей.
7.2 Пример модели
from odoo import models, fields class Hostel(models.Model): _name = 'hostel.hostel' _description = 'Hostel' name = fields.Char(string="Name", required=True) hostel_code = fields.Char(string="Hostel Code")