Odoo Россия http://www.odoo-russia.ru ru [email protected] (http://www.odoo-russia.ru) [email protected] (http://www.odoo-russia.ru) http://www.odoo-russia.ru http://www.odoo-russia.ru Подключаем локализацию в website http://www.odoo-russia.ru/forum/topic/615/ http://www.odoo-russia.ru/forum/topic/615/ aladkoi Но есть момент, когда Odoo категорически не видит эту папку с файлами. Если вы создаете свое приложение под website, то может возникнуть проблема, что никакие «танцы с бубнами» не помогут подключить данные с вашим «уникальным» переводом интерфейса. Что делать?
В Odoo при загрузке website страницы всегда вызывается ссылка '/website/translations' на загрузку локализации установленного языка интерфейса, при этом создается список всех приложений, включенных в website. При этом, если Ваше приложение не имеет в наименовании признак 'website', то оно в данный список не включается. Разработчики Odoo для обхода данной проблемы оставили заглушку.
В контроллере Вашего приложения пишем код:

from odoo.addons.website.controllers.main import Website

class MyTranslit(Website):
    <ls user="http" />.route('/website/translations', type='json', auth="public", website=True)
    def get_website_translations(self, lang, mods=None):
     return Website().get_website_translations(lang,список наименований ваших приложений)

Читать дальше]]>
Fri, 12 Jan 2018 17:24:01 +0300 Разработка первого модуля
One2many и related поля http://www.odoo-russia.ru/forum/topic/654/ http://www.odoo-russia.ru/forum/topic/654/ aladkoi Например имеем две модели, главную и подчиненную, где в главной имеется реляционное отношение One2many к подчиненной таблице.
Child:
fields1=fields.Char()
fields2=fields.Integer()
parent=Many2one('parent')

Parent:
fields1=fields.Integer()
fields_child1=fields.Char(related='child.fields1')
child=One2many('child','parent')

Для выборки определенной записи из подчиненной таблицы необходимо в поле child добавить domain
child=One2many('child','parent',domain=[('id','=',id_child)])

где id_child является номером записи из подчиненной таблицы
fields_child1 — показывает с возможностью редактирование запись из подчиненной таблицы

При необходимости в domain можно записать функцию примерно так:
child=One2many('child','parent',domain=_my_funct)

def _my_funct(self):
 if self.fields1==1:
  id=self.env['child'].sudo().search([('fields2,'=',self.fields1)],limit=1).id  # получаем id child по условию parent
  return [('id','=',id)] 

Читать дальше]]>
Wed, 06 Jun 2018 17:36:53 +0300 Разработка первого модуля
С чего начать новичку http://www.odoo-russia.ru/forum/topic/651/ http://www.odoo-russia.ru/forum/topic/651/ hain
Имеется небольшой опыт кодинга под Joomla.
Сейчас шустрыми темпами осваиваю Python.
Потроха ODOO выглядят весьма непривычно.
Заниматься придется бэк и фронт эндами.
В связи с этим куча вопросов.
Что необходимо знать?
Есть ли полноценный девелопер гид, описание структуры проекта итд?
Первое впечатление — информация очень разбросана. Не совсем ясно куда двигаться.
Читать дальше]]>
Wed, 02 May 2018 10:29:51 +0300 Разработка первого модуля
./odoo.py scaffold Academy my-modules http://www.odoo-russia.ru/forum/topic/623/ http://www.odoo-russia.ru/forum/topic/623/ IRIP
по идее, должно создать модуль, но не создает
выдает sudo: ./odoo-bin: command not found

аналогично

odoo-bin scaffold Academy my-modules
bash: odoo-bin: command not found]]>
Sun, 28 Jan 2018 13:04:56 +0300 Разработка первого модуля
Убрать ненужные поля в /shop/address http://www.odoo-russia.ru/forum/topic/640/ http://www.odoo-russia.ru/forum/topic/640/ owl_magis Помогите начинающему!
При оформлении продажи в интернет магазине хочу убрать не нужные поля в адресе(/shop/address). Vat и имя компании благополучно удалось скрыть
(

<xpath expr="//input[<ls user="name" />='company_name']/.." position="attributes">
<attribute name="style">display: none</attribute>
</xpath>

<xpath expr="//input[<ls user="name" />='vat']/.." position="attributes">
<attribute name="style">display: none</attribute>
</xpath>

), а улицу возвращает на место.


<xpath expr="//input[<ls user="name" />='street']/.." position="attributes">
<attribute name="style">display: none</attribute>
</xpath>

