From 4564213d7fd03c6fd4793c72573f1b54f2135044 Mon Sep 17 00:00:00 2001 From: brian10048 Date: Fri, 17 Apr 2020 10:54:06 -0400 Subject: [PATCH 1/8] [ADD] fieldservice_stage_validation --- fieldservice_stage_validation/README.rst | 0 fieldservice_stage_validation/__init__.py | 2 ++ fieldservice_stage_validation/__manifest__.py | 22 +++++++++++++ .../models/__init__.py | 9 +++++ .../models/fsm_equipment.py | 22 +++++++++++++ .../models/fsm_location.py | 22 +++++++++++++ .../models/fsm_order.py | 22 +++++++++++++ .../models/fsm_person.py | 22 +++++++++++++ .../models/fsm_stage.py | 31 ++++++++++++++++++ .../readme/CONFIGURE.rst | 3 ++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 10 ++++++ .../readme/ROADMAP.rst | 2 ++ .../readme/USAGE.rst | 3 ++ .../static/description/icon.png | Bin 0 -> 17808 bytes .../static/description/index.html | 0 .../views/fsm_stage.xml | 17 ++++++++++ 17 files changed, 188 insertions(+) create mode 100644 fieldservice_stage_validation/README.rst create mode 100644 fieldservice_stage_validation/__init__.py create mode 100644 fieldservice_stage_validation/__manifest__.py create mode 100644 fieldservice_stage_validation/models/__init__.py create mode 100644 fieldservice_stage_validation/models/fsm_equipment.py create mode 100644 fieldservice_stage_validation/models/fsm_location.py create mode 100644 fieldservice_stage_validation/models/fsm_order.py create mode 100644 fieldservice_stage_validation/models/fsm_person.py create mode 100644 fieldservice_stage_validation/models/fsm_stage.py create mode 100644 fieldservice_stage_validation/readme/CONFIGURE.rst create mode 100644 fieldservice_stage_validation/readme/CONTRIBUTORS.rst create mode 100644 fieldservice_stage_validation/readme/DESCRIPTION.rst create mode 100644 fieldservice_stage_validation/readme/ROADMAP.rst create mode 100644 fieldservice_stage_validation/readme/USAGE.rst create mode 100644 fieldservice_stage_validation/static/description/icon.png create mode 100644 fieldservice_stage_validation/static/description/index.html create mode 100644 fieldservice_stage_validation/views/fsm_stage.xml diff --git a/fieldservice_stage_validation/README.rst b/fieldservice_stage_validation/README.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fieldservice_stage_validation/__init__.py b/fieldservice_stage_validation/__init__.py new file mode 100644 index 0000000000..2acc0e96c4 --- /dev/null +++ b/fieldservice_stage_validation/__init__.py @@ -0,0 +1,2 @@ +# Copyright (C) 2020 Brian McMaster +from . import models diff --git a/fieldservice_stage_validation/__manifest__.py b/fieldservice_stage_validation/__manifest__.py new file mode 100644 index 0000000000..469fe6f0ce --- /dev/null +++ b/fieldservice_stage_validation/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + 'name': 'FSM Stage Validation', + 'summary': 'Validate input data when reaching a Field Service stage', + 'version': '12.0.0.1.0', + 'category': 'Field Service', + 'author': 'Brian McMaster, Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/field-service', + 'depends': [ + 'fieldservice', + ], + 'data': [ + 'views/fsm_stage.xml', + ], + 'license': 'AGPL-3', + 'development_status': 'Beta', + 'maintainers': [ + 'brian10048', + 'max3903', + ], +} diff --git a/fieldservice_stage_validation/models/__init__.py b/fieldservice_stage_validation/models/__init__.py new file mode 100644 index 0000000000..3afd424292 --- /dev/null +++ b/fieldservice_stage_validation/models/__init__.py @@ -0,0 +1,9 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import ( + fsm_stage, + fsm_order, + fsm_equipment, + fsm_location, + fsm_person, +) diff --git a/fieldservice_stage_validation/models/fsm_equipment.py b/fieldservice_stage_validation/models/fsm_equipment.py new file mode 100644 index 0000000000..14beb0b8fc --- /dev/null +++ b/fieldservice_stage_validation/models/fsm_equipment.py @@ -0,0 +1,22 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class FSMEquipment(models.Model): + _inherit = 'fsm.equipment' + + @api.constrains('stage_id') + def _validate_stage_fields(self): + for rec in self: + stage = rec.stage_id + field_ids = stage.validate_field_ids + field_names = [x.name for x in field_ids] + values = rec.read(field_names) + + for name in field_names: + if values[0][name] == False: + raise ValidationError(_('Cannot move to stage "%s" ' \ + 'until the "%s" field is set.' + % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_location.py b/fieldservice_stage_validation/models/fsm_location.py new file mode 100644 index 0000000000..208f0cfc5f --- /dev/null +++ b/fieldservice_stage_validation/models/fsm_location.py @@ -0,0 +1,22 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class FSMLocation(models.Model): + _inherit = 'fsm.location' + + @api.constrains('stage_id') + def _validate_stage_fields(self): + for rec in self: + stage = rec.stage_id + field_ids = stage.validate_field_ids + field_names = [x.name for x in field_ids] + values = rec.read(field_names) + + for name in field_names: + if values[0][name] == False: + raise ValidationError(_('Cannot move to stage "%s" ' \ + 'until the "%s" field is set.' + % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_order.py b/fieldservice_stage_validation/models/fsm_order.py new file mode 100644 index 0000000000..4b2861789a --- /dev/null +++ b/fieldservice_stage_validation/models/fsm_order.py @@ -0,0 +1,22 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class FSMOrder(models.Model): + _inherit = 'fsm.order' + + @api.constrains('stage_id') + def _validate_stage_fields(self): + for rec in self: + stage = rec.stage_id + field_ids = stage.validate_field_ids + field_names = [x.name for x in field_ids] + values = rec.read(field_names) + + for name in field_names: + if values[0][name] == False: + raise ValidationError(_('Cannot move to stage "%s" ' \ + 'until the "%s" field is set.' + % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_person.py b/fieldservice_stage_validation/models/fsm_person.py new file mode 100644 index 0000000000..12565ee542 --- /dev/null +++ b/fieldservice_stage_validation/models/fsm_person.py @@ -0,0 +1,22 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class FSMPerson(models.Model): + _inherit = 'fsm.person' + + @api.constrains('stage_id') + def _validate_stage_fields(self): + for rec in self: + stage = rec.stage_id + field_ids = stage.validate_field_ids + field_names = [x.name for x in field_ids] + values = rec.read(field_names) + + for name in field_names: + if values[0][name] == False: + raise ValidationError(_('Cannot move to stage "%s" ' \ + 'until the "%s" field is set.' + % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_stage.py b/fieldservice_stage_validation/models/fsm_stage.py new file mode 100644 index 0000000000..7f0ba54d60 --- /dev/null +++ b/fieldservice_stage_validation/models/fsm_stage.py @@ -0,0 +1,31 @@ +# Copyright (C) 2020 Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class FSMStage(models.Model): + _inherit = 'fsm.stage' + + @api.depends('stage_type') + def _compute_stage_model(self): + model_id = False + Model = self.env['ir.model'] + for rec in self: + if rec.stage_type: + model_string = 'fsm.' + rec.stage_type + model_id = Model.search( + [('model', '=', model_string)], limit=1).id + rec.stage_type_model_id = model_id + + validate_field_ids = fields.Many2many( + 'ir.model.fields', + string='Fields to Validate', + help='Select fields which must be set on the document in this stage', + ) + + stage_type_model_id = fields.Many2one( + 'ir.model', + compute=_compute_stage_model, + string='Model for Stage', + help='Technical field to hold model type', + ) diff --git a/fieldservice_stage_validation/readme/CONFIGURE.rst b/fieldservice_stage_validation/readme/CONFIGURE.rst new file mode 100644 index 0000000000..6a65fe20d3 --- /dev/null +++ b/fieldservice_stage_validation/readme/CONFIGURE.rst @@ -0,0 +1,3 @@ +* Go to Field Service > Configuration > Stages +* Create or select a stage +* Select one or more fields to be validated diff --git a/fieldservice_stage_validation/readme/CONTRIBUTORS.rst b/fieldservice_stage_validation/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..39ef3fa3d7 --- /dev/null +++ b/fieldservice_stage_validation/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Brian McMaster diff --git a/fieldservice_stage_validation/readme/DESCRIPTION.rst b/fieldservice_stage_validation/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..b1b881b644 --- /dev/null +++ b/fieldservice_stage_validation/readme/DESCRIPTION.rst @@ -0,0 +1,10 @@ +As the stage of a field service document progresses, it may be important for +specific fields of the document be completed. + +For example, when a field service order enters the 'Complete' stage, the +fields for 'Actual End Date' and/or 'Resolution Notes' should be set. + +This module allows you to raise a Validation Error if the designated fields +are not set when moving to a new stage. Since stages can be used for field +service orders, workers, locations, or equipments, this logic is available +to be applied to each document type. diff --git a/fieldservice_stage_validation/readme/ROADMAP.rst b/fieldservice_stage_validation/readme/ROADMAP.rst new file mode 100644 index 0000000000..f607015959 --- /dev/null +++ b/fieldservice_stage_validation/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +The roadmap of the Field Service application is documented on +`Github `_. diff --git a/fieldservice_stage_validation/readme/USAGE.rst b/fieldservice_stage_validation/readme/USAGE.rst new file mode 100644 index 0000000000..68abde94a1 --- /dev/null +++ b/fieldservice_stage_validation/readme/USAGE.rst @@ -0,0 +1,3 @@ +*Follow steps outlined in Configuration. +*User will receive validation error if a field is not set when +attempting to move to a new stage. diff --git a/fieldservice_stage_validation/static/description/icon.png b/fieldservice_stage_validation/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..955674d8f0b8c47de3ffa9db25cb109fbe4a1091 GIT binary patch literal 17808 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 literal 0 HcmV?d00001 diff --git a/fieldservice_stage_validation/static/description/index.html b/fieldservice_stage_validation/static/description/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fieldservice_stage_validation/views/fsm_stage.xml b/fieldservice_stage_validation/views/fsm_stage.xml new file mode 100644 index 0000000000..c8e69148ba --- /dev/null +++ b/fieldservice_stage_validation/views/fsm_stage.xml @@ -0,0 +1,17 @@ + + + + fsm.stage.validation.form + fsm.stage + + + + + + + + + + From b7c7a6bea76aa9affa684d1835360306a96adf71 Mon Sep 17 00:00:00 2001 From: brian10048 Date: Fri, 19 Jun 2020 15:29:38 -0400 Subject: [PATCH 2/8] [FIX] fieldservice_stage_validation Travis and miscellaneous errors --- fieldservice_stage_validation/README.rst | 113 +++++ .../i18n/fieldservice_stage_validation.pot | 69 +++ .../models/fsm_equipment.py | 4 +- .../models/fsm_location.py | 4 +- .../models/fsm_order.py | 4 +- .../models/fsm_person.py | 4 +- .../readme/USAGE.rst | 6 +- .../static/description/index.html | 452 ++++++++++++++++++ 8 files changed, 645 insertions(+), 11 deletions(-) create mode 100644 fieldservice_stage_validation/i18n/fieldservice_stage_validation.pot diff --git a/fieldservice_stage_validation/README.rst b/fieldservice_stage_validation/README.rst index e69de29bb2..e1deec3161 100644 --- a/fieldservice_stage_validation/README.rst +++ b/fieldservice_stage_validation/README.rst @@ -0,0 +1,113 @@ +==================== +FSM Stage Validation +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github + :target: https://github.com/OCA/field-service/tree/12.0/fieldservice_stage_validation + :alt: OCA/field-service +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_stage_validation + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/264/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +As the stage of a field service document progresses, it may be important for +specific fields of the document be completed. + +For example, when a field service order enters the 'Complete' stage, the +fields for 'Actual End Date' and/or 'Resolution Notes' should be set. + +This module allows you to raise a Validation Error if the designated fields +are not set when moving to a new stage. Since stages can be used for field +service orders, workers, locations, or equipments, this logic is available +to be applied to each document type. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +* Go to Field Service > Configuration > Stages +* Create or select a stage +* Select one or more fields to be validated + +Usage +===== + +* Follow steps outlined in Configuration. +* User will receive validation error if a field is not set when + attempting to move to a new stage. + +Known issues / Roadmap +====================== + +The roadmap of the Field Service application is documented on +`Github `_. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Brian McMaster + +Contributors +~~~~~~~~~~~~ + +* Brian McMaster + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-brian10048| image:: https://github.com/brian10048.png?size=40px + :target: https://github.com/brian10048 + :alt: brian10048 +.. |maintainer-max3903| image:: https://github.com/max3903.png?size=40px + :target: https://github.com/max3903 + :alt: max3903 + +Current `maintainers `__: + +|maintainer-brian10048| |maintainer-max3903| + +This module is part of the `OCA/field-service `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fieldservice_stage_validation/i18n/fieldservice_stage_validation.pot b/fieldservice_stage_validation/i18n/fieldservice_stage_validation.pot new file mode 100644 index 0000000000..441bcba59b --- /dev/null +++ b/fieldservice_stage_validation/i18n/fieldservice_stage_validation.pot @@ -0,0 +1,69 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_stage_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: fieldservice_stage_validation +#: code:addons/fieldservice_stage_validation/models/fsm_equipment.py:22 +#: code:addons/fieldservice_stage_validation/models/fsm_location.py:22 +#: code:addons/fieldservice_stage_validation/models/fsm_order.py:22 +#: code:addons/fieldservice_stage_validation/models/fsm_person.py:22 +#, python-format +msgid "Cannot move to stage \"%s\" until the \"%s\" field is set." +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_location +msgid "Field Service Location" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_order +msgid "Field Service Order" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_stage +msgid "Field Service Stage" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_person +msgid "Field Service Worker" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,field_description:fieldservice_stage_validation.field_fsm_stage__validate_field_ids +msgid "Fields to Validate" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,field_description:fieldservice_stage_validation.field_fsm_stage__stage_type_model_id +msgid "Model for Stage" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,help:fieldservice_stage_validation.field_fsm_stage__validate_field_ids +msgid "Select fields which must be set on the document in this stage" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,help:fieldservice_stage_validation.field_fsm_stage__stage_type_model_id +msgid "Technical field to hold model type" +msgstr "" + diff --git a/fieldservice_stage_validation/models/fsm_equipment.py b/fieldservice_stage_validation/models/fsm_equipment.py index 14beb0b8fc..87be00f34c 100644 --- a/fieldservice_stage_validation/models/fsm_equipment.py +++ b/fieldservice_stage_validation/models/fsm_equipment.py @@ -16,7 +16,7 @@ def _validate_stage_fields(self): values = rec.read(field_names) for name in field_names: - if values[0][name] == False: - raise ValidationError(_('Cannot move to stage "%s" ' \ + if not values[0][name]: + raise ValidationError(_('Cannot move to stage "%s" ' 'until the "%s" field is set.' % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_location.py b/fieldservice_stage_validation/models/fsm_location.py index 208f0cfc5f..6d55316ef2 100644 --- a/fieldservice_stage_validation/models/fsm_location.py +++ b/fieldservice_stage_validation/models/fsm_location.py @@ -16,7 +16,7 @@ def _validate_stage_fields(self): values = rec.read(field_names) for name in field_names: - if values[0][name] == False: - raise ValidationError(_('Cannot move to stage "%s" ' \ + if not values[0][name]: + raise ValidationError(_('Cannot move to stage "%s" ' 'until the "%s" field is set.' % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_order.py b/fieldservice_stage_validation/models/fsm_order.py index 4b2861789a..6aea0ee4ae 100644 --- a/fieldservice_stage_validation/models/fsm_order.py +++ b/fieldservice_stage_validation/models/fsm_order.py @@ -16,7 +16,7 @@ def _validate_stage_fields(self): values = rec.read(field_names) for name in field_names: - if values[0][name] == False: - raise ValidationError(_('Cannot move to stage "%s" ' \ + if not values[0][name]: + raise ValidationError(_('Cannot move to stage "%s" ' 'until the "%s" field is set.' % (stage.name, name))) diff --git a/fieldservice_stage_validation/models/fsm_person.py b/fieldservice_stage_validation/models/fsm_person.py index 12565ee542..8d369cffe0 100644 --- a/fieldservice_stage_validation/models/fsm_person.py +++ b/fieldservice_stage_validation/models/fsm_person.py @@ -16,7 +16,7 @@ def _validate_stage_fields(self): values = rec.read(field_names) for name in field_names: - if values[0][name] == False: - raise ValidationError(_('Cannot move to stage "%s" ' \ + if not values[0][name]: + raise ValidationError(_('Cannot move to stage "%s" ' 'until the "%s" field is set.' % (stage.name, name))) diff --git a/fieldservice_stage_validation/readme/USAGE.rst b/fieldservice_stage_validation/readme/USAGE.rst index 68abde94a1..19d952495a 100644 --- a/fieldservice_stage_validation/readme/USAGE.rst +++ b/fieldservice_stage_validation/readme/USAGE.rst @@ -1,3 +1,3 @@ -*Follow steps outlined in Configuration. -*User will receive validation error if a field is not set when -attempting to move to a new stage. +* Follow steps outlined in Configuration. +* User will receive validation error if a field is not set when + attempting to move to a new stage. diff --git a/fieldservice_stage_validation/static/description/index.html b/fieldservice_stage_validation/static/description/index.html index e69de29bb2..70f7a4451f 100644 --- a/fieldservice_stage_validation/static/description/index.html +++ b/fieldservice_stage_validation/static/description/index.html @@ -0,0 +1,452 @@ + + + + + + +FSM Stage Validation + + + +
+

