It is currently Sat Feb 11, 2012 9:05 pm

All times are UTC + 2 hours




Post new topic Reply to topic  [ 10 posts ] 
Author Message
 Post subject: Настройка форм VIEW LIST TREE
PostPosted: Mon Nov 16, 2009 7:57 am 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
Этот раздел предназначен для обмена опытом настройки форм

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject: атрибуты полей view
PostPosted: Mon Nov 16, 2009 8:36 am 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
для знаков <> лучше применять следующие обозначения
< - &lt;
> - &gt;

readonly - изменяет режим поля значения True, False
readonly="0" - режим чтения запись.
readonly="1" - режим только чтение.
например:
если надо привязать к условию то синтаксис следующий
Code:
<field  name="analytic_id" attrs="{'readonly':[('corr_account_type', '!=', 'analytic')]}"/>
или множество значений
<field  name="analytic_id" attrs="{'readonly':[('dt_account_type','=','product'),('ct_account_type','=','product')]}">

может работать в тэгах: field, group

invisible - режим видимости (показывать или не показывать, но только группу)
ВНИМАНИЕ работает только в тэге group
принцип настройки как у readonly

domain
ограничение выборки при запросах в полях many2one, many2many
в примере все видно:
Code:
<field name="ct_account_id" domain="[('company_id', '=', parent.company_id),('type','&lt;&gt;','view'), ('type', '&lt;&gt;', 'closed')]"/>

При работе в форме один к множеству т.е. заголовок-спецификация, cсылка на родительскую форму из подчиненной по ссылке parent."название поля". В условиях возможна ссылка на подчиненные объекты, например:
Code:
<field name="account_id" domain="[('company_id', '=', company_id), ('user_type.code', '=', 'cash')]"/>

поле account_id тип many2one ссылка на таблицу account_account, а 'user_type.code' - ссылка на справочную таблицу account_account_type
система берет данные из настроек объекта account_account

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Wed Jan 04, 2012 2:38 pm 
Offline

Joined: Tue Dec 27, 2011 2:04 pm
Posts: 11
Location: Minsk, Belarus
Можно ли в виде типа tree скрыть кнопку в зависимости от значений какого-либо поля? Например:
<tree>
<field name="qty_available" />
<button string="Create request" name="create_from_sale" type="object" icon="gtk-go-forward" />
</tree>

Как я понял, button не работает с атрибутом attrs, т.е. это нужно делать через атрибут invisible. Варианты, кот. я пробовал, не работают:
invisible="qty_available &lt; 15"
invisible=" 'qty_available' &lt; 15 "
invisible="'qty_available' = 13"
invisible="qty_available == 13"
invisible="[('qty_available', '&lt;', 15)]"
invisible="[('qty_available', '=', 13)]"
invisible="[(qty_available, '=', 15)]"

В коде движка все теги invisible используются с context.get, типа:
invisible="context.get('menu',False)"

