Merge lp:~therp-nl/openerp-product-attributes/7.0_lp1272282_fixed_price into lp:~product-core-editors/openerp-product-attributes/7.0

Proposed by Ronald Portier (Therp)
Status: Rejected
Rejected by: Guewen Baconnier @ Camptocamp
Proposed branch: lp:~therp-nl/openerp-product-attributes/7.0_lp1272282_fixed_price
Merge into: lp:~product-core-editors/openerp-product-attributes/7.0
Diff against target: 1642 lines (+904/-614)
17 files modified
product_pricelist_fixed_price/AUTHORS.txt (+2/-0)
product_pricelist_fixed_price/__init__.py (+1/-20)
product_pricelist_fixed_price/__openerp__.py (+11/-9)
product_pricelist_fixed_price/i18n/ca.po (+0/-65)
product_pricelist_fixed_price/i18n/de.po (+0/-65)
product_pricelist_fixed_price/i18n/es.po (+0/-65)
product_pricelist_fixed_price/i18n/it.po (+0/-64)
product_pricelist_fixed_price/i18n/nl.po (+175/-0)
product_pricelist_fixed_price/i18n/product_pricelist_fixed_price.pot (+147/-39)
product_pricelist_fixed_price/model/__init__.py (+5/-0)
product_pricelist_fixed_price/model/product_pricelist.py (+34/-0)
product_pricelist_fixed_price/model/product_pricelist_item.py (+117/-0)
product_pricelist_fixed_price/model/product_pricelist_version.py (+35/-0)
product_pricelist_fixed_price/pricelist.py (+0/-211)
product_pricelist_fixed_price/pricelist_view.xml (+0/-76)
product_pricelist_fixed_price/view/pricelist_menu.xml (+109/-0)
product_pricelist_fixed_price/view/pricelist_view.xml (+268/-0)
To merge this branch: bzr merge lp:~therp-nl/openerp-product-attributes/7.0_lp1272282_fixed_price
Reviewer Review Type Date Requested Status
Guewen Baconnier @ Camptocamp Needs Information
Yannick Vaucher @ Camptocamp Disapprove
Lionel Sausin - Initiatives/Numérigraphe (community) functionnal and code Approve
Pedro Manuel Baeza Needs Fixing
Leonardo Pistone Abstain
Ronald Portier (Therp) (community) Needs Resubmitting
Review via email: mp+203348@code.launchpad.net

Description of the change

Replace original code to make it compatible with 7.0.

I used the trick to have -1 for the price discount and put the fixed price in price_surcharge.

This will create a price: (base_price * (1 + price_discount)) + price_surcharge =

(base_price * (1 -1)) + price_surcharge = price_surcharge.

Therefore OpenERP will do all its normal computations (including currency-conversions), but none of those computations needs to be modified, adopted or overruled.

To post a comment you must log in.
Revision history for this message
Leonardo Pistone (lepistone) wrote :

Thanks for your work Ronald.

The idea to apply a 100% discount to get a fixed price seems correct to me. I would request a functional review to Lorenzo to check if that covers the use case for the old module.

review: Needs Information (code review)
Revision history for this message
Lionel Sausin - Initiatives/Numérigraphe (ls-initiatives) wrote :

The 100% discount trick is what we currently do in a non-automatic sort of way, and it looks like this module is just what I expected to develop some day to make it easier.
So we're quite willing to test this, but please allow a few days before we can give a feedback.

Revision history for this message
Lorenzo Battistini (elbati) wrote :

From a functional point of view, I approve the -1 trick.

Revision history for this message
Lionel Sausin - Initiatives/Numérigraphe (ls-initiatives) wrote :

Functional: Worked for me, no problem.
I only wish it was possible to mix fixed price rules and standard ones, so we could get rules like
- product A = 1€
- product B = 3€
- other products = sale price + 10%
But this is something that we can change later, it should not block this MP.

GUI:
The form layout for the fixed price list version is slightly wrong (the number of cols must be wrong I guess).
Would you mind making the list view of pricelist lines editable? That would make it much faster to enter.

Code:
I suggest you merge the content of "model/" in a single file at the upper level directory to make consistent with the other modules.

There are spaces at the end of lots of lines, would you care to remove them please?

Can you please make the docstring for the check_*() functions more explicit that "Raise exception when error found", like maybe "Ensure the fixed prices are in fixed pricelists"?

The docstring states that "_compute_vals()" mutates the argument "vals", so I'd be more comfortable if it was called "_adapt_vals()" or something likely explicit.

In _compute_vals you don't use the context, so please remove "context = context or {}"

In write(),the context is missing from the browse() call.

The python files lack copyright comments, is that OK?

review: Needs Fixing
Revision history for this message
Pedro Manuel Baeza (pedro.baeza) wrote :

Without demeriting your work, IMHO a better approach would be to include a field calle type_extended or something similar on product.pricelist.item model that includes the other rule types and a new one called "Fixed price". On the on_change of this field, you can change original type and discount value to -1 if "Fixed price" is selected. On interface, you only need to hide corresponding fields when this type is selected, and relace the old field with this new one. I think it's simpler, don't you?

Regards.

232. By Ronald Portier (Therp)

[ENH] - Enable mixing of fixed and traditional prices in the same pricelists.
[ENH] - Add functionality for fixed prices to traditional views.
[FIX] - whitespace and convention issues.

233. By Ronald Portier (Therp)

[FIX] Wrong layout in fixed pricelist version view.

Revision history for this message
Ronald Portier (Therp) (rportier1962) wrote :

I tried to take most remarks into account. I refer to the commit messages.

Two things
- I prefer having a separate file for each model created or modified. One of the big annoyances in working with the code in OpenERP in my experience is how everything is lumped together in monster .py files. grep is our friend ofcourse. But why for example is res.partner modified somewhere after 1800 (!) lines of code in account_invoice.py? The java community has had the convention of "one class per file" for ages, and that is working out perfectly.
- I did not add an editable list view for the moment. This is just for lack of time. Might add it in the future.

review: Needs Resubmitting
Revision history for this message
Leonardo Pistone (lepistone) wrote :

Hi all,

my review was just a pointer for Lorenzo because I wanted to see his opinion on this implementation as opposed to his own. I now abstain because I didn't actually review the code.

Thanks to all for your work.

review: Abstain
Revision history for this message
Pedro Manuel Baeza (pedro.baeza) wrote :

Hi, Ronald, let me then work in my solution and I'll propose it here. Until them, I'll put this on 'Needs fixing' until then.

Regards.

review: Needs Fixing
Revision history for this message
Ronald Portier (Therp) (rportier1962) wrote :

@Pedro I do not quite understand why you put 'need fixing'. As far as I understand, the module now does everything you and others asked for. OK, I make fields read-only instead of completely hiding them. But what else would you like to be different?

Revision history for this message
Lionel Sausin - Initiatives/Numérigraphe (ls-initiatives) wrote :

Dear Ronald Portier,
Thanks for your work. I tested them and functionally they look just fine.
The UI could be simpler: you could make the fields "hidden" instead of "read-only" when a pricelist lines have a fixed price.
Then the additional menu entries and views wouldn't be needed, you could remove them altogether.
Regarding the many files, usually we group them by module so you could do with a "product.py" with all things product-related. But I'd not block this MP for such a detail.
And other that that it looks just fine to me.

Pedro Manuel Baeza, I humbly think we should accept this MP, and then you can base your own branch on Ronald Portier's work. What do you think?

review: Approve (functionnal and code)
Revision history for this message
Lionel Sausin - Initiatives/Numérigraphe (ls-initiatives) wrote :

Pedro Manuel Baeza,
I think I didn't understand your counter-proposal at first, sorry.
What you're proposing may be more powerful but will be more intrusive won't it? Then it might be harder to test. Do you expect to develop advanced price list customizations beyond fixed price in the short term?
Otherwise I think we should accept this and eventually replace it with more complex code like the one you propose, when the actual need arises.

Revision history for this message
Pedro Manuel Baeza (pedro.baeza) wrote :

Hi, I have make another MP proposing my approach for this task. Please review it and tell me if you see it more idoneous:

https://code.launchpad.net/~pedro.baeza/openerp-product-attributes/7.0-product_pricelist_fixed_price/+merge/205045