Читать дальше]]>
Mon, 26 Feb 2018 17:14:42 +0300 Разработка первого модуля
odoo Не видит созданный модуль http://www.odoo-russia.ru/forum/topic/610/ http://www.odoo-russia.ru/forum/topic/610/ IRIP жмем обновить модуль не появляется
очень расстроены]]>
Thu, 11 Jan 2018 10:50:05 +0300 Разработка первого модуля
Удаление модуля http://www.odoo-russia.ru/forum/topic/477/ http://www.odoo-russia.ru/forum/topic/477/ darkink Tue, 27 Dec 2016 09:43:04 +0300 Разработка первого модуля Создаем поле типа autocomplete на web странице http://www.odoo-russia.ru/forum/topic/545/ http://www.odoo-russia.ru/forum/topic/545/ aladkoi Скачиваем отсюда github.com/OCA/website пакет модулей и ставим в Odoo модуль website_field_autocomplete.
Подключаем его к нашей странице

   <div class="oe_search">
     <input type="text" name="search" class="form-control js_website_autocomplete" placeholder="Выберите откуда" t-att-value="startst"
           data-query-field="name"     /// поле модели по которому ищем
           data-display-field="name"   /// получаемое поле  в ниспадающий список
           data-value-field="name"     /// возвращаемое поле модели
           data-limit="10"
           data-model="test.test"      /// имя модели
     />
  </div>

Есть один нюанс. Получаемый в результате автопоиска список однострочный и не поддерживает HTML теги.
Исправляем данную проблему:
1. Скачиваем отсюда github.com/scottgonzalez/jquery-ui-extensions/blob/master/src/autocomplete/jquery.ui.autocomplete.html.js скрипт в каталог /web/static/lib/jquery.ui/
2. Добавляем загрузку скрипта в файл addons\web\views\webclient_templates.xml
Должно быть вот так:

      <script type="text/javascript" src="/web/static/lib/jquery.ui/jquery-ui.js"></script>
      <script type="text/javascript" src="/web/static/lib/jquery.ui/jquery.ui.autocomplete.html.js"></script>

Не забываем обновить web модуль!!!
3. В файл /web/static/lib/jquery.ui/jquery-ui.js добавляем опцию html:true,

$.widget( "ui.autocomplete", {
	version: "1.11.4",
	defaultElement: "<input>",
	options: {
		appendTo: null,
		autoFocus: false,
		delay: 300,
		minLength: 1,
		position: {
			my: "left top",
			at: "left bottom",
			collision: "none"
		},
		source: null,
                html:true,
		// callbacks
		change: null,
		close: null,
		focus: null,
		open: null,
		response: null,
		search: null,
		select: null

	},


После всех манипуляций в автопоиске появятся поля согласно Вашей HTML разметки
Читать дальше]]>
Fri, 19 May 2017 13:46:26 +0300 Разработка первого модуля
Один из вариантов создания шаблона с возможностью редактирования в Website Builder http://www.odoo-russia.ru/forum/topic/580/ http://www.odoo-russia.ru/forum/topic/580/ aladkoi В Odoo есть возможность сделать все по другому.
Например, есть template c набором элементов div и label:

<template id="search" name="Форма поиска">
    <t t-set="startst" t-value="bool(listst['startst']>0)"/>
    <t t-set="endst" t-value="bool(listst['endst']>0)"/>
    <div id="wrap" class="search_snippet">
      <input type="hidden" name="tk"/>
      <div class="snippet" >
      <section class="s_text_block_image_fw oe_img_bg oe_custom_bg" style="background-image: url(/website/static/src/img/390.jpg); background-position: 12.57% 8.07%;">
        <div class="container">
          <div class="row">
            <div class="col-md-6 mt64 mb64 bg-black-25">
              <p class="o_default_snippet_text text-center">Пример записи</p>
            </div>
        </div>
      </section>
    </div>
  </div>
</template 


Для того, что-бы данный шаблон перешел в режим редактирования, в редактируемых элементах должны иметь место следующие атрибуты:
class=«snippet oe_structure o_editable o_dirty note-air-editor note-editable»
data-oe-model=«ir.ui.view»
data-oe-id=«929» — ID элемента шаблона в базе
data-oe-xpath="/t[1]/div[1]/div[1]" — путь поиска элемента шаблона

Эти атрибуты необходимы методу call записи для сохранения шаблона в базу Odoo при нажатии в Website Builder клавиши <<Сохранить>>.
Создав скрытое поле

 <input type="hidden" name="tk"/>

перед необходимым элементов

<div class="snippet" > 

получаем в элементе input весь необходимый набор атрибутов.
Далее подключаем JavaScript:

odoo.define('test.find', function (require) {
'use strict';

var animation = require('web_editor.snippets.animation');
animation.registry.search_snippet = animation.Class.extend({
 selector: ".search_snippet",
 start: function(editable_mode) {
  var el=this.$target.find(".snippet");
  var tid=this.$target.find("input[name*='tk']" )
  el.addClass('oe_structure o_editable o_dirty note-air-editor note-editable');
  el.attr('data-oe-model','ir.ui.view');
  el.attr('data-oe-id',tid.attr('data-oe-id'));
  el.attr('data-oe-xpath',"/t[1]/div[1]/div[1]");
  if (editable_mode) {
    //
  }
  else {
   // this.$target.find(".snippet").removeClass('oe_structure o_editable o_dirty note-air-editor note-editable');
  }
 },
  error: function(data){
    },
});


Читать дальше]]>
Wed, 16 Aug 2017 18:54:45 +0300 Разработка первого модуля
Программное создание записи с полями many2many, one2many http://www.odoo-russia.ru/forum/topic/338/ http://www.odoo-russia.ru/forum/topic/338/ qVadro По документации делаю следующим образом, но как добавить запись в поле parent_id не нашел описания

    class Table(models.Model):
        _name = "my.table"
        name = fields.Char("Наименование", required=True)
         _parent_store = True
         parent_id = fields.Many2one('my.table', 'ID Родителя', ondelete='restrict')

    def create_recors(self):
        table = self.env['my.table']
        #table.create({"name": "testname", "parent_id": "False"})

Читать дальше]]>
Tue, 22 Dec 2015 17:39:14 +0300 Разработка первого модуля
Меняем стили представления tree view http://www.odoo-russia.ru/forum/topic/592/ http://www.odoo-russia.ru/forum/topic/592/ aladkoi

<record model="ir.ui.view" id="test_tree_view">
            <field name="name">test.tree</field>
            <field name="model">test.test</field>
            <field name="arch" type="xml">
                <tree string="This test" class="test_tree">
                    <field name="name"/>
                    <field name="test1"/>
                    <field name="test2"/>
                </tree>
            </field>
</record>

Необходимо изменить размер колонок.
Создаем css стиль

.test_tree table{
  width: 70%;
}
.test_tree th[data-id='name']{
  width: 40%;
}
.test_tree th[data-id='test1']{
  width: 4%;
}
.test_tree th[data-id='test2']{
  width: 10%;
}

Читать дальше]]>
Tue, 10 Oct 2017 11:00:28 +0300 Разработка первого модуля
Подключаем в windows к Odoo 10 модуль wkhtmltopdf http://www.odoo-russia.ru/forum/topic/584/ http://www.odoo-russia.ru/forum/topic/584/ aladkoi github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.1/wkhtmltox-0.12.1.2_mingw-w64-cross-win32.exe
2. Устанавливаем и смотрим путь (по умолчанию C:\Program Files\wkhtmltopdf)
3. В odoo.conf добавляем путь:
bin_path=C:\Program Files\wkhtmltopdf\bin
4. Перезапускаем Odoo сервер

PS:
Чтение путей к подключаемым модулям находится в файле
\odoo\tools\misc.py

  def find_in_path(name):

Читать дальше]]>
Tue, 05 Sep 2017 15:38:28 +0300 Разработка первого модуля
Наследование http://www.odoo-russia.ru/forum/topic/565/ http://www.odoo-russia.ru/forum/topic/565/ Michail_Z # -*- coding: utf-8 -*-

from odoo import models, fields, api
import logging
_logger = logging.getLogger(__name__)

class crm_lead_ext(models.Model):
_inherit = 'crm.lead'

.one
.depends('partner_id.email_from')
def _onchange_email_from(self):
_logger.info(«Got something!»)
pass

Пробовал делать через .onchange. Но результата нет. Читал про наследование в документации разработчика, но с пониманием трудности. Не понятно, можно ли через onchange отследить изменение полей в родительской модели.
Читать дальше]]>
Sun, 02 Jul 2017 13:42:47 +0300 Разработка первого модуля
Почему при добавление план счетов автоматически добавляется два нуля в конце кода http://www.odoo-russia.ru/forum/topic/573/ http://www.odoo-russia.ru/forum/topic/573/ samaprog Например: добавил Код — 1491 стало Код — 149100]]> Tue, 18 Jul 2017 08:12:17 +0300 Разработка первого модуля Не найден модуль loglevels http://www.odoo-russia.ru/forum/topic/567/ http://www.odoo-russia.ru/forum/topic/567/ snovikov Выкачал экземпляр odoo для разработки. Согласно инструкции на сайте odoo добавил первый тестовый модуль. Попытался запустить сервер командой
odoo-bin start
. При запуске сообщение об ошибке
ModuleNotFoundError: No module named 'loglevels'

