diff --git a/iot_output_oca/README.rst b/iot_output_oca/README.rst new file mode 100644 index 00000000..09bc96a0 --- /dev/null +++ b/iot_output_oca/README.rst @@ -0,0 +1,74 @@ +========== +IoT Output +========== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fiot-lightgray.png?logo=github + :target: https://github.com/OCA/iot/tree/15.0/iot_output_oca + :alt: OCA/iot +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/iot-15-0/iot-15-0-iot_output_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/269/15.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon is a base module used to allow different outputs from the same +device + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* Creu Blanca + +Contributors +~~~~~~~~~~~~ + +* Enric Tobella + +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. + +This module is part of the `OCA/iot `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/iot_output_oca/__init__.py b/iot_output_oca/__init__.py new file mode 100644 index 00000000..83e553ac --- /dev/null +++ b/iot_output_oca/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/iot_output_oca/__manifest__.py b/iot_output_oca/__manifest__.py new file mode 100644 index 00000000..e75923ea --- /dev/null +++ b/iot_output_oca/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "IoT Output", + "version": "16.0.1.0.0", + "category": "IoT", + "author": "Creu Blanca, " "Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "application": True, + "summary": "IoT allow multiple outputs", + "website": "https://github.com/OCA/iot", + "depends": ["iot_oca"], + "data": [ + "security/ir.model.access.csv", + "views/iot_device_output_views.xml", + "views/iot_device_views.xml", + ], +} diff --git a/iot_output_oca/i18n/iot_output.pot b/iot_output_oca/i18n/iot_output.pot new file mode 100644 index 00000000..7146e991 --- /dev/null +++ b/iot_output_oca/i18n/iot_output.pot @@ -0,0 +1,189 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_output +# +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: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__action_ids +msgid "Action" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__action_count +msgid "Action Count" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_system__applies_to +msgid "Applies To" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__create_uid +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__create_date +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__create_date +msgid "Created on" +msgstr "" + +#. module: iot_output +#: selection:iot.system,applies_to:0 +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__device_id +msgid "Device" +msgstr "" + +#. module: iot_output +#: code:addons/iot_output/models/iot_device_output_action.py:32 +#, python-format +msgid "Device and action must be of the same system" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__display_name +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_output +#: selection:iot.device.output.action,status:0 +msgid "Failed" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__id +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__id +msgid "ID" +msgstr "" + +#. module: iot_output +#: model:ir.model,name:iot_output.model_iot_device_output_action +msgid "IoT Action" +msgstr "" + +#. module: iot_output +#: model:ir.model,name:iot_output.model_iot_device +#: model:ir.model,name:iot_output.model_iot_device_output +msgid "IoT Device" +msgstr "" + +#. module: iot_output +#: model:ir.actions.act_window,name:iot_output.iot_device_output_action +msgid "IoT Outputs" +msgstr "" + +#. module: iot_output +#: model:ir.model,name:iot_output.model_iot_system +msgid "IoT System" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__ip +msgid "Ip" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output____last_update +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__write_uid +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__write_date +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__model +msgid "Model" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__name +msgid "Name" +msgstr "" + +#. module: iot_output +#: selection:iot.device.output.action,status:0 +msgid "Ok" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__date_ok +msgid "Ok date" +msgstr "" + +#. module: iot_output +#: selection:iot.system,applies_to:0 +#: model:ir.model.fields,field_description:iot_output.field_iot_device__output_ids +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__output_id +#: model:ir.model.fields,field_description:iot_output.field_iot_system__output_ids +msgid "Output" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device__output_count +msgid "Output Count" +msgstr "" + +#. module: iot_output +#: model_terms:ir.ui.view,arch_db:iot_output.iot_device_form +msgid "Outputs" +msgstr "" + +#. module: iot_output +#: selection:iot.device.output.action,status:0 +msgid "Pending" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__result +msgid "Result" +msgstr "" + +#. module: iot_output +#: model_terms:ir.ui.view,arch_db:iot_output.iot_device_output_action_tree +msgid "Run" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__state +msgid "State" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__status +msgid "Status" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device__system_id +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output__system_id +msgid "System" +msgstr "" + +#. module: iot_output +#: model:ir.model.fields,field_description:iot_output.field_iot_device_output_action__system_action_id +msgid "System Action" +msgstr "" + diff --git a/iot_output_oca/i18n/iot_output_oca.pot b/iot_output_oca/i18n/iot_output_oca.pot new file mode 100644 index 00000000..9a1f127b --- /dev/null +++ b/iot_output_oca/i18n/iot_output_oca.pot @@ -0,0 +1,195 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_output_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.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: iot_output_oca +#: model_terms:ir.ui.view,arch_db:iot_output_oca.iot_device_kanban +msgid "" +"\n" +" Outputs" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__action_ids +msgid "Action" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__action_count +msgid "Action Count" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_communication_system__applies_to +msgid "Applies To" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device__communication_system_id +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__communication_system_id +msgid "Communication System" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__communication_system_action_id +msgid "Communication System Action" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__create_uid +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__create_date +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__create_date +msgid "Created on" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__device_id +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_communication_system__applies_to__device +msgid "Device" +msgstr "" + +#. module: iot_output_oca +#: code:addons/iot_output_oca/models/iot_device_output_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__display_name +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_device_output_action__status__failed +msgid "Failed" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__id +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__id +msgid "ID" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model,name:iot_output_oca.model_iot_device_output_action +msgid "IoT Action" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model,name:iot_output_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model,name:iot_output_oca.model_iot_device +#: model:ir.model,name:iot_output_oca.model_iot_device_output +msgid "IoT Device" +msgstr "" + +#. module: iot_output_oca +#: model:ir.actions.act_window,name:iot_output_oca.iot_device_output_action +msgid "IoT Outputs" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__ip +msgid "Ip" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output____last_update +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__write_uid +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__write_date +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__model +msgid "Model" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__name +msgid "Name" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_device_output_action__status__ok +msgid "Ok" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__date_ok +msgid "Ok date" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_communication_system__output_ids +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device__output_ids +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__output_id +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_communication_system__applies_to__output +msgid "Output" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device__output_count +msgid "Output Count" +msgstr "" + +#. module: iot_output_oca +#: model_terms:ir.ui.view,arch_db:iot_output_oca.iot_device_form +msgid "Outputs" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_device_output_action__status__pending +msgid "Pending" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__result +msgid "Result" +msgstr "" + +#. module: iot_output_oca +#: model_terms:ir.ui.view,arch_db:iot_output_oca.iot_device_output_action_tree +msgid "Run" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__state +msgid "State" +msgstr "" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__status +msgid "Status" +msgstr "" diff --git a/iot_output_oca/i18n/it.po b/iot_output_oca/i18n/it.po new file mode 100644 index 00000000..da15886c --- /dev/null +++ b/iot_output_oca/i18n/it.po @@ -0,0 +1,200 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_output_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-05-22 15:09+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\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 4.17\n" + +#. module: iot_output_oca +#: model_terms:ir.ui.view,arch_db:iot_output_oca.iot_device_kanban +msgid "" +"\n" +" Outputs" +msgstr "" +"\n" +" Output" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__action_ids +msgid "Action" +msgstr "Azione" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__action_count +msgid "Action Count" +msgstr "Conteggio azione" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_communication_system__applies_to +msgid "Applies To" +msgstr "Si applica a" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device__communication_system_id +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__communication_system_id +msgid "Communication System" +msgstr "Sistema di comunicazione" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__communication_system_action_id +msgid "Communication System Action" +msgstr "Azione sistema di comunicazione" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__create_uid +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__create_date +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__device_id +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_communication_system__applies_to__device +msgid "Device" +msgstr "Dispositivo" + +#. module: iot_output_oca +#: code:addons/iot_output_oca/models/iot_device_output_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "Il dispositivo e l'azione devono essere dello stesso sistema" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__display_name +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: iot_output_oca +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_device_output_action__status__failed +msgid "Failed" +msgstr "Fallito" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__id +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__id +msgid "ID" +msgstr "ID" + +#. module: iot_output_oca +#: model:ir.model,name:iot_output_oca.model_iot_device_output_action +msgid "IoT Action" +msgstr "Azione IoT" + +#. module: iot_output_oca +#: model:ir.model,name:iot_output_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "Sistema di comunicazione IoT" + +#. module: iot_output_oca +#: model:ir.model,name:iot_output_oca.model_iot_device +#: model:ir.model,name:iot_output_oca.model_iot_device_output +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_output_oca +#: model:ir.actions.act_window,name:iot_output_oca.iot_device_output_action +msgid "IoT Outputs" +msgstr "Output IoT" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__ip +msgid "Ip" +msgstr "IP" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output____last_update +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__write_uid +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__write_date +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__model +msgid "Model" +msgstr "Modello" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__name +msgid "Name" +msgstr "Nome" + +#. module: iot_output_oca +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_device_output_action__status__ok +msgid "Ok" +msgstr "Ok" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__date_ok +msgid "Ok date" +msgstr "Data ok" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_communication_system__output_ids +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device__output_ids +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__output_id +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_communication_system__applies_to__output +msgid "Output" +msgstr "Output" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device__output_count +msgid "Output Count" +msgstr "Conteggio output" + +#. module: iot_output_oca +#: model_terms:ir.ui.view,arch_db:iot_output_oca.iot_device_form +msgid "Outputs" +msgstr "Output" + +#. module: iot_output_oca +#: model:ir.model.fields.selection,name:iot_output_oca.selection__iot_device_output_action__status__pending +msgid "Pending" +msgstr "In attesa" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__result +msgid "Result" +msgstr "Risultato" + +#. module: iot_output_oca +#: model_terms:ir.ui.view,arch_db:iot_output_oca.iot_device_output_action_tree +msgid "Run" +msgstr "Esegui" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output__state +msgid "State" +msgstr "Stato" + +#. module: iot_output_oca +#: model:ir.model.fields,field_description:iot_output_oca.field_iot_device_output_action__status +msgid "Status" +msgstr "Stato" diff --git a/iot_output_oca/migrations/14.0.1.0.0/pre-migration.py b/iot_output_oca/migrations/14.0.1.0.0/pre-migration.py new file mode 100644 index 00000000..1179c8c7 --- /dev/null +++ b/iot_output_oca/migrations/14.0.1.0.0/pre-migration.py @@ -0,0 +1,15 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade + +_column_renames = { + "iot_device_output": [("system_id", "communication_system_id")], + "iot_device_output_action": [ + ("system_action_id", "communication_system_action_id") + ], +} + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.rename_columns(env.cr, _column_renames) diff --git a/iot_output_oca/models/__init__.py b/iot_output_oca/models/__init__.py new file mode 100644 index 00000000..ba048e86 --- /dev/null +++ b/iot_output_oca/models/__init__.py @@ -0,0 +1,4 @@ +from . import iot_device +from . import iot_device_output_action +from . import iot_device_output +from . import iot_communication_system diff --git a/iot_output_oca/models/iot_communication_system.py b/iot_output_oca/models/iot_communication_system.py new file mode 100644 index 00000000..2ebcecbd --- /dev/null +++ b/iot_output_oca/models/iot_communication_system.py @@ -0,0 +1,14 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import fields, models + + +class IoTCommunicationSystem(models.Model): + _inherit = "iot.communication.system" + + output_ids = fields.One2many( + "iot.device.output", inverse_name="communication_system_id" + ) + applies_to = fields.Selection( + [("device", "Device"), ("output", "Output")], default="device", required=True + ) diff --git a/iot_output_oca/models/iot_device.py b/iot_output_oca/models/iot_device.py new file mode 100644 index 00000000..96b0bca1 --- /dev/null +++ b/iot_output_oca/models/iot_device.py @@ -0,0 +1,30 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import api, fields, models + + +class IoTDevice(models.Model): + _inherit = "iot.device" + + output_ids = fields.One2many("iot.device.output", inverse_name="device_id") + output_count = fields.Integer(compute="_compute_output_count") + communication_system_id = fields.Many2one(required=False) + + @api.depends("output_ids") + def _compute_output_count(self): + for record in self: + record.output_count = len(record.output_ids) + + def action_show_output(self): + self.ensure_one() + action = self.env.ref("iot_output_oca.iot_device_output_action") + result = action.read()[0] + + result["context"] = { + "default_device_id": self.id, + } + result["domain"] = "[('device_id', '=', " + str(self.id) + ")]" + if len(self.output_ids) == 1: + result["views"] = [(False, "form")] + result["res_id"] = self.output_ids.id + return result diff --git a/iot_output_oca/models/iot_device_output.py b/iot_output_oca/models/iot_device_output.py new file mode 100644 index 00000000..eefdb5eb --- /dev/null +++ b/iot_output_oca/models/iot_device_output.py @@ -0,0 +1,43 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import api, fields, models + + +class IoTDevice(models.Model): + _name = "iot.device.output" + _description = "IoT Device" + + name = fields.Char(required=True) + device_id = fields.Many2one( + "iot.device", required=True, readonly=True, auto_join=True + ) + communication_system_id = fields.Many2one("iot.communication.system", required=True) + action_ids = fields.One2many("iot.device.output.action", inverse_name="output_id") + state = fields.Selection([], readonly=True) + model = fields.Char() + ip = fields.Char() + action_count = fields.Integer(compute="_compute_action_count") + + @api.depends("action_ids") + def _compute_action_count(self): + for record in self: + record.action_count = len(record.action_ids) + + def _system_action_vals(self, system_action): + return { + "output_id": self.id, + "communication_system_action_id": system_action.id, + } + + def device_run_action(self): + system_action = self.env["iot.communication.system.action"].browse( + self.env.context.get("iot_communication_system_action_id") + ) + for rec in self: + if not self.device_id.active: + continue + action = self.env["iot.device.output.action"].create( + rec._system_action_vals(system_action) + ) + action.run() + self.device_id.last_contact_date = fields.Datetime.now() diff --git a/iot_output_oca/models/iot_device_output_action.py b/iot_output_oca/models/iot_device_output_action.py new file mode 100644 index 00000000..58d388ea --- /dev/null +++ b/iot_output_oca/models/iot_device_output_action.py @@ -0,0 +1,46 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class IoTDeviceOutputAction(models.Model): + _name = "iot.device.output.action" + _description = "IoT Action" + _order = "date_ok desc" + + output_id = fields.Many2one("iot.device.output", required=True, readonly=True) + communication_system_action_id = fields.Many2one( + "iot.communication.system.action", required=True + ) + status = fields.Selection( + [("ok", "Ok"), ("pending", "Pending"), ("failed", "Failed")], + required=True, + default="pending", + ) + result = fields.Text() + date_ok = fields.Datetime(readonly=True, string="Ok date") + + @api.constrains("output_id", "communication_system_action_id") + def _check_system(self): + if self.filtered( + lambda r: r.output_id.communication_system_id + != r.communication_system_action_id.communication_system_id + ): + raise ValidationError(_("Device and action must be of the same system")) + + def run_extra_actions(self, status, result): + return + + def run(self): + self.ensure_one() + if self.status != "ok": + status, result = self.communication_system_action_id.run(self) + self.write( + { + "status": status, + "result": result, + "date_ok": fields.Datetime.now() if status == "ok" else False, + } + ) + self.run_extra_actions(status, result) diff --git a/iot_output_oca/readme/CONTRIBUTORS.rst b/iot_output_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..93ec993e --- /dev/null +++ b/iot_output_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Enric Tobella diff --git a/iot_output_oca/readme/DESCRIPTION.rst b/iot_output_oca/readme/DESCRIPTION.rst new file mode 100644 index 00000000..0147494b --- /dev/null +++ b/iot_output_oca/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This addon is a base module used to allow different outputs from the same +device diff --git a/iot_output_oca/security/ir.model.access.csv b/iot_output_oca/security/ir.model.access.csv new file mode 100644 index 00000000..2f735d3d --- /dev/null +++ b/iot_output_oca/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_iot_device_output_action,access_iot_device_output_action,model_iot_device_output_action,iot_oca.group_iot_user,1,1,1,0 +access_iot_device_output,access_iot_device_output,model_iot_device_output,iot_oca.group_iot_user,1,0,0,0 +manage_iot_device_output,access_iot_device_output,model_iot_device_output,iot_oca.group_iot_manager,1,1,1,0 diff --git a/iot_output_oca/static/description/icon.png b/iot_output_oca/static/description/icon.png new file mode 100644 index 00000000..da43f6f0 Binary files /dev/null and b/iot_output_oca/static/description/icon.png differ diff --git a/iot_output_oca/static/description/index.html b/iot_output_oca/static/description/index.html new file mode 100644 index 00000000..bcfe31c3 --- /dev/null +++ b/iot_output_oca/static/description/index.html @@ -0,0 +1,420 @@ + + + + + + +IoT Output + + + +
+