Regards.

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

I'll disapprove it as https://code.launchpad.net/~pedro.baeza/openerp-product-attributes/7.0-product_pricelist_fixed_price/+merge/205045 superseeds it.

Ronald would be great if you could have a look at Pedro's MP as well.

review: Disapprove
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

Hi Ronald,

The alternative [0] proposed by Pedro is about to be merged; it has been approved by 3 people. Can we have your opinion on that, and eventually can you close your one if you think that Pedro's proposal fit with your needs as well?

Thanks.

[0] https://code.launchpad.net/~pedro.baeza/openerp-product-attributes/7.0-product_pricelist_fixed_price/+merge/205045

review: Needs Information
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

Ronald having approved Pedro's proposal, I set the merge status of this proposal as rejected. Thanks to everyone for your work.

Unmerged revisions

233. By Ronald Portier (Therp)

[FIX] Wrong layout in fixed pricelist version view.

232. By Ronald Portier (Therp)

[ENH] - Enable mixing of fixed and traditional prices in the same pricelists.
[ENH] - Add functionality for fixed prices to traditional views.
[FIX] - whitespace and convention issues.

231. By Ronald Portier (Therp)

[FIX] Completely replace fixed pricelist module to make it compatible
    with OpenERP 7.0, but also have it use just standard computations.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'product_pricelist_fixed_price/AUTHORS.txt'