FSM Stage Validation

+ + +

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

+

As the stage of a field service document progresses, it may be important for +specific fields of the document be completed.

+

For example, when a field service order enters the ???Complete??? stage, the +fields for ???Actual End Date??? and/or ???Resolution Notes??? should be set.

+

This module allows you to raise a Validation Error if the designated fields +are not set when moving to a new stage. Since stages can be used for field +service orders, workers, locations, or equipments, this logic is available +to be applied to each document type.

+

Table of contents

+ +
+

Configuration

+
    +
  • Go to Field Service > Configuration > Stages
  • +
  • Create or select a stage
  • +
  • Select one or more fields to be validated
  • +
+
+
+

Usage

+
    +
  • Follow steps outlined in Configuration.
  • +
  • User will receive validation error if a field is not set when +attempting to move to a new stage.
  • +
+
+
+

Known issues / Roadmap

+

The roadmap of the Field Service application is documented on +Github.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Brian McMaster
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainers:

+

brian10048 max3903

+

This module is part of the OCA/field-service project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 5f34ac664c29c5abe4c1ba0163703feda75eb0f4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 28 Jun 2020 21:29:36 +0000 Subject: [PATCH 3/8] fieldservice_stage_validation 12.0.0.2.0 --- fieldservice_stage_validation/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fieldservice_stage_validation/__manifest__.py b/fieldservice_stage_validation/__manifest__.py index 469fe6f0ce..d609c59b79 100644 --- a/fieldservice_stage_validation/__manifest__.py +++ b/fieldservice_stage_validation/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'FSM Stage Validation', 'summary': 'Validate input data when reaching a Field Service stage', - 'version': '12.0.0.1.0', + 'version': '12.0.0.2.0', 'category': 'Field Service', 'author': 'Brian McMaster, Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/field-service', From a0eee5f16192f0792004f32bdfb5ac34b5ee061f Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 1 Jul 2020 22:06:27 +0000 Subject: [PATCH 4/8] Added translation using Weblate (Portuguese (Portugal)) --- fieldservice_stage_validation/i18n/pt_PT.po | 69 +++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 fieldservice_stage_validation/i18n/pt_PT.po diff --git a/fieldservice_stage_validation/i18n/pt_PT.po b/fieldservice_stage_validation/i18n/pt_PT.po new file mode 100644 index 0000000000..c9e7ff18a6 --- /dev/null +++ b/fieldservice_stage_validation/i18n/pt_PT.po @@ -0,0 +1,69 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fieldservice_stage_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: fieldservice_stage_validation +#: code:addons/fieldservice_stage_validation/models/fsm_equipment.py:22 +#: code:addons/fieldservice_stage_validation/models/fsm_location.py:22 +#: code:addons/fieldservice_stage_validation/models/fsm_order.py:22 +#: code:addons/fieldservice_stage_validation/models/fsm_person.py:22 +#, python-format +msgid "Cannot move to stage \"%s\" until the \"%s\" field is set." +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_equipment +msgid "Field Service Equipment" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_location +msgid "Field Service Location" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_order +msgid "Field Service Order" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_stage +msgid "Field Service Stage" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model,name:fieldservice_stage_validation.model_fsm_person +msgid "Field Service Worker" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,field_description:fieldservice_stage_validation.field_fsm_stage__validate_field_ids +msgid "Fields to Validate" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,field_description:fieldservice_stage_validation.field_fsm_stage__stage_type_model_id +msgid "Model for Stage" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,help:fieldservice_stage_validation.field_fsm_stage__validate_field_ids +msgid "Select fields which must be set on the document in this stage" +msgstr "" + +#. module: fieldservice_stage_validation +#: model:ir.model.fields,help:fieldservice_stage_validation.field_fsm_stage__stage_type_model_id +msgid "Technical field to hold model type" +msgstr "" From 0e74d03ff6b3eafafd3696b24f1097886c523327 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 1 Jul 2020 22:07:18 +0000 Subject: [PATCH 5/8] Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (10 of 10 strings) Translation: field-service-12.0/field-service-12.0-fieldservice_stage_validation Translate-URL: https://translation.odoo-community.org/projects/field-service-12-0/field-service-12-0-fieldservice_stage_validation/pt_PT/ --- fieldservice_stage_validation/i18n/pt_PT.po | 22 ++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/fieldservice_stage_validation/i18n/pt_PT.po b/fieldservice_stage_validation/i18n/pt_PT.po index c9e7ff18a6..822124843a 100644 --- a/fieldservice_stage_validation/i18n/pt_PT.po +++ b/fieldservice_stage_validation/i18n/pt_PT.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2020-07-02 00:19+0000\n" +"Last-Translator: Daniel Reis \n" "Language-Team: none\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.10\n" #. module: fieldservice_stage_validation #: code:addons/fieldservice_stage_validation/models/fsm_equipment.py:22 @@ -22,48 +24,50 @@ msgstr "" #, python-format msgid "Cannot move to stage \"%s\" until the \"%s\" field is set." msgstr "" +"N??o pode mudar para etapa \"%s\" enquanto o campo \"%s\" n??o for definido." #. module: fieldservice_stage_validation #: model:ir.model,name:fieldservice_stage_validation.model_fsm_equipment msgid "Field Service Equipment" -msgstr "" +msgstr "Equipamento de Servi??o de Campo" #. module: fieldservice_stage_validation #: model:ir.model,name:fieldservice_stage_validation.model_fsm_location msgid "Field Service Location" -msgstr "" +msgstr "Localiza????o de Servi??o de Campo" #. module: fieldservice_stage_validation #: model:ir.model,name:fieldservice_stage_validation.model_fsm_order msgid "Field Service Order" -msgstr "" +msgstr "Ordem de Servi??o de Campo" #. module: fieldservice_stage_validation #: model:ir.model,name:fieldservice_stage_validation.model_fsm_stage msgid "Field Service Stage" -msgstr "" +msgstr "Etapa de Servi??o de Campo" #. module: fieldservice_stage_validation #: model:ir.model,name:fieldservice_stage_validation.model_fsm_person msgid "Field Service Worker" -msgstr "" +msgstr "Trabalhador de Servi??o de Campo" #. module: fieldservice_stage_validation #: model:ir.model.fields,field_description:fieldservice_stage_validation.field_fsm_stage__validate_field_ids msgid "Fields to Validate" -msgstr "" +msgstr "Campos a Validar" #. module: fieldservice_stage_validation #: model:ir.model.fields,field_description:fieldservice_stage_validation.field_fsm_stage__stage_type_model_id msgid "Model for Stage" -msgstr "" +msgstr "Modelo para Etapa" #. module: fieldservice_stage_validation #: model:ir.model.fields,help:fieldservice_stage_validation.field_fsm_stage__validate_field_ids msgid "Select fields which must be set on the document in this stage" msgstr "" +"Selecione os campos que devem estar preenchidos no documento nesta Etapa" #. module: fieldservice_stage_validation #: model:ir.model.fields,help:fieldservice_stage_validation.field_fsm_stage__stage_type_model_id msgid "Technical field to hold model type" -msgstr "" +msgstr "Campo t??cnico para o tipo de modelo" From 5168f7a8f7824a69dba3b41454c39b119d657afb Mon Sep 17 00:00:00 2001 From: brian10048 Date: Tue, 21 Jul 2020 00:32:06 -0400 Subject: [PATCH 6/8] [IMP] fieldservice_stage_validation: black, isort, prettier --- fieldservice_stage_validation/__manifest__.py | 29 +- .../models/fsm_equipment.py | 13 +- .../models/fsm_location.py | 13 +- .../models/fsm_order.py | 13 +- .../models/fsm_person.py | 13 +- .../models/fsm_stage.py | 23 +- .../static/description/index.html | 1108 ++++++++++------- .../views/fsm_stage.xml | 14 +- 8 files changed, 748 insertions(+), 478 deletions(-) diff --git a/fieldservice_stage_validation/__manifest__.py b/fieldservice_stage_validation/__manifest__.py index d609c59b79..52322e6920 100644 --- a/fieldservice_stage_validation/__manifest__.py +++ b/fieldservice_stage_validation/__manifest__.py @@ -1,22 +1,15 @@ # Copyright (C) 2020 Brian McMaster # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'FSM Stage Validation', - 'summary': 'Validate input data when reaching a Field Service stage', - 'version': '12.0.0.2.0', - 'category': 'Field Service', - 'author': 'Brian McMaster, Odoo Community Association (OCA)', - 'website': 'https://github.com/OCA/field-service', - 'depends': [ - 'fieldservice', - ], - 'data': [ - 'views/fsm_stage.xml', - ], - 'license': 'AGPL-3', - 'development_status': 'Beta', - 'maintainers': [ - 'brian10048', - 'max3903', - ], + "name": "FSM Stage Validation", + "summary": "Validate input data when reaching a Field Service stage", + "version": "12.0.0.2.0", + "category": "Field Service", + "author": "Brian McMaster, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/field-service", + "depends": ["fieldservice"], + "data": ["views/fsm_stage.xml"], + "license": "AGPL-3", + "development_status": "Beta", + "maintainers": ["brian10048", "max3903"], } diff --git a/fieldservice_stage_validation/models/fsm_equipment.py b/fieldservice_stage_validation/models/fsm_equipment.py index 87be00f34c..ee7d4d7cf1 100644 --- a/fieldservice_stage_validation/models/fsm_equipment.py +++ b/fieldservice_stage_validation/models/fsm_equipment.py @@ -5,9 +5,9 @@ class FSMEquipment(models.Model): - _inherit = 'fsm.equipment' + _inherit = "fsm.equipment" - @api.constrains('stage_id') + @api.constrains("stage_id") def _validate_stage_fields(self): for rec in self: stage = rec.stage_id @@ -17,6 +17,9 @@ def _validate_stage_fields(self): for name in field_names: if not values[0][name]: - raise ValidationError(_('Cannot move to stage "%s" ' - 'until the "%s" field is set.' - % (stage.name, name))) + raise ValidationError( + _( + 'Cannot move to stage "%s" ' + 'until the "%s" field is set.' % (stage.name, name) + ) + ) diff --git a/fieldservice_stage_validation/models/fsm_location.py b/fieldservice_stage_validation/models/fsm_location.py index 6d55316ef2..08112702b4 100644 --- a/fieldservice_stage_validation/models/fsm_location.py +++ b/fieldservice_stage_validation/models/fsm_location.py @@ -5,9 +5,9 @@ class FSMLocation(models.Model): - _inherit = 'fsm.location' + _inherit = "fsm.location" - @api.constrains('stage_id') + @api.constrains("stage_id") def _validate_stage_fields(self): for rec in self: stage = rec.stage_id @@ -17,6 +17,9 @@ def _validate_stage_fields(self): for name in field_names: if not values[0][name]: - raise ValidationError(_('Cannot move to stage "%s" ' - 'until the "%s" field is set.' - % (stage.name, name))) + raise ValidationError( + _( + 'Cannot move to stage "%s" ' + 'until the "%s" field is set.' % (stage.name, name) + ) + ) diff --git a/fieldservice_stage_validation/models/fsm_order.py b/fieldservice_stage_validation/models/fsm_order.py index 6aea0ee4ae..812babdb5c 100644 --- a/fieldservice_stage_validation/models/fsm_order.py +++ b/fieldservice_stage_validation/models/fsm_order.py @@ -5,9 +5,9 @@ class FSMOrder(models.Model): - _inherit = 'fsm.order' + _inherit = "fsm.order" - @api.constrains('stage_id') + @api.constrains("stage_id") def _validate_stage_fields(self): for rec in self: stage = rec.stage_id @@ -17,6 +17,9 @@ def _validate_stage_fields(self): for name in field_names: if not values[0][name]: - raise ValidationError(_('Cannot move to stage "%s" ' - 'until the "%s" field is set.' - % (stage.name, name))) + raise ValidationError( + _( + 'Cannot move to stage "%s" ' + 'until the "%s" field is set.' % (stage.name, name) + ) + ) diff --git a/fieldservice_stage_validation/models/fsm_person.py b/fieldservice_stage_validation/models/fsm_person.py index 8d369cffe0..91ba573374 100644 --- a/fieldservice_stage_validation/models/fsm_person.py +++ b/fieldservice_stage_validation/models/fsm_person.py @@ -5,9 +5,9 @@ class FSMPerson(models.Model): - _inherit = 'fsm.person' + _inherit = "fsm.person" - @api.constrains('stage_id') + @api.constrains("stage_id") def _validate_stage_fields(self): for rec in self: stage = rec.stage_id @@ -17,6 +17,9 @@ def _validate_stage_fields(self): for name in field_names: if not values[0][name]: - raise ValidationError(_('Cannot move to stage "%s" ' - 'until the "%s" field is set.' - % (stage.name, name))) + raise ValidationError( + _( + 'Cannot move to stage "%s" ' + 'until the "%s" field is set.' % (stage.name, name) + ) + ) diff --git a/fieldservice_stage_validation/models/fsm_stage.py b/fieldservice_stage_validation/models/fsm_stage.py index 7f0ba54d60..a59b6e9a47 100644 --- a/fieldservice_stage_validation/models/fsm_stage.py +++ b/fieldservice_stage_validation/models/fsm_stage.py @@ -4,28 +4,27 @@ class FSMStage(models.Model): - _inherit = 'fsm.stage' + _inherit = "fsm.stage" - @api.depends('stage_type') + @api.depends("stage_type") def _compute_stage_model(self): model_id = False - Model = self.env['ir.model'] + Model = self.env["ir.model"] for rec in self: if rec.stage_type: - model_string = 'fsm.' + rec.stage_type - model_id = Model.search( - [('model', '=', model_string)], limit=1).id + model_string = "fsm." + rec.stage_type + model_id = Model.search([("model", "=", model_string)], limit=1).id rec.stage_type_model_id = model_id validate_field_ids = fields.Many2many( - 'ir.model.fields', - string='Fields to Validate', - help='Select fields which must be set on the document in this stage', + "ir.model.fields", + string="Fields to Validate", + help="Select fields which must be set on the document in this stage", ) stage_type_model_id = fields.Many2one( - 'ir.model', + "ir.model", compute=_compute_stage_model, - string='Model for Stage', - help='Technical field to hold model type', + string="Model for Stage", + help="Technical field to hold model type", ) diff --git a/fieldservice_stage_validation/static/description/index.html b/fieldservice_stage_validation/static/description/index.html index 70f7a4451f..bc74aeefac 100644 --- a/fieldservice_stage_validation/static/description/index.html +++ b/fieldservice_stage_validation/static/description/index.html @@ -1,13 +1,15 @@ - - - -FSM Stage Validation - - - -
-