IoT Output

+ + +

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

+

This addon is a base module used to allow different outputs from the same +device

+

Table of contents

+ +
+

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

+
    +
  • Creu Blanca
  • +
+
+
+

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.

+

This module is part of the OCA/iot project on GitHub.

+

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

+
+
+
+ + diff --git a/iot_output_oca/tests/__init__.py b/iot_output_oca/tests/__init__.py new file mode 100644 index 00000000..c1763e19 --- /dev/null +++ b/iot_output_oca/tests/__init__.py @@ -0,0 +1 @@ +from . import test_iot diff --git a/iot_output_oca/tests/test_iot.py b/iot_output_oca/tests/test_iot.py new file mode 100644 index 00000000..829f6707 --- /dev/null +++ b/iot_output_oca/tests/test_iot.py @@ -0,0 +1,73 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from mock import patch + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase +from odoo.tools import mute_logger + + +class TestIoT(TransactionCase): + def setUp(self): + super().setUp() + self.system = self.env["iot.communication.system"].create({"name": "Testing"}) + self.system_2 = self.env["iot.communication.system"].create( + {"name": "Testing 02"} + ) + self.action = self.env["iot.communication.system.action"].create( + {"name": "test", "communication_system_id": self.system.id} + ) + self.action_2 = self.env["iot.communication.system.action"].create( + {"name": "test 02", "communication_system_id": self.system_2.id} + ) + self.device = self.env["iot.device"].create({"name": "Device"}) + self.assertEqual(self.device.output_count, 0) + self.output = self.env["iot.device.output"].create( + { + "communication_system_id": self.system.id, + "device_id": self.device.id, + "name": "Output", + } + ) + + def test_views(self): + self.assertEqual(self.device.output_count, 1) + res = self.device.action_show_output() + self.assertEqual(self.output, self.env[res["res_model"]].browse(res["res_id"])) + + def test_action(self): + self.assertEqual(self.output.action_count, 0) + with mute_logger("odoo.addons.iot_oca.models.iot_communication_system_action"): + self.output.with_context( + iot_communication_system_action_id=self.action.id + ).device_run_action() + self.assertEqual(self.output.action_count, 1) + self.assertEqual(self.output.action_ids.status, "failed") + + def test_action_archived_device(self): + self.assertEqual(self.output.action_count, 0) + self.device.active = False + with mute_logger("odoo.addons.iot_oca.models.iot_communication_system_action"): + self.output.with_context( + iot_communication_system_action_id=self.action.id + ).device_run_action() + self.assertEqual(self.output.action_count, 0) + + def test_correct_action(self): + self.assertEqual(self.output.action_count, 0) + with patch( + "odoo.addons.iot_oca.models.iot_communication_system_action." + "IoTSystemAction._run", + return_value=("ok", ""), + ): + self.output.with_context( + iot_communication_system_action_id=self.action.id + ).device_run_action() + self.assertEqual(self.output.action_count, 1) + self.assertEqual(self.output.action_ids.status, "ok") + + def test_constrains(self): + with self.assertRaises(ValidationError): + self.output.with_context( + iot_communication_system_action_id=self.action_2.id + ).device_run_action() diff --git a/iot_output_oca/views/iot_device_output_views.xml b/iot_output_oca/views/iot_device_output_views.xml new file mode 100644 index 00000000..64799937 --- /dev/null +++ b/iot_output_oca/views/iot_device_output_views.xml @@ -0,0 +1,61 @@ + + + + iot.device.output.tree + iot.device.output + + + + + + + + + iot.device.output.form + iot.device.output + +
+
+ +
+
+

+ +

+
+ + + + + + + + + + + IoT Outputs + ir.actions.act_window + iot.device.output + tree,form + + + iot.device.output.action.tree + iot.device.output.action + + + + + + + + + [('applies_to', '=', 'device')] + + + {'invisible': [('communication_system_id', '=', False)]} + + + + + + iot.device.kanban + iot.device + + + + + + Outputs + + + + + diff --git a/setup/iot_output_oca/odoo/addons/iot_output_oca b/setup/iot_output_oca/odoo/addons/iot_output_oca new file mode 120000 index 00000000..ae1e4a21 --- /dev/null +++ b/setup/iot_output_oca/odoo/addons/iot_output_oca @@ -0,0 +1 @@ +../../../../iot_output_oca \ No newline at end of file diff --git a/setup/iot_output_oca/setup.py b/setup/iot_output_oca/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/iot_output_oca/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)