--- product_pricelist_fixed_price/AUTHORS.txt 2011-04-01 10:14:05 +0000
+++ product_pricelist_fixed_price/AUTHORS.txt 2014-02-03 14:58:49 +0000
@@ -1,1 +1,3 @@
1Lorenzo Battistini <lorenzo.battistini@domsense.com>1Lorenzo Battistini <lorenzo.battistini@domsense.com>
2Ronald Portier <ronald@therp.nl>
3
24
=== modified file 'product_pricelist_fixed_price/__init__.py'
--- product_pricelist_fixed_price/__init__.py 2011-04-01 10:14:05 +0000
+++ product_pricelist_fixed_price/__init__.py 2014-02-03 14:58:49 +0000
@@ -1,22 +1,3 @@
1# -*- encoding: utf-8 -*-1# -*- encoding: utf-8 -*-
2##############################################################################2from . import model
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011 Domsense s.r.l. (<http://www.domsense.com>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
213
22import pricelist
234
=== modified file 'product_pricelist_fixed_price/__openerp__.py'
--- product_pricelist_fixed_price/__openerp__.py 2013-01-21 06:49:06 +0000
+++ product_pricelist_fixed_price/__openerp__.py 2014-02-03 14:58:49 +0000
@@ -3,6 +3,7 @@
3#3#
4# OpenERP, Open Source Management Solution4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011 Domsense s.r.l. (<http://www.domsense.com>).5# Copyright (C) 2011 Domsense s.r.l. (<http://www.domsense.com>).
6# 2014 Therp BV (<http://www.therp.nl>).
6#7#
7# This program is free software: you can redistribute it and/or modify8# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as9# it under the terms of the GNU Affero General Public License as
@@ -19,20 +20,21 @@
19#20#
20##############################################################################21##############################################################################
2122
22
23{23{
24 "name": "Price List Fixed Price",24 "name": "Price List Fixed Price",
25 "version": "1.0",25 "version": "2.0",
26 'category': 'Generic Modules/Inventory Control',26 'category': 'Generic Modules/Inventory Control',
27 "depends": ["product"],27 "depends": ["product"],
28 "author": "Agile Business Group & Domsense",28 "author": "Product Addons Community",
29 "description": """This module allows to specify a fixed price for price list rules. So, if the rule is based on 'fixed price', this price will be used without any computation""",29 "description": """This module allows to specify a fixed price for price
30 'website': 'http://www.agilebg.com',30 list rules.""",
31 'init_xml': [],31 'website': 'https://launchpad.net/openerp-product-attributes',
32 'update_xml': [32 'data': [
33 'pricelist_view.xml',33 'view/pricelist_view.xml',
34 'view/pricelist_menu.xml',
34 ],35 ],
35 'demo_xml': [],36 'demo_xml': [],
36 'installable': False,37 'installable': True,
37 'active': False,38 'active': False,
38}39}
40
3941
=== removed file 'product_pricelist_fixed_price/i18n/ca.po'
--- product_pricelist_fixed_price/i18n/ca.po 2012-12-05 05:42:11 +0000
+++ product_pricelist_fixed_price/i18n/ca.po 1970-01-01 00:00:00 +0000
@@ -1,65 +0,0 @@
1# Catalan translation for openobject-addons
2# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
3# This file is distributed under the same license as the openobject-addons package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: openobject-addons\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2011-03-25 10:08+0000\n"
11"PO-Revision-Date: 2012-04-18 23:39+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Catalan <ca@li.org>\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"X-Launchpad-Export-Date: 2012-12-05 05:42+0000\n"
18"X-Generator: Launchpad (build 16335)\n"
19
20#. module: product_pricelist_fixed_price
21#: view:product.pricelist.item:0
22msgid "Max. Margin"
23msgstr "Marge màxim"
24
25#. module: product_pricelist_fixed_price
26#: view:product.pricelist.item:0
27msgid "Min. Margin"
28msgstr "Marge mínim"
29
30#. module: product_pricelist_fixed_price
31#: view:product.pricelist.item:0
32msgid "Rounding Method"
33msgstr "Mètode arrodoniment"
34
35#. module: product_pricelist_fixed_price
36#: constraint:product.pricelist.item:0
37msgid ""
38"Error ! You cannot assign the Main Pricelist as Other Pricelist in PriceList "
39"Item!"
40msgstr ""
41"Error! No podeu assignar la tarifa principal com una altre tarifa en un "
42"element de la tarifa."
43
44#. module: product_pricelist_fixed_price
45#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist
46msgid "Pricelist"
47msgstr "Tarifa"
48
49#. module: product_pricelist_fixed_price
50#: code:addons/product_pricelist_fixed_price/pricelist.py:97
51#, python-format
52msgid "Warning !"
53msgstr "Atenció!"
54
55#. module: product_pricelist_fixed_price
56#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item
57msgid "Pricelist item"
58msgstr "Element de la tarifa"
59
60#. module: product_pricelist_fixed_price
61#: code:addons/product_pricelist_fixed_price/pricelist.py:32
62#: field:product.pricelist.item,fixed_price:0
63#, python-format
64msgid "Fixed Price"
65msgstr "Preu fix"
660
=== removed file 'product_pricelist_fixed_price/i18n/de.po'
--- product_pricelist_fixed_price/i18n/de.po 2012-12-05 05:42:11 +0000
+++ product_pricelist_fixed_price/i18n/de.po 1970-01-01 00:00:00 +0000
@@ -1,65 +0,0 @@
1# German translation for openobject-addons
2# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
3# This file is distributed under the same license as the openobject-addons package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: openobject-addons\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2011-03-25 10:08+0000\n"
11"PO-Revision-Date: 2011-05-02 07:47+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: German <de@li.org>\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"X-Launchpad-Export-Date: 2012-12-05 05:42+0000\n"
18"X-Generator: Launchpad (build 16335)\n"
19
20#. module: product_pricelist_fixed_price
21#: view:product.pricelist.item:0
22msgid "Max. Margin"
23msgstr "Max. Spanne"
24
25#. module: product_pricelist_fixed_price
26#: view:product.pricelist.item:0
27msgid "Min. Margin"
28msgstr "Min. Spanne"
29
30#. module: product_pricelist_fixed_price
31#: view:product.pricelist.item:0
32msgid "Rounding Method"
33msgstr "Rundungsverfahren"
34
35#. module: product_pricelist_fixed_price
36#: constraint:product.pricelist.item:0
37msgid ""
38"Error ! You cannot assign the Main Pricelist as Other Pricelist in PriceList "
39"Item!"
40msgstr ""
41"Fehler! Sie können die Basispreisliste nicht als alternative Preisliste in "
42"einem Preislisteneintrag zuweisen."
43
44#. module: product_pricelist_fixed_price
45#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist
46msgid "Pricelist"
47msgstr "Preisliste"
48
49#. module: product_pricelist_fixed_price
50#: code:addons/product_pricelist_fixed_price/pricelist.py:97
51#, python-format
52msgid "Warning !"
53msgstr "Warnung!"
54
55#. module: product_pricelist_fixed_price
56#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item
57msgid "Pricelist item"
58msgstr "Preisliste Einzelposition"
59
60#. module: product_pricelist_fixed_price
61#: code:addons/product_pricelist_fixed_price/pricelist.py:32
62#: field:product.pricelist.item,fixed_price:0
63#, python-format
64msgid "Fixed Price"
65msgstr "Festpreis"
660
=== removed file 'product_pricelist_fixed_price/i18n/es.po'
--- product_pricelist_fixed_price/i18n/es.po 2012-12-05 05:42:11 +0000
+++ product_pricelist_fixed_price/i18n/es.po 1970-01-01 00:00:00 +0000
@@ -1,65 +0,0 @@
1# Spanish translation for openobject-addons
2# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
3# This file is distributed under the same license as the openobject-addons package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: openobject-addons\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2011-03-25 10:08+0000\n"
11"PO-Revision-Date: 2011-08-26 23:18+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"X-Launchpad-Export-Date: 2012-12-05 05:42+0000\n"
18"X-Generator: Launchpad (build 16335)\n"
19
20#. module: product_pricelist_fixed_price
21#: view:product.pricelist.item:0
22msgid "Max. Margin"
23msgstr "Margen máximo"
24
25#. module: product_pricelist_fixed_price
26#: view:product.pricelist.item:0
27msgid "Min. Margin"
28msgstr "Margen mínimo"
29
30#. module: product_pricelist_fixed_price
31#: view:product.pricelist.item:0
32msgid "Rounding Method"
33msgstr "Método redondeo"
34
35#. module: product_pricelist_fixed_price
36#: constraint:product.pricelist.item:0
37msgid ""
38"Error ! You cannot assign the Main Pricelist as Other Pricelist in PriceList "
39"Item!"
40msgstr ""
41"¡Error! No puede asignar la tarifa principal como otra tarifa en un "
42"elemento de la tarifa."
43
44#. module: product_pricelist_fixed_price
45#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist
46msgid "Pricelist"
47msgstr "Lista de Precios"
48
49#. module: product_pricelist_fixed_price
50#: code:addons/product_pricelist_fixed_price/pricelist.py:97
51#, python-format
52msgid "Warning !"
53msgstr "¡Atención!"
54
55#. module: product_pricelist_fixed_price
56#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item
57msgid "Pricelist item"
58msgstr "Elemento de la tarifa"
59
60#. module: product_pricelist_fixed_price
61#: code:addons/product_pricelist_fixed_price/pricelist.py:32
62#: field:product.pricelist.item,fixed_price:0
63#, python-format
64msgid "Fixed Price"
65msgstr "Precio fijo"
660
=== removed file 'product_pricelist_fixed_price/i18n/it.po'
--- product_pricelist_fixed_price/i18n/it.po 2012-12-05 05:42:11 +0000
+++ product_pricelist_fixed_price/i18n/it.po 1970-01-01 00:00:00 +0000
@@ -1,64 +0,0 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * product_pricelist_fixed_price
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.1\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2011-03-25 10:08+0000\n"
10"PO-Revision-Date: 2011-03-31 12:02+0000\n"
11"Last-Translator: Lorenzo Battistini <lorenzo.battistini@agilebg.com>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: 8bit\n"
16"X-Launchpad-Export-Date: 2012-12-05 05:42+0000\n"
17"X-Generator: Launchpad (build 16335)\n"
18
19#. module: product_pricelist_fixed_price
20#: view:product.pricelist.item:0
21msgid "Max. Margin"
22msgstr "Margine Massimo"
23
24#. module: product_pricelist_fixed_price
25#: view:product.pricelist.item:0
26msgid "Min. Margin"
27msgstr "Margine Minimo"
28
29#. module: product_pricelist_fixed_price
30#: view:product.pricelist.item:0
31msgid "Rounding Method"
32msgstr "Metodo Arrotondamento"
33
34#. module: product_pricelist_fixed_price
35#: constraint:product.pricelist.item:0
36msgid ""
37"Error ! You cannot assign the Main Pricelist as Other Pricelist in PriceList "
38"Item!"
39msgstr ""
40"Errore ! Non è possibile assegnare il listino principale come 'altro "
41"listino' nell'elemento di listino!"
42
43#. module: product_pricelist_fixed_price
44#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist
45msgid "Pricelist"
46msgstr "Listino Prezzi"
47
48#. module: product_pricelist_fixed_price
49#: code:addons/product_pricelist_fixed_price/pricelist.py:97
50#, python-format
51msgid "Warning !"
52msgstr "attenzione !"
53
54#. module: product_pricelist_fixed_price
55#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item
56msgid "Pricelist item"
57msgstr "Oggetto Listino"
58
59#. module: product_pricelist_fixed_price
60#: code:addons/product_pricelist_fixed_price/pricelist.py:32
61#: field:product.pricelist.item,fixed_price:0
62#, python-format
63msgid "Fixed Price"
64msgstr "Prezzo fisso"
650
=== added file 'product_pricelist_fixed_price/i18n/nl.po'
--- product_pricelist_fixed_price/i18n/nl.po 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/i18n/nl.po 2014-02-03 14:58:49 +0000
@@ -0,0 +1,175 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * product_pricelist_fixed_price
4# <ronald@therp.nl> <>, 2014.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: OpenERP Server 7.0\n"
9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2014-01-27 14:11+0000\n"
11"PO-Revision-Date: 2014-01-27 15:37+0100\n"
12"Last-Translator: <ronald@therp.nl>\n"
13"Language-Team:\n"
14"Language: nl_NL\n"
15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Transfer-Encoding: \n"
18"Plural-Forms: \n"
19"X-Generator: Gtranslator 2.91.6\n"
20
21#. module: product_pricelist_fixed_price
22#: model:ir.actions.act_window,help:product_pricelist_fixed_price.product_fixedprice_version_action
23msgid ""
24"<p class=\"oe_view_nocontent_create\">\n"
25" Click to add a pricelist version.\n"
26" </p><p>\n"
27" There can be more than one version of a pricelist, each of\n"
28" these must be valid during a certain period of time. Some\n"
29" examples of versions: Main Prices, 2010, 2011, Summer "
30"Sales,\n"
31" etc.\n"
32" </p>\n"
33" "
34msgstr ""
35"<p class=\"oe_view_nocontent_create\">\n"
36" Klik om een prijslijst versie toe te voegen.\n"
37" </p><p>\n"
38" Er kan meer dan één versie van een prijslijst zijn. Ieder\n"
39" daarvan moet een bepaalde tijd geldig zijn. Voorbeelden van\n"
40" versies: Standaard prijzen, 2010, 2011, Zomer-uitverkoop, "
41"etc.\n"
42" </p>\n"
43"..............."
44
45#. module: product_pricelist_fixed_price
46#: model:ir.actions.act_window,help:product_pricelist_fixed_price.product_fixedprice_action
47msgid ""
48"<p class=\"oe_view_nocontent_create\">\n"
49" Click to add a pricelist.\n"
50" </p><p>\n"
51" There can be more than one version of a pricelist, each of\n"
52" these must be valid during a certain period of time. Some\n"
53" examples of versions: Main Prices, 2010, 2011, Summer "
54"Sales,\n"
55" etc.\n"
56" </p>\n"
57" "
58msgstr ""
59"<p class=\"oe_view_nocontent_create\">\n"
60" Klik om een prijslijst toe te voegen.\n"
61" </p><p>\n"
62" Er kan meer dan één versie van een prijslijst zijn. Ieder\n"
63" daarvan moet een bepaalde tijd geldig zijn. Voorbeelden van\n"
64" versies: Standaard prijzen, 2010, 2011, Zomer-uitverkoop, "
65"etc.\n"
66" </p>"
67
68#. module: product_pricelist_fixed_price
69#: view:product.pricelist.version:0
70msgid "Fixed Pricelist Version"
71msgstr "Vaste prijslijst versie"
72
73#. module: product_pricelist_fixed_price
74#: model:ir.actions.act_window,name:product_pricelist_fixed_price.product_fixedprice_version_action
75#: model:ir.ui.menu,name:product_pricelist_fixed_price.product_fixedprice_version_menu
76msgid "Fixed Pricelist versions"
77msgstr "Vaste prijslijst versies"
78
79#. module: product_pricelist_fixed_price
80#: model:ir.actions.act_window,name:product_pricelist_fixed_price.product_fixedprice_action
81#: model:ir.ui.menu,name:product_pricelist_fixed_price.product_fixedprice_menu
82msgid "Fixed Pricelists"
83msgstr "Vaste prijslijsten"
84
85#. module: product_pricelist_fixed_price
86#: field:product.pricelist,fixed_price:0
87#: field:product.pricelist.item,fixed_price:0
88#: field:product.pricelist.version,fixed_price:0
89msgid "Fixed price"
90msgstr "Vaste prijs"
91
92#. module: product_pricelist_fixed_price
93#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:80
94#, python-format
95msgid "Fixed price item only valid on fixed pricelist."
96msgstr "Vaste prijs regel alleen geldig op een vaste prijslijst."
97
98#. module: product_pricelist_fixed_price
99#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:26
100#, python-format
101msgid "Fixed price version only valid on fixed pricelist."
102msgstr "Vaste prijsversie alleen geldig voor een vaste prijslijst"
103
104#. module: product_pricelist_fixed_price
105#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:73
106#, python-format
107msgid "Fixed pricelist should have fixed price items."
108msgstr "Vaste prijslijst moet vaste prijs regels hebben."
109
110#. module: product_pricelist_fixed_price
111#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:19
112#, python-format
113msgid "Fixed pricelist should have fixed price versions."
114msgstr "Vaste prijslijst moet vaste prijs versies hebben."
115
116#. module: product_pricelist_fixed_price
117#: view:product.pricelist.item:0
118msgid "Price"
119msgstr "Prijs"
120
121#. module: product_pricelist_fixed_price
122#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist
123msgid "Pricelist"
124msgstr "Prijslijst"
125
126#. module: product_pricelist_fixed_price
127#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_version
128msgid "Pricelist Version"
129msgstr "Prijslijst versie"
130
131#. module: product_pricelist_fixed_price
132#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item
133msgid "Pricelist item"
134msgstr "Prijslijst regel"
135
136#. module: product_pricelist_fixed_price
137#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:85
138#, python-format
139msgid "Product required for fixed price item."
140msgstr "Produkt verplicht op vaste prijs regel"
141
142#. module: product_pricelist_fixed_price
143#: view:product.pricelist.item:0
144msgid "Products Fixed Price Items"
145msgstr "Vaste prijs regels voor producten"
146
147#. module: product_pricelist_fixed_price
148#: view:product.pricelist:0
149msgid "Products Fixed Price List"
150msgstr "Vaste prijslijst voor produkten"
151
152#. module: product_pricelist_fixed_price
153#: view:product.pricelist:0
154msgid "Products Fixed Price Search"
155msgstr "Zoeken in vaste prijzen voor produkten"
156
157#. module: product_pricelist_fixed_price
158#: view:product.pricelist:0
159msgid "Products Price"
160msgstr "Produktprijzen"
161
162#. module: product_pricelist_fixed_price
163#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:72
164#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:79
165#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:84
166#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:18
167#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:25
168#, python-format
169msgid "Validation error!"
170msgstr "Validatie fout!"
171
172#. module: product_pricelist_fixed_price
173#: constraint:product.pricelist.item:0
174msgid "invalid values for fixed price"
175msgstr "Ongeldige waarden voor vaste prijs"
0176
=== modified file 'product_pricelist_fixed_price/i18n/product_pricelist_fixed_price.pot'
--- product_pricelist_fixed_price/i18n/product_pricelist_fixed_price.pot 2011-04-01 10:14:05 +0000
+++ product_pricelist_fixed_price/i18n/product_pricelist_fixed_price.pot 2014-02-03 14:58:49 +0000
@@ -4,10 +4,10 @@
4#4#
5msgid ""5msgid ""
6msgstr ""6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.1\n"7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2011-03-25 10:08+0000\n"9"POT-Creation-Date: 2014-01-27 14:11+0000\n"
10"PO-Revision-Date: 2011-03-25 10:08+0000\n"10"PO-Revision-Date: 2014-01-27 14:11+0000\n"
11"Last-Translator: <>\n"11"Last-Translator: <>\n"
12"Language-Team: \n"12"Language-Team: \n"
13"MIME-Version: 1.0\n"13"MIME-Version: 1.0\n"
@@ -16,45 +16,153 @@
16"Plural-Forms: \n"16"Plural-Forms: \n"
1717
18#. module: product_pricelist_fixed_price18#. module: product_pricelist_fixed_price
19#: view:product.pricelist.item:019#: model:ir.actions.act_window,help:product_pricelist_fixed_price.product_fixedprice_action
20msgid "Max. Margin"20msgid "<p class=\"oe_view_nocontent_create\">\n"
21msgstr ""21" Click to add a pricelist.\n"
2222" </p><p>\n"
23#. module: product_pricelist_fixed_price23" There can be more than one version of a pricelist, each of\n"
24#: view:product.pricelist.item:024" these must be valid during a certain period of time. Some\n"
25msgid "Min. Margin"25" examples of versions: Main Prices, 2010, 2011, Summer Sales,\n"
26msgstr ""26" etc.\n"
2727" </p>\n"
28#. module: product_pricelist_fixed_price28" "
29#: view:product.pricelist.item:029msgstr "<p class=\"oe_view_nocontent_create\">\n"
30msgid "Rounding Method"30" Click to add a pricelist.\n"
31msgstr ""31" </p><p>\n"
3232" There can be more than one version of a pricelist, each of\n"
33#. module: product_pricelist_fixed_price33" these must be valid during a certain period of time. Some\n"
34#: constraint:product.pricelist.item:034" examples of versions: Main Prices, 2010, 2011, Summer Sales,\n"
35msgid "Error ! You cannot assign the Main Pricelist as Other Pricelist in PriceList Item!"35" etc.\n"
36msgstr ""36" </p>\n"
37" "
38
39#. module: product_pricelist_fixed_price
40#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:80
41#, python-format
42msgid "Fixed price item only valid on fixed pricelist."
43msgstr "Fixed price item only valid on fixed pricelist."
44
45#. module: product_pricelist_fixed_price
46#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:19
47#, python-format
48msgid "Fixed pricelist should have fixed price versions."
49msgstr "Fixed pricelist should have fixed price versions."
50
51#. module: product_pricelist_fixed_price
52#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:72
53#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:79
54#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:84
55#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:18
56#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:25
57#, python-format
58msgid "Validation error!"
59msgstr "Validation error!"
60
61#. module: product_pricelist_fixed_price
62#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_version
63msgid "Pricelist Version"
64msgstr "Pricelist Version"
65
66#. module: product_pricelist_fixed_price
67#: code:addons/product_pricelist_fixed_price/model/product_pricelist_version.py:26
68#, python-format
69msgid "Fixed price version only valid on fixed pricelist."
70msgstr "Fixed price version only valid on fixed pricelist."
71
72#. module: product_pricelist_fixed_price
73#: model:ir.actions.act_window,help:product_pricelist_fixed_price.product_fixedprice_version_action
74msgid "<p class=\"oe_view_nocontent_create\">\n"
75" Click to add a pricelist version.\n"
76" </p><p>\n"
77" There can be more than one version of a pricelist, each of\n"
78" these must be valid during a certain period of time. Some\n"
79" examples of versions: Main Prices, 2010, 2011, Summer Sales,\n"
80" etc.\n"
81" </p>\n"
82" "
83msgstr "<p class=\"oe_view_nocontent_create\">\n"
84" Click to add a pricelist version.\n"
85" </p><p>\n"
86" There can be more than one version of a pricelist, each of\n"
87" these must be valid during a certain period of time. Some\n"
88" examples of versions: Main Prices, 2010, 2011, Summer Sales,\n"
89" etc.\n"
90" </p>\n"
91" "
92
93#. module: product_pricelist_fixed_price
94#: view:product.pricelist:0
95msgid "Products Fixed Price Search"
96msgstr "Products Fixed Price Search"
97
98#. module: product_pricelist_fixed_price
99#: view:product.pricelist.version:0
100msgid "Fixed Pricelist Version"
101msgstr "Fixed Pricelist Version"
102
103#. module: product_pricelist_fixed_price
104#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:85
105#, python-format
106msgid "Product required for fixed price item."
107msgstr "Product required for fixed price item."
108
109#. module: product_pricelist_fixed_price
110#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item
111msgid "Pricelist item"
112msgstr "Pricelist item"
113
114#. module: product_pricelist_fixed_price
115#: view:product.pricelist.item:0
116msgid "Products Fixed Price Items"
117msgstr "Products Fixed Price Items"
118
119#. module: product_pricelist_fixed_price
120#: view:product.pricelist:0
121msgid "Products Price"
122msgstr "Products Price"
123
124#. module: product_pricelist_fixed_price
125#: model:ir.actions.act_window,name:product_pricelist_fixed_price.product_fixedprice_action
126#: model:ir.ui.menu,name:product_pricelist_fixed_price.product_fixedprice_menu
127msgid "Fixed Pricelists"
128msgstr "Fixed Pricelists"
129
130#. module: product_pricelist_fixed_price
131#: view:product.pricelist:0
132msgid "Products Fixed Price List"
133msgstr "Products Fixed Price List"
37134
38#. module: product_pricelist_fixed_price135#. module: product_pricelist_fixed_price
39#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist136#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist
40msgid "Pricelist"137msgid "Pricelist"
41msgstr ""138msgstr "Pricelist"
42139
43#. module: product_pricelist_fixed_price140#. module: product_pricelist_fixed_price
44#: code:addons/product_pricelist_fixed_price/pricelist.py:97141#: constraint:product.pricelist.item:0
45#, python-format142msgid "invalid values for fixed price"
46msgid "Warning !"143msgstr "invalid values for fixed price"
47msgstr ""144
48145#. module: product_pricelist_fixed_price
49#. module: product_pricelist_fixed_price146#: model:ir.actions.act_window,name:product_pricelist_fixed_price.product_fixedprice_version_action
50#: model:ir.model,name:product_pricelist_fixed_price.model_product_pricelist_item147#: model:ir.ui.menu,name:product_pricelist_fixed_price.product_fixedprice_version_menu
51msgid "Pricelist item"148msgid "Fixed Pricelist versions"
52msgstr ""149msgstr "Fixed Pricelist versions"
53150
54#. module: product_pricelist_fixed_price151#. module: product_pricelist_fixed_price
55#: code:addons/product_pricelist_fixed_price/pricelist.py:32152#: view:product.pricelist.item:0
153msgid "Price"
154msgstr "Price"
155
156#. module: product_pricelist_fixed_price
157#: field:product.pricelist,fixed_price:0
56#: field:product.pricelist.item,fixed_price:0158#: field:product.pricelist.item,fixed_price:0
159#: field:product.pricelist.version,fixed_price:0
160msgid "Fixed price"
161msgstr "Fixed price"
162
163#. module: product_pricelist_fixed_price
164#: code:addons/product_pricelist_fixed_price/model/product_pricelist_item.py:73
57#, python-format165#, python-format
58msgid "Fixed Price"166msgid "Fixed pricelist should have fixed price items."
59msgstr ""167msgstr "Fixed pricelist should have fixed price items."
60168
61169
=== added directory 'product_pricelist_fixed_price/model'
=== added file 'product_pricelist_fixed_price/model/__init__.py'
--- product_pricelist_fixed_price/model/__init__.py 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/model/__init__.py 2014-02-03 14:58:49 +0000
@@ -0,0 +1,5 @@
1# -*- encoding: utf-8 -*-
2from . import product_pricelist
3from . import product_pricelist_version
4from . import product_pricelist_item
5
06
=== added file 'product_pricelist_fixed_price/model/product_pricelist.py'
--- product_pricelist_fixed_price/model/product_pricelist.py 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/model/product_pricelist.py 2014-02-03 14:58:49 +0000
@@ -0,0 +1,34 @@
1#-*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2014 Therp BV (<http://www.therp.nl>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from openerp.osv import orm, fields
23
24
25class ProductPricelist(orm.Model):
26 _inherit = 'product.pricelist'
27
28 _columns = {
29 'fixed_price': fields.boolean(
30 'Fixed price',
31 help='Pricelist intended for fixed prices.',
32 ),
33 }
34
035
=== added file 'product_pricelist_fixed_price/model/product_pricelist_item.py'
--- product_pricelist_fixed_price/model/product_pricelist_item.py 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/model/product_pricelist_item.py 2014-02-03 14:58:49 +0000
@@ -0,0 +1,117 @@
1#-*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2014 Therp BV (<http://www.therp.nl>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22'''All functionality to enable fixed prices in pricelists.'''
23
24from openerp.osv import orm, fields
25from openerp.tools.translate import _
26
27
28class ProductPricelistItem(orm.Model):
29 '''Inherit existing model to add functionality for fixed prices'''
30 _inherit = 'product.pricelist.item'
31
32 def _modify_vals(self, cr, uid, vals, browse_obj=None, context=None):
33 '''Ensure consistent values for fixed pricelists.
34 The passed vals parameter is used for both input and output.'''
35 # First determine wether a fixed price should apply
36 fixed_price = False
37 if browse_obj:
38 fixed_price = browse_obj.fixed_price
39 else:
40 # new record
41 fixed_price = (
42 ('fixed_price' in vals and vals['fixed_price']) or
43 ('default_fixed_price' in vals
44 and vals['default_fixed_price']) or
45 False
46 )
47 if not fixed_price:
48 return
49 # If we get here, we have a fixed price, because we need some
50 # reference to a price in product (even though its influence will be
51 # eliminated by our price_discount), we use the standard price
52 model_model = self.pool.get('ir.model.data')
53 standard_price_type = model_model.get_object_reference(
54 cr, uid, 'product', 'standard_price')[1]
55 vals.update({
56 'price_discount': -1.0,
57 'price_round': 0.0,
58 'base': standard_price_type,
59 'price_min_margin': 0.0,
60 'price_max_margin': 0.0,
61 })
62
63 def create(self, cr, uid, vals, context=None):
64 '''Make sure fixed pricelist items have consistent values'''
65 self._modify_vals(cr, uid, vals, browse_obj=None, context=context)
66 return super(ProductPricelistItem, self).create(
67 cr, uid, vals, context)
68
69 def write(self, cr, uid, ids, vals, context=None):
70 '''Override write method. We have to take into account that
71 we only get one set of values, but that the change might effect
72 multiple ids. But because the computations we do might be different
73 depending on the current values in the database, we will setup a loop
74 and compute and update each record separately.
75 '''
76 for item_id in ids:
77 browse_records = self.browse(cr, uid, [item_id], context=context)
78 browse_obj = browse_records[0]
79 self._modify_vals(
80 cr, uid, vals, browse_obj=browse_obj, context=context)
81 super(ProductPricelistItem, self).write(
82 cr, uid, [item_id], vals, context=context)
83 return True
84
85 def onchange_fixed_price(
86 self, cr, uid, ids, fixed_price, context=None):
87 res = {}
88 if fixed_price:
89 vals = {'fixed_price': True}
90 self._modify_vals(cr, uid, vals, context=context)
91 res['value'] = vals
92 return res
93
94 _columns = {
95 'fixed_price': fields.boolean('Fixed price'),
96 }
97
98 def _check_fixed_price(self, cr, uid, ids):
99 '''Ensure fixed prices always refer to a specific product.'''
100 for this_obj in self.browse(cr, uid, ids):
101 if not this_obj.fixed_price:
102 return True
103 if not this_obj.product_id:
104 raise orm.except_orm(
105 _('Validation error!'),
106 _('Product required for fixed price item.')
107 )
108 # Values for price_discount and price_round will not be checked,
109 # because create and write will automagically set appropiate
110 # values.
111 return True
112
113 _constraints = [
114 (_check_fixed_price,
115 'invalid values for fixed price', ['fixed_price']),
116 ]
117
0118
=== added file 'product_pricelist_fixed_price/model/product_pricelist_version.py'
--- product_pricelist_fixed_price/model/product_pricelist_version.py 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/model/product_pricelist_version.py 2014-02-03 14:58:49 +0000
@@ -0,0 +1,35 @@
1#-*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2014 Therp BV (<http://www.therp.nl>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from openerp.osv import orm, fields
23from openerp.tools.translate import _
24
25
26class ProductPricelistVersion(orm.Model):
27 _inherit = 'product.pricelist.version'
28
29 _columns = {
30 'fixed_price': fields.boolean(
31 'Fixed price',
32 help='Pricelist intended for fixed prices.',
33 ),
34 }
35
036
=== removed file 'product_pricelist_fixed_price/pricelist.py'
--- product_pricelist_fixed_price/pricelist.py 2011-04-01 10:14:05 +0000
+++ product_pricelist_fixed_price/pricelist.py 1970-01-01 00:00:00 +0000
@@ -1,211 +0,0 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011 Domsense s.r.l. (<http://www.domsense.com>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from osv import fields,osv
23from tools.translate import _
24import decimal_precision as dp
25import time
26from product._common import rounding
27
28class product_pricelist_item(osv.osv):
29
30 def _price_field_get(self, cr, uid, context=None):
31 result = super(product_pricelist_item, self)._price_field_get(cr, uid, context)
32 result.append((-3, _('Fixed Price')))
33 return result
34
35 _inherit = "product.pricelist.item"
36
37 _columns = {
38 'fixed_price': fields.float('Fixed Price',
39 digits_compute= dp.get_precision('Sale Price')),
40 'base': fields.selection(_price_field_get, 'Based on', required=True, size=-1, help="The mode for computing the price for this rule."),
41 }
42
43product_pricelist_item()
44
45class product_pricelist(osv.osv):
46 _inherit = "product.pricelist"
47
48 def price_get_multi(self, cr, uid, pricelist_ids, products_by_qty_by_partner, context=None):
49
50 def _create_parent_category_list(id, lst):
51 if not id:
52 return []
53 parent = product_category_tree.get(id)
54 if parent:
55 lst.append(parent)
56 return _create_parent_category_list(parent, lst)
57 else:
58 return lst
59 # _create_parent_category_list
60
61 if context is None:
62 context = {}
63
64 date = time.strftime('%Y-%m-%d')
65 if 'date' in context:
66 date = context['date']
67
68 currency_obj = self.pool.get('res.currency')
69 product_obj = self.pool.get('product.product')
70 product_category_obj = self.pool.get('product.category')
71 product_uom_obj = self.pool.get('product.uom')
72 supplierinfo_obj = self.pool.get('product.supplierinfo')
73 price_type_obj = self.pool.get('product.price.type')
74 product_pricelist_version_obj = self.pool.get('product.pricelist.version')
75
76 # product.pricelist.version:
77 if pricelist_ids:
78 pricelist_version_ids = pricelist_ids
79 else:
80 # all pricelists:
81 pricelist_version_ids = self.pool.get('product.pricelist').search(cr, uid, [], context=context)
82
83 pricelist_version_ids = list(set(pricelist_version_ids))
84 plversions_search_args = [
85 ('pricelist_id', 'in', pricelist_version_ids),
86 '|',
87 ('date_start', '=', False),
88 ('date_start', '<=', date),
89 '|',
90 ('date_end', '=', False),
91 ('date_end', '>=', date),
92 ]
93
94 plversion_ids = product_pricelist_version_obj.search(cr, uid, plversions_search_args)
95 if len(pricelist_version_ids) != len(plversion_ids):
96 msg = "At least one pricelist has no active version !\nPlease create or activate one."
97 raise osv.except_osv(_('Warning !'), _(msg))
98
99 # product.product:
100 product_ids = [i[0] for i in products_by_qty_by_partner]
101 #products = dict([(item['id'], item) for item in product_obj.read(cr, uid, product_ids, ['categ_id', 'product_tmpl_id', 'uos_id', 'uom_id'])])
102 products = product_obj.browse(cr, uid, product_ids, context=context)
103 products_dict = dict([(item.id, item) for item in products])
104
105 # product.category:
106 product_category_ids = product_category_obj.search(cr, uid, [])
107 product_categories = product_category_obj.read(cr, uid, product_category_ids, ['parent_id'])
108 product_category_tree = dict([(item['id'], item['parent_id'][0]) for item in product_categories if item['parent_id']])
109
110 results = {}
111 for product_id, qty, partner in products_by_qty_by_partner:
112 for pricelist_id in pricelist_version_ids:
113 price = False
114
115 tmpl_id = products_dict[product_id].product_tmpl_id and products_dict[product_id].product_tmpl_id.id or False
116
117 categ_id = products_dict[product_id].categ_id and products_dict[product_id].categ_id.id or False
118 categ_ids = _create_parent_category_list(categ_id, [categ_id])
119 if categ_ids:
120 categ_where = '(categ_id IN (' + ','.join(map(str, categ_ids)) + '))'
121 else:
122 categ_where = '(categ_id IS NULL)'
123
124 cr.execute(
125 'SELECT i.*, pl.currency_id '
126 'FROM product_pricelist_item AS i, '
127 'product_pricelist_version AS v, product_pricelist AS pl '
128 'WHERE (product_tmpl_id IS NULL OR product_tmpl_id = %s) '
129 'AND (product_id IS NULL OR product_id = %s) '
130 'AND (' + categ_where + ' OR (categ_id IS NULL)) '
131 'AND price_version_id = %s '
132 'AND (min_quantity IS NULL OR min_quantity <= %s) '
133 'AND i.price_version_id = v.id AND v.pricelist_id = pl.id '
134 'ORDER BY sequence',
135 (tmpl_id, product_id, plversion_ids[0], qty))
136 res1 = cr.dictfetchall()
137 uom_price_already_computed = False
138 for res in res1:
139 if res:
140 if res['base'] == -1:
141 if not res['base_pricelist_id']:
142 price = 0.0
143 else:
144 price_tmp = self.price_get(cr, uid,
145 [res['base_pricelist_id']], product_id,
146 qty, context=context)[res['base_pricelist_id']]
147 ptype_src = self.browse(cr, uid, res['base_pricelist_id']).currency_id.id
148 price = currency_obj.compute(cr, uid, ptype_src, res['currency_id'], price_tmp, round=False)
149 elif res['base'] == -2:
150 # this section could be improved by moving the queries outside the loop:
151 where = []
152 if partner:
153 where = [('name', '=', partner) ]
154 sinfo = supplierinfo_obj.search(cr, uid,
155 [('product_id', '=', tmpl_id)] + where)
156 price = 0.0
157 if sinfo:
158 qty_in_product_uom = qty
159 product_default_uom = product_obj.read(cr, uid, [tmpl_id], ['uom_id'])[0]['uom_id'][0]
160 seller_uom = supplierinfo_obj.read(cr, uid, sinfo, ['product_uom'])[0]['product_uom'][0]
161 if seller_uom and product_default_uom and product_default_uom != seller_uom:
162 uom_price_already_computed = True
163 qty_in_product_uom = product_uom_obj._compute_qty(cr, uid, product_default_uom, qty, to_uom_id=seller_uom)
164 cr.execute('SELECT * ' \
165 'FROM pricelist_partnerinfo ' \
166 'WHERE suppinfo_id IN %s' \
167 'AND min_quantity <= %s ' \
168 'ORDER BY min_quantity DESC LIMIT 1', (tuple(sinfo),qty_in_product_uom,))
169 res2 = cr.dictfetchone()
170 if res2:
171 price = res2['price']
172 elif res['base'] == -3:
173 price = res['fixed_price']
174 else:
175 price_type = price_type_obj.browse(cr, uid, int(res['base']))
176 price = currency_obj.compute(cr, uid,
177 price_type.currency_id.id, res['currency_id'],
178 product_obj.price_get(cr, uid, [product_id],
179 price_type.field,context=context)[product_id], round=False, context=context)
180
181 if price:
182 price_limit = price
183
184 price = price * (1.0+(res['price_discount'] or 0.0))
185 price = rounding(price, res['price_round'])
186 price += (res['price_surcharge'] or 0.0)
187 if res['price_min_margin']:
188 price = max(price, price_limit+res['price_min_margin'])
189 if res['price_max_margin']:
190 price = min(price, price_limit+res['price_max_margin'])
191 break
192
193 else:
194 # False means no valid line found ! But we may not raise an
195 # exception here because it breaks the search
196 price = False
197
198 if price:
199 if 'uom' in context and not uom_price_already_computed:
200 product = products_dict[product_id]
201 uom = product.uos_id or product.uom_id
202 price = self.pool.get('product.uom')._compute_price(cr, uid, uom.id, price, context['uom'])
203
204 if results.get(product_id):
205 results[product_id][pricelist_id] = price
206 else:
207 results[product_id] = {pricelist_id: price}
208
209 return results
210
211product_pricelist()
2120
=== removed file 'product_pricelist_fixed_price/pricelist_view.xml'
--- product_pricelist_fixed_price/pricelist_view.xml 2011-04-01 10:14:05 +0000
+++ product_pricelist_fixed_price/pricelist_view.xml 1970-01-01 00:00:00 +0000
@@ -1,76 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<openerp>
3 <data>
4 <record model="ir.ui.view" id="product_pricelist_item_form_view_fixed">
5 <field name="name">product.pricelist.item.form.fixed</field>
6 <field name="model">product.pricelist.item</field>
7 <field name="inherit_id" ref="product.product_pricelist_item_form_view"/>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <field name="price_max_margin" position="after">
11 <field name="fixed_price" colspan="3" attrs="{'readonly': [('base','!=', -3)]}"/>
12 </field>
13 </field>
14 </record>
15
16 <record model="ir.ui.view" id="product_pricelist_item_form_view_price_discount">
17 <field name="name">product.pricelist.item.form.price_discount</field>
18 <field name="model">product.pricelist.item</field>
19 <field name="inherit_id" ref="product.product_pricelist_item_form_view"/>
20 <field name="type">form</field>
21 <field name="arch" type="xml">
22 <field name="price_discount" position="replace">
23 <field name="price_discount" nolabel="1" attrs="{'readonly': [('base','==', -3)]}"/>
24 </field>
25 </field>
26 </record>
27
28 <record model="ir.ui.view" id="product_pricelist_item_form_view_price_surcharge">
29 <field name="name">product.pricelist.item.form.price_surcharge</field>
30 <field name="model">product.pricelist.item</field>
31 <field name="inherit_id" ref="product.product_pricelist_item_form_view"/>
32 <field name="type">form</field>
33 <field name="arch" type="xml">
34 <field name="price_surcharge" position="replace">
35 <field name="price_surcharge" nolabel="1" attrs="{'readonly': [('base','==', -3)]}"/>
36 </field>
37 </field>
38 </record>
39
40 <record model="ir.ui.view" id="product_pricelist_item_form_view_price_round">
41 <field name="name">product.pricelist.item.form.price_round</field>
42 <field name="model">product.pricelist.item</field>
43 <field name="inherit_id" ref="product.product_pricelist_item_form_view"/>
44 <field name="type">form</field>
45 <field name="arch" type="xml">
46 <field name="price_round" position="replace">
47 <field name="price_round" string="Rounding Method" attrs="{'readonly': [('base','==', -3)]}"/>
48 </field>
49 </field>
50 </record>
51
52 <record model="ir.ui.view" id="product_pricelist_item_form_view_price_min_margin">
53 <field name="name">product.pricelist.item.form.price_min_margin</field>
54 <field name="model">product.pricelist.item</field>
55 <field name="inherit_id" ref="product.product_pricelist_item_form_view"/>
56 <field name="type">form</field>
57 <field name="arch" type="xml">
58 <field name="price_min_margin" position="replace">
59 <field name="price_min_margin" string="Min. Margin" attrs="{'readonly': [('base','==', -3)]}"/>
60 </field>
61 </field>
62 </record>
63
64 <record model="ir.ui.view" id="product_pricelist_item_form_view_price_max_margin">
65 <field name="name">product.pricelist.item.form.price_max_margin</field>
66 <field name="model">product.pricelist.item</field>
67 <field name="inherit_id" ref="product.product_pricelist_item_form_view"/>
68 <field name="type">form</field>
69 <field name="arch" type="xml">
70 <field name="price_max_margin" position="replace">
71 <field name="price_max_margin" string="Max. Margin" attrs="{'readonly': [('base','==', -3)]}"/>
72 </field>
73 </field>
74 </record>
75 </data>
76</openerp>
770
=== added directory 'product_pricelist_fixed_price/view'
=== added file 'product_pricelist_fixed_price/view/pricelist_menu.xml'
--- product_pricelist_fixed_price/view/pricelist_menu.xml 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/view/pricelist_menu.xml 2014-02-03 14:58:49 +0000
@@ -0,0 +1,109 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="product_fixedprice_action" model="ir.actions.act_window">
6 <field name="name">Fixed Pricelists</field>
7 <field name="type">ir.actions.act_window</field>
8 <field name="res_model">product.pricelist</field>
9 <field name="view_type">form</field>
10 <field name="domain">[('fixed_price', '=', True)]</field>
11 <field name="context">{'default_fixed_price': True}</field>
12 <field name="view_id" ref="product_fixedprice_tree"/>
13 <field name="help" type="html">
14 <p class="oe_view_nocontent_create">
15 Click to add a pricelist.
16 </p><p>
17 There can be more than one version of a pricelist, each of
18 these must be valid during a certain period of time. Some
19 examples of versions: Main Prices, 2010, 2011, Summer Sales,
20 etc.
21 </p>
22 </field>
23 </record>
24
25 <record
26 id="product_fixedprice_action_tree"
27 model="ir.actions.act_window.view"
28 >
29 <field name="sequence" eval="99"/>
30 <field name="view_mode">tree</field>
31 <field name="view_id" ref="product_fixedprice_tree"/>
32 <field name="act_window_id" ref="product_fixedprice_action"/>
33 </record>
34
35 <record
36 id="product_fixedprice_action_form"
37 model="ir.actions.act_window.view"
38 >
39 <field name="sequence" eval="99"/>
40 <field name="view_mode">form</field>
41 <field name="view_id" ref="product_fixedprice_form"/>
42 <field name="act_window_id" ref="product_fixedprice_action"/>
43 </record>
44
45 <record
46 id="product_fixedprice_version_action"
47 model="ir.actions.act_window"
48 >
49 <field name="name">Fixed Pricelist versions</field>
50 <field name="type">ir.actions.act_window</field>
51 <field name="res_model">product.pricelist.version</field>
52 <field name="view_type">form</field>
53 <field name="domain">[('fixed_price', '=', True)]</field>
54 <field name="context">{'default_fixed_price': True}</field>
55 <field name="view_id" ref="product_fixedprice_version_tree"/>
56 <field name="help" type="html">
57 <p class="oe_view_nocontent_create">
58 Click to add a pricelist version.
59 </p><p>
60 There can be more than one version of a pricelist, each of
61 these must be valid during a certain period of time. Some
62 examples of versions: Main Prices, 2010, 2011, Summer Sales,
63 etc.
64 </p>
65 </field>
66 </record>
67
68 <record
69 id="product_fixedprice_version_action_tree"
70 model="ir.actions.act_window.view"
71 >
72 <field name="sequence" eval="99"/>
73 <field name="view_mode">tree</field>
74 <field name="view_id" ref="product_fixedprice_version_tree"/>
75 <field
76 name="act_window_id"
77 ref="product_fixedprice_version_action"
78 />
79 </record>
80
81 <record
82 id="product_fixedprice_version_action_form"
83 model="ir.actions.act_window.view"
84 >
85 <field name="sequence" eval="99"/>
86 <field name="view_mode">form</field>
87 <field name="view_id" ref="product_fixedprice_version_form"/>
88 <field
89 name="act_window_id"
90 ref="product_fixedprice_version_action"
91 />
92 </record>
93
94 <menuitem
95 id="product_fixedprice_menu"
96 action="product_fixedprice_action"
97 parent="product.menu_product_pricelist_main"
98 sequence="22"
99 />
100
101 <menuitem
102 id="product_fixedprice_version_menu"
103 action="product_fixedprice_version_action"
104 parent="product.menu_product_pricelist_main"
105 sequence="24"
106 />
107
108 </data>
109</openerp>
0110
=== added file 'product_pricelist_fixed_price/view/pricelist_view.xml'
--- product_pricelist_fixed_price/view/pricelist_view.xml 1970-01-01 00:00:00 +0000
+++ product_pricelist_fixed_price/view/pricelist_view.xml 2014-02-03 14:58:49 +0000
@@ -0,0 +1,268 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <!-- Basically this file contains simplified versions of the views
6 for pricelist items, pricelist versions and pricelists.
7 The views contain only the fields needed to add fixed prices.
8 Actually the surcharche field is used for the fixed price, while
9 the discount_factor is set to -1 to eliminate the role of the
10 base price.
11 For fixed prices product_id is (ofcourse?) required.
12 -->
13
14 <!-- Pricelist item -->
15
16 <record id="product_fixedprice_item_tree" model="ir.ui.view">
17 <field name="name">product.fixedprice.item.tree</field>
18 <field name="model">product.pricelist.item</field>
19 <field name="priority">99</field>
20 <field name="arch" type="xml">
21 <tree string="Products Fixed Price Items">
22 <field
23 name="name"
24 invisible="1"
25 />
26 <field
27 name="fixed_price"
28 />
29 <field name="product_id"/>
30 <field
31 name="product_tmpl_id"
32 groups="product.group_product_variant"
33 />
34 <field name="min_quantity"/>
35 <field
36 name="price_surcharge"
37 string="Price"
38 />
39 </tree>
40 </field>
41 </record>
42
43 <record id="product_fixedprice_item_form" model="ir.ui.view">
44 <field name="name">product.fixedprice.item.form</field>
45 <field name="model">product.pricelist.item</field>
46 <field name="priority">99</field>
47 <field name="arch" type="xml">
48 <form string="Products Fixed Price Items" version="7.0">
49 <field
50 name="name"
51 invisible="1"
52 />
53 <field
54 name="price_discount"
55 invisible="1"
56 />
57 <group col="4">
58 <field name="fixed_price" />
59 <field
60 name="product_id"
61 on_change="product_id_change(product_id)"
62 required="1"
63 />
64 <field
65 name="product_tmpl_id"
66 groups="product.group_product_variant"
67 />
68 <field
69 name="company_id"
70 groups="base.group_multi_company"
71 widget="selection"
72 />
73 <field name="min_quantity"/>
74 <field
75 name="price_surcharge"
76 string="Price"
77 />
78 </group>
79 </form>
80 </field>
81 </record>
82
83
84 <!-- Pricelist version -->
85
86 <record id="product_fixedprice_version_tree" model="ir.ui.view">
87 <field name="name">product.fixedprice.version.tree</field>
88 <field name="model">product.pricelist.version</field>
89 <field name="priority">99</field>
90 <field name="arch" type="xml">
91 <tree string="Fixed Pricelist Version">
92 <field
93 name="fixed_price"
94 invisible="1"
95 />
96 <field name="name"/>
97 <field name="pricelist_id"/>
98 <field name="date_start"/>
99 <field name="date_end"/>
100 </tree>
101 </field>
102 </record>
103
104 <record id="product_fixedprice_version_form" model="ir.ui.view">
105 <field name="name">product.fixedprice.version.form</field>
106 <field name="model">product.pricelist.version</field>
107 <field name="priority">99</field>
108 <field name="arch" type="xml">
109 <form string="Fixed Pricelist Version" version="7.0" >
110 <group col="4">
111 <field name="name"/>
112 <field name="active"/>
113 <field
114 colspan="4"
115 name="pricelist_id"
116 domain="[('fixed_price', '=', True),]"
117 />
118 <field name="date_start"/>
119 <field name="date_end"/>
120 <field
121 name="company_id"
122 groups="base.group_multi_company"
123 widget="selection"
124 />
125 <field name="fixed_price" />
126 </group>
127 <p></p>
128 <field
129 name="items_id"
130 context="{
131 'form_view_ref': 'product_pricelist_fixed_price.product_fixedprice_item_form',
132 'tree_view_ref': 'product_pricelist_fixed_price.product_fixedprice_item_tree',
133 'default_fixed_price': True,
134 'default_price_discount': -1,
135 }"
136 />
137 </form>
138 </field>
139 </record>
140
141
142 <!-- Pricelist -->
143
144 <record model="ir.ui.view" id="product_fixedprice_search">
145 <field name="name">product.fixedprice.search</field>
146 <field name="model">product.pricelist</field>
147 <field name="priority">99</field>
148 <field name="arch" type="xml">
149 <search string="Products Fixed Price Search">
150 <field name="name" string="Products Price"/>
151 <field name="type"/>
152 <field name="active" />
153 <field
154 name="currency_id"
155 groups="base.group_multi_currency"
156 />
157 </search>
158 </field>
159 </record>
160
161 <record id="product_fixedprice_tree" model="ir.ui.view">
162 <field name="name">product.fixedprice.tree</field>
163 <field name="model">product.pricelist</field>
164 <field name="priority">99</field>
165 <field name="arch" type="xml">
166 <tree string="Products Fixed Price List">
167 <field name="name"/>
168 <field name="type"/>
169 <field
170 name="currency_id"
171 groups="base.group_multi_currency"
172 />
173 <field name="active" />
174 </tree>
175 </field>
176 </record>
177
178 <record id="product_fixedprice_form" model="ir.ui.view">
179 <field name="name">product.fixedprice.form</field>
180 <field name="model">product.pricelist</field>
181 <field name="priority">99</field>
182 <field name="arch" type="xml">
183 <form string="Products Fixed Price List" version="7.0" >
184 <field name="name"/>
185 <group col="4">
186 <field name="active"/>
187 <field name="type"/>
188 <field
189 name="currency_id"
190 groups="base.group_multi_currency"
191 />
192 <field
193 name="company_id"
194 groups="base.group_multi_company"
195 widget="selection"
196 />
197 </group>
198 <p></p>
199 <field
200 name="version_id"
201 context="{
202 'form_view_ref': 'product_pricelist_fixed_price.product_fixedprice_version_form',
203 'tree_view_ref': 'product_pricelist_fixed_price.product_fixedprice_version_tree',
204 'default_pricelist_id': active_id,
205 'default_fixed_price': True,
206 }"
207 />
208 </form>
209 </field>
210 </record>
211
212 <!-- Add fixed price info to standard tree -->
213 <record id="pricelist_item_tree_inherit" model="ir.ui.view">
214 <field name="name">pricelist.item.tree.inherit</field>
215 <field name="model">product.pricelist.item</field>
216 <field
217 name="inherit_id"
218 ref="product.product_pricelist_item_tree_view"
219 />
220 <field name="arch" type="xml">
221 <field name="base" position="after">
222 <field name="fixed_price" />
223 <field name="price_surcharge" />
224 </field>
225 </field>
226 </record>
227
228 <!-- Add functionality for fixed prices also to standard form -->
229 <record id="pricelist_item_form_inherit" model="ir.ui.view">
230 <field name="name">pricelist.item.form.inherit</field>
231 <field name="model">product.pricelist.item</field>
232 <field
233 name="inherit_id"
234 ref="product.product_pricelist_item_form_view"
235 />
236 <field name="arch" type="xml">
237 <field name="sequence" position="after">
238 <field
239 name="fixed_price"
240 on_change="onchange_fixed_price(fixed_price, context)"
241 attrs="{'invisible':[('product_id','=',False)]}"
242 />
243 </field>
244 <field name="price_discount" position="attributes">
245 <attribute
246 name="attrs">{'readonly':[('fixed_price','=',True)]}
247 </attribute>
248 </field>
249 <field name="price_round" position="attributes">
250 <attribute
251 name="attrs">{'readonly':[('fixed_price','=',True)]}
252 </attribute>
253 </field>
254 <field name="price_min_margin" position="attributes">
255 <attribute
256 name="attrs">{'readonly':[('fixed_price','=',True)]}
257 </attribute>
258 </field>
259 <field name="price_max_margin" position="attributes">
260 <attribute
261 name="attrs">{'readonly':[('fixed_price','=',True)]}
262 </attribute>
263 </field>
264 </field>
265 </record>
266
267 </data>
268</openerp>

Subscribers

People subscribed via source and target branches