Files
enterprise-addons/mrp_workorder/tests/test_tablet_client_action.py
T

252 lines
15 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from markupsafe import Markup
from odoo import Command
from odoo.addons.mrp_workorder.tests.common import TestMrpWorkorderCommon
from odoo.tests import Form
class TestWorkorderClientActionCommon(TestMrpWorkorderCommon):
@classmethod
def _get_client_action_url(cls, workorder_id):
return f'/odoo/{workorder_id}/action-mrp_workorder.tablet_client_action'
@classmethod
def setUpClass(cls):
super(TestWorkorderClientActionCommon, cls).setUpClass()
cls.user_admin = cls.env.ref('base.user_admin')
cls.user_admin.write({
'name': 'Mitchell Admin',
'email': 'mitchell.admin@example.com'
})
cls.potion = cls.env['product.product'].create({
'name': 'Magic Potion',
'is_storable': True})
cls.ingredient_1 = cls.env['product.product'].create({
'name': 'Magic',
'type': 'consu'})
cls.bom_potion = cls.env['mrp.bom'].create({
'product_tmpl_id': cls.potion.product_tmpl_id.id,
'consumption': 'flexible',
'product_qty': 1.0,
'bom_line_ids': [Command.create({'product_id': cls.ingredient_1.id, 'product_qty': 1})]})
cls.wizard_op_1 = cls.env['mrp.routing.workcenter'].create({
'name': 'Wizarding Operation',
'workcenter_id': cls.workcenter_2.id,
'bom_id': cls.bom_potion.id,
'time_cycle': 12,
'sequence': 1})
cls.wizarding_step_1 = cls.env['quality.point'].create({
'title': 'Gather Magic Step',
'product_ids': [Command.link(cls.potion.id)],
'picking_type_ids': [Command.link(cls.picking_type_manu.id)],
'operation_id': cls.wizard_op_1.id,
'test_type_id': cls.env.ref('quality.test_type_instructions').id,
'sequence': 1,
'note': '<p>Close your eyes and concentrate</p>'})
cls.step_image_html = '<p><img src="/stock/static/description/icon.png"></p>'
cls.wizarding_step_2 = cls.env['quality.point'].create({
'title': 'Cast Magic Step',
'product_ids': [Command.link(cls.potion.id)],
'picking_type_ids': [Command.link(cls.picking_type_manu.id)],
'operation_id': cls.wizard_op_1.id,
'test_type_id': cls.env.ref('quality.test_type_instructions').id,
'sequence': 2,
'note': '<p>Wave your hands in the air like you just do not care! %s</p>' % cls.step_image_html})
# IMPORTANT: These tests need to be at_install because expected behavior is different when plm is installed
# Also, since tours are ONLY allowed in the post_install case, we do a pure python recreation of the flow
# here and only run tours in the corresponding plm module
class TestPickingWorkorderClientActionSuggestImprovement(TestWorkorderClientActionCommon):
def test_add_step(self):
""" Add 2 new steps as instruction in the tablet view via the 'suggest
worksheet improvement' and check that BoM chatter messages are correct:
- One with title + instructions,
- One with NO title or instructions (i.e. check no 'False' values displayed) """
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = self.potion
mo = mo_form.save()
mo.action_confirm()
self.assertEqual(len(mo.workorder_ids.check_ids), 2)
wo = mo.workorder_ids[0]
wo.button_start()
new_step_title = "New Magical Step"
new_step_note = "Do extra magic"
# add step with title + instructions
add_step_form = Form.from_action(self.env, wo.action_add_step())
add_step_form.title = new_step_title
add_step_form.note = new_step_note
add_step = add_step_form.save()
add_step.with_user(self.user_admin).add_check_in_chain()
# add step with NO title or instructions
Form.from_action(self.env, wo.action_add_step())\
.save() \
.with_user(self.user_admin) \
.add_check_in_chain()
messages = mo.bom_id.message_ids
self.assertEqual(len(messages), 2, 'should be 2 messages created on the BoM')
self.assertEqual(messages[0].body, Markup('<p>BoM feedback (%s - %s)<br>New Step suggested by Mitchell Admin</p>') % (mo.name, wo.operation_id.name))
self.assertEqual(messages[1].body, Markup('<p>BoM feedback (%s - %s)<br>New Step suggested by Mitchell Admin<br><b>Title:</b> %s<br><b>Instruction:</b></p><p>%s</p>') % (mo.name, wo.operation_id.name, new_step_title, new_step_note))
def test_remove_step(self):
""" Removes steps in the tablet view via the 'suggest
worksheet improvement' and check that BoM chatter message is correct:
- Existing BoM step with a comment (for why step should be removed),
- Existing BoM step without a comment, i.e. check no 'False' values displayed
- An added step (via 'suggest worksheet improvement'), i.e. check NO activity created about its removal
"""
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = self.potion
mo = mo_form.save()
mo.action_confirm()
self.assertEqual(len(mo.workorder_ids.check_ids), 2)
wo = mo.workorder_ids[0]
wo.button_start()
remove_step_comment = "The magic is already within me"
new_step_title = "Temporary Magical Step"
# remove existing BoM step with a comment
action = wo.action_propose_change('remove_step', wo.check_ids[0].id)
remove_step_form = Form.from_action(self.env, action)
remove_step_form.comment = remove_step_comment
remove_step = remove_step_form.save()
remove_step.with_user(self.user_admin).process()
# add a temporary new step (via suggestion) => remove it
add_step_form = Form.from_action(self.env, wo.action_add_step())
add_step_form.title = new_step_title
add_step = add_step_form.save()
add_step.with_user(self.user_admin).add_check_in_chain()
wo.current_quality_check_id = add_step
# remove existing BoM step without a comment
wo.current_quality_check_id = wo.check_ids[1]
action = wo.action_propose_change('remove_step', wo.check_ids[1].id)
remove_step_form = Form.from_action(self.env, action)
remove_step = remove_step_form.save()
remove_step.with_user(self.user_admin).process()
messages = mo.bom_id.message_ids
self.assertEqual(len(messages), 3, 'should be 3 messages created on the BoM')
self.assertEqual(messages[0].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>Mitchell Admin suggests to delete this instruction</b></p>') % (wo.check_ids[1].title, mo.name, wo.operation_id.name))
self.assertEqual(messages[1].body, Markup('<p>BoM feedback (%s - %s)<br>New Step suggested by Mitchell Admin<br><b>Title:</b> %s</p>') % (mo.name, wo.operation_id.name, new_step_title))
self.assertEqual(messages[2].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>Mitchell Admin suggests to delete this instruction</b><br><b>Reason:</b> %s</p>') % (wo.check_ids[0].title, mo.name, wo.operation_id.name, remove_step_comment))
def test_update_instructions(self):
""" 'Update Instructions' for a step in the tablet view via the 'suggest
worksheet improvement' and check that the BoM chatter messages are correct:
- Existing BoM step with no title provided (i.e. keep original title) + no note + no comment, i.e. check no 'False' values displayed
- Existing BoM step with a title + note + comment
- An added step (via 'suggest worksheet improvement'), i.e. check activity is created for its update"""
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = self.potion
mo = mo_form.save()
mo.action_confirm()
self.assertEqual(len(mo.workorder_ids.check_ids), 2)
wo = mo.workorder_ids[0]
wo.button_start()
original_title = wo.current_quality_check_id.title
updated_title = "Pre-magic Step"
updated_note = "This is the step before magic is done"
update_comment = "This step was inaccurate"
new_step_title = "Extra Magical Step"
new_step_note = "Make it extra magical"
# update existing BoM step with NO title + NO instruction + NO comment
action = wo.action_propose_change('update_step', wo.check_ids[0].id)
update_step_form = Form.from_action(self.env, action)
update_step_form.title = ""
update_step = update_step_form.save()
update_step.with_user(self.user_admin).process()
self.assertEqual(wo.current_quality_check_id.title, original_title, "When no title provided, keep original title")
# update existing BoM step with title + instruction + comment
action = wo.action_propose_change('update_step', wo.check_ids[0].id)
update_step_form = Form.from_action(self.env, action)
update_step_form.title = updated_title
update_step_form.note = updated_note
update_step_form.comment = update_comment
update_step = update_step_form.save()
update_step.with_user(self.user_admin).process()
self.assertEqual(wo.current_quality_check_id.title, updated_title, "Title didn't correctly update")
self.assertEqual(wo.current_quality_check_id.note, Markup("<p>%s</p>" % updated_note), "Instruction didn't correctly update")
# add a new step (via suggestion) => update it
add_step_form = Form.from_action(self.env, wo.action_add_step())
add_step_form.title = new_step_title
add_step = add_step_form.save()
add_step.with_user(self.user_admin).add_check_in_chain()
wo.current_quality_check_id = add_step
action = wo.action_propose_change('update_step', add_step.id)
update_step_form = Form.from_action(self.env, action)
update_step_form.title = ""
update_step_form.note = new_step_note
update_step = update_step_form.save()
update_step.with_user(self.user_admin).process()
self.assertEqual(add_step.note, Markup("<p>%s</p>" % new_step_note), "New step's note should have been updated")
messages = mo.bom_id.message_ids
self.assertEqual(len(messages), 4, 'should be 4 messages created on the BoM')
self.assertEqual(messages[0].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>New Instruction suggested by Mitchell Admin</b><br><b>Instruction:</b></p><p>%s</p>') % (new_step_title, mo.name, wo.operation_id.name, new_step_note))
self.assertEqual(messages[1].body, Markup('<p>BoM feedback (%s - %s)<br>New Step suggested by Mitchell Admin<br><b>Title:</b> %s</p>') % (mo.name, wo.operation_id.name, new_step_title))
self.assertEqual(messages[2].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>New Instruction suggested by Mitchell Admin</b><br><b>Instruction:</b></p><p>%s</p><br><b>Reason:</b> %s<br><b>New Title suggested: %s</b>') % (original_title, mo.name, wo.operation_id.name, updated_note, update_comment, updated_title))
self.assertEqual(messages[3].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>New Instruction suggested by Mitchell Admin</b></p>') % (original_title, mo.name, wo.operation_id.name))
def test_update_instructions_w_images(self):
""" 'Update Instructions' for a step in the tablet view via the 'suggest
worksheet improvement' when images are involved and check that the BoM chatter messages are correct:
- Step with no image + update with an new_image => instruction should be: completely overwritten (only new_image)
- Step with image and text + update only with 'new_text' => instruction should be: 'new_text' + image
- Step with image + update with new_image + 'new_text' => instruction should be: new_image + 'new_text' """
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = self.potion
mo = mo_form.save()
mo.action_confirm()
self.assertEqual(len(mo.workorder_ids.check_ids), 2)
wo = mo.workorder_ids[0]
wo.button_start()
image = Markup(self.step_image_html)
updated_note = "Improved magic instructions"
updated_image = Markup('<p><img src="/mrp/static/description/icon.png"></p>')
# update existing BoM step containing only text instructions with only an image
action = wo.action_propose_change('update_step', wo.check_ids[0].id)
update_step_form = Form.from_action(self.env, action)
update_step_form.note = image
update_step = update_step_form.save()
update_step.with_user(self.user_admin).process()
self.assertEqual(wo.current_quality_check_id.note, image, "Step's note should have been updated to only be the new instruction image")
# update existing BoM step containing text + image instructions with only text
wo.current_quality_check_id = wo.check_ids[1]
action = wo.action_propose_change('update_step', wo.check_ids[1].id)
update_step_form = Form.from_action(self.env, action)
update_step_form.note = updated_note
update_step = update_step_form.save()
update_step.with_user(self.user_admin).process()
self.assertEqual(wo.current_quality_check_id.note, Markup("<p>%s</p>" % updated_note) + image, "Step's note should have been updated to updated text + original image")
# update existing BoM step containing text + image instructions with image + text
action = wo.action_propose_change('update_step', wo.check_ids[1].id)
update_step_form = Form.from_action(self.env, action)
update_step_form.note = updated_image + Markup("<p>%s</p>" % updated_note)
update_step = update_step_form.save()
update_step.with_user(self.user_admin).process()
self.assertEqual(wo.current_quality_check_id.note, updated_image + Markup("<p>%s</p>" % updated_note), "Step's note should have been updated to updated image + updated text")
messages = mo.bom_id.message_ids
self.assertEqual(len(messages), 3, 'should be 3 messages created on the BoM')
self.assertEqual(messages[0].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>New Instruction suggested by Mitchell Admin</b><br><b>Instruction:</b></p>%s<p>%s</p>') % (wo.check_ids[1].title, mo.name, wo.operation_id.name, updated_image, updated_note))
self.assertEqual(messages[1].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>New Instruction suggested by Mitchell Admin</b><br><b>Instruction:</b></p><p>%s</p>') % (wo.check_ids[1].title, mo.name, wo.operation_id.name, updated_note))
self.assertEqual(messages[2].body, Markup('<p>BoM feedback %s (%s - %s)<br><b>New Instruction suggested by Mitchell Admin</b><br><b>Instruction:</b></p>') % (wo.check_ids[0].title, mo.name, wo.operation_id.name) + Markup(self.step_image_html))