FSM Stage Validation

- - -

Beta License: AGPL-3 OCA/field-service Translate me on Weblate Try me on Runbot

-

As the stage of a field service document progresses, it may be important for -specific fields of the document be completed.

-

For example, when a field service order enters the ???Complete??? stage, the -fields for ???Actual End Date??? and/or ???Resolution Notes??? should be set.

-

This module allows you to raise a Validation Error if the designated fields -are not set when moving to a new stage. Since stages can be used for field -service orders, workers, locations, or equipments, this logic is available -to be applied to each document type.

-

Table of contents

- -
-

Configuration

-
    -
  • Go to Field Service > Configuration > Stages
  • -
  • Create or select a stage
  • -
  • Select one or more fields to be validated
  • -
-
-
-

Usage

-
    -
  • Follow steps outlined in Configuration.
  • -
  • User will receive validation error if a field is not set when -attempting to move to a new stage.
  • -
-
-
-

Known issues / Roadmap

-

The roadmap of the Field Service application is documented on -Github.

-
-
-

Bug Tracker

-

Bugs are tracked on GitHub Issues. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

-

Do not contact contributors directly about support or help with technical issues.

-
-
-

Credits

-
-

Authors

-
    -
  • Brian McMaster
  • -
-
-
-

Contributors

- -
-
-

