python

Разработка ERP на tryton: Часть 1

  • четверг, 8 мая 2014 г. в 03:10:58
http://habrahabr.ru/post/222121/

К нам пришел крупный проект по созданию ERP-системы для компании производителя. В качестве сервера выбор пал на tryton. Однако у них с документацией достаточно плохо. На просторах интернета удалось найти официальную документацию, куски кода с описанием и логи irc канала tryton. Данной информации очень мало для разработки какой-либо системы на tryton. Что б закрыть этот пробел, было решено документировать весь процесс разработки, в особенности подводные камни, с которыми пришлось столкнуться. Итак приступим.

1. Установка и предварительная настройка trytond


1.1. Запуск сервера

Установить tryton можно из репозитариев, однако, нам данный путь не подходит. Так что идем к ним на репозиторий. trytond — исходники сервера, tryton — gtk клиент. У нас в качестве клиента будет веб-интерфейс(yii), так что качаем непосредственно сервер trytond. На данный момент последняя версия 3.2.0, её и будем рассматривать.

Скрипт сервера лежит в папке bin и называется trytond. У меня при попытке запуска trytond вываливался с ошибкой доступа к файлу конфига в /etc/trytond.conf. Волшебный ключик --help подсказал, что есть аргумент -c(--config) с помощью которого можно указать файл конфига. Запускать сервер приходится так python trytond -с /home/username/trytond_path/etc/trytond.conf.

1.2. Подготовка БД

В документации заявлена поддержка postgresql, mysql, sqlite. Исходя из переписки разработчиков trytond в irc, то лучше mysql не использовать. Соответсвенно выбор пал на postgresql. С данной БД раньше не приходилось работать, поэтому я воспользовался небольшим туториалом.

Нам необходимо установить postgresql, создать там пользователя и обязательно наделить его правами для создания БД:

sudo aptitude install postgresql
sudo su -l postgres
psql
create user tryton with password 'tryton';
alter user tryton createdb;
\q


1.3. Правка trytond.conf

Приступаем к правке конфига. Первое что мы видим — это не закомментированная строка jsonrpc = localhost:8000. Во всей документации используется xml-rpc, хотя он по дефолту не включен. Меня устраивает json-rpc, так что оставляем как есть.

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

db_type = postgresql
db_host = localhost
db_port = 5432
db_user = tryton
db_password = tryton


Зададим пароль администратора trytond admin_passwd = tryton; у меня trytond отказался создавать БД с пустым паролем админа.
В последстви нам придется работать с модулями, так что включим автоматическую перезагрузку модулей auto_reload = True.
Укажем, куда складывать логи logfile = /home/username/trytond_path/log/debug.log.

В конечном итоге конфиг выглядит так:
trytond.conf
#This file is part of Tryton.  The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
[options]

# Activate the json-rpc protocol
jsonrpc = localhost:8000
#ssl_jsonrpc = False

# This is the hostname used when generating tryton URI
#hostname_jsonrpc =

# Configure the path of json-rpc data
#jsondata_path = /var/www/localhost/tryton

# Activate the xml-rpc protocol
#xmlrpc = *:8069
#ssl_xmlrpc = False

# Activate the webdav protocol
#webdav = *:8080
#ssl_webdav = False

# This is the hostname used when generating WebDAV URI
#hostname_webdav =

# Configure the database type
# allowed values are postgresql, sqlite, mysql
db_type = postgresql

# Configure the database connection
## Note: Only databases owned by db_user will be displayed in the connection dialog
## of the Tryton client. db_user must have create permission for new databases
## to be able to use automatic database creation with the Tryton client.
db_host = localhost
db_port = 5432
db_user = tryton
db_password = tryton
#db_minconn = 1
#db_maxconn = 64

# Configure the postgresql path for the executable
#pg_path = None

# Configure the Tryton server password
admin_passwd = tryton

# Configure the path of the files for the pid and the logs
#pidfile = False
logfile = /home/clutcher/projects/erp/log/debug.log

#privatekey = server.pem
#certificate = server.pem

# Configure the SMTP connection
#smtp_server = localhost
#smtp_port = 25
#smtp_ssl = False
#smtp_tls = False
#smtp_password = False
#smtp_user = False
#smtp_default_from_email = False

# Configure the path to store attachments and sqlite database
#data_path = /var/lib/trytond

# Allow to run more than one instance of trytond
#multi_server = False

# Configure the session timeout (inactivity of the client in sec)
#session_timeout = 600

# Enable auto-reload of modules if changed
auto_reload = True

# Prevent database listing
#prevent_dblist = False

# Enable cron
# cron = True

# unoconv connection
#unoconv = pipe,name=trytond;urp;StarOffice.ComponentContext

# Number of retries on database operational error
# retry = 5

# Default language code
# language = en_US


1.4. Логирование

У tryton есть несколько уровней логирования(в документации указаны DEBUG, INFO, WARNING, ERROR, CRITICAL). В исходниках библиотеки logging нашлись такие строки:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0


Чем больше цифра, тем менее детальные логи. В irc мелькало, что NOTSET делает самые расширенные логи, хотя в документации не слово об этом не сказано, так что я остановился на уровне DEBUG.

Для того, что бы задать уровень логирования необходимо отредактировать trytond/server.py (27 строка): level=logging.INFO.

2. Структура запроса, API по рабте с БД, создание БД


Конфиг поменяли, теперь запускаем сервер. Скудное описания API сервера я можно найти тут, но этого явно не достаточно, поэтому продолжаем разбираться дальше. В сети полно python кода для работы с сервером напрямую. Выглядит он примерно так:

from jsonrpc import ServerProxy

connection = ServerProxy("localhost", "8000", "tryton", verbose=0)
name = "model.ir.model.search"
model_ids = conn.execute(name, [])


После долгих попыток зауска этого кода, оказалось, что jsonrpc — это не стандартная библиотека из pypi, а собственная библиотека разработчиков trytond, которую можно выковырять из клиента(не путать с trytond/protocols/jsonrpc.py — это разные библиотеки). Качаем tryton, распаковываем, и в папке tryton находим наш заветный jsonrpc.py. Теперь можно на python общаться с trytond, однако у нас фронтенд будет на php, поэтому продолжаем копать дальше.

2.1. Структура запроса