Перерыл (как мог) весь инет, но так и не нашел как называется файл данной библиотеки.
Подскажите пожалуйста как все-таки эту библиотеку установить.
Читать дальше]]>
Mon, 10 Jul 2017 12:29:33 +0300 Разработка первого модуля
Как добавить новый Account Types в Accounts http://www.odoo-russia.ru/forum/topic/569/ http://www.odoo-russia.ru/forum/topic/569/ samaprog В настройках пользователя Settings > Users > Users, Access Right. сделал
Остальные выбирал Manager а Accounting & Finance делал Adviser
В Accounting не появляется Configuration > Accounts > Account Types
Я не могу добавить новую тип и даже не могу видеть дефолтных типов чтобы редактировать их.
Что я не так делаю или где то что-то пропустил?]]>
Tue, 11 Jul 2017 08:41:30 +0300 Разработка первого модуля
Создание модального окна для website http://www.odoo-russia.ru/forum/topic/562/ http://www.odoo-russia.ru/forum/topic/562/ aladkoi getbootstrap.com/javascript/#modals
Для создания модальной страницы необходимо написать template в требуемом стиле и подключить через javascript модальный модуль
1.Создаем template

<template id="product_info" name="Product Info">
<div id="modal_optional_products" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog modal-lg" style="width:350px;">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
        <h4 class="modal-title" id="myModalLabel"><t t-esc="product"/>
<t t-esc="product"/></br></h4>
      </div>
      <div class="modal-body">

                                <div class="container">
                                    <div class="row">
                                      Код страницы
                                    </div>
                                </div>
      </div>
    </div>
    </div>
</div>
</template>

2. Подключаем вызов модального окна, например, к тегу <a/>

<a name="info_route" itemprop="name" t-att-route="slug(product)" class="btn btn-primary btn-lg">Инфо</a></span>

3.Пишем javascript код

$('a[name="info_route"]')
    .off('click')
    .removeClass('a-submit')
    .click(function (event) {
        var product_id = parseInt($(this).attr('route'));
        event.preventDefault();
        ajax.jsonRpc("/shop/info", 'call', {
                'product_id': product_id,
            }).then(function (modal) {
                   var $modal = $(modal);
                $modal
                    .modal()
                    .on('hidden.bs.modal', function () {
                                 $(this).remove();
                    });
                });
        return false;
});

Читать дальше]]>
Thu, 29 Jun 2017 15:39:35 +0300 Разработка первого модуля
Использование механизма сессий в Odoo http://www.odoo-russia.ru/forum/topic/560/ http://www.odoo-russia.ru/forum/topic/560/ aladkoi Данный объект доступен в контроллере Odoo.
При передаче параметров между страницами механизм сессий можно использовать для сохранения необходимых параметров.
Например:

   request.session['test1']='a'
   request.session['test2']='b'
 v={}
 v={'start':1,'end':2,'name':'test'}
   request.session['v']=v

Соответственно извлекаем:

  a=request.session['test1']
  b=request.session['test2']
  v=request.session['v']

При вот такой команде:

  v.pop('start')  

из request.session['v'] будет так-же удален ключ 'start'
Читать дальше]]>
Tue, 27 Jun 2017 13:01:00 +0300 Разработка первого модуля
Редактирование record http://www.odoo-russia.ru/forum/topic/511/ http://www.odoo-russia.ru/forum/topic/511/ Jackson
<xpath expr="//field[<ls user="name" />='description']" position="after">
    <field name="idea_ids" />
</xpath>

<field name="description" position="after">
    <field name="idea_ids" />
</field>


Но не пойму как внести корректировки в записи типа
<record>
Например:
<record model="ir.actions.act_window.view" id="action_crm_tag_kanban_view_oppor11">
            <field name="sequence" eval="0"/> 
            <field name="view_mode">kanban</field>
            <field name="view_id" ref="crm_case_kanban_view_leads"/>
            <field name="act_window_id" ref="crm_lead_opportunities"/>
       </record>

???

Все попытки с помощью своего модуля были провальны. В итоге пришлось в исходниках внести корректировки. Кто подскажет?
Читать дальше]]>
Wed, 15 Mar 2017 11:30:43 +0300 Разработка первого модуля
Как передать значение канбана в дополнительную форму http://www.odoo-russia.ru/forum/topic/555/ http://www.odoo-russia.ru/forum/topic/555/ samaprog
<div>
      <button string="Return data" name="return_record_data" type="button">Return data </button>
</div>


Создал дополнительную форму. При нажатие кнопки должно открываться дополнительная форма с переданные ему значениями из канбана

Как передать значение канбана через функцию в другую форму

def return_record_data(что здесь):
что здесь
return {
что здесь
}
Читать дальше]]>
Tue, 13 Jun 2017 09:08:58 +0300 Разработка первого модуля