Использование модуля website

Содержание

В этой статье мы рассмотрим, как использовать модуль website, который идет в стандартной поставке Community Edition.

Подготовка

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

Вот ее имя - 16.0-website-usage-example

Затем удалите текущую базу и создайте новую.

Убедитесь, что у вас не осталось вкладок со старыми сессиями

В файл конфигурации в параметры init_modules и update_modules добавьте имя модуля website_first_module

Запустите менеджер с параметрами -d, -i, и -u

Перейдите откройте браузер по адресу http://127.0.0.1:8069

Зачем использовать модуль website

В предыдущей статье мы рассмотрели вариант того, как можно создавать собственные веб-страницы на основании базовых odoo абстракций. Современный вебсайт достаточно сложная и комплексная система, и каждый раз руками создавать для каждого проекта все необходимые части весьма утомительно. Именно эту задачу и решает базовый модуль website, который добавляет в систему необходимый набор абстракций для разработки полноценного вебсайта на базе платформы odoo. Данный модуль отвечает именно за бизнес-логику и ее построение, все что касается отображения и создания уникального внешнего вида вынесено в еще одну абстракцию - темы вебсайта, они являют собой специальный модуль, который распознается системой как тема. Но про темы мы поговорим в следующий раз. Теперь давайте отобразим все те же самые записи из нашей модели first.model на отдельной веб-странице, но уже с использованием модуля website

Использование модуля website в новом примере

Для того, чтобы можно мы могли использовать модуль website его, очевидно, надо добавить в зависимости. Что и сделали, на забыв добавить наш first_module, в котором содержится модель first.model чьи записи мы планируем отображать на отдельной странице:

Установка зависимостей Как мы можем увидеть - мы просто добавляем имена модулей в ключ depends файла __manifest__.py. И когда мы будем устанавливать наш модуль, система автоматически установит модули-зависимости, а затем позволит нам обращаться к ресурсам, объявленным в этих модулях.

После создания новой базы и установки всех модулей мы увидим следующую картину:

Не аутентифицированная страница с записями

  1. У нас появился полноценный вебсайт с меню, футером и логотипом.
  2. При выборе пункта меню First Model мы увидим список записей, доступных публично (т.е. опубликованных).
  3. Мы еще не прошли аутентификацию, т.е. все что мы видим доступно для всех посетителей нашего сайт.

Теперь давайте нажмем на кнопку Sign In и введем логин и пароль.

Не аутентифицированная страница с записями

  1. После ввода логина и пароля нас принудительно отправит на страницу модуля Discuss, в главном меню выбираем пункт Website. Затем опять кликаем на пункт меню First Model
  2. В итоге мы видим, что у теперь для нас видны все три записи, а так же дополнительная иконка, которая показывает, видна ли данная запись публично или нет. Нажатие на эту иконку либо публикует неопубликованную записи или наоборот снимает публикацию с уже опубликованной записи.

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

Как это работает