После продолжительного разбора полётов получаем первый рабочий код(не забываем, что сервер trytond должен быть запущен):

import json
import requests

url = 'http://localhost:8000/'
id = 1
methodname = 'common.db.list'
params = '[]'
request = json.dumps({
                'id': id,
                'method': methodname,
                'params': params,
                })

r = requests.post(url, data=request)

print r.json()


Этот код уже понятен и его не сложно перенести на необходимый ЯП(php, Java ...). Теперь изучим этот запрос.

Разберемся с url запроса. Все действия с БД делаются на url http://localhost:8000/. Дл работы с БД мы делаем запросы на url http://localhost:8000/db_name. Предполагается, что читатель уже знаком с json-rpc, поэтому структуру запроса описывать не будем.

2.2. API для работы с БД

И вот долгожданное API по работе с http://localhost:8000, которое удалось вытащить из trytond/protocols/dispatcher.py и кусков кода из irc канала:

Название метода Параметры Описание
common.server.version [] Узнать версию сервера
common.db.list [] Список существующих БД
common.server.login [user_name, user_pass] Залогинится(возвращается id и cookie пользователя)
common.db.create [user_id, user_cookie, database_name, password, lang, admin_password] Создать БД
common.db.drop [user_id, user_cookie, database_name, password] Удалить БД
common.db.dump [user_id, user_cookie, database_name, password] Сделать дамп БД
common.db.restore [user_id, user_cookie, database_name, password, data, update=False] Восстановить БД


У tryton есть анонимные и аутентифицированные запросы. К примеру, common.server.version — анонимный запрос, его можно выполнить не логинясь на сервер. Для common.db.create, можно не указать id и cookie, запрос всё равно выполнится. Для аутентифицированых запросов необходимо обязательно указывать id и cookie.

2.3. Создание БД

Следующий шаг — создать БД, которая необходима для функционирования trytond(юзеры, кеширование ...) и непосрдственно ERP-системы. Скрипт выполняется около минуты:

import json
import requests

url = 'http://localhost:8000/'
id = 2
methodname = 'common.db.create'
params = [None, None, 'tryton', 'tryton', 'ru_RU', 'tryton']
request = json.dumps({
                'id': id,
                'method': methodname,
                'params': params,
                })

r = requests.post(url, data=request)

print r.json()


tryton сам создаст нужные ему таблицы в БД. Следует отметить, что tryton не сможет создать таблицы в существующей пустой БД даже, если дать пользователю соответсвующие права. Мы назвали БД tryton, поэтому в дальнейшем запросы необходимо делать на адрес http://localhost:8000/tryton.

3. trytond methods


Где-то на просторах гугл групп по tryton мне удалось найти метод system.server.listMethods.

import json
import requests

url = 'http://localhost:8000/tryton'

id = 3
methodname = 'system.server.listMethods'
params = '[]'
request = json.dumps({
                'id': id,
                'method': methodname,
                'params': params,
                })

r = requests.post(url, data=request)

print r.json()


