8.9 KiB
Премиум (витрина сервисов)
name: premium_client
version: 19.0.1.0.0
author: MK.Lab
depends: base, web
Архитектура
Модуль состоит из двух моделей и минимального набора представлений. Не содержит внешних зависимостей, кроме стандартной библиотеки requests.
premium_client
├── premium.service — карточка сервиса (каталог)
├── premium.order.wizard — форма заявки (временная, удаляется после отправки)
└── res.config.settings — расширение: поля настроек API
Модели
premium.service — Карточка сервиса
Файл: models/premium_service.py
Хранит информацию об одном сервисе в витрине. Сортируется по полю sequence, затем по имени.
| Поле | Тип | Описание |
|---|---|---|
name |
Char (required, translate) | Название сервиса |
sequence |
Integer (default: 10) | Порядок отображения в канбане |
category |
Selection (required) | Категория: services, bank, wms, marketplace, industry, other |
short_description |
Text (translate) | Краткий текст на карточке канбана |
description |
Html (sanitize, translate) | Полное описание на странице сервиса |
author_url |
Char | Ссылка на автора или страницу сервиса |
image |
Image (max 1024×768) | Изображение сервиса |
Права доступа
Создание, изменение и удаление карточек доступно только администраторам (base.group_system). Обычные пользователи могут только просматривать. Проверка выполняется в переопределённых методах create(), write() и unlink() — при попытке нарушить правило срабатывает ошибка AccessError.
Методы
action_open_form() — открывает форму карточки сервиса. Вызывается по кнопке «Подробнее» в канбане.
action_open_order_wizard() — открывает визард заявки в диалоговом окне. В контекст передаётся default_service_id, чтобы визард знал какой сервис заказывается.
premium.order.wizard — Форма заявки
Файл: wizard/premium_order_wizard.py
Временная модель (TransientModel) — запись существует только пока пользователь заполняет форму и удаляется после отправки. Предзаполняется данными текущей компании и пользователя.
| Поле | Тип | Описание |
|---|---|---|
service_id |
Many2one → premium.service (required) |
Сервис, на который подаётся заявка |
company_name |
Char (required) | Название компании |
inn |
Char | ИНН (10 или 12 цифр) |
email |
Char (required) | Email для связи |
phone_telegram |
Char | Телефон или Telegram |
contact_person |
Char | Имя контактного лица |
Предзаполнение (default_get)
При открытии визарда поля заполняются автоматически:
company_name←env.company.nameinn←env.company.vatemail←env.company.emailилиenv.user.emailphone_telegram←env.company.phoneилиenv.company.mobilecontact_person←env.user.name
Валидация
Проверки выполняются как при изменении поля (@api.onchange — показывает предупреждение), так и при сохранении (@api.constrains — блокирует отправку):
| Поле | Правило |
|---|---|
email |
Соответствие шаблону *@*.* |
inn |
Только цифры, длина 10 или 12 символов |
Метод action_submit() — отправка заявки
Выполняет POST-запрос во внешний API. Последовательность шагов:
- Проверяет заполненность обязательных полей
- Читает URL и токен из системных параметров (
premium.project_api_url,premium.project_api_token) - Если URL не оканчивается на
/newlead/— добавляет этот суффикс автоматически - Формирует заголовки:
Content-Type: application/jsonиX-API-Key: {токен}(если токен задан) - Отправляет запрос с повторными попытками — 3 попытки с паузой 3 секунды между ними
- Считает успехом ответ со статусом 200 или 201 и полем
"ok": trueв теле - При неудаче всех трёх попыток показывает сообщение с просьбой написать на
info@inf-centre.ru
Состав отправляемых данных (_build_payload):
| Поле | Источник |
|---|---|
service_id, service_name |
Карточка сервиса |
service_category, service_author_url |
Карточка сервиса |
service_description |
HTML-описание сервиса |
company_name, inn, email |
Форма заявки |
phone, contact_name |
Форма заявки |
source_db |
Техническое имя базы данных Odoo |
res.config.settings — Расширение настроек
Файл: models/res_config_settings.py
Добавляет два поля в стандартную форму Настроек Odoo. Значения хранятся как системные параметры (ir.config_parameter).
| Поле | Параметр | Описание |
|---|---|---|
premium_project_api_url |
premium.project_api_url |
URL внешнего API для приёма заявок |
premium_project_api_token |
premium.project_api_token |
Токен авторизации (передаётся в заголовке X-API-Key) |
При установке модуля оба параметра создаются с заглушечными значениями (noupdate="1") — их нужно заменить реальными в Настройках.
Представления и меню
Структура меню
Премиум (sequence=20)
└── Сервисы → action_premium_services
Режимы: kanban (по умолчанию), list, form
Группировка по умолчанию: category
Канбан-карточка
Каждая карточка показывает: название (по центру), изображение (слева), краткое описание (справа), кнопку «Подробнее». При клике на карточку открывается форма.
Форма сервиса
Содержит: название, изображение, категорию, ссылку на автора, HTML-описание на вкладке, кнопку «Заказать».
Форма заявки (визард)
Диалоговое окно с полями компании. Кнопки: «Отправить» (primary) и «Отмена».
Предустановленные данные
Файл: data/premium_service_data.xml (noupdate="1")
При установке создаются 6 карточек-примеров по одной на каждую категорию: Интеграция 1С, Эквайринг в Odoo, WMS модуль, Интеграции с маркетплейсами, Отраслевые решения, Прочие доработки. Карточки не перезаписываются при обновлении модуля.
Безопасность
Файл: security/ir.model.access.csv
Все авторизованные пользователи (base.group_user) имеют право на чтение карточек сервисов и работу с визардом. Создание, редактирование и удаление карточек ограничено только для группы base.group_system.