Шаблон

  1. Как вы видите в параметрах функции-декоратора появился параметр website=True, это означает, что при генерации HTML строки будет в словарь с параметрами будет автоматически добавлен рекордсет из одной записи, который описывает наш текущий сайт. Самих сайтов может быть больше одного, но это мы позже изучим.
  2. Проверяем входит ли наш пользователь, который отправил запрос в группу с xml_id base.group_user. Это группа, куда входят все внутренние пользователи системы.
  3. Мы это делаем для того, что бы для публичных пользователей показывать только опубликованные записи. После установки модуля website, появляется возможность использовать mixin website.published.mixin, который добавляет дополнительное поле is_published. Оно используется для того, чтобы определять доступна ли запись публично или нет. В нашем случае мы с помощью файла с данными, дополнительно заполнили это поле
  4. Как и в прошлый раз, мы генерируем HTML с помощью шаблона xml_id website_first_module.first_model_public_list перед тем, как отдать его браузеру в качестве ответа на запрос.
  5. В этот раз мы используем вместо id записи значение website_url. Для того, чтобы этот параметр корректно работа нам в нашу модель first.model пришлось добавить небольшое дополнение из модуля website. Данный подход позволяет автоматически формировать человекочитаемые ссылки на наши записи. Это очень любят поисковики и поэтому данный функционал включен в модуль website.
  6. Для отрисовки кнопки в виде иконки с глазом, которая одновременно является и идентификатором "опубликованности" записи и ее же переключателем, мы вызываем отдельный шаблон.
  7. Если наш пользователь, который отправил запрос на сервер, является членом группы с xml_id base.group_user, то эта кнопка будет показана
  8. Для того, чтобы правильно идентифицировать запись, на которой нажата кнопка мы в качестве атрибутов data добавляем имя модели записи, ее id и информацию о ее публикации. В дальнейшем я покажу как мы используем эту информацию в js скрипте, который обрабатывает нажатие.
  9. Если мы нажимаем на запись, то браузер отправляет запрос на указанный в п. 5 контроллер, здесь мы проверяем есть ли id записи среди опубликованных и входит ли пользователь в группу с xml_id base.group_user(в данном случае условие написано плохо, т.к. если будет много записей, это будет работать медленно, но материал уже готов, поэтому пока оставлю так))
  10. Если одно из условий не соблюдается, то мы показываем страницу 404, что означает, что запрашиваемая вами страница не существует. Это сделано для того, чтобы нельзя было не аутентифицированному пользователю перейти по прямой ссылке.
  11. Генерация HTML из шаблона с xml_id website_first_module.first_model_public_item.

Использование ассетов

Вы уже наверное обратили внимание, что в файле __manifest__.py есть только один js файл, который добавляется к ассетам, к тому же, судя по их xml_id эти ассеты так же созданы в модуле website. Да все верно. В модуле website содержится специальный бандл для работы вебсайта и мы можем спокойно использовать css классы из bootstrap 5, а так же большое количество уже написанного js кода.

Использование JavaScript

Для того, чтобы обрабатывать нажатие на кнопку и менять статус публикации соответствующей записи мы будем использовать javascript. Поскольку мы используем уже готовый механизм формирования веб-страниц, который реализован в модуле website, то для того, чтобы прослушивать событие нажатия на нужный для нас элемент мы будем использовать специально предназначенный для этого инструмент publicWidget:

Публикация записи 0. Обратите внимание на первые 4 строки. В строке 1 происходит объявление имени данного js модуля в системе (что-то вроде xml_id, только для модулей javascript). Затем идут две строки с ключевыми слованми import. Здесь мы указываем системе, какие уже готовые модули мы хотим использовать в своем коде. Подробнее об этом можно в документации.

  1. Указываем что ждем событие на элементе с классом toggle-published
  2. Если событие, это клик по элементу с классом toggle-published, то запустится функцию с именем _onClickPublishButton
  3. Из атрибутов записи, по которой произошел клик мы собираем информацию о имени модели, идентификаторе и о состоянии публикации. Как вы можете видеть, эта информация находится в самом HTML и была добавлена туда на шаге генерации, см. п 8 из раздела Как это работает
  4. Задействуем готовый механизм обращения к моделям, указываем все необходимые данные, для того, чтобы выполнить метод write в соответствующей модели и таким образом изменить состояние публикации нашей записи
  5. Если в ответе вернулось true, то мы изменяем состояние публикации на противоположное и в зависимости от состояния публикации меняем иконку

Итоги

Как вы можете видеть в модуль website создатели платформы добавили огромное количество идей и инструментов. Использование которых существенно сократит количество трудозатрат. Правда необходимо уметь узнавать что именно уже есть, а чего еще нет. К сожалению по модулю website документация отсутствует и его эффективное использование возможно только если вы умеет читать исходный код системы). Я конечно буду стараться дополнять данный учебник, но объем очень большой и к тому же постоянно меняется от версии к версии, поэтому

Пункт меню на сайт был добавлен вот так

Обсуждение

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