diff options
| author | Thibault Delavallée <tde@openerp.com> | 2016-07-28 15:46:13 +0200 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2016-08-01 15:05:33 +0200 |
| commit | 1b4f96cf4067409fa2e526ea8a002ec49007b6f6 (patch) | |
| tree | 426c1f1b0dd6dca4de00eff24afab8d7d60909af /addons | |
| parent | 1aa5bc0fdfa402ac7cccbc3a7203ec5050f6339b (diff) | |
[MIG][IMP] product: migrate and clean product pricelist report
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/product/models/product.py | 19 | ||||
| -rw-r--r-- | addons/product/models/product_pricelist.py | 9 | ||||
| -rw-r--r-- | addons/product/report/product_pricelist.py | 149 | ||||
| -rw-r--r-- | addons/product/report/product_pricelist_templates.xml | 44 | ||||
| -rw-r--r-- | addons/product/report/product_product_templates.xml | 4 | ||||
| -rw-r--r-- | addons/product/report/product_reports.xml | 4 | ||||
| -rw-r--r-- | addons/product/report/product_template_templates.xml | 6 | ||||
| -rw-r--r-- | addons/product/security/product_security.xml | 4 |
8 files changed, 91 insertions, 148 deletions
diff --git a/addons/product/models/product.py b/addons/product/models/product.py index 5a8828c0551..b0e9f7bee86 100644 --- a/addons/product/models/product.py +++ b/addons/product/models/product.py @@ -6,12 +6,12 @@ import time from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT -import odoo.addons.decimal_precision as dp - from odoo import api, fields, models, tools, _ from odoo.exceptions import ValidationError from odoo.osv import expression +import odoo.addons.decimal_precision as dp + class ProductCategory(models.Model): _name = "product.category" @@ -309,11 +309,11 @@ class ProductProduct(models.Model): if self.uom_id and self.uom_po_id and self.uom_id.category_id != self.uom_po_id.category_id: self.uom_po_id = self.uom_id - def create(self, cr, uid, vals, context=None): - ctx = dict(context or {}, create_product_product=True) - product_id = super(ProductProduct, self).create(cr, uid, vals, context=ctx) - self._set_standard_price(cr, uid, [product_id], vals.get('standard_price', 0.0), context=context) - return product_id + @api.model + def create(self, vals): + product = super(ProductProduct, self.with_context(create_product_product=True)).create(vals) + product._set_standard_price(vals.get('standard_price', 0.0)) + return product @api.multi def write(self, values): @@ -534,8 +534,9 @@ class ProductProduct(models.Model): # compatibility to remove after v10 - DEPRECATED - def price_get(self, cr, uid, ids, ptype='list_price', context=None): - return self.browse(cr, uid, ids, context=context).price_compute(ptype) + @api.multi + def price_get(self, ptype='list_price'): + return self.price_compute(ptype) @api.multi def _set_standard_price(self, value): diff --git a/addons/product/models/product_pricelist.py b/addons/product/models/product_pricelist.py index a8756f0edd5..b574858c0b9 100644 --- a/addons/product/models/product_pricelist.py +++ b/addons/product/models/product_pricelist.py @@ -18,12 +18,7 @@ class Pricelist(models.Model): return self.env.user.company_id.currency_id.id def _get_default_item_ids(self): - vals = {} - # ProductPricelistItem = self.pool.get('product.pricelist.item') - # fields_list = ProductPricelistItem._defaults.keys() - # vals = ProductPricelistItem.default_get(cr, uid, fields_list, context=context) - vals['compute_price'] = 'formula' - return [[0, False, vals]] + return [[0, False, {'compute_price': 'formula'}]] name = fields.Char('Pricelist Name', required=True, translate=True) active = fields.Boolean('Active', default=True, help="If unchecked, it will allow you to hide the pricelist without removing it.") @@ -373,7 +368,7 @@ class PricelistItem(models.Model): return True @api.constrains('price_min_margin', 'price_max_margin') - def _check_margin(self, cr, uid, ids, context=None): + def _check_margin(self): if any(item.price_min_margin > item.price_max_margin for item in self): raise ValidationError(_('Error! The minimum margin should be lower than the maximum margin.')) return True diff --git a/addons/product/report/product_pricelist.py b/addons/product/report/product_pricelist.py index b2b8e856965..6b9641e7bb2 100644 --- a/addons/product/report/product_pricelist.py +++ b/addons/product/report/product_pricelist.py @@ -1,105 +1,58 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import time -from openerp.osv import osv -from openerp.report import report_sxw -from openerp.tools import float_round +from odoo import api, models +from odoo.tools import float_round -class product_pricelist(report_sxw.rml_parse): - def __init__(self, cr, uid, name, context): - super(product_pricelist, self).__init__(cr, uid, name, context=context) - self.pricelist=False - self.quantity=[] - self.localcontext.update({ - 'time': time, - 'get_pricelist': self._get_pricelist, - 'get_currency': self._get_currency, - 'get_categories': self._get_categories, - 'get_price': self._get_price, - 'get_titles': self._get_titles, - }) - - def _get_titles(self, form): - lst = [] - vals = {} - qtys = 1 - - for i in range(1,6): - if form['qty'+str(i)]!=0: - vals['qty'+str(qtys)] = str(form['qty'+str(i)]) + ' units' - qtys += 1 - lst.append(vals) - return lst - - def _set_quantity(self, form): - for i in range(1,6): - q = 'qty%d'%i - if form[q] >0 and form[q] not in self.quantity: - self.quantity.append(form[q]) - else: - self.quantity.append(0) - return True - - def _get_pricelist(self, pricelist_id): - pricelist = self.pool.get('product.pricelist').read(self.cr, self.uid, [pricelist_id], ['name'], context=self.localcontext)[0] - return pricelist['name'] - - def _get_currency(self, pricelist_id): - pricelist = self.pool.get('product.pricelist').read(self.cr, self.uid, [pricelist_id], ['currency_id'], context=self.localcontext)[0] - return pricelist['currency_id'][1] +class report_product_pricelist(models.AbstractModel): + _name = 'report.product.report_pricelist' - def _get_categories(self, products, form): - cat_ids=[] - res=[] - self.pricelist = form['price_list'] - self._set_quantity(form) - pro_ids=[] + @api.multi + def render_html(self, data=None): + data = data if data is not None else {} + pricelist = self.env['product.pricelist'].browse(data.get('form', {}).get('price_list', False)) + products = self.env['product.product'].browse(data.get('ids', data.get('active_ids'))) + quantities = self._get_quantity(data) + docargs = { + 'doc_ids': data.get('ids', data.get('active_ids')), + 'doc_model': 'hr.contribution.register', + 'docs': products, + 'data': dict( + data, + pricelist=pricelist, + quantities=quantities, + categories_data=self._get_categories(pricelist, products, quantities) + ), + } + return self.env['report'].render('product.report_pricelist', docargs) + + def _get_quantity(self, data): + return sorted([data['form'][key] for key in data['form'].keys() if key.startswith('qty') and data['form'][key]]) + + def _get_categories(self, pricelist, products, quantities): + categ_data = [] + categories = self.env['product.category'] for product in products: - pro_ids.append(product.id) - if product.categ_id.id not in cat_ids: - cat_ids.append(product.categ_id.id) - - cats = self.pool.get('product.category').name_get(self.cr, self.uid, cat_ids, context=self.localcontext) - if not cats: - return res - for cat in cats: - product_ids=self.pool.get('product.product').search(self.cr, self.uid, [('id', 'in', pro_ids), ('categ_id', '=', cat[0])], context=self.localcontext) - products = [] - for product in self.pool.get('product.product').read(self.cr, self.uid, product_ids, ['name', 'code'], context=self.localcontext): - val = { - 'id':product['id'], - 'name':product['name'], - 'code':product['code'] - } - i = 1 - for qty in self.quantity: - if qty == 0: - val['qty'+str(i)] = 0.0 - else: - val['qty'+str(i)]=self._get_price(self.pricelist, product['id'], qty) - i += 1 - products.append(val) - res.append({'name':cat[1],'products': products}) - return res - - def _get_price(self, pricelist_id, product_id, qty): - sale_price_digits = self.get_digits(dp='Product Price') - pricelist = self.pool.get('product.pricelist').browse(self.cr, self.uid, [pricelist_id], context=self.localcontext)[0] - product = self.pool['product.product'].browse(self.cr, self.uid, product_id, context=self.localcontext) - price = self.pool.get('product.pricelist').get_product_price(self.cr, self.uid, [pricelist_id], product, qty, False, context=self.localcontext) - if price: - price = float_round(price, precision_digits=sale_price_digits) - else: - res = self.pool.get('product.product').read(self.cr, self.uid, [product_id], ['list_price']) - price = float_round(res[0]['list_price'], precision_digits=sale_price_digits) - price = self.formatLang(price, digits=sale_price_digits, currency_obj=pricelist.currency_id) - return price - - -class report_product_pricelist(osv.AbstractModel): - _name = 'report.product.report_pricelist' - _inherit = 'report.abstract_report' - _template = 'product.report_pricelist' - _wrapped_report_class = product_pricelist + categories |= product.categ_id + + for category in categories: + categ_products = products.filtered(lambda product: product.categ_id == category) + prices = {} + for categ_product in categ_products: + prices[categ_product.id] = dict.fromkeys(quantities, 0.0) + for quantity in quantities: + prices[categ_product.id][quantity] = self._get_price(pricelist, categ_product, quantity) + categ_data.append({ + 'category': category, + 'products': categ_products, + 'prices': prices, + }) + return categ_data + + def _get_price(self, pricelist, product, qty): + sale_price_digits = self.env['decimal.precision'].precision_get('Product Price') + price = pricelist.get_product_price(product, qty, False) + if not price: + price = product.list_price + return float_round(price, precision_digits=sale_price_digits) diff --git a/addons/product/report/product_pricelist_templates.xml b/addons/product/report/product_pricelist_templates.xml index 9b990f3c068..59643e7222f 100644 --- a/addons/product/report/product_pricelist_templates.xml +++ b/addons/product/report/product_pricelist_templates.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<openerp> -<data> +<odoo> <template id="report_pricelist"> <t t-call="report.html_container"> <t t-call="report.internal_layout"> @@ -10,15 +9,15 @@ <div class="row mt32 mb32"> <div class="col-xs-3"> <strong>Price List Name</strong>:<br/> - <span t-esc="get_pricelist(data['form']['price_list'])"/> + <span t-esc="data['pricelist'].name"/> </div> <div class="col-xs-3"> <strong>Currency</strong>:<br/> - <span t-esc="get_currency(data['form']['price_list'])"/> + <span t-esc="data['pricelist'].currency_id.name"/> </div> <div class="col-xs-3"> <strong>Print date</strong>:<br/> - <t t-esc="formatLang(time.strftime('%Y-%m-%d'), date=True)"/> + <t t-esc="datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')"/> </div> </div> @@ -28,34 +27,32 @@ <th> <strong>Description</strong> </th> - <t t-foreach="get_titles(data['form'])" t-as="k"> - <th t-if="k.has_key('qty1')"><strong t-esc="k['qty1']"/></th> - <th t-if="k.has_key('qty2')"><strong t-esc="k['qty2']"/></th> - <th t-if="k.has_key('qty3')"><strong t-esc="k['qty3']"/></th> - <th t-if="k.has_key('qty4')"><strong t-esc="k['qty4']"/></th> - <th t-if="k.has_key('qty5')"><strong t-esc="k['qty5']"/></th> + <t t-foreach="data['quantities']" t-as="quantity"> + <th><strong t-esc="'%s units' % quantity"/></th> </t> </tr> </thead> <tbody> - <t t-foreach="get_categories(objects,data['form'])" t-as="c"> + <t t-foreach="data['categories_data']" t-as="categ_data"> <tr> <td colspan="100"> - <strong t-esc="c['name']"/> + <strong t-esc="categ_data['category'].name"/> </td> </tr> - <tr t-foreach="c['products']" t-as="p"> + <tr t-foreach="categ_data['products']" t-as="product"> <td> - <t t-if="p.get('code')"> - [<span t-esc="p['code']"/>] + <t t-if="product.code"> + [<span t-esc="product.code"/>] </t> - <span t-esc="p['name']"/> + <span t-esc="product.name"/> </td> - <td t-if="p.has_key('qty1') and p['qty1']"><strong t-esc="p['qty1']"/></td> - <td t-if="p.has_key('qty2') and p['qty2']"><strong t-esc="p['qty2']"/></td> - <td t-if="p.has_key('qty3') and p['qty3']"><strong t-esc="p['qty3']"/></td> - <td t-if="p.has_key('qty4') and p['qty4']"><strong t-esc="p['qty4']"/></td> - <td t-if="p.has_key('qty5') and p['qty5']"><strong t-esc="p['qty5']"/></td> + <t t-foreach="data['quantities']" t-as="quantity"> + <td><strong t-esc="categ_data['prices'][product.id][quantity]" + t-esc-options="{ + 'widget': 'monetary', + 'display_currency': data['pricelist'].currency_id}"/> + </td> + </t> </tr> </t> </tbody> @@ -64,5 +61,4 @@ </t> </t> </template> -</data> -</openerp> +</odoo> diff --git a/addons/product/report/product_product_templates.xml b/addons/product/report/product_product_templates.xml index 74eb5d473b0..60e11d8d38c 100644 --- a/addons/product/report/product_product_templates.xml +++ b/addons/product/report/product_product_templates.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<openerp> +<odoo> <data> <template id="report_simple_label"> <div class="col-xs-4" style="padding:0;"> @@ -44,4 +44,4 @@ </t> </template> </data> -</openerp>
\ No newline at end of file +</odoo>
\ No newline at end of file diff --git a/addons/product/report/product_reports.xml b/addons/product/report/product_reports.xml index 2a124c8f553..11c802515e8 100644 --- a/addons/product/report/product_reports.xml +++ b/addons/product/report/product_reports.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<openerp> +<odoo> <data> <report id="report_product_label" @@ -26,4 +26,4 @@ file="product.report_pricelist" menu="False"/> </data> -</openerp> +</odoo> diff --git a/addons/product/report/product_template_templates.xml b/addons/product/report/product_template_templates.xml index 84d911dfbc6..b2390ca5140 100644 --- a/addons/product/report/product_template_templates.xml +++ b/addons/product/report/product_template_templates.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<openerp> -<data> +<odoo> <template id="report_producttemplatelabel"> <t t-call="report.html_container"> <div class="page"> @@ -14,5 +13,4 @@ </div> </t> </template> -</data> -</openerp>
\ No newline at end of file +</odoo>
\ No newline at end of file diff --git a/addons/product/security/product_security.xml b/addons/product/security/product_security.xml index 161626d5bdb..9aba121200c 100644 --- a/addons/product/security/product_security.xml +++ b/addons/product/security/product_security.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<openerp> +<odoo> <data noupdate="0"> <record id="group_sale_pricelist" model="res.groups"> @@ -70,4 +70,4 @@ </record> </data> -</openerp> +</odoo> |