Maintainers

-

This module is maintained by the OCA.

-Odoo Community Association -

OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use.

-

Current maintainers:

-

brian10048 max3903

-

This module is part of the OCA/field-service project on GitHub.

-

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

-
-
-
- +

+ Beta + License: AGPL-3 + OCA/field-service + Translate me on Weblate + Try me on Runbot +

+

+ As the stage of a field service document progresses, it may be important for + specific fields of the document be completed. +

+

+ For example, when a field service order enters the ???Complete??? stage, the + fields for ???Actual End Date??? and/or ???Resolution Notes??? should be set. +

+

+ This module allows you to raise a Validation Error if the designated fields are + not set when moving to a new stage. Since stages can be used for field service + orders, workers, locations, or equipments, this logic is available to be applied + to each document type. +

+

Table of contents

+
+ +
+
+

Configuration

+
    +
  • Go to Field Service > Configuration > Stages
  • +
  • Create or select a stage
  • +
  • Select one or more fields to be validated
  • +
+
+
+

Usage

+
    +
  • Follow steps outlined in Configuration.
  • +
  • + User will receive validation error if a field is not set when attempting to + move to a new stage. +
  • +
+
+
+

Known issues / Roadmap

+

+ The roadmap of the Field Service application is documented on + Github. +

+
+
+