Но вероятно значение моего поля к context не имеет отношения? Как я еще могу получить значение поля из invisible ?
Видел тему topic15461.html , но там к сожалению нету решения :(


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Wed Jan 04, 2012 5:51 pm 
Offline

Joined: Mon Aug 20, 2007 10:14 pm
Posts: 130
Location: Russia, Saint-Petersburg
duh386 wrote:
Можно ли в виде типа tree скрыть кнопку в зависимости от значений какого-либо поля? Например:
<tree>
<field name="qty_available" />
<button string="Create request" name="create_from_sale" type="object" icon="gtk-go-forward" />
</tree>

Как я понял, button не работает с атрибутом attrs, т.е. это нужно делать через атрибут invisible. Варианты, кот. я пробовал, не работают:
invisible="qty_available &lt; 15"
invisible=" 'qty_available' &lt; 15 "
invisible="'qty_available' = 13"
invisible="qty_available == 13"
invisible="[('qty_available', '&lt;', 15)]"
invisible="[('qty_available', '=', 13)]"
invisible="[(qty_available, '=', 15)]"

Так ничего работать не будет. Invisible вообще для tree-view работать не должен. А если бы речь была про форму, то надо было бы через attrs

Quote:
В коде движка все теги invisible используются с context.get, типа:
invisible="context.get('menu',False)"

Но вероятно значение моего поля к context не имеет отношения? Как я еще могу получить значение поля из invisible ?
Видел тему topic15461.html , но там к сожалению нету решения :(

"Код движка" это что?

Я бы предложил в вашем конкретном случае под другим углом посмотреть. Использовать другой механизм, более подходящий, на мой взгляд.
OpenERP предлагает использовать поле state. Именно с этим полем связывают почти все кнопки в модулях. Именно для button во views введен атрибут states.
Подразумевается, что кнопка имеет смысл для определенных статусов объекта и скорее всего будет запускать действие в конечном итоге меняющее статус(хотя это не обязательно)
Посмотрите, например, tree-view для модулей:
Code:
...
                   <button name="button_install" states="uninstalled" string="Schedule for Installation" icon="terp-gtk-jump-to-ltr" type="object"/>
                    <button name="button_install_cancel" states="to install" string="Cancel Install" icon="gtk-cancel" type="object"/>
                    <button name="button_upgrade" states="installed" string="Schedule Upgrade" icon="terp-gtk-go-back-rtl" type="object"/>
                    <button name="button_uninstall" states="installed" string="Uninstall (beta)" icon="terp-dialog-close" type="object"/>
                    <button name="button_uninstall_cancel" states="to remove" string="Cancel Uninstall" icon="gtk-cancel" type="object"/>
                    <button name="button_upgrade_cancel" states="to upgrade" string="Cancel Upgrade" icon="gtk-cancel" type="object"/>
...


Так что архитектурно было бы правильнее, на мой взгляд, ввести поле state. Может функциональное, а может и материальное. Пусть там будут два значения, типа "low_qty", "high_qty". И статус у вас меняется при изменении qty_available относительно 15(или 13). А в tree-view используйте <button states="low_qty" .... /> И походу получите сокрытие кнопки, как бонус за правильное использование openERP :D

PS: Вас не смущает что теме больше двух лет и с вашим вопросом она крайне косвенно связана?


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Thu Jan 05, 2012 9:07 am 
Offline

Joined: Tue Dec 27, 2011 2:04 pm
Posts: 11
Location: Minsk, Belarus
qoqenator wrote:
"Код движка" это что?

Это исходники существующих модулей.

qoqenator wrote:
Так ничего работать не будет. Invisible вообще для tree-view работать не должен. А если бы речь была про форму, то надо было бы через attrs

Хм...вот например кусок кода из модуля project:
Code:
<record id="view_task_tree" model="ir.ui.view">
            <field name="name">project.task.tree</field>
            <field name="model">project.task</field>
            <field name="type">tree</field>
            <field eval="99" name="priority"/>
            <field name="arch" type="xml">
                  <tree colors="red:date_deadline&lt;current_date;blue:date_deadline==current_date;black:date_deadline&gt;current_date" string="My Tasks">
                    <field name="name"/>
                    <field name="project_id"/>
                    <field name="date_deadline"/>
                    <field name="priority"/>
                    <field name="planned_hours" widget="float_time"/>
                    <field name="effective_hours" widget="float_time"/>
                    <field name="progress" widget="progressbar"/>
                    <field name="state" invisible="context.get('set_visible',False)"/>
...............

Вот похожим образом я и пытался сделать (правда тут field вместо button). Возможно что-то я понял неправильно, но в документации не было намеков на правильное решение.

qoqenator wrote:
Я бы предложил в вашем конкретном случае под другим углом посмотреть. Использовать другой механизм, более подходящий, на мой взгляд.
OpenERP предлагает использовать поле state. Именно с этим полем связывают почти все кнопки в модулях. Именно для button во views введен атрибут states.


Задача в общем то простая - в модели sale.order.line есть связь product_id. Вот если количество этого продукта (qty_available) < 0 , то нужно показать кнопку. Т.е. можно было бы ввести в sale.order.line функциональное поле state, кот. бы вычислялось в зависимости от qty_available.
Но там уже есть поле state, которое естественно уже используется для других целей. Что можно придумать в таком случае?

qoqenator wrote:
PS: Вас не смущает что теме больше двух лет и с вашим вопросом она крайне косвенно связана?

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


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Fri Jan 06, 2012 12:32 pm 
Offline

Joined: Tue Dec 27, 2011 2:04 pm
Posts: 11
Location: Minsk, Belarus
Есть конечно еще один вариант решения проблемы - где на веб-сервере парсится xml и получается html. Сча поищу где это делается, может там можно добавить какой-то атрибут или правило...Кто-нибудь может подсказать, как и где обрабатывается xml ?


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Sun Jan 08, 2012 10:22 am 
Offline

Joined: Mon Aug 20, 2007 10:14 pm
Posts: 130
Location: Russia, Saint-Petersburg
duh386 wrote:
Хм...вот например кусок кода из модуля project:


В данном случае, при использовании context, invisible распространяется на весь столбец. Вы же ищите индивидуальный для каждого ряда.

duh386 wrote:
Есть конечно еще один вариант решения проблемы - где на веб-сервере парсится xml и получается html. Сча поищу где это делается, может там можно добавить какой-то атрибут или правило...Кто-нибудь может подсказать, как и где обрабатывается xml ?


Мне кажется для вас это будет довольно трудно. Документации ноль, опыта в программировании надо больше. Но тем не менее дам такие советы:
1. Вам надо будет сделать web-модуль. Несмотря на отсутствие документации, некие стандартные правила для этого есть.
2. Посмотрите, как устроены web-модули, которые идут в стандартной поставке.
3. Посмотрите, как устроены web-модули, на apps.openerp.com (вот например, которые я знаю http://apps.openerp.com/?filter={%22order_by%22%3A+%22click_counter+desc%22%2C+%22author%22%3A+261})
4. Структура такая:
4.1. Делаете обычный модуль
4.2. В нем делаете папку web (содержимое этой папки отправится на веб-клиент)
4.3. Может будет имеет смысл сделать под вашу кнопку отдельный controler, если не разберетесь, как реализовать стандартную кнопку с action
4.4. Попробуйте найти шаблон, который строит ряд в таблице.
4.5. Отнаследуйтесь от него (editor)
5. При апдейте модуля на сервере изменения на веб-клиенте не применяются! Надо или перед каждым желаемым обновлением повышать версию модуля, или просто найти, где лежит скопированный на веб-клиент модуль и просто его удалять.


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Fri Jan 13, 2012 11:18 am 
Offline

Joined: Tue Dec 27, 2011 2:04 pm
Posts: 11
Location: Minsk, Belarus
Огромное спасибо!
Для моей задачи мне нужно переопределить методы класса openerp/widgets/listgrid.py, класс Button. Я пока поправил код в исходниках, все заработало, но хотелось бы сделать через модуль.
Я просмотрел код web-модулей, там обычно определяют контроллеры (controllers.py - т.е. как я понял это обработчики событий по определенному УРЛу), и в editors.py заменяют куски стандартных шаблонов (тоже как я понял, могу ошибаться). Мне ничего этого не нужно изменять, так я и не понял, как подменить методы класса, который я хочу. Если я в своем модуле пытаюсь определить класс с таким же именем, как мне нужно, и родительским исходным, при этом переопределяя методы родительсткого - то новые методы не используются.
Или я все делаю неправильно - нужно как и все модули - через шаблон и контроллер? Просто нашел место, где определяется невидимость кнопки - хотелось бы туда же вставить свой код, было бы очень удачно.
А вообще, с точки зрения Питона - если я определяю класс с именем, которое уже существует, как поступит интерпретатор? Нагуглить ответ не удалось, мне показалось что он просто добавит новые методы к исходному классу и переопределит существующие, но в моем случае так не получилось.


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Fri Jan 13, 2012 5:56 pm 
Offline

Joined: Mon Aug 20, 2007 10:14 pm
Posts: 130
Location: Russia, Saint-Petersburg
duh386 wrote:
А вообще, с точки зрения Питона - если я определяю класс с именем, которое уже существует, как поступит интерпретатор? Нагуглить ответ не удалось, мне показалось что он просто добавит новые методы к исходному классу и переопределит существующие, но в моем случае так не получилось.


Каждый класс уникален. Уникальность класса состоит далеко не только в имени. Вам надо просто задекорировать/заменить метод существующего класса во время исполнения. Это дело не очень хорошее с точки зрения идеальной архитектуры и называется monkey patching

Вот общей набросок одного из моих модулей. Я думаю идея будет понятна:
Code:
from openerp.widgets.form_view import ViewForm

def init_decor(fnct):
    def init_wrapp(self, params, **kwargs):

        res = fnct(self, params, **kwargs)
        .....
        .....
    return init_wrapp

ViewForm.__init__ = init_decor(ViewForm.__init__)

ViewForm.template = "..../viewform.mako"


А вообще, крайне рекомендую уже попробовать 6.1 http://www.openerp.com/downloads#download61
Но там совершенно по другому устроенна работа с web. И писать там уже больше надо на javascript.


Top
 Profile  
 
 Post subject: Re: Настройка форм VIEW LIST TREE
PostPosted: Mon Jan 16, 2012 10:06 am 
Offline

Joined: Tue Dec 27, 2011 2:04 pm
Posts: 11
Location: Minsk, Belarus
Все получилось, еще раз спасибо. Сразу как то не привык, что можно переопределять методы классов наподобие Classname.method=func. Ну и декораторы конечно добавляют возможностей.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 10 posts ] 

All times are UTC + 2 hours


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:

Protected by Anti-Spam ACP