Skip to Content
Menu
This question has been flagged
1 Reply
5346 Views

I want to get the value of L and W from PRODUCT. I use the ONCHANGE METHOD for this but it didn't work i don't know why.  I simply add the computation in the existing "onchange_porduct_id". It didn't pass the value from product to purchase. Anyone please help me Thanks in advance..

Product:

Purchase:

Here's my code:

Python:

 def onchange_product_id(self, cr, uid, ids, pricelist_id = False, product_id=False, qty=0.0, uom_id=False,
            partner_id=False, date_order=False, fiscal_position_id=False, date_planned=False,
            name=False, price_unit=False, metric = 0.0, lll=0.00, www=0.00, context=None):
        '''
        values = super(purchase_order_line, self).onchange_product_id(cr, uid, ids, pricelist_id, product_id, qty, uom_id,
                                                                      partner_id, date_order, fiscal_position_id, date_planned,
                                                                      name, price_unit, n, metric_tons, context=context)
        '''
        """
        #onchange handler of product_id.
        """
        if context is None:
            context = {}
 
        res = {'value': {'price_unit': price_unit or 0.0, 'name': name or '', 'product_uom' : uom_id or False}}
        if not product_id:
            return res
 
        product_product = self.pool.get('product.product')
        product_uom = self.pool.get('product.uom')
        res_partner = self.pool.get('res.partner')
        product_supplierinfo = self.pool.get('product.supplierinfo')
        product_pricelist = self.pool.get('product.pricelist')
        account_fiscal_position = self.pool.get('account.fiscal.position')
        account_tax = self.pool.get('account.tax')
 
        # - check for the presence of partner_id and pricelist_id
        #if not partner_id:
        #    raise osv.except_osv(_('No Partner!'), _('Select a partner in purchase order to choose a product.'))
        #if not pricelist_id:
        #    raise osv.except_osv(_('No Pricelist !'), _('Select a price list in the purchase order form before choosing a product.'))
 
        # - determine name and notes based on product in partner lang.
        context_partner = context.copy()
        if partner_id:
            lang = res_partner.browse(cr, uid, partner_id).lang
            context_partner.update( {'lang': lang, 'partner_id': partner_id} )
        product = product_product.browse(cr, uid, product_id, context=context_partner)
        name = product.name
        if product.description_purchase:
            name += '\n' + product.description_purchase
        res['value'].update({'name': name})
 
        # - set a domain on product_uom
        res['domain'] = {'product_uom': [('category_id','=',product.uom_id.category_id.id)]}
        # - check that uom and product uom belong to the same category
        product_uom_po_id = product.uom_po_id.id
        if not uom_id:
            uom_id = product_uom_po_id
 
        if product.uom_id.category_id.id != product_uom.browse(cr, uid, uom_id, context=context).category_id.id:
            if self._check_product_uom_group(cr, uid, context=context):
                res['warning'] = {'title': ('Warning!'), 'message': ('Selected Unit of Measure does not belong to the same category as the product Unit of Measure.')}
            uom_id = product_uom_po_id
 
        res['value'].update({'product_uom': uom_id})
 
        # - determine product_qty and date_planned based on seller info
        if not date_order:
            date_order = fields.date.context_today(self,cr,uid,context=context)
 
 
        supplierinfo = False
        for supplier in product.seller_ids:
            if partner_id and (supplier.name.id == partner_id):
                supplierinfo = supplier
                if supplierinfo.product_uom.id != uom_id:
                    res['warning'] = {'title': _('Warning!'), 'message': _('The selected supplier only sells this product by %s') % supplierinfo.product_uom.name }
                min_qty = product_uom._compute_qty(cr, uid, supplierinfo.product_uom.id, supplierinfo.min_qty, to_uom_id=uom_id)
                if (qty or 0.0) < min_qty: # If the supplier quantity is greater than entered from user, set minimal.
                    if qty:
                        res['warning'] = {'title': _('Warning!'), 'message': _('The selected supplier has a minimal quantity set to %s %s, you should not purchase less.') % (supplierinfo.min_qty, supplierinfo.product_uom.name)}
                    qty = min_qty
        dt = self._get_date_planned(cr, uid, supplierinfo, date_order, context=context).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
        qty = qty or 1.0
        res['value'].update({'date_planned': date_planned or dt})
        if qty:
            res['value'].update({'product_qty': qty})
 
        # - determine price_unit and taxes_id
        if pricelist_id:
            price = product_pricelist.price_get(cr, uid, [pricelist_id],
                    product.id, qty or 1.0, partner_id or False, {'uom': uom_id, 'date': date_order})[pricelist_id]
        else:
            price = product.standard_price
 
        taxes = account_tax.browse(cr, uid, map(lambda x: x.id, product.supplier_taxes_id))
        fpos = fiscal_position_id and account_fiscal_position.browse(cr, uid, fiscal_position_id, context=context) or False
        taxes_ids = account_fiscal_position.map_tax(cr, uid, fpos, taxes)
        res['value'].update({'price_unit': price, 'taxes_id': taxes_ids})
          
        netsvc.Logger().notifyChannel("TESSSSSTTTTmmmmmmmmmmmmmmmmmmmmmmetric    -----      ",netsvc.LOG_INFO, '' +'' + str(metric))  
        '''
        try:
            #netsvc.Logger().notifyChannel("TESSSSSTTTT11111111111111000000000000000000000000000000000AAAA",netsvc.LOG_INFO, '' +'' + str(mmm) + '  ::' + str(qty))
            m = metric / qty
            netsvc.Logger().notifyChannel("TESSSSSTTTTmmmmmmmmmmmmmmmmmmmmmm",netsvc.LOG_INFO, '' +'' + str(m))
        except ZeroDivisionError:
            m = 0.0
        '''
        res['value'].update({'metric_tons2':qty})
        
        netsvc.Logger().notifyChannel("TESSSSSTTTTAAAAAAAAAAAAAAAaa    -----      ",netsvc.LOG_INFO, '' +'' + str(lll))
        netsvc.Logger().notifyChannel("TESSSSSTTTTBBBBBBBBBBBBBBBB    -----      ",netsvc.LOG_INFO, '' +'' + str(www))
        x = 0.00
        s = 0.00
        valss = 0.00
        netsvc.Logger().notifyChannel("TESSSSSTTTTCCCCCCCCCCCC    -----      ",netsvc.LOG_INFO, '' +'' + str())
        if lll > 0:
            netsvc.Logger().notifyChannel("TESSSSSTTTTDDDDDDDDD    -----      ",netsvc.LOG_INFO, '' +'' + str(lll))
            s = lll * www
            netsvc.Logger().notifyChannel("TESSSSSTTTT111111111111    -----      ",netsvc.LOG_INFO, '' +'' + str(s))
            netsvc.Logger().notifyChannel("TESSSSSTTTT222222222222    -----      ",netsvc.LOG_INFO, '' +'' + str(lll))
            netsvc.Logger().notifyChannel("TESSSSSTTTT333333333333    -----      ",netsvc.LOG_INFO, '' +'' + str(www))      
            try:
                valss = s / x
                netsvc.Logger().notifyChannel("TESSSSSTTTT4444444444    -----      ",netsvc.LOG_INFO, '' +'' + str(valss))  
            except ZeroDivisionError:
                s = 0.0
                
        res['value'].update({'ll': lll,
                            'hh': www,
                            'qou': valss,})
        netsvc.Logger().notifyChannel("TESSSSSTTTT555555555    -----      ",netsvc.LOG_INFO, '' +'' + str(res['value']))    
          
        return res

