Help

1

Replace copy function by inheritance

Avatar
Thomas Grellety

In the sale module there is the copy function :

    def copy(self, cr, uid, id, default=None, context=None):
        if not default:
            default = {}
        default.update({
            'state': 'draft',
            'shipped': False,
            'invoice_ids': [],
            'picking_ids': [],
            'date_confirm': False,
            'name': self.pool.get('ir.sequence').get(cr, uid, 'sale.order'),
        })
    return super(sale_order, self).copy(cr, uid, id, default, context=context)

I've create a new module that inherits the sale.order object and I redefine the copy function by :

    def copy(self, cr, uid, id, default=None, context=None):
        if not context:
            context = {}
        if not default:
            default = {}
        default.update({
            'state': 'draft',
            'shipped': False,
            'invoice_ids': [],
            'picking_ids': [],
            'date_confirm': False,
            'name': self.pool.get('ir.sequence').get(cr, uid, 'sale.order.XXX'),
        })
        return super(sale_order, self).copy(cr, uid, id, default, context=context)

I want to use another sequence for the name but when the copy function is call, the server execute in first the new function and after it executes the old function that replace my new name by the old.

Thanks for your help.

Avatar
Discard
2Answers
2
Avatar
Damián Soriano
Best Answer

The problem is that when you call super() it override the previously setted default variables. Take into account that when you call super().copy() the default values of the dictionary are override by the original copy() function.

Instead of overriding copy() the way you do I would execute the copy function of the super class and then override the fields you want with the write() function. I would do something like this:

def copy(self, cr, uid, id, default=None, context=None):
    ret = super(sale_order, self).copy(cr, uid, id, default, context=context)
    self.write(cr, uid, id, {'name': self.pool.get('ir.sequence').get(cr, uid, 'sale.order.XXX')}, context=context)
    return ret
4Comments
Avatar
Discard
Avatar
Thomas Grellety
-

Thanks for your answer. It works, but it's not what I want. With this code, when I click on the duplicate boutton that's create a new sale order with "SOXXX" in the name and after I replace the name with the function write(). I would like the click on duplicate bouton create a new sale order with my new sequence without to use and increment the basic sequence "SOXXX". I hope you understand my need.

Avatar
Damián Soriano
-

Yes, I undestood your need but the problem is that when you call the function super().copy() you are handing the control to the super class function, which set as default the name with the order sequence 'sale.order'.

You want to violate the Object Oriented encapsulation and here is not possible I think. The only way is not to call the super().copy() function but this would be wrong, since if other module overrides it you may not call it.

The only way I see to handle your requirement is the one I post or you should modify the original copy function.

Avatar
Thomas Grellety
-

Ok, I will use your solution. Thanks for your help.

Avatar
Damián Soriano
-

ok, if you think is correct you may mark it as correct answer so people searching for answers later may know that there is a way to solve this problem....

0
Avatar
Souleymane Male
Best Answer

Hi. I have the same problem, I want to inherit to the function default_get in stock/wizard/stock_partial_picking like this:

class stock_partial_picking(osv.osv):
_inherit = 'stock.partial.picking'

def default_get(self, cr, uid, fields, context=None):
    if context is None: context = {}
    res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
    picking_ids = context.get('active_ids', [])
    active_model = context.get('active_model')

    if not picking_ids or len(picking_ids) != 1:
        # Partial Picking Processing may only be done for one picking at a time
        return res
    assert active_model in ('materialstock.stock.picking.outgoing','materialstock.stock.picking.entry','materialstock.stock.picking.transfert'), 'Bad context propagation'
    picking_id, = picking_ids
    if 'picking_id' in fields:
        res.update(picking_id=picking_id)
    if 'move_ids' in fields:
        picking = self.pool.get('stock.picking').browse(cr, uid, picking_id, context=context)
        moves = [self._partial_move_for(cr, uid, m) for m in picking.move_lines if m.state not in ('done','cancel')]
        res.update(move_ids=moves)
    if 'date' in fields:
        res.update(date=time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
    return res

But it is not work, can you help me please? Thanks

Avatar
Discard