2017-03-01 3 views
0

Ich habe dieses Modell:Erstellen Lager von vererbten Modell Kommissionierung, Aktionstaste - Odoo v9 Community

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

Ich möchte ein stock.picking von ihm zu schaffen, ich habe bereits eine Methode dieser Klasse:

@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 

Was ich aus der Sicht nennen:

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

Aber jedes Mal, wenn ich versuche, den Knopf auf klicken:

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 

Irgendwelche Ideen dazu?

Vielen Dank im Voraus.

Antwort

1

Sie brauchen hier nicht super(), weil Sie einen anderen odoo-Modelldatenbankdatensatz erstellen möchten. Verwenden Sie dazu die Environment, in der alle Modelle registriert sind, und rufen Sie die Erstellung auf. Auch glaube ich nicht, dass self oder self.id die richtigen Werte für die Felder in vals sind.

@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 
+0

Ja, das ist der Fehler immer noch da, würde versuchen, wie dieses – NeoVe

+0

Es gibt einen weiteren Fehler, ich werde eine neue Frage offen für das, danken Sie – NeoVe

1

Was ich bisher bemerkt habe: create wartet ein Vals-Wörterbuch mit genauen Werten. Was ist Many2one in Wirklichkeit? (Deshalb müssen Sie die odoo-Dokumentation lesen, bevor Sie Module entwickeln.) Many2one ist nur eine Spalte in der Datenbank, in der die ID des zugehörigen Modells gespeichert ist. Weil es ID speichert, speichert es Integer-Wert, aber in Ihrem Fall geben Sie es Objekt self, die create kann nicht verstehen. Sie müssen also self.id verwenden.

ANMERKUNG: In der normalen Modellfunktion können Sie Many2one Feld mit self Wert zuweisen, aber im Falle von create, wenn Sie Wertwörterbuch geben, müssen Sie genauen Wert angeben, weil odoo es nicht für Sie berechnet.

@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 

Und letzte Hinweis: Verwenden Sie PEP8

-Code muss leicht lesbar sein!

Verwandte Themen