Skip to Content

Структура модуля Odoo

Структура модуля 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")