Improve port to new API and fix exceptions error.

Simplify some methods, work with recordset instead of ids when
possible, use @api.one, follow naming guidelines, ...

Also fixes an error introduced in the previous-to-last commit
regarding the custom exceptions.
This commit is contained in:
Leonardo Donelli
2015-08-05 20:03:24 +02:00
parent e1b79001d2
commit d11503bca4
7 changed files with 196 additions and 273 deletions

View File

@@ -71,10 +71,10 @@ Contributors:
* Javier Carrasco <javier.carrasco@eezee-it.com>
""",
'author': "Akretion, Camptocamp, Eezee-it, "
'author': "Akretion, Camptocamp, Eezee-it, MONK Software"
"Odoo Community Association (OCA)",
'website': 'http://www.akretion.com, http://www.camptocamp.com, '
'http://www.eezee-it.com',
'http://www.eezee-it.com, http://www.wearemonk.com',
'license': 'AGPL-3',
'depends': [
'sale',

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Eezee-It
# Copyright 2015 Eezee-It, MONK Software
# Copyright 2013 Camptocamp
# Copyright 2009-2013 Akretion,
# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau,
# Benoît Guillot, Joel Grand-Guillaume
# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -37,20 +37,20 @@ class AccountInvoice(models.Model):
Override when from claim to update the quantity and link to the
claim line.
"""
new_lines = []
inv_line_obj = self.env['account.invoice.line']
claim_line_obj = self.env['claim.line']
# check if is an invoice_line and we are from a claim
if not (self.env.context.get('claim_line_ids') and lines and
lines[0]._name == 'account.invoice.line'):
return super(AccountInvoice, self)._refund_cleanup_lines(lines)
for __, claim_line_id, __ in self.env.context.get('claim_line_ids'):
line = claim_line_obj.browse(claim_line_id)
if not line.refund_line_id:
# start by browsing all the lines so that Odoo will correctly prefetch
line_ids = [l[1] for l in self.env.context['claim_line_ids']]
claim_lines = self.env['claim.line'].browse(line_ids)
new_lines = []
for claim_line in claim_lines:
if not claim_line.refund_line_id:
# For each lines replace quantity and add claim_line_id
inv_line = inv_line_obj.browse(line.invoice_line_id.id)
inv_line = claim_line.invoice_line_id
clean_line = {}
for field_name, field in inv_line._all_columns.iteritems():
column_type = field.column._type
@@ -59,12 +59,10 @@ class AccountInvoice(models.Model):
elif column_type not in ('many2many', 'one2many'):
clean_line[field_name] = inv_line[field_name]
elif field_name == 'invoice_line_tax_id':
tax_list = []
for tax in inv_line[field_name]:
tax_list.append(tax.id)
clean_line[field_name] = [(6, 0, tax_list)]
clean_line['quantity'] = line['product_returned_quantity']
clean_line['claim_line_id'] = [claim_line_id]
tax_ids = inv_line[field_name].ids
clean_line[field_name] = [(6, 0, tax_ids)]
clean_line['quantity'] = claim_line['product_returned_quantity']
clean_line['claim_line_id'] = [claim_line.id]
new_lines.append(clean_line)
if not new_lines:
# TODO use custom states to show button of this wizard or
@@ -91,14 +89,13 @@ class AccountInvoiceLine(models.Model):
@api.model
def create(self, vals):
claim_line_id = False
if vals.get('claim_line_id'):
claim_line_id = vals['claim_line_id']
claim_line_id = vals.get('claim_line_id')
if claim_line_id:
del vals['claim_line_id']
line_id = super(AccountInvoiceLine, self).create(vals)
line = super(AccountInvoiceLine, self).create(vals)
if claim_line_id:
claim_line = self.env['claim.line'].browse(claim_line_id)
claim_line.write({'refund_line_id': line_id.id})
claim_line.refund_line_id = line.id
return line_id
return line

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Eezee-It
# Copyright 2015 Eezee-It, MONK Software
# Copyright 2013 Camptocamp
# Copyright 2009-2013 Akretion,
# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau,
# Benoît Guillot, Joel Grand-Guillaume
# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -26,18 +26,18 @@ import calendar
from datetime import datetime
from dateutil.relativedelta import relativedelta
from openerp.models import models, fields, api, exceptions
from openerp import models, fields, api, exceptions
from openerp.tools.misc import (DEFAULT_SERVER_DATE_FORMAT,
DEFAULT_SERVER_DATETIME_FORMAT)
from openerp.tools.translate import _
class InvoiceNoDate(exceptions.Exception):
class InvoiceNoDate(Exception):
""" Raised when a warranty cannot be computed for a claim line
because the invoice has no date. """
class ProductNoSupplier(exceptions.Exception):
class ProductNoSupplier(Exception):
""" Raised when a warranty cannot be computed for a claim line
because the product has no supplier. """
@@ -86,9 +86,7 @@ class ClaimLine(models.Model):
return super(ClaimLine, self).copy_data(default=std_default)
def get_warranty_return_partner(self):
seller = self.env['product.supplierinfo']
result = seller.get_warranty_return_partner()
return result
return self.env['product.supplierinfo'].get_warranty_return_partner()
name = fields.Char(string='Description', required=True, default=None)
claim_origine = fields.Selection(
@@ -226,11 +224,10 @@ class ClaimLine(models.Model):
date_invoice = datetime.strptime(date_invoice,
DEFAULT_SERVER_DATE_FORMAT)
if claim_type == 'supplier':
suppliers = product.seller_ids
if not suppliers:
try:
warranty_duration = product.seller_ids[0].warranty_duration
except IndexError:
raise ProductNoSupplier
supplier = suppliers[0]
warranty_duration = supplier.warranty_duration
else:
warranty_duration = product.warranty
@@ -248,13 +245,9 @@ class ClaimLine(models.Model):
def set_warranty_limit(self):
claim = self.claim_id
invoice = claim.invoice_id
claim_type = claim.claim_type
claim_date = claim.date
product = self.product_id
try:
values = self._warranty_limit_values(invoice, claim_type, product,
claim_date)
values = self._warranty_limit_values(
claim.invoice_id, claim.claim_type, self.product_id, claim.date)
except InvoiceNoDate:
raise exceptions.Warning(
_('Error'), _('Cannot find any date for invoice. '
@@ -276,19 +269,20 @@ class ClaimLine(models.Model):
line.set_warranty()
return True
@api.returns('stock.location')
def get_destination_location(self, product, warehouse):
"""Compute and return the destination location ID to take
"""
Compute and return the destination location to take
for a return. Always take 'Supplier' one when return type different
from company."""
location_dest_id = warehouse.lot_stock_id.id
if product:
sellers = product.seller_ids
if sellers:
seller = sellers[0]
return_type = seller.warranty_return_partner
if return_type != 'company':
location_dest_id = seller.name.property_stock_supplier.id
return location_dest_id
from company.
"""
location_dest_id = warehouse.lot_stock_id
try:
seller = product.seller_ids[0]
if seller.warranty_return_partner != 'company':
location_dest_id = seller.name.property_stock_supplier
finally:
return location_dest_id
@api.onchange('product_id', 'invoice_line_id')
def _onchange_product_invoice_line(self):
@@ -312,7 +306,7 @@ class ClaimLine(models.Model):
return False
invoice = invoice_line.invoice_id
claim_line_obj = self.env['claim.line']
claim_line_model = self.env['claim.line']
if claim:
claim = self.env['crm.claim'].browse(claim)
@@ -328,7 +322,7 @@ class ClaimLine(models.Model):
values = {}
try:
warranty = claim_line_obj._warranty_limit_values(
warranty = claim_line_model._warranty_limit_values(
invoice, claim_type, product, claim_date)
except (InvoiceNoDate, ProductNoSupplier):
# we don't mind at this point if the warranty can't be
@@ -336,11 +330,9 @@ class ClaimLine(models.Model):
values.update({'guarantee_limit': False, 'warning': False})
else:
values.update(warranty)
warranty_address = claim_line_obj._warranty_return_address_values(
warranty_address = claim_line_model._warranty_return_address_values(
product, company, warehouse)
values.update(warranty_address)
self.update(values)
def _warranty_return_address_values(self, product, company, warehouse):
@@ -368,10 +360,10 @@ class ClaimLine(models.Model):
company.partner_id)
return_address_id = return_address.id
return_type = 'company'
location_dest_id = self.get_destination_location(product, warehouse)
location_dest = self.get_destination_location(product, warehouse)
return {'warranty_return_partner': return_address_id,
'warranty_type': return_type,
'location_dest_id': location_dest_id}
'location_dest_id': location_dest.id}
def set_warranty_return_address(self):
claim = self.claim_id
@@ -383,15 +375,14 @@ class ClaimLine(models.Model):
self.write(values)
return True
@api.multi
@api.one
def set_warranty(self):
""" Calculate warranty limit and address """
for claim_line in self:
if not (claim_line.product_id and claim_line.invoice_line_id):
raise exceptions.Warning(
_('Error'), _('Please set product and invoice.'))
claim_line.set_warranty_limit()
claim_line.set_warranty_return_address()
if not (self.product_id and self.invoice_line_id):
raise exceptions.Warning(
_('Error'), _('Please set product and invoice.'))
self.set_warranty_limit()
self.set_warranty_return_address()
# TODO add the option to split the claim_line in order to manage the same
@@ -408,15 +399,12 @@ class CrmClaim(models.Model):
_('There is no warehouse for the current user\'s company.'))
return wh
@api.multi
@api.one
def name_get(self):
res = []
for claim in self:
code = claim.code and str(claim.code) or ''
res.append((claim.id, '[' + code + '] ' + claim.name))
return res
return (self.id, '[{}] {}'.format(self.code or '', self.name))
def copy_data(self, cr, uid, id, default=None, context=None):
@api.model
def copy_data(self, default=None):
if default is None:
default = {}
std_default = {
@@ -425,8 +413,7 @@ class CrmClaim(models.Model):
'code': self.env['ir.sequence'].get('crm.claim'),
}
std_default.update(default)
return super(CrmClaim, self).copy_data(cr, uid, id, std_default,
context=context)
return super(CrmClaim, self).copy_data(std_default)
claim_type = fields.Selection(
[('customer', 'Customer'),
@@ -495,7 +482,7 @@ class CrmClaim(models.Model):
if create_lines: # happens when the invoice is changed
for invoice_line in invoice_lines:
location_dest_id = claim_line_obj.get_destination_location(
location_dest = claim_line_obj.get_destination_location(
invoice_line.product_id, warehouse)
line = {
'name': invoice_line.name,
@@ -504,7 +491,7 @@ class CrmClaim(models.Model):
'product_id': invoice_line.product_id.id,
'product_returned_quantity': invoice_line.quantity,
'unit_sale_price': invoice_line.price_unit,
'location_dest_id': location_dest_id,
'location_dest_id': location_dest.id,
'state': 'draft',
}
line.update(warranty_values(invoice_line.invoice_id,

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Eezee-It
# Copyright 2015 Eezee-It, MONK Software
# Copyright 2013 Camptocamp
# Copyright 2009-2013 Akretion,
# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau,
# Benoît Guillot, Joel Grand-Guillaume
# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -33,12 +33,8 @@ class StockPicking(models.Model):
@api.model
def create(self, vals):
if ('name' not in vals) or (vals.get('name') == '/'):
sequence_obj = self.env['ir.sequence']
seq_obj_name = self._name
vals['name'] = sequence_obj.get(seq_obj_name)
picking = super(StockPicking, self).create(vals)
return picking
vals['name'] = self.env['ir.sequence'].get(self._name)
return super(StockPicking, self).create(vals)
class StockMove(models.Model):
@@ -54,9 +50,7 @@ class StockMove(models.Model):
"""
move = super(StockMove, self).create(vals)
if vals.get('picking_id'):
picking_obj = self.env['stock.picking']
picking = picking_obj.browse(vals['picking_id'])
picking = self.env['stock.picking'].browse(vals['picking_id'])
if picking.claim_id and picking.picking_type_id.code == 'incoming':
move.write({'state': 'confirmed'})
return move

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Eezee-It
# Copyright 2015 Eezee-It, MONK Software
# Copyright 2013 Camptocamp
# Copyright 2009-2013 Akretion,
# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau,
# Benoît Guillot, Joel Grand-Guillaume
# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -28,24 +28,14 @@ from openerp import models, fields, api
class AccountInvoiceRefund(models.TransientModel):
_inherit = "account.invoice.refund"
def _get_description(self):
context = self.env.context
if context is None:
context = {}
def _default_description(self):
return self.env.context.get('description', '')
description = context.get('description') or ''
return description
description = fields.Char(default=_get_description)
description = fields.Char(default=_default_description)
@api.one
def compute_refund(self, mode='refund'):
context = self.env.context.copy()
if context is None:
context = {}
if context.get('invoice_ids'):
context['active_ids'] = context.get('invoice_ids')
self = self.with_context(context)
invoice_ids = self.env.context.get('invoice_ids', [])
if invoice_ids:
self = self.with_context(active_ids=invoice_ids)
return super(AccountInvoiceRefund, self).compute_refund(mode=mode)

View File

@@ -1,11 +1,11 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Eezee-It
# Copyright 2015 Eezee-It, MONK Software
# Copyright 2013 Camptocamp
# Copyright 2009-2013 Akretion,
# Author: Emmanuel Samyn, Raphaël Valyi, Sébastien Beau,
# Benoît Guillot, Joel Grand-Guillaume
# Benoît Guillot, Joel Grand-Guillaume, Leonardo Donelli
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -24,183 +24,166 @@
import time
from openerp import models, fields, exceptions, api, workflow, _
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT as DT_FORMAT
class ClaimMakePicking(models.TransientModel):
_name = 'claim_make_picking.wizard'
_description = 'Wizard to create pickings from claim lines'
def _get_source_loc(self):
"""Get default source location"""
loc_id = False
context = self.env.context
if context is None:
context = {}
warehouse_obj = self.env['stock.warehouse']
warehouse_id = context.get('warehouse_id')
picking_type = context.get('picking_type')
partner_id = context.get('partner_id')
if picking_type == 'out':
loc_id = warehouse_obj.browse(
warehouse_id).lot_stock_id.id
elif partner_id:
loc_id = self.env['res.partner'].browse(
partner_id).property_stock_customer.id
return loc_id
def _get_common_dest_location_from_line(self, line_ids):
def _get_common_field_from_lines(self, lines, field):
"""
Return the ID of the common location between all lines. If no common
destination was found, return False
Read the supplied field from all the lines.
Lines that do not have the supplied field set are ignored.
If all the remaining lines have the same value for the field,
that value is returned, else False is returned
"""
loc_id = False
line_obj = self.env['claim.line']
line_location = []
field_values = lines.mapped(field)
return field_values[0] if len(field_values) == 1 else False
for line in line_obj.browse(line_ids):
if line.location_dest_id.id not in line_location:
line_location.append(line.location_dest_id.id)
def _get_common_dest_location_from_line(self, lines):
return self._get_common_field_from_lines(
lines, 'location_dest_id.id')
if len(line_location) == 1:
loc_id = line_location[0]
def _get_common_partner_from_line(self, lines):
return self._get_common_field_from_lines(
lines, 'warranty_return_partner.id')
return loc_id
def _default_claim_line_source_location_id(self):
picking_type = self.env.context.get('picking_type')
partner_id = self.env.context.get('partner_id')
warehouse_id = self.env.context.get('warehouse_id')
# Get default destination location
def _get_dest_loc(self):
if picking_type == 'out' and warehouse_id:
return self.env['stock.warehouse'].browse(warehouse_id).lot_stock_id
if partner_id:
partner = self.env['res.partner'].browse(partner_id)
return partner.property_stock_customer
return False
def _default_claim_line_dest_location_id(self):
"""Return the location_id to use as destination.
If it's an outoing shippment: take the customer stock property
If it's an incoming shippment take the location_dest_id common to all
If it's an outoing shipment: take the customer stock property
If it's an incoming shipment take the location_dest_id common to all
lines, or if different, return None.
"""
context = self.env.context
if context is None:
context = {}
loc_id = False
picking_type = context.get('picking_type')
partner_id = context.get('partner_id')
picking_type = self.env.context.get('picking_type')
partner_id = self.env.context.get('partner_id')
if picking_type == 'out' and partner_id:
loc_id = self.env['res.partner'].browse(
partner_id).property_stock_customer.id
elif picking_type == 'in' and partner_id:
return self.env['res.partner'].browse(
partner_id).property_stock_customer
if picking_type == 'in' and partner_id:
# Add the case of return to supplier !
line_ids = self._get_claim_lines()
loc_id = self._get_common_dest_location_from_line(line_ids)
lines = self._default_claim_line_ids()
return self._get_common_dest_location_from_line(lines)
return loc_id
return False
def _get_claim_lines(self):
@api.returns('claim.line')
def _default_claim_line_ids(self):
# TODO use custom states to show buttons of this wizard or not instead
# of raise an error
context = self.env.context
if context is None:
context = {}
line_obj = self.env['claim.line']
if context.get('picking_type') == 'out':
move_field = 'move_out_id'
else:
move_field = 'move_in_id'
good_lines = []
lines = line_obj.search(
[('claim_id', '=', context['active_id'])])
for line in lines:
if not line[move_field] or line[move_field].state == 'cancel':
good_lines.append(line.id)
if not good_lines:
move_field = ('move_out_id'
if self.env.context.get('picking_type') == 'out'
else 'move_in_id')
domain = [
('claim_id', '=', self.env.context['active_id']),
'|', (move_field, '=', False), (move_field+'.state', '=', 'cancel')
]
lines = self.env['claim.line'].search(domain)
if not lines:
raise exceptions.Warning(
_('Error'),
_('A picking has already been created for this claim.'))
return lines
return good_lines
claim_line_source_location = fields.Many2one(
claim_line_source_location_id = fields.Many2one(
'stock.location', string='Source Location', required=True,
default=_get_source_loc,
default=_default_claim_line_source_location_id,
help="Location where the returned products are from.")
claim_line_dest_location = fields.Many2one(
claim_line_dest_location_id = fields.Many2one(
'stock.location', string='Dest. Location', required=True,
default=_get_dest_loc,
default=_default_claim_line_dest_location_id,
help="Location where the system will stock the returned products.")
claim_line_ids = fields.Many2many(
'claim.line',
'claim_line_picking',
'claim_picking_id',
'claim_line_id',
string='Claim lines', default=_get_claim_lines)
string='Claim lines', default=_default_claim_line_ids)
def _get_common_partner_from_line(self, line_ids):
"""
Return the ID of the common partner between all lines. If no common
partner was found, return False
"""
partner_id = False
line_obj = self.env['claim.line']
line_partner = []
for line in line_obj.browse(line_ids):
if (line.warranty_return_partner
and line.warranty_return_partner.id
not in line_partner):
line_partner.append(line.warranty_return_partner.id)
def _get_picking_name(self):
return 'RMA picking {}'.format(
self.env.context.get('picking_type', 'in'))
if len(line_partner) == 1:
partner_id = line_partner[0]
def _get_picking_note(self):
return self._get_picking_name()
return partner_id
def _get_picking_data(self, claim, picking_type, partner_id):
return {
'origin': claim.code,
'picking_type_id': picking_type.id,
'move_type': 'one', # direct
'state': 'draft',
'date': time.strftime(DT_FORMAT),
'partner_id': partner_id,
'invoice_state': "none",
'company_id': claim.company_id.id,
'location_id': self.claim_line_source_location.id,
'location_dest_id': self.claim_line_dest_location.id,
'note': self._get_picking_note(),
'claim_id': claim.id,
}
@api.multi
def action_cancel(self):
return {'type': 'ir.actions.act_window_close'}
def _get_picking_line_data(self, claim, picking, line):
return {
'name': line.product_id.name_template,
'priority': '0',
'date': time.strftime(DT_FORMAT),
'date_expected': time.strftime(DT_FORMAT),
'product_id': line.product_id.id,
'product_uom_qty': line.product_returned_quantity,
'product_uom': line.product_id.product_tmpl_id.uom_id.id,
'partner_id': claim.delivery_address_id.id,
'picking_id': picking.id,
'state': 'draft',
'price_unit': line.unit_sale_price,
'company_id': claim.company_id.id,
'location_id': self.claim_line_source_location.id,
'location_dest_id': self.claim_line_dest_location.id,
'note': self._get_picking_note(),
}
@api.multi
def action_create_picking(self):
picking_obj = self.env['stock.picking']
picking_type_obj = self.env['stock.picking.type']
context = self.env.context
if context is None:
context = {}
view_obj = self.env['ir.ui.view']
name = 'RMA picking out'
if context.get('picking_type') == 'out':
picking_type_code = 'incoming'
write_field = 'move_out_id'
if self.env.context.get('picking_type') == 'out':
picking_type_code = 'outgoing'
write_field = 'move_out_id'
note = 'RMA picking out'
else:
picking_type_code = 'incoming'
write_field = 'move_in_id'
if context.get('picking_type'):
note = 'RMA picking ' + str(context.get('picking_type'))
name = note
picking_type_id = picking_type_obj.search([
destination_id = self.claim_line_dest_location_id.id
picking_type = self.env['stock.picking.type'].search([
('code', '=', picking_type_code),
('default_location_dest_id', '=',
self.claim_line_dest_location.id)], limit=1).id
('default_location_dest_id', '=', destination_id)
], limit=1)
model = 'stock.picking'
view_id = view_obj.search([
('model', '=', model),
('type', '=', 'form')], limit=1).id
claim = self.env['crm.claim'].browse(context['active_id'])
claim = self.env['crm.claim'].browse(self.env.context['active_id'])
partner_id = claim.delivery_address_id.id
claim_lines = self.claim_line_ids
# In case of product return, we don't allow one picking for various
# product if location are different
# or if partner address is different
if context.get('product_return'):
if self.env.context.get('product_return'):
common_dest_loc_id = self._get_common_dest_location_from_line(
claim_lines.ids)
claim_lines)
if not common_dest_loc_id:
raise Warning(
_('Error'),
@@ -209,54 +192,25 @@ class ClaimMakePicking(models.TransientModel):
'same destination location.'))
claim_lines.auto_set_warranty()
common_dest_partner_id = self._get_common_partner_from_line(
claim_lines.ids)
common_dest_partner_id = self._get_common_partner_from_line(
claim_lines)
if not common_dest_partner_id:
raise exceptions.Warning(
_('Error'),
_('A product return cannot be created for various '
'destination addresses, please choose line with a '
'same address.'))
partner_id = common_dest_partner_id
# create picking
picking = picking_obj.create({
'origin': claim.code,
'picking_type_id': picking_type_id,
'move_type': 'one', # direct
'state': 'draft',
'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
'partner_id': partner_id,
'invoice_state': "none",
'company_id': claim.company_id.id,
'location_id': self.claim_line_source_location.id,
'location_dest_id': self.claim_line_dest_location.id,
'note': note,
'claim_id': claim.id,
})
picking = self.env['stock.picking'].create(
self._get_picking_data(claim, picking_type, partner_id))
# Create picking lines
fmt = DEFAULT_SERVER_DATETIME_FORMAT
for line in self.claim_line_ids:
move_id = self.env['stock.move'].create({
'name': line.product_id.name_template,
'priority': '0',
'date': time.strftime(fmt),
'date_expected': time.strftime(fmt),
'product_id': line.product_id.id,
'product_uom_qty': line.product_returned_quantity,
'product_uom': line.product_id.product_tmpl_id.uom_id.id,
'partner_id': partner_id,
'picking_id': picking.id,
'state': 'draft',
'price_unit': line.unit_sale_price,
'company_id': claim.company_id.id,
'location_id': self.claim_line_source_location.id,
'location_dest_id': self.claim_line_dest_location.id,
'note': note}).id
move_id = self.env['stock.move'].create(
self._get_picking_line_data(claim, picking, line))
line.write({write_field: move_id})
wf_service = workflow
@@ -265,16 +219,17 @@ class ClaimMakePicking(models.TransientModel):
wf_service.trg_validate(uid, 'stock.picking',
picking.id, 'button_confirm', cr)
picking.action_assign()
domain = ("[('picking_type_id.code', '=', '%s'), "
"('partner_id', '=', %s)]" % (picking_type_code, partner_id))
domain = [
('picking_type_id.code', '=', picking_type_code),
('partner_id', '=', partner_id)
]
return {
'name': '%s' % name,
'name': self._get_picking_name(),
'view_type': 'form',
'view_mode': 'form',
'view_id': view_id,
'domain': domain,
'res_model': model,
'res_model': 'stock.picking',
'res_id': picking.id,
'type': 'ir.actions.act_window',
}

View File

@@ -14,8 +14,8 @@
<field name="arch" type="xml">
<form string="Select exchange lines to add in picking" version="7.0">
<separator string="Locations" colspan="4"/>
<field name="claim_line_source_location" nolabel="1" />
<field name="claim_line_dest_location" nolabel="1" />
<field name="claim_line_source_location_id" nolabel="1" />
<field name="claim_line_dest_location_id" nolabel="1" />
<separator string="Select lines for picking" colspan="4"/>
<field name="claim_line_ids" nolabel="1" colspan="4"/>
<footer>