0
votes

I have this model:

class fleet_vehicles_services(models.Model):

@api.model
def create(self, vals):
    if vals.get('name', 'Nuevo') == 'Nuevo':
        vals['name'] = self.env['ir.sequence'].next_by_code('fleet.vehicle.log.services') or '/'
    return super(fleet_vehicles_services, self).create(vals)

def _static_location(self):
    return self.env.ref('fleet_stock.location_stock')

_inherit = "fleet.vehicle.log.services"

name = fields.Char('Referencia de Orden', required=True, index=True, copy=False, readonly='True', default='Nuevo')

x_location_src_id = fields.Many2one('stock.location', string=u'Ubicacion Origen de Productos', required=True,
                                   readonly=False, 
                                   help="Location where the system will look for components.")
x_location_dest_id = fields.Many2one('stock.location', string=u'Ubicacion Destino de Productos', required=True,
                                    readonly=False, default=_static_location,
                                    help="Location where the system will look for components.")
product_id = fields.Many2one('product.template', "Producto")
product_uom_qty = fields.Float(string='Quantity', digits=dp.get_precision('Product Unit of Measure'), required=True, default=1.0)
stock_picking = fields.Many2one("stock.picking", "Picking", required=True)
state = fields.Selection(string="Estados", store=True, readonly=True, related="stock_picking.state")

I want to create a stock.picking from it, I already have a method on this class:

@api.multi
def create_picking(self,vals):
    vals = {'x_location_src_id': self, 'x_location_dest_id':self, 'product_id':self, 'product_uom_qty':self}
    res = super(stock_picking, self).create(vals)
    return res

Which I call from view:

<record model='ir.ui.view' id='fleet_vehicle_log_services_form_inherit'>
        <field name='name'>fleet.vehicle.log.services.form</field>
        <field name='model'>fleet.vehicle.log.services</field>
        <field name='inherit_id' ref='fleet.fleet_vehicle_log_services_form'/>
        <field name="priority">90</field>
        <field name='arch' type='xml'>
            <xpath expr="//form//sheet//group[1]" position="before">
                <div class="oe_title">
            <label for="name" class="oe_edit_only" />
            <h1>
                <field name="name" />
            </h1>
            </div>
            </xpath>
            <xpath expr="//form/sheet/group" position="after">
                <group string="Ubicaciones de Productos" col="2">
                </group>
                <group><field name="stock_picking"/></group>
                <group string="Datos del picking">
                    <button name="create_picking" string="Crear Picking" type="object" class="oe_highlight"/>
                        <tree decoration-info="state == 'draft'" decoration-muted="state in ('cancel','done')" decoration-danger="state in ('confirmed','waiting')" string="Products to Consume">
                            <field name="product_id"/>
                            <field name="product_uom_qty"/>
                            <field name="x_location_src_id"/>
                            <field name="x_location_dest_id"/>
                            <field name="state" invisible="1"/>
                        </tree>
                   </group>
            </xpath>
        </field>
    </record>

But every time I try on clicking the button:

Traceback (most recent call last):
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/http.py", line 648, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/http.py", line 685, in dispatch
result = self._call_function(**self.params)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/http.py", line 321, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/service/model.py", line 118, in wrapper
return f(dbname, *args, **kwargs)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/http.py", line 314, in checked_call
result = self.endpoint(*a, **kw)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/http.py", line 964, in __call__
return self.method(*args, **kw)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/http.py", line 514, in response_wrap
response = f(*args, **kw)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/addons/web/controllers/main.py", line 892, in call_button
action = self._call_kw(model, method, args, {})
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/addons/web/controllers/main.py", line 880, in _call_kw
return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/api.py", line 250, in wrapper
return old_api(self, *args, **kwargs)
File "/home/kristian/odoov9/odoo-9.0c-20161106/openerp/api.py", line 354, in old_api
result = method(recs, *args, **kwargs)
File "/home/kristian/odoov9/danisan/fleet_stock/models/fleet_vehicle_services.py", line 218, in create_picking
res = super(stock_picking, self).create(vals)
TypeError: super(type, obj): obj must be an instance or subtype of type

Any ideas about this?

Thanks in advance.

2

2 Answers

1
votes

You don't need super() here, because you want to create another odoo model database record. To do it, use the Environment where all models are registered and call the creation. Also i don't believe that self or self.id are the correct values for the fields in vals.

@api.multi
def create_picking(self):
    self.ensure_one()
    vals = {
        'x_location_src_id': self.x_location_src_id.id,
        'x_location_dest_id': self.x_location_dest_id.id,
        'product_id': self.product_id.id,  # shouldn't be set on stock.picking, products are handled on it's positions (stock.move)
        'product_uom_qty': self.product_uom_qty  # the same as for product_id
    }
    picking = self.env['stock.picking'].create(vals)
    return picking
1
votes

What I noticed so far: create is waiting a vals dictionary with exact values. What is Many2one in real? (Thats why you need to read odoo documentation before starting developing modules) Many2one is just a column in database which stores ID of related model. Because it stores ID it stores Integer value but in your case you are giving it object self which create cant understand. So you must use self.id.

NOTE: In normal model function you can assign value to Many2one field using self, but in case of create when you are giving values dictionary you must specify exact value because odoo wont calculate it for you.

@api.multi
def create_picking(self,vals):
    vals = {
        'x_location_src_id': self.id, 
        'x_location_dest_id': self.id, 
        'product_id': self.id, 
        'product_uom_qty': self.id
    }
    res = super(stock_picking, self).create(vals)
    return res

And last notice: Use PEP8

Code must be easy readable!