Я создаю собственное дополнение для Odoo, которое добавляет страницу в res.partner.form для отображения данных из внешнего API.
Вот мой код
просмотры/my_view.xml
<data>
<record id = "onglet_factu" model = "ir.ui.view">
<field name = "name">La Factu</field>
<field name = "model">res.partner</field>
<field name = "inherit_id" ref = "base.view_partner_form"/>
<field name = "arch" type = "xml">
<xpath expr = "//page[@name='internal_notes']" position='after'>
<page string='Onglet API'>
<h2>Fake API</h2>
<field name = "data" widget = "my_widget"/>
</page>
</xpath>
</field>
</record>
затем я добавляю новое поле в свою модель
из моделей импорта odoo, полей
модели/api.py
class Api(models.Model):
_inherit = 'res.partner'
data = fields.Char()
Я использую класс javascript для вызова API через контроллер и отображения в шаблоне Qweb.
статический/src/js/api_comComponent.js
export class MyApiField extends Component {
setup() {
super.setup();
onWillStart(async () => {
var id = this.env.model.root.data.id
fetch('/napsis_factu/test?id='+id)
.then(response => response.json())
.then((data) => {
console.info(data);
this.state.data = {
data1 : data['data1'],
data2: data['data2']
}
})
.catch((err) => {
console.info(err.message);
});
})
}
}
MyApiField.template = "addon.template";
MyApiField.props = {
...standardFieldProps,
};
MyApiField.supportedTypes = ["char"];
export const apiField = { component: MyApiField };
registry.category("fields").add("my_text_field", apiField);
А вот вызов контроллера в классе javascript:
контроллеры/api_call.py
@http.route('/myaddon/api-call', auth='user', csrf=False )
def calling(self, **kwargs):
theId = # How to get the ID of the res partner object I'm on ??
payload = { "Ctxt": "xxxxxxxxxxxxx",
"ID": theId,
}
req = urllib.request.Request(url='https://myapi', headers = {
"Content-Type":"application/json"}, data = json.dumps(payload).encode())
reply = json.loads(urllib.request.urlopen(req).read().decode('UTF-8'))
if reply.get("error"):
print('Alert!!')
raise Exception(reply["error"])
return json.dumps(reply)
Мне интересно, можно ли будет получить в контроллере информацию о текущей модели. Теперь я передаю это через вызов javascript, но можно ли получить идентификатор res.parner.form.view, в котором я нахожусь? Знаете ли вы, как это сделать?
Спасибо !
У меня Odoo 16 версии.





Обычно вам нужно импортировать odoo.http.request и использовать это следующим образом:
# other imports
from odoo.http import request
class MyController:
@http.route('/myaddon/api-call', auth='user', csrf=False )
def calling(self, **kwargs):
user_id = request.env.user.id
partner_id = request.env.user.partner_id.id
Спасибо за Ваш ответ. Это дает вам идентификатор компании пользователя, вошедшего в систему. Я хотел бы получить идентификатор страницы компании, на которой я нахожусь. Допустим, я нахожусь в представлении формы Azure Interior res.partner и хотел бы получить его идентификатор. Извините, если неясно...
Что вы подразумеваете под страницей? Я понятия не имею, для чего используется ваш контроллер. Как это называется?
Точнее, мой контроллер используется для вызова внешнего API. Под страницей я имею в виду res.partner.form (действительно, это неправильное слово). Я добавил в эту форму пользовательскую страницу, которая отображает данные из этого внешнего API через виджет поля. Поэтому я вызываю свой контроллер из класса javascript. Я передаю идентификатор через этот вызов JavaScript, но я бы предпочел, чтобы информация была непосредственно в контроллере.
Мы говорим здесь о двух Оду? Или зачем вам дополнительный контроллер для вашего виджета? А как насчет использования «простого» вызова RPC в JavaScript (пример OWL и Old Framework)?
Я попробовал вызов RPC для внешнего API, но получил ошибку CORS, поэтому предпочел выполнить вызов API через Python.
Вы можете использовать odoo.http.request и переданный идентификатор партнера, используя параметр kwargs, чтобы получить запись партнера.
Пример:
partner_id = int(kwargs.get('id', 0))
partner = request.env['res.partner'].browse(partner_id)
Вы можете найти пример в модуле website_profile .
Спасибо ! Но я не могу получить Partner_Id формы res.partner.form, в которой я нахожусь, непосредственно в контроллере? Я должен передать это в кварги?
Да, как и в fetch
Большое спасибо за вашу помощь. Последний вопрос: лучше ли изменять размер javascript с помощью моей выборки или непосредственно в контроллере?
Какая версия Оду?