Skip to content

Commit

Permalink
[UPD] Remove view and clean the model
Browse files Browse the repository at this point in the history
No need adding the view and just overriding
one method in the StockMoveSplit class
  • Loading branch information
ehdem committed May 8, 2015
1 parent 0f43908 commit 0441fba
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 198 deletions.
1 change: 0 additions & 1 deletion quantity_warn_on_lot/__openerp__.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
'python': [],
},
'data': [
'views/stock_move_split.xml',
],
'installable': True,
'application': False,
Expand Down
201 changes: 30 additions & 171 deletions quantity_warn_on_lot/models/stock_move_split.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,194 +21,53 @@
##############################################################################
import logging

from openerp.osv import orm
from openerp.osv import orm, osv
from openerp.tools.translate import _

_logger = logging.getLogger(__name__)


class InvalidAmountException(Exception):

"""
InvalidAmountException is raised when there is not enough products.
It contains the product_id, prodlot_id and the actual quantity of
products after a successful update.
"""

def __init__(self, product_id, prodlot_id, quantity):
"""
Create the InvalidAmountException object.
:params product_id: The product in question
:params prodlot_id: The prodlot in question
:params quantity: The quantity of products available
"""
self.product_id = product_id
self.prodlot_id = prodlot_id
self.quantity = quantity


class StockMoveSplit(orm.TransientModel):

"""StockMoveSplit override to handle the amount of available products."""

_inherit = 'stock.move.split'

def get_confirm_view_id(self, cr, uid, context=None):
"""Get the default view id for the confirm view."""
ir_model_data = self.pool.get('ir.model.data')

try:
view_ref = ir_model_data.get_object_reference(
cr, uid, 'quantity_warn_on_lot', 'view_confirm_split'
)
except ValueError as exc:
_logger.debug(exc)
view_ref = None

return view_ref and view_ref[1] or False

def restore_split(self, cr, uid, ids, context=None):
"""Restore the split to where we were before the warning."""
res = {
'type': 'ir.actions.act_window',
'res_model': 'stock.move.split',
'res_id': ids[0],
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
'nodestroy': True,
'context': context,
}

active_id = context.get('active_id')
move = self.pool['stock.move'].browse(cr, uid, active_id)
picking = move.picking_id

picking.message_post(
_("Pressed correct button in the confirmation window")
)

return res

def continue_split(self, cr, uid, ids, context=None):
"""Continue splitting without and silence the warning."""
if context is None:
context = {}

# Adding continue_split to the context will silence
# the check for amount_quantity
context['continue_split'] = True

active_id = context.get('active_id')
move = self.pool['stock.move'].browse(cr, uid, active_id)
picking = move.picking_id

picking.message_post(
_("Pressed continue button in the confirmation window")
)

return self.split_lot(cr, uid, ids, context=context)

def fields_view_get(
self, cr, uid,
view_id=None, view_type='form',
context=None, toolbar=False,
submenu=False
):
"""Override the confirm_view and add a custom message."""
base_func = super(StockMoveSplit, self).fields_view_get
ret = base_func(cr, uid, view_id, view_type, context=context)

view_confirm_id = self.get_confirm_view_id(cr, uid, context)

if view_confirm_id == view_id:
# Edit only the confirm window
message = context.get('warning_message', '')
# Simple and dirty replace {message} by our text
ret['arch'] = ret['arch'].replace('{message}', message)

return ret

def split_lot(self, cr, uid, ids, context=None):
"""
Override the split_lot method and handle errors.
In case the available quantity is below 0, the split
method will raise an InvalidAmountException. This method
catch this error and instead open a new view that requires
confirmation to continue the split or keep editing.
def split(self, cr, uid, ids, move_ids, context=None):
""" To split stock moves into serial numbers
Before returning this method, we have to rollback changes to
be certain that none of the change made before raising the
error will get saved to the database.
:param move_ids: the ID or list of IDs of stock move we want to split
"""
base_func = super(StockMoveSplit, self).split_lot

try:
res = base_func(cr, uid, ids, context=context)
except InvalidAmountException as exc:
# Prevent changes to be saved
cr.rollback()

view_id = self.get_confirm_view_id(cr, uid, context)

message = _(
"The remaining amount of <b>%(product_name)s</b> in the lot "
"<b>%(lot_number)s</b> of the product isn't enough."
"The remaining amount of products in this lot number is "
"<b>%(quantity)d</b>."
"Please correct your sale order"
)

format_dict = {
"product_name": exc.product_id.name,
"lot_number": exc.prodlot_id.name,
"quantity": exc.quantity,
}

context['warning_message'] = message % format_dict

# Call the window
res = {
'type': 'ir.actions.act_window',
'view_id': view_id,
'res_model': 'stock.move.split',
'res_id': ids[0],
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
'nodestroy': True,
'context': context,
}

return res

def split(self, cr, uid, ids, move_ids, context=None):
"""Check for the available stock quantity to be over 0."""
if context is None:
context = {}

base_func = super(StockMoveSplit, self).split
res = base_func(cr, uid, ids, move_ids, context)

move_obj = self.pool.get('stock.move')
uom_obj = self.pool.get('product.uom')
product_obj = self.pool.get('product.product')
for data in self.browse(cr, uid, ids, context=context):
for move in data.line_exist_ids:
sum_in_draft = [
m.product_qty
for m in move.prodlot_id.move_ids
if m.state == 'draft'
]

quantity_rest = (
move.prodlot_id.stock_available - sum(sum_in_draft)
)

if quantity_rest < 0 and not context.get('continue_split'):
raise InvalidAmountException(
move.prodlot_id.product_id,
move.prodlot_id, quantity_rest
)
for move in move_obj.browse(cr, uid, move_ids, context=context):
product_uom = product_obj.browse(
cr, uid, move.product_id.id, context=context).uom_id
if data.use_exist:
lines = [l for l in data.line_exist_ids if l]
else:
lines = [l for l in data.line_ids if l]
total_move_qty = 0.0
for line in lines:
quantity = line.quantity
total_move_qty += quantity
amount_actual = uom_obj._compute_qty_obj(
cr, uid, move.product_uom,
line.prodlot_id.stock_available,
product_uom, context=context)
if (data.location_id.usage == 'internal') and \
(quantity > (amount_actual or 0.0)):
raise osv.except_osv(
_('Insufficient Stock for Serial Number !'),
_('You are moving %.2f %s but only %.2f %s '
'available for this serial number.') %
(total_move_qty, move.product_uom.name,
amount_actual, move.product_uom.name))

return res
26 changes: 0 additions & 26 deletions quantity_warn_on_lot/views/stock_move_split.xml

This file was deleted.

0 comments on commit 0441fba

Please sign in to comment.