Bug Tracker

+

+ Bugs are tracked on + GitHub Issues. In case of trouble, please check there if your issue has already been + reported. If you spotted it first, help us smashing it by providing a detailed + and welcomed + feedback. +

+

+ Do not contact contributors directly about support or help with technical + issues. +

+
+
+

Credits

+
+

Authors

+
    +
  • Brian McMaster
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ Odoo Community Association +

+ OCA, or the Odoo Community Association, is a nonprofit organization whose + mission is to support the collaborative development of Odoo features and + promote its widespread use. +

+

+ Current + maintainers: +

+

+ brian10048 + max3903 +

+

+ This module is part of the + OCA/field-service + project on GitHub. +

+

+ You are welcome to contribute. To learn how please visit + https://odoo-community.org/page/Contribute. +

+
+
+ + diff --git a/fieldservice_stage_validation/views/fsm_stage.xml b/fieldservice_stage_validation/views/fsm_stage.xml index c8e69148ba..b29c51bba3 100644 --- a/fieldservice_stage_validation/views/fsm_stage.xml +++ b/fieldservice_stage_validation/views/fsm_stage.xml @@ -1,17 +1,17 @@ - fsm.stage.validation.form fsm.stage - + - - + + - From dd521a89227d3b79b43e7c7bae320cf625ba5bb0 Mon Sep 17 00:00:00 2001 From: brian10048 Date: Tue, 21 Jul 2020 00:33:16 -0400 Subject: [PATCH 7/8] [MIG] fieldservice_stage_validation: Migration to 13.0 --- fieldservice_stage_validation/__manifest__.py | 2 +- .../odoo/addons/fieldservice_stage_validation | 1 + setup/fieldservice_stage_validation/setup.py | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 120000 setup/fieldservice_stage_validation/odoo/addons/fieldservice_stage_validation create mode 100644 setup/fieldservice_stage_validation/setup.py diff --git a/fieldservice_stage_validation/__manifest__.py b/fieldservice_stage_validation/__manifest__.py index 52322e6920..7f4e5181cd 100644 --- a/fieldservice_stage_validation/__manifest__.py +++ b/fieldservice_stage_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "FSM Stage Validation", "summary": "Validate input data when reaching a Field Service stage", - "version": "12.0.0.2.0", + "version": "13.0.1.0.0", "category": "Field Service", "author": "Brian McMaster, Odoo Community Association (OCA)", "website": "https://github.com/OCA/field-service", diff --git a/setup/fieldservice_stage_validation/odoo/addons/fieldservice_stage_validation b/setup/fieldservice_stage_validation/odoo/addons/fieldservice_stage_validation new file mode 120000 index 0000000000..424c0ea876 --- /dev/null +++ b/setup/fieldservice_stage_validation/odoo/addons/fieldservice_stage_validation @@ -0,0 +1 @@ +../../../../fieldservice_stage_validation \ No newline at end of file diff --git a/setup/fieldservice_stage_validation/setup.py b/setup/fieldservice_stage_validation/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/fieldservice_stage_validation/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 35c847e7d577afd854782d8bf864313dd9d36541 Mon Sep 17 00:00:00 2001 From: Brian McMaster Date: Tue, 27 Oct 2020 11:04:07 -0400 Subject: [PATCH 8/8] [IMP] fieldservice_stage_validation: Add test --- .../tests/__init__.py | 4 + .../tests/test_fsm_stage_validation.py | 195 ++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 fieldservice_stage_validation/tests/__init__.py create mode 100644 fieldservice_stage_validation/tests/test_fsm_stage_validation.py diff --git a/fieldservice_stage_validation/tests/__init__.py b/fieldservice_stage_validation/tests/__init__.py new file mode 100644 index 0000000000..7586a16155 --- /dev/null +++ b/fieldservice_stage_validation/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright (C) 2020, Brian McMaster +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_fsm_stage_validation diff --git a/fieldservice_stage_validation/tests/test_fsm_stage_validation.py b/fieldservice_stage_validation/tests/test_fsm_stage_validation.py new file mode 100644 index 0000000000..bdc44da914 --- /dev/null +++ b/fieldservice_stage_validation/tests/test_fsm_stage_validation.py @@ -0,0 +1,195 @@ +# Copyright 2020, Brian McMaster +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) + +from odoo.exceptions import ValidationError +from odoo.tests import SavepointCase + + +class TestFSMStageValidation(SavepointCase): + @classmethod + def setUpClass(cls): + super(TestFSMStageValidation, cls).setUpClass() + + cls.stage = cls.env["fsm.stage"] + cls.fsm_order = cls.env["fsm.order"] + cls.fsm_person = cls.env["fsm.person"] + cls.fsm_location = cls.env["fsm.location"] + cls.fsm_equipment = cls.env["fsm.equipment"] + cls.ir_model_fields = cls.env["ir.model.fields"] + + # Get some fields to use in the stages + cls.order_field = cls.ir_model_fields.search( + [("model", "=", "fsm.order"), ("name", "=", "description")] + ) + cls.person_field = cls.ir_model_fields.search( + [("model", "=", "fsm.person"), ("name", "=", "mobile")] + ) + cls.location_field = cls.ir_model_fields.search( + [("model", "=", "fsm.location"), ("name", "=", "direction")] + ) + cls.equipment_field = cls.ir_model_fields.search( + [("model", "=", "fsm.equipment"), ("name", "=", "notes")] + ) + + # For each model type, create a default stage and a stage + # which will apply field validation + # Order Stages + cls.stage_order_default = cls.stage.create( + { + "name": "Order Stage Default", + "stage_type": "order", + "is_default": True, + "sequence": "10", + } + ) + cls.stage_order = cls.stage.create( + { + "name": "Order Stage Validate", + "stage_type": "order", + "validate_field_ids": [(6, 0, [cls.order_field.id])], + "sequence": "11", + } + ) + # Person Stages + cls.stage_person_default = cls.stage.create( + { + "name": "Person Stage Default", + "stage_type": "worker", + "is_default": True, + "sequence": "10", + } + ) + cls.stage_person = cls.stage.create( + { + "name": "Person Stage Validate", + "stage_type": "worker", + "validate_field_ids": [(6, 0, [cls.person_field.id])], + "sequence": "11", + } + ) + # Location Stages + cls.stage_location_default = cls.stage.create( + { + "name": "Location Stage Default", + "stage_type": "location", + "is_default": True, + "sequence": "10", + } + ) + cls.stage_location = cls.stage.create( + { + "name": "Location Stage Validate", + "stage_type": "location", + "validate_field_ids": [(6, 0, [cls.location_field.id])], + "sequence": "11", + } + ) + # Equipment Stages + cls.stage_equipment_default = cls.stage.create( + { + "name": "Equipment Stage Default", + "stage_type": "equipment", + "is_default": True, + "sequence": "10", + } + ) + cls.stage_equipment = cls.stage.create( + { + "name": "Equipment Stage Validate", + "stage_type": "equipment", + "validate_field_ids": [(6, 0, [cls.equipment_field.id])], + "sequence": "11", + } + ) + + # Create a person + cls.person_01 = cls.fsm_person.create( + { + "name": "FSM Worker 01", + "partner_id": cls.env["res.partner"] + .create({"name": "Worker 01 Partner"}) + .id, + "stage_id": cls.stage_person_default.id, + } + ) + # Create a location + cls.location_01 = cls.fsm_location.create( + { + "name": "Location 01", + "owner_id": cls.env["res.partner"] + .create({"name": "Location 01 Partner"}) + .id, + "stage_id": cls.stage_location_default.id, + } + ) + # Create an Equipment + cls.equipment_01 = cls.fsm_equipment.create( + { + "name": "Equipment 01", + "current_location_id": cls.location_01.id, + "stage_id": cls.stage_equipment_default.id, + } + ) + # Create an Order + cls.order_01 = cls.fsm_order.create({"location_id": cls.location_01.id}) + + def test_fsm_stage_validation(self): + + # Validate the stage computes the correct model type + self.assertEqual( + self.stage_order.stage_type_model_id, + self.env["ir.model"].search([("model", "=", "fsm.order")]), + "FSM Stage model is not computed correctly", + ) + + # Validate the Equipment cannot move to next stage + with self.assertRaises(ValidationError): + self.equipment_01.next_stage() + + # Update the Equipment notes field and validate it goes to next stage + self.equipment_01.notes = "Equipment service note" + self.equipment_01.next_stage() + self.assertEqual( + self.equipment_01.stage_id, + self.stage_equipment, + "FSM Equipment did not progress to correct stage", + ) + + # Validate the Location cannot move to next stage + with self.assertRaises(ValidationError): + self.location_01.next_stage() + + # Update the Location directions field and validate it goes to next stage + self.location_01.direction = "Location direction note" + self.location_01.next_stage() + self.assertEqual( + self.location_01.stage_id, + self.stage_location, + "FSM Location did not progress to correct stage", + ) + + # Validate the Person cannot move to next stage + with self.assertRaises(ValidationError): + self.person_01.next_stage() + + # Update the Person mobile field and validate it goes to next stage + self.person_01.mobile = "1-888-888-8888" + self.person_01.next_stage() + self.assertEqual( + self.person_01.stage_id, + self.stage_person, + "FSM Person did not progress to correct stage", + ) + + # Validate the Order cannot move to stage which requires validation + with self.assertRaises(ValidationError): + self.order_01.write({"stage_id": self.stage_order.id}) + + # Update the Order description field and validate it goes to next stage + self.order_01.description = "Complete the work order" + self.order_01.write({"stage_id": self.stage_order.id}) + self.assertEqual( + self.order_01.stage_id, + self.stage_order, + "FSM Order did not progress to correct stage", + )