从继承的模型,操作按钮 - Odoo v9社区创建库存选择

时间:2017-03-01 20:19:15

标签: python openerp odoo-9

我有这个型号:

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")

我想从中创建一个stock.picking,我已经有了这个类的方法:

@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

我从视图中打电话:

<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>

但每次我尝试点击按钮时:

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

有关于此的任何想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

到目前为止我注意到:create正在等待具有确切值的vals字典。什么是真正的Many2one? (这就是为什么你需要在开始开发模块之前阅读odoo文档)Many2one只是数据库中存储相关模型ID的列。因为它存储了ID,它存储了Integer值,但在你的情况下,你给它self无法理解的对象create。因此,您必须使用self.id

注意:在普通模型函数中,您可以使用self为Many2one字段赋值,但是在创建值时,您必须指定精确值,因为odoo不会为您计算它。

@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

最后一次通知:使用PEP8

代码必须易于阅读!

答案 1 :(得分:1)

此处不需要super(),因为您要创建另一个odoo模型数据库记录。要执行此操作,请使用注册了所有模型的Environment并调用创建。另外,我不认为selfself.idvals中字段的正确值。

@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