Xml:

 <record id="biz1_purchase_order_line_form" model="ir.ui.view">
        <field name="name">biz1.purchase.order.line.form</field>
        <field name="model">purchase.order.line</field>
        <field name="priority" eval="16"/>
        <field name="inherit_id" ref="purchase.purchase_order_line_form"/>
        <field name="arch" type="xml">
             <xpath expr="//field[@name='product_id']" position="after">
                     <field name = "item_number"/>
                     <field name = "sap_part_number"/>
                    <field name = "rss_l"  on_change = "onchange_rss2(rss_l, rss_w, rss_11,metric_tons,metric_tons2)"/>
                    <field name = "rss_w"  on_change = "onchange_rss2(rss_l, rss_w, rss_11,metric_tons,metric_tons2)"/>
                    <field name = "rss_11"  on_change = "onchange_rss2(rss_l, rss_w, rss_11,metric_tons,metric_tons2)"/> <!-- on_change="onchange_product_id(parent.pricelist_id,product_id,product_qty,product_uom,parent.partner_id,parent.date_order,parent.fiscal_position,date_planned,name,price_unit,rss_l,rss_w,rss_11,context)"/>-->
                    <field name = "rss_li" />
                    <field name = "rss_wi" />
                    <field name = "metric_tons"/>
                    <field name = "production_id"/>
                      <field name = "openerp_part_number"/>
                    <field name = "ll"/>
                    <field name = "hh"/>
                    <field name = "xx"/>
                    <field name = "qou"/>
                    <field name = "metric_tons2" readonly="True" on_change = "onchange_rss2(rss_l, rss_w, rss_11,metric_tons,metric_tons2)"/>
             </xpath>
            

Avatar
Discard

Hi, Can you put xml part from that on_change is called. Means product_id field of sale order line in which you have called on_change from xml.

Best Answer

The result of your super method is stored in "values", but instead you return another variable named "res". Make sure the result of super is in red. Manipulate res througout your method and return it. See if that works.

Avatar
Discard
Author

thanks Ludo for answering every question of mine.. :))

Hehe, no problem. Ever since your questions started having a clear description they have become much easier to answer.