И наконец-то получаем долгожданный ответ сервера с названиями методов, некоторые из которых описаны в документации:
Методы trytond
{
«id»: 3,
«result»: [
«model.ir.module.module.config_wizard.done.view_toolbar_get»,
«model.ir.module.module.config_wizard.done.fields_view_get»,
«model.ir.module.module.config_wizard.done.on_change_with»,
«model.ir.module.module.config_wizard.done.pre_validate»,
«model.ir.module.module.config_wizard.done.fields_get»,
«model.ir.module.module.config_wizard.done.default_get»,
«model.ir.model.print_model_graph.start.view_toolbar_get»,
«model.ir.model.print_model_graph.start.fields_view_get»,
«model.ir.model.print_model_graph.start.on_change_with»,
«model.ir.model.print_model_graph.start.pre_validate»,
«model.ir.model.print_model_graph.start.fields_get»,
«model.ir.model.print_model_graph.start.default_get»,
«model.ir.module.module.install_upgrade.start.view_toolbar_get»,
«model.ir.module.module.install_upgrade.start.fields_view_get»,
«model.ir.module.module.install_upgrade.start.on_change_with»,
«model.ir.module.module.install_upgrade.start.pre_validate»,
«model.ir.module.module.install_upgrade.start.fields_get»,
«model.ir.module.module.install_upgrade.start.default_get»,
«model.res.user.login.attempt.pre_validate»,
«model.res.user.login.attempt.fields_get»,
«model.res.user.login.attempt.default_get»,
«model.res.user.login.attempt.on_change_with»,
«model.ir.ui.menu-res.group.pre_validate»,
«model.ir.ui.menu-res.group.fields_get»,
«model.ir.ui.menu-res.group.default_get»,
«model.ir.ui.menu-res.group.on_change_with»,
«model.ir.action.act_window.domain.view_toolbar_get»,
«model.ir.action.act_window.domain.fields_view_get»,
«model.ir.action.act_window.domain.export_data»,
«model.ir.action.act_window.domain.search_read»,
«model.ir.action.act_window.domain.import_data»,
«model.ir.action.act_window.domain.create»,
«model.ir.action.act_window.domain.search»,
«model.ir.action.act_window.domain.on_change_with»,
«model.ir.action.act_window.domain.write»,
«model.ir.action.act_window.domain.read»,
«model.ir.action.act_window.domain.search_count»,
«model.ir.action.act_window.domain.history_revisions»,
«model.ir.action.act_window.domain.pre_validate»,
«model.ir.action.act_window.domain.copy»,
«model.ir.action.act_window.domain.fields_get»,
«model.ir.action.act_window.domain.default_get»,
«model.ir.action.act_window.domain.delete»,
«model.ir.model.access.view_toolbar_get»,
«model.ir.model.access.fields_view_get»,
«model.ir.model.access.export_data»,
«model.ir.model.access.search_read»,
«model.ir.model.access.import_data»,
«model.ir.model.access.create»,
«model.ir.model.access.get_access»,
«model.ir.model.access.search»,
«model.ir.model.access.on_change_with»,
«model.ir.model.access.write»,
«model.ir.model.access.read»,
«model.ir.model.access.search_count»,
«model.ir.model.access.history_revisions»,
«model.ir.model.access.pre_validate»,
«model.ir.model.access.copy»,
«model.ir.model.access.fields_get»,
«model.ir.model.access.default_get»,
«model.ir.model.access.delete»,
«model.ir.ui.view_tree_state.view_toolbar_get»,
«model.ir.ui.view_tree_state.fields_view_get»,
«model.ir.ui.view_tree_state.export_data»,
«model.ir.ui.view_tree_state.search_read»,
«model.ir.ui.view_tree_state.import_data»,
«model.ir.ui.view_tree_state.create»,
«model.ir.ui.view_tree_state.get»,
«model.ir.ui.view_tree_state.search»,
«model.ir.ui.view_tree_state.on_change_with»,
«model.ir.ui.view_tree_state.write»,
«model.ir.ui.view_tree_state.read»,
«model.ir.ui.view_tree_state.search_count»,
«model.ir.ui.view_tree_state.set»,
«model.ir.ui.view_tree_state.history_revisions»,
«model.ir.ui.view_tree_state.pre_validate»,
«model.ir.ui.view_tree_state.copy»,
«model.ir.ui.view_tree_state.fields_get»,
«model.ir.ui.view_tree_state.default_get»,
«model.ir.ui.view_tree_state.delete»,
«model.ir.action.act_window.view_toolbar_get»,
«model.ir.action.act_window.fields_view_get»,
«model.ir.action.act_window.export_data»,
«model.ir.action.act_window.search_read»,
«model.ir.action.act_window.import_data»,
«model.ir.action.act_window.create»,
«model.ir.action.act_window.get»,
«model.ir.action.act_window.search»,
«model.ir.action.act_window.on_change_with»,
«model.ir.action.act_window.write»,
«model.ir.action.act_window.read»,
«model.ir.action.act_window.search_count»,
«model.ir.action.act_window.history_revisions»,
«model.ir.action.act_window.pre_validate»,
«model.ir.action.act_window.copy»,
«model.ir.action.act_window.fields_get»,
«model.ir.action.act_window.default_get»,
«model.ir.action.act_window.delete»,
«model.res.user.config.start.view_toolbar_get»,
«model.res.user.config.start.fields_view_get»,
«model.res.user.config.start.on_change_with»,
«model.res.user.config.start.pre_validate»,
«model.res.user.config.start.fields_get»,
«model.res.user.config.start.default_get»,
«model.ir.module.module.dependency.view_toolbar_get»,
«model.ir.module.module.dependency.fields_view_get»,
«model.ir.module.module.dependency.export_data»,
«model.ir.module.module.dependency.search_read»,
«model.ir.module.module.dependency.import_data»,
«model.ir.module.module.dependency.create»,
«model.ir.module.module.dependency.search»,
«model.ir.module.module.dependency.on_change_with»,
«model.ir.module.module.dependency.write»,
«model.ir.module.module.dependency.read»,
«model.ir.module.module.dependency.search_count»,
«model.ir.module.module.dependency.history_revisions»,
«model.ir.module.module.dependency.pre_validate»,
«model.ir.module.module.dependency.copy»,
«model.ir.module.module.dependency.fields_get»,
«model.ir.module.module.dependency.default_get»,
«model.ir.module.module.dependency.delete»,
«model.ir.module.module.view_toolbar_get»,
«model.ir.module.module.fields_view_get»,
«model.ir.module.module.export_data»,
«model.ir.module.module.search_read»,
«model.ir.module.module.import_data»,
«model.ir.module.module.create»,
«model.ir.module.module.on_write»,
«model.ir.module.module.search»,
«model.ir.module.module.on_change_with»,
«model.ir.module.module.write»,
«model.ir.module.module.read»,
«model.ir.module.module.search_count»,
«model.ir.module.module.history_revisions»,
«model.ir.module.module.pre_validate»,
«model.ir.module.module.copy»,
«model.ir.module.module.fields_get»,
«model.ir.module.module.default_get»,
«model.ir.module.module.delete»,
«model.ir.module.module.upgrade_cancel»,
«model.ir.module.module.upgrade»,
«model.ir.module.module.install»,
«model.ir.module.module.uninstall_cancel»,
«model.ir.module.module.install_cancel»,
«model.ir.module.module.uninstall»,
«model.ir.action-res.group.pre_validate»,
«model.ir.action-res.group.fields_get»,
«model.ir.action-res.group.default_get»,
«model.ir.action-res.group.on_change_with»,
«model.ir.translation.export.result.view_toolbar_get»,
«model.ir.translation.export.result.fields_view_get»,
«model.ir.translation.export.result.on_change_with»,
«model.ir.translation.export.result.pre_validate»,
«model.ir.translation.export.result.fields_get»,
«model.ir.translation.export.result.default_get»,
«model.ir.action.view_toolbar_get»,
«model.ir.action.fields_view_get»,
«model.ir.action.get_action_id»,
«model.ir.action.export_data»,
«model.ir.action.search_read»,
«model.ir.action.import_data»,
«model.ir.action.create»,
«model.ir.action.search»,
«model.ir.action.on_change_with»,
«model.ir.action.write»,
«model.ir.action.read»,
«model.ir.action.search_count»,
«model.ir.action.history_revisions»,
«model.ir.action.pre_validate»,
«model.ir.action.copy»,
«model.ir.action.fields_get»,
«model.ir.action.default_get»,
«model.ir.action.delete»,
«model.ir.translation.set.succeed.view_toolbar_get»,
«model.ir.translation.set.succeed.fields_view_get»,
«model.ir.translation.set.succeed.on_change_with»,
«model.ir.translation.set.succeed.pre_validate»,
«model.ir.translation.set.succeed.fields_get»,
«model.ir.translation.set.succeed.default_get»,
«model.ir.property.view_toolbar_get»,
«model.ir.property.fields_view_get»,
«model.ir.property.export_data»,
«model.ir.property.search_read»,
«model.ir.property.import_data»,
«model.ir.property.create»,
«model.ir.property.search»,
«model.ir.property.on_change_with»,
«model.ir.property.write»,
«model.ir.property.read»,
«model.ir.property.search_count»,
«model.ir.property.history_revisions»,
«model.ir.property.pre_validate»,
«model.ir.property.models_get»,
«model.ir.property.copy»,
«model.ir.property.fields_get»,
«model.ir.property.default_get»,
«model.ir.property.delete»,
«model.ir.rule.group-res.group.pre_validate»,
«model.ir.rule.group-res.group.fields_get»,
«model.ir.rule.group-res.group.default_get»,
«model.ir.rule.group-res.group.on_change_with»,
«model.ir.ui.view_search.view_toolbar_get»,
«model.ir.ui.view_search.fields_view_get»,
«model.ir.ui.view_search.get_search»,
«model.ir.ui.view_search.export_data»,
«model.ir.ui.view_search.search_read»,
«model.ir.ui.view_search.import_data»,
«model.ir.ui.view_search.create»,
«model.ir.ui.view_search.search»,
«model.ir.ui.view_search.on_change_with»,
«model.ir.ui.view_search.write»,
«model.ir.ui.view_search.read»,
«model.ir.ui.view_search.search_count»,
«model.ir.ui.view_search.history_revisions»,
«model.ir.ui.view_search.pre_validate»,
«model.ir.ui.view_search.copy»,
«model.ir.ui.view_search.fields_get»,
«model.ir.ui.view_search.default_get»,
«model.ir.ui.view_search.delete»,
«model.ir.module.module.config_wizard.first.view_toolbar_get»,
«model.ir.module.module.config_wizard.first.fields_view_get»,
«model.ir.module.module.config_wizard.first.on_change_with»,
«model.ir.module.module.config_wizard.first.pre_validate»,
«model.ir.module.module.config_wizard.first.fields_get»,
«model.ir.module.module.config_wizard.first.default_get»,
«model.ir.action.url.view_toolbar_get»,
«model.ir.action.url.fields_view_get»,
«model.ir.action.url.export_data»,
«model.ir.action.url.search_read»,
«model.ir.action.url.import_data»,
«model.ir.action.url.create»,
«model.ir.action.url.search»,
«model.ir.action.url.on_change_with»,
«model.ir.action.url.write»,
«model.ir.action.url.read»,
«model.ir.action.url.search_count»,
«model.ir.action.url.history_revisions»,
«model.ir.action.url.pre_validate»,
«model.ir.action.url.copy»,
«model.ir.action.url.fields_get»,
«model.ir.action.url.default_get»,
«model.ir.action.url.delete»,
«model.ir.action.act_window.view.view_toolbar_get»,
«model.ir.action.act_window.view.fields_view_get»,
«model.ir.action.act_window.view.export_data»,
«model.ir.action.act_window.view.search_read»,
«model.ir.action.act_window.view.import_data»,
«model.ir.action.act_window.view.create»,
«model.ir.action.act_window.view.search»,
«model.ir.action.act_window.view.on_change_with»,
«model.ir.action.act_window.view.write»,
«model.ir.action.act_window.view.read»,
«model.ir.action.act_window.view.search_count»,
«model.ir.action.act_window.view.history_revisions»,
«model.ir.action.act_window.view.pre_validate»,
«model.ir.action.act_window.view.copy»,
«model.ir.action.act_window.view.fields_get»,
«model.ir.action.act_window.view.default_get»,
«model.ir.action.act_window.view.delete»,
«model.ir.sequence.strict.view_toolbar_get»,
«model.ir.sequence.strict.fields_view_get»,
«model.ir.sequence.strict.export_data»,
«model.ir.sequence.strict.search_read»,
«model.ir.sequence.strict.import_data»,
«model.ir.sequence.strict.create»,
«model.ir.sequence.strict.search»,
«model.ir.sequence.strict.on_change_with»,
«model.ir.sequence.strict.write»,
«model.ir.sequence.strict.read»,
«model.ir.sequence.strict.search_count»,
«model.ir.sequence.strict.code_get»,
«model.ir.sequence.strict.history_revisions»,
«model.ir.sequence.strict.pre_validate»,
«model.ir.sequence.strict.copy»,
«model.ir.sequence.strict.fields_get»,
«model.ir.sequence.strict.default_get»,
«model.ir.sequence.strict.delete»,
«model.ir.ui.menu.favorite.view_toolbar_get»,
«model.ir.ui.menu.favorite.fields_view_get»,
«model.ir.ui.menu.favorite.export_data»,
«model.ir.ui.menu.favorite.search_read»,
«model.ir.ui.menu.favorite.import_data»,
«model.ir.ui.menu.favorite.create»,
«model.ir.ui.menu.favorite.get»,
«model.ir.ui.menu.favorite.search»,
«model.ir.ui.menu.favorite.on_change_with»,
«model.ir.ui.menu.favorite.write»,
«model.ir.ui.menu.favorite.read»,
«model.ir.ui.menu.favorite.search_count»,
«model.ir.ui.menu.favorite.set»,
«model.ir.ui.menu.favorite.history_revisions»,
«model.ir.ui.menu.favorite.pre_validate»,
«model.ir.ui.menu.favorite.copy»,
«model.ir.ui.menu.favorite.fields_get»,
«model.ir.ui.menu.favorite.default_get»,
«model.ir.ui.menu.favorite.unset»,
«model.ir.ui.menu.favorite.delete»,
«model.res.user-res.group.pre_validate»,
«model.res.user-res.group.fields_get»,
«model.res.user-res.group.default_get»,
«model.res.user-res.group.on_change_with»,
«model.ir.ui.view.show.start.view_toolbar_get»,
«model.ir.ui.view.show.start.fields_view_get»,
«model.ir.ui.view.show.start.on_change_with»,
«model.ir.ui.view.show.start.pre_validate»,
«model.ir.ui.view.show.start.fields_get»,
«model.ir.ui.view.show.start.default_get»,
«model.ir.attachment.view_toolbar_get»,
«model.ir.attachment.fields_view_get»,
«model.ir.attachment.export_data»,
«model.ir.attachment.search_read»,
«model.ir.attachment.import_data»,
«model.ir.attachment.create»,
«model.ir.attachment.search»,
«model.ir.attachment.on_change_with_summary»,
«model.ir.attachment.on_change_with»,
«model.ir.attachment.write»,
«model.ir.attachment.read»,
«model.ir.attachment.search_count»,
«model.ir.attachment.history_revisions»,
«model.ir.attachment.pre_validate»,
«model.ir.attachment.models_get»,
«model.ir.attachment.copy»,
«model.ir.attachment.fields_get»,
«model.ir.attachment.default_get»,
«model.ir.attachment.delete»,
«model.ir.translation.update.start.view_toolbar_get»,
«model.ir.translation.update.start.fields_view_get»,
«model.ir.translation.update.start.on_change_with»,
«model.ir.translation.update.start.pre_validate»,
«model.ir.translation.update.start.fields_get»,
«model.ir.translation.update.start.default_get»,
«model.ir.export.view_toolbar_get»,
«model.ir.export.fields_view_get»,
«model.ir.export.export_data»,
«model.ir.export.search_read»,
«model.ir.export.import_data»,
«model.ir.export.create»,
«model.ir.export.search»,
«model.ir.export.on_change_with»,
«model.ir.export.write»,
«model.ir.export.read»,
«model.ir.export.search_count»,
«model.ir.export.history_revisions»,
«model.ir.export.pre_validate»,
«model.ir.export.copy»,
«model.ir.export.fields_get»,
«model.ir.export.default_get»,
«model.ir.export.delete»,
«model.ir.ui.view_tree_width.view_toolbar_get»,
«model.ir.ui.view_tree_width.fields_view_get»,
«model.ir.ui.view_tree_width.set_width»,
«model.ir.ui.view_tree_width.export_data»,
«model.ir.ui.view_tree_width.search_read»,
«model.ir.ui.view_tree_width.import_data»,
«model.ir.ui.view_tree_width.create»,
«model.ir.ui.view_tree_width.search»,
«model.ir.ui.view_tree_width.on_change_with»,
«model.ir.ui.view_tree_width.write»,
«model.ir.ui.view_tree_width.read»,
«model.ir.ui.view_tree_width.search_count»,
«model.ir.ui.view_tree_width.history_revisions»,
«model.ir.ui.view_tree_width.pre_validate»,
«model.ir.ui.view_tree_width.copy»,
«model.ir.ui.view_tree_width.fields_get»,
«model.ir.ui.view_tree_width.default_get»,
«model.ir.ui.view_tree_width.delete»,
«model.res.group.view_toolbar_get»,
«model.res.group.fields_view_get»,
«model.res.group.export_data»,
«model.res.group.search_read»,
«model.res.group.import_data»,
«model.res.group.create»,
«model.res.group.search»,
«model.res.group.on_change_with»,
«model.res.group.write»,
«model.res.group.read»,
«model.res.group.search_count»,
«model.res.group.history_revisions»,
«model.res.group.pre_validate»,
«model.res.group.copy»,
«model.res.group.fields_get»,
«model.res.group.default_get»,
«model.res.group.delete»,
«model.ir.sequence.view_toolbar_get»,
«model.ir.sequence.fields_view_get»,
«model.ir.sequence.export_data»,
«model.ir.sequence.search_read»,
«model.ir.sequence.import_data»,
«model.ir.sequence.create»,
«model.ir.sequence.search»,
«model.ir.sequence.on_change_with»,
«model.ir.sequence.write»,
«model.ir.sequence.read»,
«model.ir.sequence.search_count»,
«model.ir.sequence.code_get»,
«model.ir.sequence.history_revisions»,
«model.ir.sequence.pre_validate»,
«model.ir.sequence.copy»,
«model.ir.sequence.fields_get»,
«model.ir.sequence.default_get»,
«model.ir.sequence.delete»,
«model.ir.model.data.view_toolbar_get»,
«model.ir.model.data.fields_view_get»,
«model.ir.model.data.export_data»,
«model.ir.model.data.search_read»,
«model.ir.model.data.import_data»,
«model.ir.model.data.create»,
«model.ir.model.data.search»,
«model.ir.model.data.on_change_with»,
«model.ir.model.data.write»,
«model.ir.model.data.read»,
«model.ir.model.data.search_count»,
«model.ir.model.data.history_revisions»,
«model.ir.model.data.pre_validate»,
«model.ir.model.data.copy»,
«model.ir.model.data.fields_get»,
«model.ir.model.data.default_get»,
«model.ir.model.data.delete»,
«model.ir.sequence.type-res.group.pre_validate»,
«model.ir.sequence.type-res.group.fields_get»,
«model.ir.sequence.type-res.group.default_get»,
«model.ir.sequence.type-res.group.on_change_with»,
«model.ir.trigger.log.pre_validate»,
«model.ir.trigger.log.fields_get»,
«model.ir.trigger.log.default_get»,
«model.ir.trigger.log.on_change_with»,
«model.ir.ui.view.view_toolbar_get»,
«model.ir.ui.view.fields_view_get»,
«model.ir.ui.view.export_data»,
«model.ir.ui.view.search_read»,
«model.ir.ui.view.import_data»,
«model.ir.ui.view.create»,
«model.ir.ui.view.search»,
«model.ir.ui.view.on_change_with»,
«model.ir.ui.view.write»,
«model.ir.ui.view.read»,
«model.ir.ui.view.search_count»,
«model.ir.ui.view.history_revisions»,
«model.ir.ui.view.pre_validate»,
«model.ir.ui.view.copy»,
«model.ir.ui.view.fields_get»,
«model.ir.ui.view.default_get»,
«model.ir.ui.view.delete»,
«model.ir.ui.view.show»,
«model.ir.action.report.view_toolbar_get»,
«model.ir.action.report.fields_view_get»,
«model.ir.action.report.on_change_with_report_content_name»,
«model.ir.action.report.export_data»,
«model.ir.action.report.search_read»,
«model.ir.action.report.import_data»,
«model.ir.action.report.create»,
«model.ir.action.report.search»,
«model.ir.action.report.on_change_with»,
«model.ir.action.report.write»,
«model.ir.action.report.read»,
«model.ir.action.report.search_count»,
«model.ir.action.report.history_revisions»,
«model.ir.action.report.pre_validate»,
«model.ir.action.report.copy»,
«model.ir.action.report.fields_get»,
«model.ir.action.report.default_get»,
«model.ir.action.report.delete»,
«model.res.user-ir.action.pre_validate»,
«model.res.user-ir.action.fields_get»,
«model.res.user-ir.action.default_get»,
«model.res.user-ir.action.on_change_with»,
«model.ir.model.field-res.group.pre_validate»,
«model.ir.model.field-res.group.fields_get»,
«model.ir.model.field-res.group.default_get»,
«model.ir.model.field-res.group.on_change_with»,
«model.ir.module.module.install_upgrade.done.view_toolbar_get»,
«model.ir.module.module.install_upgrade.done.fields_view_get»,
«model.ir.module.module.install_upgrade.done.on_change_with»,
«model.ir.module.module.install_upgrade.done.pre_validate»,
«model.ir.module.module.install_upgrade.done.fields_get»,
«model.ir.module.module.install_upgrade.done.default_get»,
«model.ir.rule.view_toolbar_get»,
«model.ir.rule.fields_view_get»,
«model.ir.rule.export_data»,
«model.ir.rule.search_read»,
«model.ir.rule.import_data»,
«model.ir.rule.create»,
«model.ir.rule.search»,
«model.ir.rule.on_change_with»,
«model.ir.rule.write»,
«model.ir.rule.read»,
«model.ir.rule.search_count»,
«model.ir.rule.history_revisions»,
«model.ir.rule.pre_validate»,
«model.ir.rule.copy»,
«model.ir.rule.fields_get»,
«model.ir.rule.default_get»,
«model.ir.rule.delete»,
«model.ir.translation.view_toolbar_get»,
«model.ir.translation.fields_view_get»,
«model.ir.translation.export_data»,
«model.ir.translation.search_read»,
«model.ir.translation.import_data»,
«model.ir.translation.create»,
«model.ir.translation.search»,
«model.ir.translation.on_change_with»,
«model.ir.translation.write»,
«model.ir.translation.read»,
«model.ir.translation.search_count»,
«model.ir.translation.get_language»,
«model.ir.translation.history_revisions»,
«model.ir.translation.pre_validate»,
«model.ir.translation.copy»,
«model.ir.translation.fields_get»,
«model.ir.translation.default_get»,
«model.ir.translation.delete»,
«model.ir.model.button.view_toolbar_get»,
«model.ir.model.button.fields_view_get»,
«model.ir.model.button.export_data»,
«model.ir.model.button.search_read»,
«model.ir.model.button.import_data»,
«model.ir.model.button.create»,
«model.ir.model.button.search»,
«model.ir.model.button.on_change_with»,
«model.ir.model.button.write»,
«model.ir.model.button.read»,
«model.ir.model.button.search_count»,
«model.ir.model.button.history_revisions»,
«model.ir.model.button.pre_validate»,
«model.ir.model.button.copy»,
«model.ir.model.button.fields_get»,
«model.ir.model.button.default_get»,
«model.ir.model.button.delete»,
«model.ir.translation.export.start.view_toolbar_get»,
«model.ir.translation.export.start.fields_view_get»,
«model.ir.translation.export.start.on_change_with»,
«model.ir.translation.export.start.pre_validate»,
«model.ir.translation.export.start.fields_get»,
«model.ir.translation.export.start.default_get»,
«model.ir.sequence.type.view_toolbar_get»,
«model.ir.sequence.type.fields_view_get»,
«model.ir.sequence.type.export_data»,
«model.ir.sequence.type.search_read»,
«model.ir.sequence.type.import_data»,
«model.ir.sequence.type.create»,
«model.ir.sequence.type.search»,
«model.ir.sequence.type.on_change_with»,
«model.ir.sequence.type.write»,
«model.ir.sequence.type.read»,
«model.ir.sequence.type.search_count»,
«model.ir.sequence.type.history_revisions»,
«model.ir.sequence.type.pre_validate»,
«model.ir.sequence.type.copy»,
«model.ir.sequence.type.fields_get»,
«model.ir.sequence.type.default_get»,
«model.ir.sequence.type.delete»,
«model.ir.action.wizard.view_toolbar_get»,
«model.ir.action.wizard.fields_view_get»,
«model.ir.action.wizard.export_data»,
«model.ir.action.wizard.search_read»,
«model.ir.action.wizard.import_data»,
«model.ir.action.wizard.create»,
«model.ir.action.wizard.search»,
«model.ir.action.wizard.on_change_with»,
«model.ir.action.wizard.write»,
«model.ir.action.wizard.read»,
«model.ir.action.wizard.search_count»,
«model.ir.action.wizard.history_revisions»,
«model.ir.action.wizard.pre_validate»,
«model.ir.action.wizard.copy»,
«model.ir.action.wizard.fields_get»,
«model.ir.action.wizard.default_get»,
«model.ir.action.wizard.delete»,
«model.res.user.get_preferences_fields_view»,
«model.res.user.view_toolbar_get»,
«model.res.user.fields_view_get»,
«model.res.user.export_data»,
«model.res.user.search_read»,
«model.res.user.import_data»,
«model.res.user.create»,
«model.res.user.search»,
«model.res.user.on_change_with»,
«model.res.user.write»,
«model.res.user.read»,
«model.res.user.search_count»,
«model.res.user.get_preferences»,
«model.res.user.history_revisions»,
«model.res.user.pre_validate»,
«model.res.user.set_preferences»,
«model.res.user.copy»,
«model.res.user.fields_get»,
«model.res.user.default_get»,
«model.res.user.delete»,
«model.ir.translation.clean.start.view_toolbar_get»,
«model.ir.translation.clean.start.fields_view_get»,
«model.ir.translation.clean.start.on_change_with»,
«model.ir.translation.clean.start.pre_validate»,
«model.ir.translation.clean.start.fields_get»,
«model.ir.translation.clean.start.default_get»,
«model.ir.ui.menu.view_toolbar_get»,
«model.ir.ui.menu.fields_view_get»,
«model.ir.ui.menu.export_data»,
«model.ir.ui.menu.search_read»,
«model.ir.ui.menu.import_data»,
«model.ir.ui.menu.create»,
«model.ir.ui.menu.search»,
«model.ir.ui.menu.on_change_with»,
«model.ir.ui.menu.write»,
«model.ir.ui.menu.read»,
«model.ir.ui.menu.search_count»,
«model.ir.ui.menu.history_revisions»,
«model.ir.ui.menu.pre_validate»,
«model.ir.ui.menu.copy»,
«model.ir.ui.menu.fields_get»,
«model.ir.ui.menu.default_get»,
«model.ir.ui.menu.list_icons»,
«model.ir.ui.menu.delete»,
«model.ir.cache.pre_validate»,
«model.ir.cache.fields_get»,
«model.ir.cache.default_get»,
«model.ir.cache.on_change_with»,
«model.ir.module.module.config_wizard.other.view_toolbar_get»,
«model.ir.module.module.config_wizard.other.fields_view_get»,
«model.ir.module.module.config_wizard.other.on_change_with»,
«model.ir.module.module.config_wizard.other.pre_validate»,
«model.ir.module.module.config_wizard.other.fields_get»,
«model.ir.module.module.config_wizard.other.default_get»,
«model.ir.ui.icon.view_toolbar_get»,
«model.ir.ui.icon.fields_view_get»,
«model.ir.ui.icon.export_data»,
«model.ir.ui.icon.search_read»,
«model.ir.ui.icon.import_data»,
«model.ir.ui.icon.create»,
«model.ir.ui.icon.search»,
«model.ir.ui.icon.on_change_with»,
«model.ir.ui.icon.write»,
«model.ir.ui.icon.read»,
«model.ir.ui.icon.search_count»,
«model.ir.ui.icon.history_revisions»,
«model.ir.ui.icon.pre_validate»,
«model.ir.ui.icon.copy»,
«model.ir.ui.icon.fields_get»,
«model.ir.ui.icon.default_get»,
«model.ir.ui.icon.list_icons»,
«model.ir.ui.icon.delete»,
«model.ir.configuration.pre_validate»,
«model.ir.configuration.fields_get»,
«model.ir.configuration.default_get»,
«model.ir.configuration.on_change_with»,
«model.ir.rule.group.view_toolbar_get»,
«model.ir.rule.group.fields_view_get»,
«model.ir.rule.group.export_data»,
«model.ir.rule.group.search_read»,
«model.ir.rule.group.import_data»,
«model.ir.rule.group.create»,
«model.ir.rule.group.search»,
«model.ir.rule.group.on_change_with»,
«model.ir.rule.group.write»,
«model.ir.rule.group.read»,
«model.ir.rule.group.search_count»,
«model.ir.rule.group.history_revisions»,
«model.ir.rule.group.pre_validate»,
«model.ir.rule.group.copy»,
«model.ir.rule.group.fields_get»,
«model.ir.rule.group.default_get»,
«model.ir.rule.group.delete»,
«model.ir.rule.group-res.user.pre_validate»,
«model.ir.rule.group-res.user.fields_get»,
«model.ir.rule.group-res.user.default_get»,
«model.ir.rule.group-res.user.on_change_with»,
«model.res.user.warning.view_toolbar_get»,
«model.res.user.warning.fields_view_get»,
«model.res.user.warning.export_data»,
«model.res.user.warning.search_read»,
«model.res.user.warning.import_data»,
«model.res.user.warning.create»,
«model.res.user.warning.search»,
«model.res.user.warning.on_change_with»,
«model.res.user.warning.write»,
«model.res.user.warning.read»,
«model.res.user.warning.search_count»,
«model.res.user.warning.history_revisions»,
«model.res.user.warning.pre_validate»,
«model.res.user.warning.copy»,
«model.res.user.warning.fields_get»,
«model.res.user.warning.default_get»,
«model.res.user.warning.delete»,
«model.ir.translation.clean.succeed.view_toolbar_get»,
«model.ir.translation.clean.succeed.fields_view_get»,
«model.ir.translation.clean.succeed.on_change_with»,
«model.ir.translation.clean.succeed.pre_validate»,
«model.ir.translation.clean.succeed.fields_get»,
«model.ir.translation.clean.succeed.default_get»,
«model.ir.trigger.view_toolbar_get»,
«model.ir.trigger.fields_view_get»,
«model.ir.trigger.on_change_on_time»,
«model.ir.trigger.on_change_on_write»,
«model.ir.trigger.export_data»,
«model.ir.trigger.search_read»,
«model.ir.trigger.import_data»,
«model.ir.trigger.create»,
«model.ir.trigger.on_change_on_delete»,
«model.ir.trigger.search»,
«model.ir.trigger.on_change_with»,
«model.ir.trigger.write»,
«model.ir.trigger.read»,
«model.ir.trigger.search_count»,
«model.ir.trigger.history_revisions»,
«model.ir.trigger.pre_validate»,
«model.ir.trigger.on_change_on_create»,
«model.ir.trigger.copy»,
«model.ir.trigger.fields_get»,
«model.ir.trigger.default_get»,
«model.ir.trigger.delete»,
«model.ir.action.keyword.view_toolbar_get»,
«model.ir.action.keyword.fields_view_get»,
«model.ir.action.keyword.export_data»,
«model.ir.action.keyword.search_read»,
«model.ir.action.keyword.import_data»,
«model.ir.action.keyword.create»,
«model.ir.action.keyword.get_keyword»,
«model.ir.action.keyword.search»,
«model.ir.action.keyword.on_change_with»,
«model.ir.action.keyword.write»,
«model.ir.action.keyword.read»,
«model.ir.action.keyword.search_count»,
«model.ir.action.keyword.history_revisions»,
«model.ir.action.keyword.pre_validate»,
«model.ir.action.keyword.models_get»,
«model.ir.action.keyword.copy»,
«model.ir.action.keyword.fields_get»,
«model.ir.action.keyword.default_get»,
«model.ir.action.keyword.delete»,
«model.ir.date.pre_validate»,
«model.ir.date.fields_get»,
«model.ir.date.default_get»,
«model.ir.date.today»,
«model.ir.date.on_change_with»,
«model.ir.model.field.access.view_toolbar_get»,
«model.ir.model.field.access.fields_view_get»,
«model.ir.model.field.access.export_data»,
«model.ir.model.field.access.search_read»,
«model.ir.model.field.access.import_data»,
«model.ir.model.field.access.create»,
«model.ir.model.field.access.search»,
«model.ir.model.field.access.on_change_with»,
«model.ir.model.field.access.write»,
«model.ir.model.field.access.read»,
«model.ir.model.field.access.search_count»,
«model.ir.model.field.access.history_revisions»,
«model.ir.model.field.access.pre_validate»,
«model.ir.model.field.access.copy»,
«model.ir.model.field.access.fields_get»,
«model.ir.model.field.access.default_get»,
«model.ir.model.field.access.delete»,
«model.ir.model.button-res.group.pre_validate»,
«model.ir.model.button-res.group.fields_get»,
«model.ir.model.button-res.group.default_get»,
«model.ir.model.button-res.group.on_change_with»,
«model.ir.lang.view_toolbar_get»,
«model.ir.lang.fields_view_get»,
«model.ir.lang.export_data»,
«model.ir.lang.search_read»,
«model.ir.lang.import_data»,
«model.ir.lang.create»,
«model.ir.lang.search»,
«model.ir.lang.on_change_with»,
«model.ir.lang.write»,
«model.ir.lang.read»,
«model.ir.lang.search_count»,
«model.ir.lang.history_revisions»,
«model.ir.lang.pre_validate»,
«model.ir.lang.copy»,
«model.ir.lang.fields_get»,
«model.ir.lang.default_get»,
«model.ir.lang.delete»,
«model.ir.cron.view_toolbar_get»,
«model.ir.cron.fields_view_get»,
«model.ir.cron.export_data»,
«model.ir.cron.search_read»,
«model.ir.cron.import_data»,
«model.ir.cron.create»,
«model.ir.cron.search»,
«model.ir.cron.on_change_with»,
«model.ir.cron.write»,
«model.ir.cron.read»,
«model.ir.cron.search_count»,
«model.ir.cron.history_revisions»,
«model.ir.cron.pre_validate»,
«model.ir.cron.copy»,
«model.ir.cron.fields_get»,
«model.ir.cron.default_get»,
«model.ir.cron.delete»,
«model.ir.export.line.view_toolbar_get»,
«model.ir.export.line.fields_view_get»,
«model.ir.export.line.export_data»,
«model.ir.export.line.search_read»,
«model.ir.export.line.import_data»,
«model.ir.export.line.create»,
«model.ir.export.line.search»,
«model.ir.export.line.on_change_with»,
«model.ir.export.line.write»,
«model.ir.export.line.read»,
«model.ir.export.line.search_count»,
«model.ir.export.line.history_revisions»,
«model.ir.export.line.pre_validate»,
«model.ir.export.line.copy»,
«model.ir.export.line.fields_get»,
«model.ir.export.line.default_get»,
«model.ir.export.line.delete»,
«model.ir.translation.set.start.view_toolbar_get»,
«model.ir.translation.set.start.fields_view_get»,
«model.ir.translation.set.start.on_change_with»,
«model.ir.translation.set.start.pre_validate»,
«model.ir.translation.set.start.fields_get»,
«model.ir.translation.set.start.default_get»,
«model.ir.model.field.view_toolbar_get»,
«model.ir.model.field.fields_view_get»,
«model.ir.model.field.export_data»,
«model.ir.model.field.search_read»,
«model.ir.model.field.import_data»,
«model.ir.model.field.create»,
«model.ir.model.field.search»,
«model.ir.model.field.on_change_with»,
«model.ir.model.field.write»,
«model.ir.model.field.read»,
«model.ir.model.field.search_count»,
«model.ir.model.field.history_revisions»,
«model.ir.model.field.pre_validate»,
«model.ir.model.field.copy»,
«model.ir.model.field.fields_get»,
«model.ir.model.field.default_get»,
«model.ir.model.field.delete»,
«model.ir.module.module.config_wizard.item.view_toolbar_get»,
«model.ir.module.module.config_wizard.item.fields_view_get»,
«model.ir.module.module.config_wizard.item.export_data»,
«model.ir.module.module.config_wizard.item.search_read»,
«model.ir.module.module.config_wizard.item.import_data»,
«model.ir.module.module.config_wizard.item.create»,
«model.ir.module.module.config_wizard.item.search»,
«model.ir.module.module.config_wizard.item.on_change_with»,
«model.ir.module.module.config_wizard.item.write»,
«model.ir.module.module.config_wizard.item.read»,
«model.ir.module.module.config_wizard.item.search_count»,
«model.ir.module.module.config_wizard.item.history_revisions»,
«model.ir.module.module.config_wizard.item.pre_validate»,
«model.ir.module.module.config_wizard.item.copy»,
«model.ir.module.module.config_wizard.item.fields_get»,
«model.ir.module.module.config_wizard.item.default_get»,
«model.ir.module.module.config_wizard.item.delete»,
«model.ir.model.global_search»,
«model.ir.model.view_toolbar_get»,
«model.ir.model.fields_view_get»,
«model.ir.model.list_models»,
«model.ir.model.export_data»,
«model.ir.model.search_read»,
«model.ir.model.import_data»,
«model.ir.model.create»,
«model.ir.model.search»,
«model.ir.model.list_history»,
«model.ir.model.on_change_with»,
«model.ir.model.write»,
«model.ir.model.read»,
«model.ir.model.search_count»,
«model.ir.model.history_revisions»,
«model.ir.model.pre_validate»,
«model.ir.model.copy»,
«model.ir.model.fields_get»,
«model.ir.model.default_get»,
«model.ir.model.delete»,
«wizard.ir.module.module.config_wizard.create»,
«wizard.ir.module.module.config_wizard.execute»,
«wizard.ir.module.module.config_wizard.delete»,
«wizard.ir.translation.update.create»,
«wizard.ir.translation.update.execute»,
«wizard.ir.translation.update.delete»,
«wizard.ir.translation.set.create»,
«wizard.ir.translation.set.execute»,
«wizard.ir.translation.set.delete»,
«wizard.ir.module.module.install_upgrade.create»,
«wizard.ir.module.module.install_upgrade.execute»,
«wizard.ir.module.module.install_upgrade.delete»,
«wizard.ir.translation.export.create»,
«wizard.ir.translation.export.execute»,
«wizard.ir.translation.export.delete»,
«wizard.res.user.config.create»,
«wizard.res.user.config.execute»,
«wizard.res.user.config.delete»,
«wizard.ir.ui.view.show.create»,
«wizard.ir.ui.view.show.execute»,
«wizard.ir.ui.view.show.delete»,
«wizard.ir.module.module.config.create»,
«wizard.ir.module.module.config.execute»,
«wizard.ir.module.module.config.delete»,
«wizard.ir.model.print_model_graph.create»,
«wizard.ir.model.print_model_graph.execute»,
«wizard.ir.model.print_model_graph.delete»,
«wizard.ir.translation.clean.create»,
«wizard.ir.translation.clean.execute»,
«wizard.ir.translation.clean.delete»,
«report.ir.model.graph.execute»
]
}


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