From b1d16a46bf580186d5f4f4f1455cd7040752cedd Mon Sep 17 00:00:00 2001 From: Ernad Husremovic Date: Sat, 30 Aug 2025 17:53:33 +0200 Subject: [PATCH] Move 7 IoT modules to oca-ocb-hw and 9 product modules to oca-product MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- odoo-bringout-oca-iot-iot_amqp_oca/README.md | 44 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + odoo-bringout-oca-iot-iot_amqp_oca/doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 15 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../iot_amqp_oca/README.rst | 80 +++ .../iot_amqp_oca/__init__.py | 1 + .../iot_amqp_oca/__manifest__.py | 20 + .../iot_amqp_oca/data/system_data.xml | 11 + .../iot_amqp_oca/i18n/bs.po | 140 +++++ .../iot_amqp_oca/i18n/iot_amqp.pot | 140 +++++ .../iot_amqp_oca/i18n/iot_amqp_oca.pot | 142 +++++ .../iot_amqp_oca/i18n/it.po | 145 ++++++ .../iot_amqp_oca/models/__init__.py | 4 + .../iot_amqp_oca/models/iot_amqp_host.py | 13 + .../models/iot_communication_system_action.py | 10 + .../iot_amqp_oca/models/iot_device_output.py | 27 + .../models/iot_device_output_action.py | 33 ++ .../iot_amqp_oca/readme/CONTRIBUTORS.rst | 1 + .../iot_amqp_oca/readme/DESCRIPTION.rst | 5 + .../iot_amqp_oca/security/ir.model.access.csv | 3 + .../iot_amqp_oca/static/description/icon.png | Bin 0 -> 4151 bytes .../static/description/index.html | 426 +++++++++++++++ .../iot_amqp_oca/tests/__init__.py | 4 + .../iot_amqp_oca/tests/test_amqp.py | 84 +++ .../iot_amqp_oca/views/iot_amqp_host.xml | 53 ++ .../views/iot_device_output_views.xml | 44 ++ .../pyproject.toml | 42 ++ odoo-bringout-oca-iot-iot_input_oca/README.md | 44 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 14 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../iot_input_oca/README.rst | 157 ++++++ .../iot_input_oca/__init__.py | 2 + .../iot_input_oca/__manifest__.py | 19 + .../iot_input_oca/controller/__init__.py | 1 + .../controller/iot_input_controller.py | 105 ++++ .../examples/multi_input_values.json | 19 + .../iot_input_oca/i18n/bs.po | 250 +++++++++ .../iot_input_oca/i18n/ca.po | 246 +++++++++ .../iot_input_oca/i18n/es.po | 248 +++++++++ .../iot_input_oca/i18n/fa.po | 248 +++++++++ .../iot_input_oca/i18n/iot_input.pot | 250 +++++++++ .../iot_input_oca/i18n/iot_input_oca.pot | 244 +++++++++ .../iot_input_oca/i18n/it.po | 248 +++++++++ .../iot_input_oca/models/__init__.py | 2 + .../iot_input_oca/models/iot_device.py | 77 +++ .../iot_input_oca/models/iot_device_input.py | 146 ++++++ .../iot_input_oca/readme/CONTRIBUTORS.rst | 2 + .../iot_input_oca/readme/DESCRIPTION.rst | 14 + .../iot_input_oca/readme/USAGE.rst | 55 ++ .../security/ir.model.access.csv | 5 + .../iot_input_oca/static/description/icon.png | Bin 0 -> 4151 bytes .../static/description/index.html | 489 ++++++++++++++++++ .../iot_input_oca/tests/__init__.py | 3 + .../iot_input_oca/tests/models.py | 10 + .../tests/test_iot_controller.py | 141 +++++ .../iot_input_oca/tests/test_iot_in.py | 122 +++++ .../tests/test_iot_multi_input.py | 196 +++++++ .../views/iot_device_input_views.xml | 79 +++ .../iot_input_oca/views/iot_device_views.xml | 38 ++ .../pyproject.toml | 42 ++ .../README.md | 45 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../iot_key_employee_rfid/README.rst | 78 +++ .../iot_key_employee_rfid/__init__.py | 1 + .../iot_key_employee_rfid/__manifest__.py | 14 + .../iot_key_employee_rfid/i18n/bs.po | 66 +++ .../i18n/iot_key_employee_rfid.pot | 66 +++ .../iot_key_employee_rfid/i18n/it.po | 86 +++ .../iot_key_employee_rfid/models/__init__.py | 2 + .../models/hr_employee.py | 65 +++ .../iot_key_employee_rfid/models/iot_key.py | 14 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 425 +++++++++++++++ .../iot_key_employee_rfid/tests/__init__.py | 1 + .../tests/test_employee_rfid.py | 42 ++ .../views/hr_employee.xml | 38 ++ .../pyproject.toml | 44 ++ odoo-bringout-oca-iot-iot_oca/README.md | 44 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + odoo-bringout-oca-iot-iot_oca/doc/FAQ.md | 4 + odoo-bringout-oca-iot-iot_oca/doc/INSTALL.md | 7 + odoo-bringout-oca-iot-iot_oca/doc/MODELS.md | 18 + odoo-bringout-oca-iot-iot_oca/doc/OVERVIEW.md | 6 + odoo-bringout-oca-iot-iot_oca/doc/REPORTS.md | 3 + odoo-bringout-oca-iot-iot_oca/doc/SECURITY.md | 42 ++ .../doc/TROUBLESHOOTING.md | 5 + odoo-bringout-oca-iot-iot_oca/doc/USAGE.md | 7 + odoo-bringout-oca-iot-iot_oca/doc/WIZARDS.md | 3 + .../iot_oca/README.rst | 77 +++ .../iot_oca/__init__.py | 3 + .../iot_oca/__manifest__.py | 24 + .../iot_oca/i18n/bs.po | 269 ++++++++++ .../iot_oca/i18n/ca.po | 426 +++++++++++++++ .../iot_oca/i18n/es.po | 441 ++++++++++++++++ .../iot_oca/i18n/fa.po | 426 +++++++++++++++ .../iot_oca/i18n/fa_IR.po | 424 +++++++++++++++ .../iot_oca/i18n/iot.pot | 269 ++++++++++ .../iot_oca/i18n/iot_oca.pot | 423 +++++++++++++++ .../iot_oca/i18n/it.po | 428 +++++++++++++++ .../migrations/14.0.1.0.0/pre-migration.py | 26 + .../iot_oca/models/__init__.py | 6 + .../models/iot_communication_system.py | 15 + .../models/iot_communication_system_action.py | 32 ++ .../iot_oca/models/iot_device.py | 50 ++ .../iot_oca/models/iot_device_action.py | 46 ++ .../iot_oca/models/iot_device_group.py | 11 + .../iot_oca/models/iot_device_tag.py | 13 + .../iot_oca/readme/CONTRIBUTORS.rst | 2 + .../iot_oca/readme/DESCRIPTION.rst | 1 + .../iot_oca/security/iot_security.xml | 28 + .../iot_oca/security/ir.model.access.csv | 13 + .../iot_oca/static/description/icon.png | Bin 0 -> 6183 bytes .../iot_oca/static/description/icon.svg | 141 +++++ .../iot_oca/static/description/index.html | 424 +++++++++++++++ .../iot_oca/tests/__init__.py | 1 + .../iot_oca/tests/test_iot.py | 54 ++ .../iot_oca/views/iot_device_group.xml | 51 ++ .../iot_oca/views/iot_device_tag.xml | 55 ++ .../iot_oca/views/iot_device_views.xml | 249 +++++++++ .../iot_oca/views/iot_menu.xml | 15 + .../iot_oca/views/iot_system_views.xml | 62 +++ odoo-bringout-oca-iot-iot_oca/pyproject.toml | 42 ++ .../README.md | 44 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 15 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../iot_output_oca/README.rst | 77 +++ .../iot_output_oca/__init__.py | 3 + .../iot_output_oca/__manifest__.py | 20 + .../iot_output_oca/i18n/bs.po | 196 +++++++ .../iot_output_oca/i18n/es.po | 201 +++++++ .../iot_output_oca/i18n/fa.po | 201 +++++++ .../iot_output_oca/i18n/iot_output.pot | 189 +++++++ .../iot_output_oca/i18n/iot_output_oca.pot | 196 +++++++ .../iot_output_oca/i18n/it.po | 201 +++++++ .../migrations/14.0.1.0.0/pre-migration.py | 15 + .../iot_output_oca/models/__init__.py | 4 + .../models/iot_communication_system.py | 14 + .../iot_output_oca/models/iot_device.py | 30 ++ .../models/iot_device_output.py | 43 ++ .../models/iot_device_output_action.py | 46 ++ .../iot_output_oca/readme/CONTRIBUTORS.rst | 1 + .../iot_output_oca/readme/DESCRIPTION.rst | 2 + .../security/ir.model.access.csv | 4 + .../static/description/icon.png | Bin 0 -> 4151 bytes .../static/description/index.html | 424 +++++++++++++++ .../iot_output_oca/tests/__init__.py | 1 + .../iot_output_oca/tests/test_iot.py | 73 +++ .../views/iot_device_output_views.xml | 61 +++ .../iot_output_oca/views/iot_device_views.xml | 47 ++ .../pyproject.toml | 42 ++ odoo-bringout-oca-iot-iot_rule/README.md | 44 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + odoo-bringout-oca-iot-iot_rule/doc/FAQ.md | 4 + odoo-bringout-oca-iot-iot_rule/doc/INSTALL.md | 7 + odoo-bringout-oca-iot-iot_rule/doc/MODELS.md | 19 + .../doc/OVERVIEW.md | 6 + odoo-bringout-oca-iot-iot_rule/doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 ++ .../doc/TROUBLESHOOTING.md | 5 + odoo-bringout-oca-iot-iot_rule/doc/USAGE.md | 7 + odoo-bringout-oca-iot-iot_rule/doc/WIZARDS.md | 3 + .../iot_rule/README.rst | 86 +++ .../iot_rule/__init__.py | 2 + .../iot_rule/__manifest__.py | 28 + .../iot_rule/demo/iot_key_demo.xml | 22 + .../iot_rule/demo/iot_lock_demo.xml | 35 ++ .../iot_rule/demo/iot_rule_demo.xml | 22 + .../iot_rule/i18n/bs.po | 355 +++++++++++++ .../iot_rule/i18n/es.po | 355 +++++++++++++ .../iot_rule/i18n/iot_rule.pot | 355 +++++++++++++ .../iot_rule/i18n/it.po | 354 +++++++++++++ .../iot_rule/models/__init__.py | 7 + .../iot_rule/models/iot_device.py | 30 ++ .../iot_rule/models/iot_device_input.py | 29 ++ .../iot_rule/models/iot_key.py | 122 +++++ .../iot_rule/models/iot_key_action.py | 20 + .../iot_rule/models/iot_lock.py | 66 +++ .../iot_rule/models/iot_rule.py | 55 ++ .../iot_rule/models/res_partner.py | 9 + .../iot_rule/readme/CONTRIBUTORS.rst | 3 + .../iot_rule/readme/DESCRIPTION.rst | 8 + .../iot_rule/security/ir.model.access.csv | 9 + .../iot_rule/static/description/icon.png | Bin 0 -> 3305 bytes .../iot_rule/static/description/icon.svg | 143 +++++ .../iot_rule/static/description/index.html | 432 ++++++++++++++++ .../iot_rule/tests/__init__.py | 1 + .../iot_rule/tests/test_iot_rule.py | 299 +++++++++++ .../iot_rule/views/iot_device_input.xml | 27 + .../iot_rule/views/iot_key.xml | 102 ++++ .../iot_rule/views/iot_key_action.xml | 62 +++ .../iot_rule/views/iot_lock.xml | 76 +++ .../iot_rule/views/iot_rule.xml | 73 +++ .../iot_rule/views/res_partner.xml | 30 ++ .../iot_rule/wizards/__init__.py | 1 + .../iot_rule/wizards/iot_key_wizard.py | 48 ++ .../iot_rule/wizards/iot_key_wizard.xml | 44 ++ odoo-bringout-oca-iot-iot_rule/pyproject.toml | 43 ++ .../README.md | 45 ++ .../doc/ARCHITECTURE.md | 32 ++ .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 19 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../iot_template_oca/README.rst | 92 ++++ .../iot_template_oca/__init__.py | 3 + .../iot_template_oca/__manifest__.py | 19 + .../iot_template_oca/controller/__init__.py | 1 + .../controller/iot_controller.py | 25 + .../iot_template_oca/demo/iot_template.xml | 17 + .../iot_template_oca/i18n/bs.po | 289 +++++++++++ .../iot_template_oca/i18n/es.po | 292 +++++++++++ .../iot_template_oca/i18n/fa.po | 290 +++++++++++ .../i18n/iot_template_oca.pot | 289 +++++++++++ .../iot_template_oca/i18n/it.po | 292 +++++++++++ .../iot_template_oca/models/__init__.py | 4 + .../iot_template_oca/models/iot_device.py | 21 + .../models/iot_device_input.py | 18 + .../models/iot_device_output.py | 15 + .../iot_template_oca/models/iot_template.py | 137 +++++ .../iot_template_oca/readme/CONTRIBUTORS.rst | 1 + .../iot_template_oca/readme/DESCRIPTION.rst | 7 + .../iot_template_oca/readme/USAGE.rst | 6 + .../security/ir.model.access.csv | 10 + .../static/description/icon.png | Bin 0 -> 4151 bytes .../static/description/index.html | 440 ++++++++++++++++ .../iot_template_oca/tests/__init__.py | 1 + .../tests/test_iot_template.py | 141 +++++ .../views/iot_template_views.xml | 109 ++++ .../iot_template_oca/wizards/__init__.py | 1 + .../wizards/iot_device_configure.py | 35 ++ .../wizards/iot_device_configure.xml | 45 ++ .../pyproject.toml | 43 ++ 292 files changed, 19657 insertions(+) create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/README.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/README.rst create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/data/system_data.xml create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp.pot create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp_oca.pot create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_amqp_host.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_communication_system_action.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output_action.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/test_amqp.py create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_amqp_host.xml create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_device_output_views.xml create mode 100644 odoo-bringout-oca-iot-iot_amqp_oca/pyproject.toml create mode 100644 odoo-bringout-oca-iot-iot_input_oca/README.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/README.rst create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/controller/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/controller/iot_input_controller.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/examples/multi_input_values.json create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/ca.po create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/es.po create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/fa.po create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/iot_input.pot create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/iot_input_oca.pot create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/models/iot_device.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/models/iot_device_input.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/readme/USAGE.rst create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/tests/models.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/tests/test_iot_controller.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/tests/test_iot_in.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/tests/test_iot_multi_input.py create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/views/iot_device_input_views.xml create mode 100644 odoo-bringout-oca-iot-iot_input_oca/iot_input_oca/views/iot_device_views.xml create mode 100644 odoo-bringout-oca-iot-iot_input_oca/pyproject.toml create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/README.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/README.rst create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/iot_key_employee_rfid.pot create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/hr_employee.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/iot_key.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/test_employee_rfid.py create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/views/hr_employee.xml create mode 100644 odoo-bringout-oca-iot-iot_key_employee_rfid/pyproject.toml create mode 100644 odoo-bringout-oca-iot-iot_oca/README.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_oca/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/README.rst create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/ca.po create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/es.po create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa.po create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa_IR.po create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot.pot create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot_oca.pot create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/migrations/14.0.1.0.0/pre-migration.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system_action.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_action.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_group.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_tag.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/security/iot_security.xml create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.svg create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/tests/test_iot.py create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_group.xml create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_tag.xml create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_views.xml create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_menu.xml create mode 100644 odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_system_views.xml create mode 100644 odoo-bringout-oca-iot-iot_oca/pyproject.toml create mode 100644 odoo-bringout-oca-iot-iot_output_oca/README.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/README.rst create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/i18n/es.po create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/i18n/fa.po create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/i18n/iot_output.pot create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/i18n/iot_output_oca.pot create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/migrations/14.0.1.0.0/pre-migration.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/models/iot_communication_system.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/models/iot_device.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/models/iot_device_output.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/models/iot_device_output_action.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/tests/test_iot.py create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/views/iot_device_output_views.xml create mode 100644 odoo-bringout-oca-iot-iot_output_oca/iot_output_oca/views/iot_device_views.xml create mode 100644 odoo-bringout-oca-iot-iot_output_oca/pyproject.toml create mode 100644 odoo-bringout-oca-iot-iot_rule/README.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_rule/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/README.rst create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_key_demo.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_lock_demo.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_rule_demo.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/es.po create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/iot_rule.pot create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device_input.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key_action.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_lock.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_rule.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/models/res_partner.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.svg create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/tests/test_iot_rule.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_device_input.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_key.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_key_action.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_lock.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_rule.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/views/res_partner.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.py create mode 100644 odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.xml create mode 100644 odoo-bringout-oca-iot-iot_rule/pyproject.toml create mode 100644 odoo-bringout-oca-iot-iot_template_oca/README.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/FAQ.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/INSTALL.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/MODELS.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/REPORTS.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/SECURITY.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/USAGE.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/README.rst create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__manifest__.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/iot_controller.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/demo/iot_template.xml create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/bs.po create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/es.po create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/fa.po create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/iot_template_oca.pot create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/it.po create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_input.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_output.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_template.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/USAGE.rst create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/icon.png create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/index.html create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/test_iot_template.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/views/iot_template_views.xml create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/__init__.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.py create mode 100644 odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.xml create mode 100644 odoo-bringout-oca-iot-iot_template_oca/pyproject.toml diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/README.md b/odoo-bringout-oca-iot-iot_amqp_oca/README.md new file mode 100644 index 0000000..62b8669 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/README.md @@ -0,0 +1,44 @@ +# IoT AMQP + +Odoo addon: iot_amqp_oca + +## Installation + +```bash +pip install odoo-bringout-oca-iot-iot_amqp_oca +``` + +## Dependencies + +This addon depends on: +- iot_output_oca + +## Manifest Information + +- **Name**: IoT AMQP +- **Version**: 16.0.1.0.0 +- **Category**: IoT +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/iot](https://github.com/OCA/iot) branch 16.0, addon `iot_amqp_oca`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/ARCHITECTURE.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/ARCHITECTURE.md new file mode 100644 index 0000000..61b3c8c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Iot_amqp_oca Module - iot_amqp_oca + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/CONFIGURATION.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/CONFIGURATION.md new file mode 100644 index 0000000..95e2b6c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for iot_amqp_oca. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/CONTROLLERS.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/DEPENDENCIES.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/DEPENDENCIES.md new file mode 100644 index 0000000..5db18dd --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [iot_output_oca](https://github.com/bringout/oca-technical) diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/FAQ.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/FAQ.md new file mode 100644 index 0000000..64e08dc --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon iot_amqp_oca or install in UI. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/INSTALL.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/INSTALL.md new file mode 100644 index 0000000..96cafac --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-iot-iot_amqp_oca" +# or +uv pip install odoo-bringout-oca-iot-iot_amqp_oca" +``` diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/MODELS.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/MODELS.md new file mode 100644 index 0000000..adf67e0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/MODELS.md @@ -0,0 +1,15 @@ +# Models + +Detected core models and extensions in iot_amqp_oca. + +```mermaid +classDiagram + class iot_amqp_host + class iot_communication_system_action + class iot_device_output + class iot_device_output_action +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/OVERVIEW.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/OVERVIEW.md new file mode 100644 index 0000000..06b505f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: iot_amqp_oca. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon iot_amqp_oca +- License: LGPL-3 diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/REPORTS.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/SECURITY.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/SECURITY.md new file mode 100644 index 0000000..866376c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/SECURITY.md @@ -0,0 +1,34 @@ +# Security + +Access control and security definitions in iot_amqp_oca. + +## Access Control Lists (ACLs) + +Model access permissions defined in: +- **[ir.model.access.csv](../iot_amqp_oca/security/ir.model.access.csv)** + - 2 model access rules + +## Record Rules + +Row-level security rules defined in: + +```mermaid +graph TB + subgraph "Security Layers" + A[Users] --> B[Groups] + B --> C[Access Control Lists] + C --> D[Models] + B --> E[Record Rules] + E --> F[Individual Records] + end +``` + +Security files overview: +- **[ir.model.access.csv](../iot_amqp_oca/security/ir.model.access.csv)** + - Model access permissions (CRUD rights) + +Notes +- Access Control Lists define which groups can access which models +- Record Rules provide row-level security (filter records by user/group) +- Security groups organize users and define permission sets +- All security is enforced at the ORM level by Odoo diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/USAGE.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/USAGE.md new file mode 100644 index 0000000..8c48668 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon iot_amqp_oca +``` diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/doc/WIZARDS.md b/odoo-bringout-oca-iot-iot_amqp_oca/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/README.rst b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/README.rst new file mode 100644 index 0000000..2c8dced --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/README.rst @@ -0,0 +1,80 @@ +======== +IoT AMQP +======== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:906fa0b02813f40ecaaf8f4b48261919b2f1ee30a29ac68ad2f4ea6d0165a24d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/16.0/iot_amqp_oca + :alt: OCA/iot +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/iot-16-0/iot-16-0-iot_amqp_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/iot&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon defines AMQP as an integration option with a device. + +With AMQP, we will send and AMQP message to a broker that will send it to the +device. +Then, the device will do the expected action. + +**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 to smash 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/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__init__.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__manifest__.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/__manifest__.py new file mode 100644 index 0000000..4ea8cd8 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_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 AMQP", + "version": "16.0.1.0.0", + "category": "IoT", + "author": "Creu Blanca, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "summary": "Integrate Iot Outputs with AMQP", + "depends": ["iot_output_oca"], + "external_dependencies": {"python": ["pika"]}, + "website": "https://github.com/OCA/iot", + "data": [ + "security/ir.model.access.csv", + "views/iot_amqp_host.xml", + "data/system_data.xml", + "views/iot_device_output_views.xml", + ], +} diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/data/system_data.xml b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/data/system_data.xml new file mode 100644 index 0000000..1071c32 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/data/system_data.xml @@ -0,0 +1,11 @@ + + + + AMQP + output + + + + amqp + + diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/bs.po b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/bs.po new file mode 100644 index 0000000..2bb7620 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/bs.po @@ -0,0 +1,140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_amqp +# +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_amqp +#: model:ir.ui.menu,name:iot_amqp.iot_amqp_host_menu +msgid "AMQP Hosts" +msgstr "AMQP hostovi" + +#. module: iot_amqp +#: model_terms:ir.ui.view,arch_db:iot_amqp.iot_device_output_form +msgid "AMQP configuration" +msgstr "AMQP konfiguracija" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__active +msgid "Active" +msgstr "Aktivan" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_exchange +msgid "Amqp Exchange" +msgstr "Amqp exchange" + +#. module: iot_amqp +#: model:ir.actions.act_window,name:iot_amqp.iot_amqp_host_act_window +#: model:ir.model,name:iot_amqp.model_iot_amqp_host +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_host_id +msgid "Amqp Host" +msgstr "Amqp host" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_payload +msgid "Amqp Payload" +msgstr "Amqp payload" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_routing_key +msgid "Amqp Routing Key" +msgstr "Amqp routing ključ" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__connection +msgid "Connection" +msgstr "Konekcija" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: iot_amqp +#: code:addons/iot_amqp/models/iot_device_output.py:23 +#, python-format +msgid "Exchange is required" +msgstr "Exchange je potreban" + +#. module: iot_amqp +#: code:addons/iot_amqp/models/iot_device_output.py:31 +#, python-format +msgid "Host is required" +msgstr "Host je potreban" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__id +msgid "ID" +msgstr "ID" + +#. module: iot_amqp +#: model:ir.model,name:iot_amqp.model_iot_device_output_action +msgid "IoT Action" +msgstr "IoT akcija" + +#. module: iot_amqp +#: model:ir.model,name:iot_amqp.model_iot_device_output +msgid "IoT Device" +msgstr "IoT uređaj" + +#. module: iot_amqp +#: model:ir.model,name:iot_amqp.model_iot_system_action +msgid "IoT System.action" +msgstr "IoT sistem.akcija" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host____last_update +msgid "Last Modified on" +msgstr "Zadnje mijenjano" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__name +msgid "Name" +msgstr "Naziv:" + +#. module: iot_amqp +#: code:addons/iot_amqp/models/iot_device_output.py:27 +#, python-format +msgid "Routing Key is required" +msgstr "Routing ključ je potreban" + +#. module: iot_amqp +#: model_terms:ir.ui.view,arch_db:iot_amqp.iot_device_output_form +msgid "Run" +msgstr "Pokrenut" + +#. module: iot_amqp +#: model_terms:ir.ui.view,arch_db:iot_amqp.iot_amqp_host_form_view +msgid "amqp://USER:PASS@HOST" +msgstr "amqp://KORISNIK:LOZINKA@HOST" + diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp.pot b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp.pot new file mode 100644 index 0000000..1774652 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp.pot @@ -0,0 +1,140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_amqp +# +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_amqp +#: model:ir.ui.menu,name:iot_amqp.iot_amqp_host_menu +msgid "AMQP Hosts" +msgstr "" + +#. module: iot_amqp +#: model_terms:ir.ui.view,arch_db:iot_amqp.iot_device_output_form +msgid "AMQP configuration" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__active +msgid "Active" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_exchange +msgid "Amqp Exchange" +msgstr "" + +#. module: iot_amqp +#: model:ir.actions.act_window,name:iot_amqp.iot_amqp_host_act_window +#: model:ir.model,name:iot_amqp.model_iot_amqp_host +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_host_id +msgid "Amqp Host" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_payload +msgid "Amqp Payload" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_device_output__amqp_routing_key +msgid "Amqp Routing Key" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__connection +msgid "Connection" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__create_date +msgid "Created on" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_amqp +#: code:addons/iot_amqp/models/iot_device_output.py:23 +#, python-format +msgid "Exchange is required" +msgstr "" + +#. module: iot_amqp +#: code:addons/iot_amqp/models/iot_device_output.py:31 +#, python-format +msgid "Host is required" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__id +msgid "ID" +msgstr "" + +#. module: iot_amqp +#: model:ir.model,name:iot_amqp.model_iot_device_output_action +msgid "IoT Action" +msgstr "" + +#. module: iot_amqp +#: model:ir.model,name:iot_amqp.model_iot_device_output +msgid "IoT Device" +msgstr "" + +#. module: iot_amqp +#: model:ir.model,name:iot_amqp.model_iot_system_action +msgid "IoT System.action" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_amqp +#: model:ir.model.fields,field_description:iot_amqp.field_iot_amqp_host__name +msgid "Name" +msgstr "" + +#. module: iot_amqp +#: code:addons/iot_amqp/models/iot_device_output.py:27 +#, python-format +msgid "Routing Key is required" +msgstr "" + +#. module: iot_amqp +#: model_terms:ir.ui.view,arch_db:iot_amqp.iot_device_output_form +msgid "Run" +msgstr "" + +#. module: iot_amqp +#: model_terms:ir.ui.view,arch_db:iot_amqp.iot_amqp_host_form_view +msgid "amqp://USER:PASS@HOST" +msgstr "" + diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp_oca.pot b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp_oca.pot new file mode 100644 index 0000000..c181b97 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/iot_amqp_oca.pot @@ -0,0 +1,142 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_amqp_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_amqp_oca +#: model:ir.ui.menu,name:iot_amqp_oca.iot_amqp_host_menu +msgid "AMQP Hosts" +msgstr "" + +#. module: iot_amqp_oca +#: model_terms:ir.ui.view,arch_db:iot_amqp_oca.iot_device_output_form +msgid "AMQP configuration" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__active +msgid "Active" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_exchange +msgid "Amqp Exchange" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.actions.act_window,name:iot_amqp_oca.iot_amqp_host_act_window +#: model:ir.model,name:iot_amqp_oca.model_iot_amqp_host +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_host_id +msgid "Amqp Host" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_payload +msgid "Amqp Payload" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_routing_key +msgid "Amqp Routing Key" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__connection +msgid "Connection" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__create_date +msgid "Created on" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_amqp_oca +#. odoo-python +#: code:addons/iot_amqp_oca/models/iot_device_output.py:0 +#, python-format +msgid "Exchange is required" +msgstr "" + +#. module: iot_amqp_oca +#. odoo-python +#: code:addons/iot_amqp_oca/models/iot_device_output.py:0 +#, python-format +msgid "Host is required" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__id +msgid "ID" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model,name:iot_amqp_oca.model_iot_device_output_action +msgid "IoT Action" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model,name:iot_amqp_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model,name:iot_amqp_oca.model_iot_device_output +msgid "IoT Device" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__name +msgid "Name" +msgstr "" + +#. module: iot_amqp_oca +#. odoo-python +#: code:addons/iot_amqp_oca/models/iot_device_output.py:0 +#, python-format +msgid "Routing Key is required" +msgstr "" + +#. module: iot_amqp_oca +#: model_terms:ir.ui.view,arch_db:iot_amqp_oca.iot_device_output_form +msgid "Run" +msgstr "" + +#. module: iot_amqp_oca +#: model_terms:ir.ui.view,arch_db:iot_amqp_oca.iot_amqp_host_form_view +msgid "amqp://USER:PASS@HOST" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/it.po b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/it.po new file mode 100644 index 0000000..261e265 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/i18n/it.po @@ -0,0 +1,145 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_amqp_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-12 12:09+0000\n" +"Last-Translator: Francesco Foresti \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_amqp_oca +#: model:ir.ui.menu,name:iot_amqp_oca.iot_amqp_host_menu +msgid "AMQP Hosts" +msgstr "Host AMQP" + +#. module: iot_amqp_oca +#: model_terms:ir.ui.view,arch_db:iot_amqp_oca.iot_device_output_form +msgid "AMQP configuration" +msgstr "Configurazione AMQP" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__active +msgid "Active" +msgstr "Attivo" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_exchange +msgid "Amqp Exchange" +msgstr "Comunicazione AMQP" + +#. module: iot_amqp_oca +#: model:ir.actions.act_window,name:iot_amqp_oca.iot_amqp_host_act_window +#: model:ir.model,name:iot_amqp_oca.model_iot_amqp_host +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_host_id +msgid "Amqp Host" +msgstr "Host AMQP" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_payload +msgid "Amqp Payload" +msgstr "Contenuto AMQP" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_device_output__amqp_routing_key +msgid "Amqp Routing Key" +msgstr "Chiave instradamento AMQP" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__connection +msgid "Connection" +msgstr "Connessione" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: iot_amqp_oca +#. odoo-python +#: code:addons/iot_amqp_oca/models/iot_device_output.py:0 +#, python-format +msgid "Exchange is required" +msgstr "Richiesta comunicazione" + +#. module: iot_amqp_oca +#. odoo-python +#: code:addons/iot_amqp_oca/models/iot_device_output.py:0 +#, python-format +msgid "Host is required" +msgstr "Richiesto host" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__id +msgid "ID" +msgstr "ID" + +#. module: iot_amqp_oca +#: model:ir.model,name:iot_amqp_oca.model_iot_device_output_action +msgid "IoT Action" +msgstr "Azione IoT" + +#. module: iot_amqp_oca +#: model:ir.model,name:iot_amqp_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "Azione sisterma comunicazione IoT" + +#. module: iot_amqp_oca +#: model:ir.model,name:iot_amqp_oca.model_iot_device_output +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: iot_amqp_oca +#: model:ir.model.fields,field_description:iot_amqp_oca.field_iot_amqp_host__name +msgid "Name" +msgstr "Nome" + +#. module: iot_amqp_oca +#. odoo-python +#: code:addons/iot_amqp_oca/models/iot_device_output.py:0 +#, python-format +msgid "Routing Key is required" +msgstr "Richiesta chiave instradamento" + +#. module: iot_amqp_oca +#: model_terms:ir.ui.view,arch_db:iot_amqp_oca.iot_device_output_form +msgid "Run" +msgstr "Esegui" + +#. module: iot_amqp_oca +#: model_terms:ir.ui.view,arch_db:iot_amqp_oca.iot_amqp_host_form_view +msgid "amqp://USER:PASS@HOST" +msgstr "amqp://USER:PASS@HOST" diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/__init__.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/__init__.py new file mode 100644 index 0000000..f9e86be --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/__init__.py @@ -0,0 +1,4 @@ +from . import iot_amqp_host +from . import iot_device_output +from . import iot_communication_system_action +from . import iot_device_output_action diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_amqp_host.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_amqp_host.py new file mode 100644 index 0000000..eaa617d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_amqp_host.py @@ -0,0 +1,13 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IotAmqpHost(models.Model): + _name = "iot.amqp.host" + _description = "Amqp Host" + + name = fields.Char(required=True) + connection = fields.Char() + active = fields.Boolean(default=True) diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_communication_system_action.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_communication_system_action.py new file mode 100644 index 0000000..d888ed3 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_communication_system_action.py @@ -0,0 +1,10 @@ +from odoo import models + + +class IoTCommunicationSystemAction(models.Model): + _inherit = "iot.communication.system.action" + + def _run(self, device_action): + if self != self.env.ref("iot_amqp_oca.amqp_action"): + return super()._run(device_action) + device_action._run_amqp() diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output.py new file mode 100644 index 0000000..4409b91 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output.py @@ -0,0 +1,27 @@ +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class IotDeviceOutput(models.Model): + _inherit = "iot.device.output" + + amqp_exchange = fields.Char() + amqp_routing_key = fields.Char() + amqp_payload = fields.Char() + amqp_host_id = fields.Many2one( + "iot.amqp.host", + ) + + @api.constrains( + "amqp_exchange", "amqp_routing_key", "amqp_host_id", "communication_system_id" + ) + def _check_amqp(self): + amqp_system = self.env.ref("iot_amqp_oca.amqp_system") + for rec in self: + if rec.communication_system_id == amqp_system: + if not rec.amqp_exchange: + raise ValidationError(_("Exchange is required")) + if not rec.amqp_routing_key: + raise ValidationError(_("Routing Key is required")) + if not rec.amqp_host_id: + raise ValidationError(_("Host is required")) diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output_action.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output_action.py new file mode 100644 index 0000000..dbf0583 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/models/iot_device_output_action.py @@ -0,0 +1,33 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging + +from odoo import models + +_logger = logging.getLogger(__name__) +try: + from pika import BlockingConnection, URLParameters, spec +except (ImportError, IOError) as err: + _logger.debug(err) + + +class IotDeviceOutputAction(models.Model): + _inherit = "iot.device.output.action" + + def _run_amqp(self): + url = self.output_id.amqp_host_id.connection + connection = BlockingConnection(URLParameters(url)) + channel = connection.channel() + result = channel.basic_publish(**self._generate_amqp_data()) + _logger.debug(result) + connection.close() + + def _generate_amqp_data(self): + return { + "exchange": self.output_id.amqp_exchange, + "routing_key": self.output_id.amqp_routing_key, + "body": self.output_id.amqp_payload, + "properties": spec.BasicProperties(), + "mandatory": False, + } diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..93ec993 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Enric Tobella diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/DESCRIPTION.rst b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/DESCRIPTION.rst new file mode 100644 index 0000000..f291b3f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This addon defines AMQP as an integration option with a device. + +With AMQP, we will send and AMQP message to a broker that will send it to the +device. +Then, the device will do the expected action. diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/security/ir.model.access.csv b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/security/ir.model.access.csv new file mode 100644 index 0000000..e5d8a4a --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_iot_amqp_host,access_iot_amqp_host,model_iot_amqp_host,iot_oca.group_iot_user,1,0,0,0 +manage_iot_amqp_host,manage_iot_amqp_host,model_iot_amqp_host,iot_oca.group_iot_manager,1,1,1,0 diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/icon.png b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..da43f6f07766d54a65259a14a0688ace6b65ccf0 GIT binary patch literal 4151 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+*pj^6T^Rm@;DWu&Co?cG za29w(7BevLUI$@DCym(^3=9nHC7!;n?2p)m*cEkB5^Pp5Fz_Goba4!+xb-$RGeRW% zTHWkg_m~^zjs^;WV#*6R@)~y>T_MPR@xhU&#^FBpi1Aabwrvv&R_w!ki86T;rYFe^eqNt8ve) zpb~G5n)n*lFtuk7IDfPlnl>N4;-}Dl_~0eO%>rguS_emK-{b9D7scJ^;XnVzG3@C2 z7Ta9mhWUHd(|+|GpLXKu1h1tJ3M{<(w|=jZva{OVZm>eP+u^*U-;b0}@gED1EK=`h z2o;bwlTW{YkGEW!{m>$=3)lIJZ#o_Cyp*&}@sP4Wn%c4~>C5+W6yB_5TRi8u>*f!F ziIdmLJve>hyTC)+sI^a+8+NXgy!WBk;mQYrLn_g%1}F1G!hE|f-uRKGw(N%GTU(d@ zs;L`JnlVaj_uf!^Eh~y=rj^Z<4JXwYJ)&JYKKC|VRNLuYvcOFeg9Wa@bYXD ze#|ssTSvm>Rs8Yn{5+esEj&A;@ZI8&KD`cxD-QdX?BZS9>sz6lqO|r{%dUMq>Z=u7 zLYJ{z@U~+~Iy28eRBv0~7OBT}7X;ri%W|&v;dqewiLqhPuFUe|(~hM{WTd%9ERANU zSCeOOa$|9fkDqVmT(x~#ZO&cJ)g@dD^gl5+-1mEbE@u7qmv6)-w<^RkO>nhikdT%% z6q+)*Y-7qx^0 z!b~+8Do?O8$nBRj<$slF>h@!Y@Yh^^&egMo8umP4e&PA}*H^2vi3==GU0?S2@P~*) zYj&|N;P|=sgx;CNBP-rs4tx0MQ|*TBGAsTpR*pZ6BvYz&i{<`k378-=NE=Q$kiKKZ`L`%deb)z2?#WjKd?U|D*6p$69>KfxWmTfNk0^O(su zh%PKv5a}-1{Hk1u!FTe1lOk`f31uJID|S~LIC6p`?bxy+cMhRWmXr5o4<4(3cVyR- zTmy5%!#Ae8YuD-q?>UyxXNW8O*4iKI&$(x9EAJVe>UI7ss6a zzdPLLGkjTWvt*Y;oqijSM9bso$%cjnYrGz7MAu{`XLW9GT9*9ogeOPY*WkRlA+bF@ zi%whoy50Yv`kp8R#PSn}m5s#(hW z^c7WNY+7We^RKq&xl+9K)}qx+8C6%Brkq*4!NAmgh0w#K_6U~Kyqji6{IITi{A7`A zgoH)t;@aLX7F9DINVa&qPY}6s*Dbl)_#;D?l9B?;aeME!yAD6O+~1j9J&=FBX6F3k zEG`c(?CF)7{q_83HgCV$K4DgSLH-3CtE93gPWi`cBNH3HLw0U_bl-yYVkhI`TmG{C zepYkF!`#@mPww7_*$v;$@jVF>7iQG3sy13b&%H8~by@#h9_Hrs*-Nh4R&^ZFb`QK# z;IH_ceyi$J`S?y)ag-Sj_D@awVmtqowDbi+s6$&F@OCe?@PE@4S3rov2b>$<<`*w&~L1r(xpC zHkFpf*$q1~FIvp~!Mm)@uW9GXnNEv1zw;lQG}ADn>d5i>chd~S^~$(EoL^*|VffdoQ<)z4#E%Xy~8vB>={S%2#UJ4oZ>8_TOBUH5HqZ81$w zj_|MR*S>ySO7)fEmnn09uKM@o)^jcEBC~IG6AnmyS{rRqk$%i+ZD(Fs%elthl}poD z16Go+9QU~GO-1@%CvGp_ z3H*%``F?X2mR8FYyZc?5!*K1`x+&IYf?2njHE%R4Q(gST`nHwA5&eMIECO#{v8QK8 zpXErnsq?E#?`oYM>k0O%BHpc{k8PQr{9AV?pJ%42UDvdm|F?+0*caz~dS}lxcALq< zmdCEgXS06j+PwbGez8+;8P)pvn%6B_KgUD9Jb&%h3zV2Xoh)yc~+VXU5irenzo2;6Ek}y?(lwn)vmVVcWbAwn=LszYpw6z z%;#DCOeLRw>QDTV{rjmH!`)u_%-Om|Rbm{ww`>m!_^~7SFVl(@t1sPkO^|=^arTyL zYOZk`G`BN+$`^mRgyD?uuX{z$%&ugu^$q>Q_LaNg-L(8IoDRqG`BLv#M`Z`!WL|gY z{?uyq4_~&4T`$#x#}*GiLdme$;V1-zh1}XtDXmY1bR(JgQl%Y`=Y1#KJ8Gtt=N5g_8dMla(?D zkv-{L%nnu8BG(E#xLr&=`-b_;qZ2zPdz`aaW5_(onD6n4os-w>nCX6Q?xdZeXWRmW zxZLZ12Z9QkA9rULJbLc4RT@O588xRi+`rfLcc%LmHwI1f{lPmHwp@xn*uCx8>Z`&k z=`zO_t^K%W_sZRU%QITV7pRErI}=v(a7|F+iJxDPt$MpY!8x^M~(` zPl~8azHP-a!9#V1gh}63rW;ic70yk)AMnE>NUCk#r42VuSpInRgmLEG6YG}GNz3g^ z(EDEAviwhf(D6(0GEtFD-sbB!t+UwjE|EEJs#wy!wtd-enD+dgQ2apW^`#@4U59SO z7HT{R-{j12t7+e^&eD#Sis$v$AMWU3eb;p2riEAe*Gt?Req3Oivt#zsFCYJ|a&*yO zq`tpz&63~`MUubT|4U0sDc!MWNxfseBf9wi%*S=>HQb}y873YST(jZv;>qz30!~^^ zJ@z78&f#9)BGswe4PUL*)UU}g@cno156{%&ioT0d7Q9PjzLVBJ@#oK`6E}aP9nQOT zokheo@#I7Q(4yae{TMn|nfU2}7+nK@yos;=@Ll?NN|>1@_gr7DSlPWIM^{E_ zO^lB#RxBySq)qRZ;VAcEvH*jFy_YUl?9xiS1Q?t6=x% zcsiGSda@-$;pJx!&vqJ5sWW*Z@?6>WwNBq0Yu0@sKkm$OQ);kpE!W!K{oGu+?6g+Q zzqf6tu0PIs-B9pfpy%V)_Ws@GcVy=zW*h(TJlnXzn?-Iv=bg5wDTVJJgk>sj;w}z2 z{rmr%ec~cpUbQgX_;RQtc>1}7kK6b!sJ=^zJ8Lq5Ut@ys3eFABrW*Dijo9=z-=a`) zvh2DZwNH|t84kzVe!TiS`l0m|?lLpyUpY5#iK_^4eoK{ctGX6>N8{Atb5o^1JZuux ziuEo_%8fuSf806^8OtY)!13TJAShNZM%lu&D>>scXJvaR+8L*zWNg1 zA^kEX#rfx4A4~~9mYf!$qI2eqsoh!XsCQ-R_B!niHc$$44JioW^RE5$EndLh(( z@L@rQ`HIb}yC;6mQvN9=%5b+=b?K#f^G$qudguS~J&_*3V5z$QVpQnqhXo2#y#mYr z>nX-7GDb*brX#<|vWnCWvgP1Pq%~N}_Igo+j!@uy^g{uG6TIRlbd+@%ZkkaQ@mAAxa?{czpNN%4X z?OIu|wfs-XO1|-{=K5xSHEvOo`3Afg2D-2OSN=w zd|M*x5_2eP3)d}SW;fX`-_uzL4SgwVnz0`A@Pl zF!ya_d~hk)NAW4=Z~31xd|zzX8lA W4WBV~?P6eHVDNPHb6Mw<&;$Tn=gY1D literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/index.html b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/index.html new file mode 100644 index 0000000..0878bcc --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/index.html @@ -0,0 +1,426 @@ + + + + + +IoT AMQP + + + +
+

IoT AMQP

+ + +

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

+

This addon defines AMQP as an integration option with a device.

+

With AMQP, we will send and AMQP message to a broker that will send it to the +device. +Then, the device will do the expected action.

+

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 to smash 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/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/__init__.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/__init__.py new file mode 100644 index 0000000..75c86ab --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/__init__.py @@ -0,0 +1,4 @@ +from . import test_amqp +from odoo.addons.iot_output_oca.tests import test_iot + +# We want to test original tests in order to ensure that all works as expected diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/test_amqp.py b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/test_amqp.py new file mode 100644 index 0000000..0288247 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/tests/test_amqp.py @@ -0,0 +1,84 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from unittest.mock import patch + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestChannel: + def __init__(self, test, output, *args, **kwargs): + self.test = test + self.output = output + self.kwargs = kwargs + self.args = args + + def basic_publish( + self, exchange, routing_key, body, properties=None, mandatory=False + ): + self.test.assertEqual(exchange, self.output.amqp_exchange) + self.test.assertEqual(routing_key, self.output.amqp_routing_key) + self.test.assertEqual(body, self.output.amqp_payload) + + +class TestBlockingConnection: + def __init__(self, test, output, *args, **kwargs): + self.test = test + self.output = output + self.kwargs = kwargs + self.args = args + + def connect(self, hostname, port, username, password): + return + + def channel(self): + return TestChannel(self.test, self.output, *self.args, **self.kwargs) + + def close(self): + pass + + +class TestAmqp(TransactionCase): + def setUp(self): + super().setUp() + self.host = self.env["iot.amqp.host"].create( + {"name": "Host", "connection": "amqp://demo_connection"} + ) + self.device = self.env["iot.device"].create({"name": "Device"}) + self.system = self.env.ref("iot_amqp_oca.amqp_system") + self.action = self.env.ref("iot_amqp_oca.amqp_action") + self.output = self.env["iot.device.output"].create( + { + "communication_system_id": self.system.id, + "device_id": self.device.id, + "name": "Output", + "amqp_exchange": "EXCHANGE", + "amqp_routing_key": "ROUTING_KEY", + "amqp_host_id": self.host.id, + "amqp_payload": "PAYLOAD", + } + ) + + def test_constrain_01(self): + with self.assertRaises(ValidationError): + self.output.amqp_exchange = False + + def test_constrain_02(self): + with self.assertRaises(ValidationError): + self.output.amqp_routing_key = False + + def test_constrain_03(self): + with self.assertRaises(ValidationError): + self.output.amqp_host_id = False + + def test_amqp(self): + with patch( + "odoo.addons.iot_amqp_oca.models." + "iot_device_output_action.BlockingConnection" + ) as mock: + mock.return_value = TestBlockingConnection(self, self.output) + self.output.with_context( + iot_communication_system_action_id=self.action.id + ).device_run_action() + mock.assert_called() diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_amqp_host.xml b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_amqp_host.xml new file mode 100644 index 0000000..562f651 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_amqp_host.xml @@ -0,0 +1,53 @@ + + + + + iot.amqp.host.form (in iot_amqp) + iot.amqp.host + +
+
+ + + + + + +
+ + + + + iot.amqp.host.search (in iot_amqp) + iot.amqp.host + + + + + + + + iot.amqp.host.tree (in iot_amqp) + iot.amqp.host + + + + + + + + Amqp Host + iot.amqp.host + tree,form + [] + {} + + + diff --git a/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_device_output_views.xml b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_device_output_views.xml new file mode 100644 index 0000000..11d5dcf --- /dev/null +++ b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/views/iot_device_output_views.xml @@ -0,0 +1,44 @@ + + + + iot.device.output.form + iot.device.output + + + + + + + + + + + + + + + + + iot.device.kanban + iot.device + + + + + + Inputs + + + + + diff --git a/odoo-bringout-oca-iot-iot_input_oca/pyproject.toml b/odoo-bringout-oca-iot-iot_input_oca/pyproject.toml new file mode 100644 index 0000000..0a0056d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_input_oca/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-iot-iot_input_oca" +version = "16.0.0" +description = "IoT Input - IoT Input module" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-iot-iot_oca>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["iot_input_oca"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/README.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/README.md new file mode 100644 index 0000000..e1412e7 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/README.md @@ -0,0 +1,45 @@ +# IoT Key Employee RFID + +Odoo addon: iot_key_employee_rfid + +## Installation + +```bash +pip install odoo-bringout-oca-iot-iot_key_employee_rfid +``` + +## Dependencies + +This addon depends on: +- hr_attendance_rfid +- iot_rule + +## Manifest Information + +- **Name**: IoT Key Employee RFID +- **Version**: 16.0.1.0.0 +- **Category**: N/A +- **License**: AGPL-3 +- **Installable**: False + +## Source + +Based on [OCA/iot](https://github.com/OCA/iot) branch 16.0, addon `iot_key_employee_rfid`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/ARCHITECTURE.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/ARCHITECTURE.md new file mode 100644 index 0000000..3e9f9b4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Iot_key_employee_rfid Module - iot_key_employee_rfid + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONFIGURATION.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONFIGURATION.md new file mode 100644 index 0000000..6246957 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for iot_key_employee_rfid. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONTROLLERS.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/DEPENDENCIES.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/DEPENDENCIES.md new file mode 100644 index 0000000..f0a11f1 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/DEPENDENCIES.md @@ -0,0 +1,6 @@ +# Dependencies + +This addon depends on: + +- [hr_attendance_rfid](https://github.com/bringout/oca-technical) +- [iot_rule](https://github.com/bringout/oca-technical) diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/FAQ.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/FAQ.md new file mode 100644 index 0000000..92cb913 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon iot_key_employee_rfid or install in UI. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/INSTALL.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/INSTALL.md new file mode 100644 index 0000000..ff56190 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-iot-iot_key_employee_rfid" +# or +uv pip install odoo-bringout-oca-iot-iot_key_employee_rfid" +``` diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/MODELS.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/MODELS.md new file mode 100644 index 0000000..04d5b87 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/MODELS.md @@ -0,0 +1,13 @@ +# Models + +Detected core models and extensions in iot_key_employee_rfid. + +```mermaid +classDiagram + class hr_employee + class iot_key +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/OVERVIEW.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/OVERVIEW.md new file mode 100644 index 0000000..8e8e070 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: iot_key_employee_rfid. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon iot_key_employee_rfid +- License: LGPL-3 diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/REPORTS.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/SECURITY.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/USAGE.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/USAGE.md new file mode 100644 index 0000000..5902fc0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon iot_key_employee_rfid +``` diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/WIZARDS.md b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/README.rst b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/README.rst new file mode 100644 index 0000000..fdd03b4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/README.rst @@ -0,0 +1,78 @@ +===================== +IoT Key Employee RFID +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f050534fb0fe825ed9eb152a71240158b02f1d0c75d760526df54bfeccbb1c22 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/16.0/iot_key_employee_rfid + :alt: OCA/iot +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/iot-16-0/iot-16-0-iot_key_employee_rfid + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/iot&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon allows the use of an RFID Card as an IoT Key. + +**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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* CreuBlanca + +Contributors +~~~~~~~~~~~~ + +* Enric Tobella +* Luis Burrel +* Aaron Henriquez + +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/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__init__.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__manifest__.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__manifest__.py new file mode 100644 index 0000000..b42b248 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/__manifest__.py @@ -0,0 +1,14 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "IoT Key Employee RFID", + "summary": """ + Use an Employee RFID Card as an IoT Key""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "CreuBlanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/iot", + "depends": ["hr_attendance_rfid", "iot_rule"], + "data": ["views/hr_employee.xml"], +} diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/bs.po b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/bs.po new file mode 100644 index 0000000..cc2ed85 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/bs.po @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_key_employee_rfid +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_key_employee_rfid +#. odoo-python +#: code:addons/iot_key_employee_rfid/models/hr_employee.py:0 +#, python-format +msgid "%s / RFID" +msgstr "%s / RFID" + +#. module: iot_key_employee_rfid +#: model:ir.model,name:iot_key_employee_rfid.model_hr_employee +msgid "Employee" +msgstr "Zaposleni" + +#. module: iot_key_employee_rfid +#: model_terms:ir.ui.view,arch_db:iot_key_employee_rfid.hr_employee_form_view +msgid "Generate IoT Key for this RFID Card" +msgstr "Generiraj IoT ključ za ovu RFID karticu" + +#. module: iot_key_employee_rfid +#: model:ir.model,name:iot_key_employee_rfid.model_iot_key +msgid "IoT Key" +msgstr "IoT ključ" + +#. module: iot_key_employee_rfid +#: model_terms:ir.ui.view,arch_db:iot_key_employee_rfid.hr_employee_form_view +msgid "IoT Key for the RFID Card" +msgstr "IoT ključ za RFID karticu" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_ids +msgid "IoT Keys" +msgstr "IoT ključevi" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__rule_ids +msgid "IoT Rules" +msgstr "IoT pravila" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_id +msgid "Iot Key" +msgstr "IoT ključ" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_count +msgid "Iot Key Count" +msgstr "Broj IoT ključeva" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__rfid_card_code +msgid "RFID Card Code" +msgstr "Kod RFID kartice" diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/iot_key_employee_rfid.pot b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/iot_key_employee_rfid.pot new file mode 100644 index 0000000..f30cee4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/iot_key_employee_rfid.pot @@ -0,0 +1,66 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_key_employee_rfid +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_key_employee_rfid +#. odoo-python +#: code:addons/iot_key_employee_rfid/models/hr_employee.py:0 +#, python-format +msgid "%s / RFID" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model,name:iot_key_employee_rfid.model_hr_employee +msgid "Employee" +msgstr "" + +#. module: iot_key_employee_rfid +#: model_terms:ir.ui.view,arch_db:iot_key_employee_rfid.hr_employee_form_view +msgid "Generate IoT Key for this RFID Card" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model,name:iot_key_employee_rfid.model_iot_key +msgid "IoT Key" +msgstr "" + +#. module: iot_key_employee_rfid +#: model_terms:ir.ui.view,arch_db:iot_key_employee_rfid.hr_employee_form_view +msgid "IoT Key for the RFID Card" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_ids +msgid "IoT Keys" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__rule_ids +msgid "IoT Rules" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_id +msgid "Iot Key" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_count +msgid "Iot Key Count" +msgstr "" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__rfid_card_code +msgid "RFID Card Code" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/it.po b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/it.po new file mode 100644 index 0000000..66eb8af --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/i18n/it.po @@ -0,0 +1,86 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_key_employee_rfid +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-04 15:10+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_key_employee_rfid +#: code:addons/iot_key_employee_rfid/models/hr_employee.py:0 +#, python-format +msgid "%s / RFID" +msgstr "%s /RFID" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__display_name +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_iot_key__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: iot_key_employee_rfid +#: model:ir.model,name:iot_key_employee_rfid.model_hr_employee +msgid "Employee" +msgstr "Dipendente" + +#. module: iot_key_employee_rfid +#: model_terms:ir.ui.view,arch_db:iot_key_employee_rfid.hr_employee_form_view +msgid "Generate IoT Key for this RFID Card" +msgstr "Genera chiave IoT per questa scheda RFID" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__id +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_iot_key__id +msgid "ID" +msgstr "ID" + +#. module: iot_key_employee_rfid +#: model:ir.model,name:iot_key_employee_rfid.model_iot_key +msgid "IoT Key" +msgstr "Chiave IoT" + +#. module: iot_key_employee_rfid +#: model_terms:ir.ui.view,arch_db:iot_key_employee_rfid.hr_employee_form_view +msgid "IoT Key for the RFID Card" +msgstr "Chiave IoT per la scheda RFID" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_ids +msgid "IoT Keys" +msgstr "Chiavi IoT" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__rule_ids +msgid "IoT Rules" +msgstr "Regole IoT" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_id +msgid "Iot Key" +msgstr "Chiave IoT" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__iot_key_count +msgid "Iot Key Count" +msgstr "Conteggio chiave IoT" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee____last_update +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_iot_key____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: iot_key_employee_rfid +#: model:ir.model.fields,field_description:iot_key_employee_rfid.field_hr_employee__rfid_card_code +msgid "RFID Card Code" +msgstr "Codice tesserino RFID" diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/__init__.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/__init__.py new file mode 100644 index 0000000..536d6a0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/__init__.py @@ -0,0 +1,2 @@ +from . import hr_employee +from . import iot_key diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/hr_employee.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/hr_employee.py new file mode 100644 index 0000000..713cbc0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/hr_employee.py @@ -0,0 +1,65 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models + + +class HrEmployee(models.Model): + _name = "hr.employee" + _inherit = ["hr.employee", "iot.key.mixin"] + + iot_key_id = fields.Many2one( + "iot.key", compute="_compute_iot_key", search="_search_iot_key" + ) + iot_key_ids = fields.One2many(context={"active_test": False}, string="IoT Keys") + rule_ids = fields.Many2many( + "iot.rule", + related="iot_key_id.rule_ids", + readonly=False, + string="IoT Rules", + ) + rfid_card_code = fields.Char( + store=True, + compute="_compute_rfid_card_code", + inverse="_inverse_rfid_card_code", + ) + + @api.model + def _search_iot_key(self, operator, value): + if operator not in ["=", "!=", "in", "not in"]: + raise ValueError("Operator not supported for iot_key_id search") + employees = self.search([("iot_key_ids", operator, value)]) + return [("id", "in", employees.ids)] + + @api.depends("iot_key_ids.unique_virtual_key", "iot_key_ids") + def _compute_rfid_card_code(self): + for record in self: + if record.iot_key_ids: + record.rfid_card_code = record.iot_key_ids.unique_virtual_key + + def _inverse_rfid_card_code(self): + for record in self: + if record.iot_key_ids: + record.iot_key_ids.unique_virtual_key = record.rfid_card_code + + @api.depends("iot_key_ids") + def _compute_iot_key(self): + for record in self: + record.iot_key_id = record.iot_key_ids[:1] if record.iot_key_ids else False + + def _generate_iot_key_vals(self): + return { + "unique_virtual_key": self.rfid_card_code, + "name": _("%s / RFID") % self.display_name, + "key_type": "RFID", + "res_id": self.id, + "res_model": self._name, + } + + def generate_iot_key(self): + self.ensure_one() + if not self.iot_key_id and self.rfid_card_code: + self.env["iot.key"].create(self._generate_iot_key_vals()) + self.invalidate_recordset() + self._compute_rfid_card_code() + return {} diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/iot_key.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/iot_key.py new file mode 100644 index 0000000..14cc628 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/models/iot_key.py @@ -0,0 +1,14 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class IotKey(models.Model): + _inherit = "iot.key" + + @api.model + def _get_unique_key_models(self): + res = super(IotKey, self)._get_unique_key_models() + res.append("hr.employee") + return res diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..21c844e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Enric Tobella +* Luis Burrel +* Aaron Henriquez diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/DESCRIPTION.rst b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/DESCRIPTION.rst new file mode 100644 index 0000000..720b8a2 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This addon allows the use of an RFID Card as an IoT Key. diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/icon.png b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/index.html b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/index.html new file mode 100644 index 0000000..77a817a --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/index.html @@ -0,0 +1,425 @@ + + + + + +IoT Key Employee RFID + + + +
+

IoT Key Employee RFID

+ + +

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

+

This addon allows the use of an RFID Card as an IoT Key.

+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • CreuBlanca
  • +
+
+
+

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/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/__init__.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/__init__.py new file mode 100644 index 0000000..97b9f87 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/__init__.py @@ -0,0 +1 @@ +from . import test_employee_rfid diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/test_employee_rfid.py b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/test_employee_rfid.py new file mode 100644 index 0000000..355759e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/tests/test_employee_rfid.py @@ -0,0 +1,42 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import uuid + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestEmployeeRfid(TransactionCase): + def setUp(self): + super(TestEmployeeRfid, self).setUp() + self.employee = self.env["hr.employee"].create({"name": "Employee"}) + + def test_generate(self): + self.employee.write({"rfid_card_code": "1235"}) + self.assertFalse(self.employee.iot_key_id) + self.employee.generate_iot_key() + self.employee.invalidate_recordset() + self.assertTrue(self.employee.iot_key_id) + self.assertEqual( + self.employee.iot_key_id.unique_virtual_key, + self.employee.rfid_card_code, + ) + + self.employee.write({"rfid_card_code": "125466"}) + self.assertEqual( + self.employee.iot_key_id.unique_virtual_key, + self.employee.rfid_card_code, + ) + + def test_unique_constrain(self): + self.employee.write({"rfid_card_code": "1235"}) + self.employee.generate_iot_key() + with self.assertRaises(ValidationError): + self.env["iot.key"].create( + { + "unique_virtual_key": uuid.uuid4(), + "res_model": self.employee._name, + "res_id": self.employee.id, + } + ) diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/views/hr_employee.xml b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/views/hr_employee.xml new file mode 100644 index 0000000..451513f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/views/hr_employee.xml @@ -0,0 +1,38 @@ + + + + + hr.employee.form (in iot_key_employee_rfid) + hr.employee + + +
+
+ + + + + + +
+
diff --git a/odoo-bringout-oca-iot-iot_key_employee_rfid/pyproject.toml b/odoo-bringout-oca-iot-iot_key_employee_rfid/pyproject.toml new file mode 100644 index 0000000..1138439 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_key_employee_rfid/pyproject.toml @@ -0,0 +1,44 @@ +[project] +name = "odoo-bringout-oca-iot-iot_key_employee_rfid" +version = "16.0.0" +description = "IoT Key Employee RFID - + Use an Employee RFID Card as an IoT Key" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-iot-hr_attendance_rfid>=16.0.0", + "odoo-bringout-oca-iot-iot_rule>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["iot_key_employee_rfid"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-iot-iot_oca/README.md b/odoo-bringout-oca-iot-iot_oca/README.md new file mode 100644 index 0000000..7dfd9f4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/README.md @@ -0,0 +1,44 @@ +# IoT Base + +Odoo addon: iot_oca + +## Installation + +```bash +pip install odoo-bringout-oca-iot-iot_oca +``` + +## Dependencies + +This addon depends on: +- base + +## Manifest Information + +- **Name**: IoT Base +- **Version**: 16.0.1.0.1 +- **Category**: IoT +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/iot](https://github.com/OCA/iot) branch 16.0, addon `iot_oca`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-iot-iot_oca/doc/ARCHITECTURE.md b/odoo-bringout-oca-iot-iot_oca/doc/ARCHITECTURE.md new file mode 100644 index 0000000..4c062e4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Iot_oca Module - iot_oca + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/CONFIGURATION.md b/odoo-bringout-oca-iot-iot_oca/doc/CONFIGURATION.md new file mode 100644 index 0000000..82bd0a4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for iot_oca. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/CONTROLLERS.md b/odoo-bringout-oca-iot-iot_oca/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/DEPENDENCIES.md b/odoo-bringout-oca-iot-iot_oca/doc/DEPENDENCIES.md new file mode 100644 index 0000000..e3a0a5c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- base diff --git a/odoo-bringout-oca-iot-iot_oca/doc/FAQ.md b/odoo-bringout-oca-iot-iot_oca/doc/FAQ.md new file mode 100644 index 0000000..3bdb2ce --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon iot_oca or install in UI. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/INSTALL.md b/odoo-bringout-oca-iot-iot_oca/doc/INSTALL.md new file mode 100644 index 0000000..c714fd7 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-iot-iot_oca" +# or +uv pip install odoo-bringout-oca-iot-iot_oca" +``` diff --git a/odoo-bringout-oca-iot-iot_oca/doc/MODELS.md b/odoo-bringout-oca-iot-iot_oca/doc/MODELS.md new file mode 100644 index 0000000..1e1fab4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/MODELS.md @@ -0,0 +1,18 @@ +# Models + +Detected core models and extensions in iot_oca. + +```mermaid +classDiagram + class iot_communication_system + class iot_communication_system_action + class iot_device + class iot_device_action + class iot_device_group + class iot_device_tag + class image_mixin +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/OVERVIEW.md b/odoo-bringout-oca-iot-iot_oca/doc/OVERVIEW.md new file mode 100644 index 0000000..18eb1a4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: iot_oca. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon iot_oca +- License: LGPL-3 diff --git a/odoo-bringout-oca-iot-iot_oca/doc/REPORTS.md b/odoo-bringout-oca-iot-iot_oca/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/SECURITY.md b/odoo-bringout-oca-iot-iot_oca/doc/SECURITY.md new file mode 100644 index 0000000..24da04d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/SECURITY.md @@ -0,0 +1,42 @@ +# Security + +Access control and security definitions in iot_oca. + +## Access Control Lists (ACLs) + +Model access permissions defined in: +- **[ir.model.access.csv](../iot_oca/security/ir.model.access.csv)** + - 12 model access rules + +## Record Rules + +Row-level security rules defined in: + +## Security Groups & Configuration + +Security groups and permissions defined in: +- **[iot_security.xml](../iot_oca/security/iot_security.xml)** + - 2 security groups defined + +```mermaid +graph TB + subgraph "Security Layers" + A[Users] --> B[Groups] + B --> C[Access Control Lists] + C --> D[Models] + B --> E[Record Rules] + E --> F[Individual Records] + end +``` + +Security files overview: +- **[iot_security.xml](../iot_oca/security/iot_security.xml)** + - Security groups, categories, and XML-based rules +- **[ir.model.access.csv](../iot_oca/security/ir.model.access.csv)** + - Model access permissions (CRUD rights) + +Notes +- Access Control Lists define which groups can access which models +- Record Rules provide row-level security (filter records by user/group) +- Security groups organize users and define permission sets +- All security is enforced at the ORM level by Odoo diff --git a/odoo-bringout-oca-iot-iot_oca/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-iot-iot_oca/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-iot-iot_oca/doc/USAGE.md b/odoo-bringout-oca-iot-iot_oca/doc/USAGE.md new file mode 100644 index 0000000..8dcd1e7 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon iot_oca +``` diff --git a/odoo-bringout-oca-iot-iot_oca/doc/WIZARDS.md b/odoo-bringout-oca-iot-iot_oca/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/README.rst b/odoo-bringout-oca-iot-iot_oca/iot_oca/README.rst new file mode 100644 index 0000000..392f1ae --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/README.rst @@ -0,0 +1,77 @@ +======== +IoT Base +======== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c34e428d89d764b8729d8c6829d21080bbcb86b8c3d8af66fd656894bebb1e2f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/16.0/iot_oca + :alt: OCA/iot +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/iot-16-0/iot-16-0-iot_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/iot&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon is a base module used for all iot modules. + +**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 to smash 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 +* ViraWeb123 + +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/odoo-bringout-oca-iot-iot_oca/iot_oca/__init__.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/__init__.py new file mode 100644 index 0000000..83e553a --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_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/odoo-bringout-oca-iot-iot_oca/iot_oca/__manifest__.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/__manifest__.py new file mode 100644 index 0000000..c90c302 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "IoT Base", + "version": "16.0.1.0.1", + "category": "IoT", + "author": "Creu Blanca, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "application": True, + "summary": "IoT base module", + "website": "https://github.com/OCA/iot", + "depends": ["base"], + "data": [ + "security/iot_security.xml", + "security/ir.model.access.csv", + "views/iot_menu.xml", + "views/iot_device_tag.xml", + "views/iot_device_group.xml", + "views/iot_system_views.xml", + "views/iot_device_views.xml", + ], +} diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/bs.po b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/bs.po new file mode 100644 index 0000000..9aa5a4b --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/bs.po @@ -0,0 +1,269 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot +# +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 +#: model:ir.model.fields,field_description:iot.field_iot_device__action_ids +msgid "Action" +msgstr "Akcija" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__action_count +msgid "Action Count" +msgstr "Broj akcija" + +#. module: iot +#: code:addons/iot/models/iot_system_action.py:20 +#, python-format +msgid "Action cannot be processed" +msgstr "Akcija se ne može obraditi" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot.iot_system_form +msgid "Actions" +msgstr "Akcije" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot.iot_device_search +msgid "Active" +msgstr "Aktivan" + +#. module: iot +#: model:ir.ui.menu,name:iot.iot_config_device_menu +msgid "Config Devices" +msgstr "Konfiguriši uređaje" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot.field_iot_system__create_uid +#: model:ir.model.fields,field_description:iot.field_iot_system_action__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot.field_iot_system__create_date +#: model:ir.model.fields,field_description:iot.field_iot_system_action__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__device_id +#: model:ir.model.fields,field_description:iot.field_iot_system__device_ids +msgid "Device" +msgstr "Uređaj" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__device_identification +msgid "Device Identification" +msgstr "Identifikacija uređaja" + +#. module: iot +#: code:addons/iot/models/iot_device_action.py:28 +#, python-format +msgid "Device and action must be of the same system" +msgstr "Uređaj i akcija moraju biti istog sistema" + +#. module: iot +#: model:ir.ui.menu,name:iot.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot.iot_system_form +msgid "Devices" +msgstr "Uređaji" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot.field_iot_system__display_name +#: model:ir.model.fields,field_description:iot.field_iot_system_action__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: iot +#: selection:iot.device.action,status:0 +msgid "Failed" +msgstr "Neuspješan" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__id +#: model:ir.model.fields,field_description:iot.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot.field_iot_system__id +#: model:ir.model.fields,field_description:iot.field_iot_system_action__id +msgid "ID" +msgstr "ID" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_search +msgid "Inactive" +msgstr "Neaktivan" + +#. module: iot +#: model:ir.module.category,name:iot.ir_module_category_iot +#: model:ir.ui.menu,name:iot.iot_root_menu +msgid "IoT" +msgstr "IoT" + +#. module: iot +#: model:ir.model,name:iot.model_iot_device_action +msgid "IoT Action" +msgstr "IoT akcija" + +#. module: iot +#: model:ir.model,name:iot.model_iot_device +msgid "IoT Device" +msgstr "IoT uređaj" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_search +msgid "IoT Device Search" +msgstr "Pretraga IoT uređaja" + +#. module: iot +#: model:ir.actions.act_window,name:iot.iot_device_action +#: model:ir.actions.act_window,name:iot.iot_device_config_action +msgid "IoT Devices" +msgstr "IoT uređaji" + +#. module: iot +#: model:ir.actions.act_window,name:iot.iot_system_action +#: model:ir.model,name:iot.model_iot_system +msgid "IoT System" +msgstr "IoT sistem" + +#. module: iot +#: model:ir.model,name:iot.model_iot_system_action +msgid "IoT System.action" +msgstr "IoT sistem.akcija" + +#. module: iot +#: model:res.groups,name:iot.group_iot_user +msgid "IoT User" +msgstr "IoT korisnik" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__ip +msgid "Ip" +msgstr "IP" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot.field_iot_system____last_update +#: model:ir.model.fields,field_description:iot.field_iot_system_action____last_update +msgid "Last Modified on" +msgstr "Zadnje mijenjano" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot.field_iot_system__write_uid +#: model:ir.model.fields,field_description:iot.field_iot_system_action__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot.field_iot_system__write_date +#: model:ir.model.fields,field_description:iot.field_iot_system_action__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: iot +#: model:res.groups,name:iot.group_iot_manager +msgid "Manager" +msgstr "Upravitelj" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__model +msgid "Model" +msgstr "Model" + +#. module: iot +#: model:res.groups,comment:iot.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "Administrator modula, može mijenjati konfiguracijske podatke." + +#. module: iot +#: model:res.groups,comment:iot.group_iot_user +msgid "Module user." +msgstr "Korisnik modula." + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__name +#: model:ir.model.fields,field_description:iot.field_iot_system__name +#: model:ir.model.fields,field_description:iot.field_iot_system_action__name +msgid "Name" +msgstr "Naziv:" + +#. module: iot +#: selection:iot.device.action,status:0 +msgid "Ok" +msgstr "Uredu" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "Datum u redu" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__passphrase +msgid "Passphrase" +msgstr "Parolska fraza" + +#. module: iot +#: selection:iot.device.action,status:0 +msgid "Pending" +msgstr "Na čekanju" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__result +msgid "Result" +msgstr "Rezultat" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_action_tree +msgid "Run" +msgstr "Pokrenut" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__state +msgid "State" +msgstr "Status" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__status +msgid "Status" +msgstr "Status" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__system_id +#: model:ir.model.fields,field_description:iot.field_iot_system_action__system_id +msgid "System" +msgstr "Sistem" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__system_action_id +#: model:ir.model.fields,field_description:iot.field_iot_system__system_action_ids +msgid "System Action" +msgstr "Sistemska akcija" + +#. module: iot +#: model:ir.ui.menu,name:iot.iot_system_menu +msgid "Systems" +msgstr "Sistemi" + diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/ca.po b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/ca.po new file mode 100644 index 0000000..a64f429 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/ca.po @@ -0,0 +1,426 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-06-03 11:05+0000\n" +"Last-Translator: jabelchi \n" +"Language-Team: none\n" +"Language: ca\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.3.2\n" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_ids +msgid "Action" +msgstr "Acció" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_count +msgid "Action Count" +msgstr "Nombre d'accions" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_communication_system_action.py:0 +#, python-format +msgid "Action cannot be processed" +msgstr "L'acció no pot processar-se" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Actions" +msgstr "Accions" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Active" +msgstr "Actiu" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__color +msgid "Color" +msgstr "Color" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__color +msgid "Color Index" +msgstr "Index de colors" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__communication_system_id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__communication_system_id +msgid "Communication System" +msgstr "Sistema de comunicacions" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__communication_system_action_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__communication_system_action_id +msgid "Communication System Action" +msgstr "Acció del sistema de comunicacions" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_configuration_menu +msgid "Configuration" +msgstr "Configuració" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Delete" +msgstr "Elimina" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__device_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__device_id +msgid "Device" +msgstr "Dispositiu" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_group_act_window +#: model:ir.ui.menu,name:iot_oca.iot_device_group_menu +msgid "Device Group" +msgstr "Grup de dispositius" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_tag_act_window +#: model:ir.model,name:iot_oca.model_iot_device_tag +#: model:ir.ui.menu,name:iot_oca.iot_device_tag_menu +msgid "Device Tag" +msgstr "Etiqueta de dispositiu" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_device_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "El dispositiu i l'acció han d'ésser del mateix sistema" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Devices" +msgstr "Dispositius" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__display_name +msgid "Display Name" +msgstr "Nom a mostrar" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Dropdown menu" +msgstr "Menú desplegable" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Edit..." +msgstr "Edita..." + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__failed +msgid "Failed" +msgstr "Error" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__group_id +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group" +msgstr "Grup" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group By" +msgstr "Agrupa per" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__id +msgid "ID" +msgstr "ID" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__ip +msgid "IP" +msgstr "IP" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "IP:" +msgstr "IP:" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__icon +msgid "Icon" +msgstr "Icona" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1920 +msgid "Image" +msgstr "Imatge" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_128 +msgid "Image 128" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_256 +msgid "Image 256" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_512 +msgid "Image 512" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Inactive" +msgstr "" + +#. module: iot_oca +#: model:ir.module.category,name:iot_oca.ir_module_category_iot +#: model:ir.ui.menu,name:iot_oca.iot_root_menu +msgid "IoT" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_action +msgid "IoT Action" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device +msgid "IoT Device" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "IoT Device Search" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_action +msgid "IoT Devices" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_system_action +msgid "IoT System" +msgstr "" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_user +msgid "IoT User" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_group +msgid "Iot Group" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__last_contact_date +msgid "Last Contact Date" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Last contact:" +msgstr "" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_manager +msgid "Manager" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__model +msgid "Model" +msgstr "" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_user +msgid "Module user." +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__name +msgid "Name" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__ok +msgid "Ok" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__pending +msgid "Pending" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__result +msgid "Result" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_action_tree +msgid "Run" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__state +msgid "State" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__status +msgid "Status" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_system_menu +msgid "Systems" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__tag_ids +msgid "Tag" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Unknown device" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-archive_fa-4x +msgid "archive" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "default_image" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-desktop_fa-4x +msgid "desktop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-laptop_fa-4x +msgid "laptop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-mobile_fa-6x +msgid "mobile" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-television_fa-4x +msgid "television" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-wifi_fa-4x +msgid "wifi" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/es.po b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/es.po new file mode 100644 index 0000000..2fea697 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/es.po @@ -0,0 +1,441 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-09-03 13:40+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_ids +msgid "Action" +msgstr "Acción" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_count +msgid "Action Count" +msgstr "# Acciones" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_communication_system_action.py:0 +#, python-format +msgid "Action cannot be processed" +msgstr "La acción no puede ser procesada" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Actions" +msgstr "Acciones" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Active" +msgstr "Activo" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__color +msgid "Color" +msgstr "Color" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__color +msgid "Color Index" +msgstr "Índice de Color" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__communication_system_id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__communication_system_id +msgid "Communication System" +msgstr "Sistema de comunicación" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__communication_system_action_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__communication_system_action_id +msgid "Communication System Action" +msgstr "Acción del sistema de comunicación" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_configuration_menu +msgid "Configuration" +msgstr "Configuración" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Delete" +msgstr "Borrar" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__device_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__device_id +msgid "Device" +msgstr "Dispositivo" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_group_act_window +#: model:ir.ui.menu,name:iot_oca.iot_device_group_menu +msgid "Device Group" +msgstr "Grupo de dispositivos" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_tag_act_window +#: model:ir.model,name:iot_oca.model_iot_device_tag +#: model:ir.ui.menu,name:iot_oca.iot_device_tag_menu +msgid "Device Tag" +msgstr "Etiqueta de dispositivo" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_device_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "El dispositivo y la acción deben ser del mismo sistema" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Devices" +msgstr "Dispositivos" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Dropdown menu" +msgstr "Menú Desplegable" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Edit..." +msgstr "Editar..." + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__failed +msgid "Failed" +msgstr "Fallado" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__group_id +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group" +msgstr "Grupo" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group By" +msgstr "Agrupar Por" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__id +msgid "ID" +msgstr "ID" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__ip +msgid "IP" +msgstr "IP" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "IP:" +msgstr "IP:" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__icon +msgid "Icon" +msgstr "Icono" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1920 +msgid "Image" +msgstr "Imagen" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1024 +msgid "Image 1024" +msgstr "Imagen 1024" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_128 +msgid "Image 128" +msgstr "Imagen 128" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_256 +msgid "Image 256" +msgstr "Imagen 256" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_512 +msgid "Image 512" +msgstr "Imagen 512" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Inactive" +msgstr "Inactivo" + +#. module: iot_oca +#: model:ir.module.category,name:iot_oca.ir_module_category_iot +#: model:ir.ui.menu,name:iot_oca.iot_root_menu +msgid "IoT" +msgstr "IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_action +msgid "IoT Action" +msgstr "Acción IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "Sistema de comunicación de IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "Acción del sistema de comunicación IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "IoT Device Search" +msgstr "Búsqueda de dispositivos IoT" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_action +msgid "IoT Devices" +msgstr "Dispositivos IoT" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_system_action +msgid "IoT System" +msgstr "Sistema IoT" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_user +msgid "IoT User" +msgstr "Usuario IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_group +msgid "Iot Group" +msgstr "Grupo IoT" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__last_contact_date +msgid "Last Contact Date" +msgstr "Última fecha de contacto" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Last contact:" +msgstr "Último contacto:" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_manager +msgid "Manager" +msgstr "Responsable" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__model +msgid "Model" +msgstr "Modelo" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "Administrador del módulo, puede modificar los datos de configuración." + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_user +msgid "Module user." +msgstr "Usuario del módulo." + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__name +msgid "Name" +msgstr "Nombre" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__ok +msgid "Ok" +msgstr "Ok" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "Fecha de aceptación" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__pending +msgid "Pending" +msgstr "Pendiente" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__result +msgid "Result" +msgstr "Resultado" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_action_tree +msgid "Run" +msgstr "Procesar" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__state +msgid "State" +msgstr "Estado" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__status +msgid "Status" +msgstr "Estados" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_system_menu +msgid "Systems" +msgstr "Sistemas" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__tag_ids +msgid "Tag" +msgstr "Etiqueta" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Unknown device" +msgstr "Dispositivo desconocido" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-archive_fa-4x +msgid "archive" +msgstr "archivo" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "default_image" +msgstr "imagen_por_defecto" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-desktop_fa-4x +msgid "desktop" +msgstr "escritorio" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-laptop_fa-4x +msgid "laptop" +msgstr "ordenador portátil" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-mobile_fa-6x +msgid "mobile" +msgstr "móvil" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-television_fa-4x +msgid "television" +msgstr "televisión" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-wifi_fa-4x +msgid "wifi" +msgstr "wifi" + +#~ msgid "IoT System.action" +#~ msgstr "Acción de Sistema IoT" + +#~ msgid "Ip" +#~ msgstr "Ip" + +#~ msgid "System" +#~ msgstr "Sistema" + +#~ msgid "System Action" +#~ msgstr "Acción del Sistema" + +#~ msgid "Config Devices" +#~ msgstr "Configurar Dispositivos" diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa.po b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa.po new file mode 100644 index 0000000..65e67ef --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa.po @@ -0,0 +1,426 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-04-03 19:37+0000\n" +"Last-Translator: Mostafa Barmshory \n" +"Language-Team: none\n" +"Language: fa\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_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_ids +msgid "Action" +msgstr "فعالیت" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_count +msgid "Action Count" +msgstr "تعداد فعالیت" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_communication_system_action.py:0 +#, python-format +msgid "Action cannot be processed" +msgstr "فعالیت قابل پردازش نیست" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Actions" +msgstr "فعالیت‌ها" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Active" +msgstr "فعال" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__color +msgid "Color" +msgstr "رنگ" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__color +msgid "Color Index" +msgstr "شماره رنگ" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__communication_system_id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__communication_system_id +msgid "Communication System" +msgstr "سیستم ارتباطی" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__communication_system_action_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__communication_system_action_id +msgid "Communication System Action" +msgstr "فعالیت سیستم ارتباطی" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_configuration_menu +msgid "Configuration" +msgstr "پیکره بندی" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_uid +msgid "Created by" +msgstr "ایجاد شده توسط" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_date +msgid "Created on" +msgstr "ایجاد شد در" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Delete" +msgstr "حذف" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__device_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__device_id +msgid "Device" +msgstr "دستگاه" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_group_act_window +#: model:ir.ui.menu,name:iot_oca.iot_device_group_menu +msgid "Device Group" +msgstr "گره دستگاه" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_tag_act_window +#: model:ir.model,name:iot_oca.model_iot_device_tag +#: model:ir.ui.menu,name:iot_oca.iot_device_tag_menu +msgid "Device Tag" +msgstr "برچسب دستگاه" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_device_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "دستگاه و فعالیت باید از یک سیستم مشابه باشد" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Devices" +msgstr "دستگاه‌ها" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__display_name +msgid "Display Name" +msgstr "نام نایشی" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Dropdown menu" +msgstr "منوی آبشاری" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Edit..." +msgstr "ویرایش.." + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__failed +msgid "Failed" +msgstr "ناموفق" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__group_id +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group" +msgstr "گروه" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group By" +msgstr "گروه با" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__id +msgid "ID" +msgstr "شناسه" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__ip +msgid "IP" +msgstr "آدرس" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "IP:" +msgstr "آدرس:" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__icon +msgid "Icon" +msgstr "شکلک" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1920 +msgid "Image" +msgstr "تصویر" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1024 +msgid "Image 1024" +msgstr "تصویر ۱۰۲۴" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_128 +msgid "Image 128" +msgstr "تصویر ۱۲۸" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_256 +msgid "Image 256" +msgstr "تصویر ۲۵۶" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_512 +msgid "Image 512" +msgstr "تصویر ۵۱۲" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Inactive" +msgstr "غیر فعال" + +#. module: iot_oca +#: model:ir.module.category,name:iot_oca.ir_module_category_iot +#: model:ir.ui.menu,name:iot_oca.iot_root_menu +msgid "IoT" +msgstr "اینترنت اشیا" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_action +msgid "IoT Action" +msgstr "فعالیت اینترنت اشیا" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "سیستم ارتباطی اینترنت اشیا" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "فعالیت سیستم ارتباطی اینترنت اشیا" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device +msgid "IoT Device" +msgstr "دستگاه اینترنت اشیا" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "IoT Device Search" +msgstr "جستجوی دستگاه اینترنت اشیا" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_action +msgid "IoT Devices" +msgstr "دستگاه‌های اینترنت اشیا" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_system_action +msgid "IoT System" +msgstr "سیستم اینترنت اشیا" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_user +msgid "IoT User" +msgstr "کاربر اینترنت اشیا" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_group +msgid "Iot Group" +msgstr "گروه اینترنت اشیا" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__last_contact_date +msgid "Last Contact Date" +msgstr "آخرین تاریخ اتصال" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag____last_update +msgid "Last Modified on" +msgstr "آخرین نگارش در" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_uid +msgid "Last Updated by" +msgstr "آخرین به روز رسانی با" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_date +msgid "Last Updated on" +msgstr "آخرین به روز رسانی در" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Last contact:" +msgstr "آخرین اتصال:" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_manager +msgid "Manager" +msgstr "مدیر" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__model +msgid "Model" +msgstr "مدل" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "مدیر ماژول قادر به تغییر داده‌های پیکره بندی است." + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_user +msgid "Module user." +msgstr "کاربر ماژول." + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__name +msgid "Name" +msgstr "نام" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__ok +msgid "Ok" +msgstr "تایید" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "تاریخ تایید" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__pending +msgid "Pending" +msgstr "معلق" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__result +msgid "Result" +msgstr "نتیجه" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_action_tree +msgid "Run" +msgstr "اجرا" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__state +msgid "State" +msgstr "حالت" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__status +msgid "Status" +msgstr "حالت‌ها" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_system_menu +msgid "Systems" +msgstr "سیستم‌ها" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__tag_ids +msgid "Tag" +msgstr "برچسب" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Unknown device" +msgstr "دستگاه ناشناس" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-archive_fa-4x +msgid "archive" +msgstr "بایگانی" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "default_image" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-desktop_fa-4x +msgid "desktop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-laptop_fa-4x +msgid "laptop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-mobile_fa-6x +msgid "mobile" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-television_fa-4x +msgid "television" +msgstr "تلویزیون" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-wifi_fa-4x +msgid "wifi" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa_IR.po b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa_IR.po new file mode 100644 index 0000000..b02b5e0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/fa_IR.po @@ -0,0 +1,424 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fa_IR\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: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_ids +msgid "Action" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_count +msgid "Action Count" +msgstr "" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_communication_system_action.py:0 +#, python-format +msgid "Action cannot be processed" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Actions" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Active" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__color +msgid "Color" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__color +msgid "Color Index" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__communication_system_id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__communication_system_id +msgid "Communication System" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__communication_system_action_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__communication_system_action_id +msgid "Communication System Action" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_configuration_menu +msgid "Configuration" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_date +msgid "Created on" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Delete" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__device_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__device_id +msgid "Device" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_group_act_window +#: model:ir.ui.menu,name:iot_oca.iot_device_group_menu +msgid "Device Group" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_tag_act_window +#: model:ir.model,name:iot_oca.model_iot_device_tag +#: model:ir.ui.menu,name:iot_oca.iot_device_tag_menu +msgid "Device Tag" +msgstr "" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_device_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Devices" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Dropdown menu" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Edit..." +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__failed +msgid "Failed" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__group_id +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group By" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__id +msgid "ID" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__ip +msgid "IP" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "IP:" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__icon +msgid "Icon" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1920 +msgid "Image" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_128 +msgid "Image 128" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_256 +msgid "Image 256" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_512 +msgid "Image 512" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Inactive" +msgstr "" + +#. module: iot_oca +#: model:ir.module.category,name:iot_oca.ir_module_category_iot +#: model:ir.ui.menu,name:iot_oca.iot_root_menu +msgid "IoT" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_action +msgid "IoT Action" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device +msgid "IoT Device" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "IoT Device Search" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_action +msgid "IoT Devices" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_system_action +msgid "IoT System" +msgstr "" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_user +msgid "IoT User" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_group +msgid "Iot Group" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__last_contact_date +msgid "Last Contact Date" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Last contact:" +msgstr "" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_manager +msgid "Manager" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__model +msgid "Model" +msgstr "" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_user +msgid "Module user." +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__name +msgid "Name" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__ok +msgid "Ok" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__pending +msgid "Pending" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__result +msgid "Result" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_action_tree +msgid "Run" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__state +msgid "State" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__status +msgid "Status" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_system_menu +msgid "Systems" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__tag_ids +msgid "Tag" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Unknown device" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-archive_fa-4x +msgid "archive" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "default_image" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-desktop_fa-4x +msgid "desktop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-laptop_fa-4x +msgid "laptop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-mobile_fa-6x +msgid "mobile" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-television_fa-4x +msgid "television" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-wifi_fa-4x +msgid "wifi" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot.pot b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot.pot new file mode 100644 index 0000000..adcd4ef --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot.pot @@ -0,0 +1,269 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot +# +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 +#: model:ir.model.fields,field_description:iot.field_iot_device__action_ids +msgid "Action" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__action_count +msgid "Action Count" +msgstr "" + +#. module: iot +#: code:addons/iot/models/iot_system_action.py:20 +#, python-format +msgid "Action cannot be processed" +msgstr "" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot.iot_system_form +msgid "Actions" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot.iot_device_search +msgid "Active" +msgstr "" + +#. module: iot +#: model:ir.ui.menu,name:iot.iot_config_device_menu +msgid "Config Devices" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot.field_iot_system__create_uid +#: model:ir.model.fields,field_description:iot.field_iot_system_action__create_uid +msgid "Created by" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot.field_iot_system__create_date +#: model:ir.model.fields,field_description:iot.field_iot_system_action__create_date +msgid "Created on" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__device_id +#: model:ir.model.fields,field_description:iot.field_iot_system__device_ids +msgid "Device" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__device_identification +msgid "Device Identification" +msgstr "" + +#. module: iot +#: code:addons/iot/models/iot_device_action.py:28 +#, python-format +msgid "Device and action must be of the same system" +msgstr "" + +#. module: iot +#: model:ir.ui.menu,name:iot.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot.iot_system_form +msgid "Devices" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot.field_iot_system__display_name +#: model:ir.model.fields,field_description:iot.field_iot_system_action__display_name +msgid "Display Name" +msgstr "" + +#. module: iot +#: selection:iot.device.action,status:0 +msgid "Failed" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__id +#: model:ir.model.fields,field_description:iot.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot.field_iot_system__id +#: model:ir.model.fields,field_description:iot.field_iot_system_action__id +msgid "ID" +msgstr "" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_search +msgid "Inactive" +msgstr "" + +#. module: iot +#: model:ir.module.category,name:iot.ir_module_category_iot +#: model:ir.ui.menu,name:iot.iot_root_menu +msgid "IoT" +msgstr "" + +#. module: iot +#: model:ir.model,name:iot.model_iot_device_action +msgid "IoT Action" +msgstr "" + +#. module: iot +#: model:ir.model,name:iot.model_iot_device +msgid "IoT Device" +msgstr "" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_search +msgid "IoT Device Search" +msgstr "" + +#. module: iot +#: model:ir.actions.act_window,name:iot.iot_device_action +#: model:ir.actions.act_window,name:iot.iot_device_config_action +msgid "IoT Devices" +msgstr "" + +#. module: iot +#: model:ir.actions.act_window,name:iot.iot_system_action +#: model:ir.model,name:iot.model_iot_system +msgid "IoT System" +msgstr "" + +#. module: iot +#: model:ir.model,name:iot.model_iot_system_action +msgid "IoT System.action" +msgstr "" + +#. module: iot +#: model:res.groups,name:iot.group_iot_user +msgid "IoT User" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__ip +msgid "Ip" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot.field_iot_system____last_update +#: model:ir.model.fields,field_description:iot.field_iot_system_action____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot.field_iot_system__write_uid +#: model:ir.model.fields,field_description:iot.field_iot_system_action__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot.field_iot_system__write_date +#: model:ir.model.fields,field_description:iot.field_iot_system_action__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot +#: model:res.groups,name:iot.group_iot_manager +msgid "Manager" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__model +msgid "Model" +msgstr "" + +#. module: iot +#: model:res.groups,comment:iot.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "" + +#. module: iot +#: model:res.groups,comment:iot.group_iot_user +msgid "Module user." +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__name +#: model:ir.model.fields,field_description:iot.field_iot_system__name +#: model:ir.model.fields,field_description:iot.field_iot_system_action__name +msgid "Name" +msgstr "" + +#. module: iot +#: selection:iot.device.action,status:0 +msgid "Ok" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__passphrase +msgid "Passphrase" +msgstr "" + +#. module: iot +#: selection:iot.device.action,status:0 +msgid "Pending" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__result +msgid "Result" +msgstr "" + +#. module: iot +#: model_terms:ir.ui.view,arch_db:iot.iot_device_action_tree +msgid "Run" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__state +msgid "State" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__status +msgid "Status" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device__system_id +#: model:ir.model.fields,field_description:iot.field_iot_system_action__system_id +msgid "System" +msgstr "" + +#. module: iot +#: model:ir.model.fields,field_description:iot.field_iot_device_action__system_action_id +#: model:ir.model.fields,field_description:iot.field_iot_system__system_action_ids +msgid "System Action" +msgstr "" + +#. module: iot +#: model:ir.ui.menu,name:iot.iot_system_menu +msgid "Systems" +msgstr "" + diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot_oca.pot b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot_oca.pot new file mode 100644 index 0000000..4662fe9 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/iot_oca.pot @@ -0,0 +1,423 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_ids +msgid "Action" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_count +msgid "Action Count" +msgstr "" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_communication_system_action.py:0 +#, python-format +msgid "Action cannot be processed" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Actions" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Active" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__color +msgid "Color" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__color +msgid "Color Index" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__communication_system_id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__communication_system_id +msgid "Communication System" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__communication_system_action_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__communication_system_action_id +msgid "Communication System Action" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_configuration_menu +msgid "Configuration" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_date +msgid "Created on" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Delete" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__device_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__device_id +msgid "Device" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_group_act_window +#: model:ir.ui.menu,name:iot_oca.iot_device_group_menu +msgid "Device Group" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_tag_act_window +#: model:ir.model,name:iot_oca.model_iot_device_tag +#: model:ir.ui.menu,name:iot_oca.iot_device_tag_menu +msgid "Device Tag" +msgstr "" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_device_action.py:0 +#, python-format +msgid "Device and action must be of the same system" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Devices" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Dropdown menu" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Edit..." +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__failed +msgid "Failed" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__group_id +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group By" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__id +msgid "ID" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__ip +msgid "IP" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "IP:" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__icon +msgid "Icon" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1920 +msgid "Image" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_128 +msgid "Image 128" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_256 +msgid "Image 256" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_512 +msgid "Image 512" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Inactive" +msgstr "" + +#. module: iot_oca +#: model:ir.module.category,name:iot_oca.ir_module_category_iot +#: model:ir.ui.menu,name:iot_oca.iot_root_menu +msgid "IoT" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_action +msgid "IoT Action" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device +msgid "IoT Device" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "IoT Device Search" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_action +msgid "IoT Devices" +msgstr "" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_system_action +msgid "IoT System" +msgstr "" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_user +msgid "IoT User" +msgstr "" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_group +msgid "Iot Group" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__last_contact_date +msgid "Last Contact Date" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Last contact:" +msgstr "" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_manager +msgid "Manager" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__model +msgid "Model" +msgstr "" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_user +msgid "Module user." +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__name +msgid "Name" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__ok +msgid "Ok" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__pending +msgid "Pending" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__result +msgid "Result" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_action_tree +msgid "Run" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__state +msgid "State" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__status +msgid "Status" +msgstr "" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_system_menu +msgid "Systems" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__tag_ids +msgid "Tag" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Unknown device" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-archive_fa-4x +msgid "archive" +msgstr "" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "default_image" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-desktop_fa-4x +msgid "desktop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-laptop_fa-4x +msgid "laptop" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-mobile_fa-6x +msgid "mobile" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-television_fa-4x +msgid "television" +msgstr "" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-wifi_fa-4x +msgid "wifi" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/it.po b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/it.po new file mode 100644 index 0000000..e10223a --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/i18n/it.po @@ -0,0 +1,428 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-21 13:27+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 5.10.4\n" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_ids +msgid "Action" +msgstr "Azione" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__action_count +msgid "Action Count" +msgstr "Conteggio azione" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_communication_system_action.py:0 +#, python-format +msgid "Action cannot be processed" +msgstr "L'azione non può essere elaborata" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_form +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Actions" +msgstr "Azioni" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__active +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Active" +msgstr "Attivo" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__color +msgid "Color" +msgstr "Colore" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__color +msgid "Color Index" +msgstr "Indice colore" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__communication_system_id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__communication_system_id +msgid "Communication System" +msgstr "Sistema di comunicazione" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__communication_system_action_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__communication_system_action_id +msgid "Communication System Action" +msgstr "Azione sistema di comunicazione" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_configuration_menu +msgid "Configuration" +msgstr "Configurazione" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__create_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Delete" +msgstr "Elimina" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__device_ids +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__device_id +msgid "Device" +msgstr "Dispositivo" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_group_act_window +#: model:ir.ui.menu,name:iot_oca.iot_device_group_menu +msgid "Device Group" +msgstr "Gruppo dispositivo" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_tag_act_window +#: model:ir.model,name:iot_oca.model_iot_device_tag +#: model:ir.ui.menu,name:iot_oca.iot_device_tag_menu +msgid "Device Tag" +msgstr "Etichetta dispositivo" + +#. module: iot_oca +#. odoo-python +#: code:addons/iot_oca/models/iot_device_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_oca +#: model:ir.ui.menu,name:iot_oca.iot_device_menu +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_system_form +msgid "Devices" +msgstr "Dispositivi" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__display_name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Dropdown menu" +msgstr "Menu a tendina" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Edit..." +msgstr "Edita..." + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__failed +msgid "Failed" +msgstr "Fallito" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__group_id +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group" +msgstr "Gruppo" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__id +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__id +msgid "ID" +msgstr "ID" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__ip +msgid "IP" +msgstr "IP" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "IP:" +msgstr "IP:" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__icon +msgid "Icon" +msgstr "Icona" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1920 +msgid "Image" +msgstr "Immagine" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_1024 +msgid "Image 1024" +msgstr "Immagine 1024" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_128 +msgid "Image 128" +msgstr "Immagine 128" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_256 +msgid "Image 256" +msgstr "Immagine 256" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__image_512 +msgid "Image 512" +msgstr "Immagine 512" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "Inactive" +msgstr "Inattivo" + +#. module: iot_oca +#: model:ir.module.category,name:iot_oca.ir_module_category_iot +#: model:ir.ui.menu,name:iot_oca.iot_root_menu +msgid "IoT" +msgstr "IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_action +msgid "IoT Action" +msgstr "Azione IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system +msgid "IoT Communication System" +msgstr "Sistema di comunicazione IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_communication_system_action +msgid "IoT Communication System action" +msgstr "Azione sistema di comunicazione IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_search +msgid "IoT Device Search" +msgstr "Ricerca dispositivo IoT" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_device_action +msgid "IoT Devices" +msgstr "Dispositivi IoT" + +#. module: iot_oca +#: model:ir.actions.act_window,name:iot_oca.iot_system_action +msgid "IoT System" +msgstr "Sistema IoT" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_user +msgid "IoT User" +msgstr "Utente IoT" + +#. module: iot_oca +#: model:ir.model,name:iot_oca.model_iot_device_group +msgid "Iot Group" +msgstr "Gruppo IoT" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__last_contact_date +msgid "Last Contact Date" +msgstr "Ultima data contatto" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group____last_update +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_uid +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__write_date +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Last contact:" +msgstr "Ultimo contatto:" + +#. module: iot_oca +#: model:res.groups,name:iot_oca.group_iot_manager +msgid "Manager" +msgstr "Supervisore" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__model +msgid "Model" +msgstr "Modello" + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_manager +msgid "Module administrator, able to modify configuration data." +msgstr "" +"Amministratore del modulo, abilitato alla modifica dei dati di " +"configurazione." + +#. module: iot_oca +#: model:res.groups,comment:iot_oca.group_iot_user +msgid "Module user." +msgstr "Utente modulo." + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_communication_system_action__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_group__name +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_tag__name +msgid "Name" +msgstr "Nome" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__ok +msgid "Ok" +msgstr "Ok" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__date_ok +msgid "Ok date" +msgstr "Data ok" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device_action__status__pending +msgid "Pending" +msgstr "In attesa" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__result +msgid "Result" +msgstr "Risultato" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_action_tree +msgid "Run" +msgstr "Esegui" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__state +msgid "State" +msgstr "Stato" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device_action__status +msgid "Status" +msgstr "Stato" + +#. module: iot_oca +#: model:ir.ui.menu,name:iot_oca.iot_system_menu +msgid "Systems" +msgstr "Sistemi" + +#. module: iot_oca +#: model:ir.model.fields,field_description:iot_oca.field_iot_device__tag_ids +msgid "Tag" +msgstr "Etichetta" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "Unknown device" +msgstr "Dispositivo sconosciuto" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-archive_fa-4x +msgid "archive" +msgstr "archivia" + +#. module: iot_oca +#: model_terms:ir.ui.view,arch_db:iot_oca.iot_device_kanban +msgid "default_image" +msgstr "default_image" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-desktop_fa-4x +msgid "desktop" +msgstr "desktop" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-laptop_fa-4x +msgid "laptop" +msgstr "laptop" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-mobile_fa-6x +msgid "mobile" +msgstr "cellulare" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-television_fa-4x +msgid "television" +msgstr "televisione" + +#. module: iot_oca +#: model:ir.model.fields.selection,name:iot_oca.selection__iot_device__icon__fa_fa-wifi_fa-4x +msgid "wifi" +msgstr "wifi" diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/migrations/14.0.1.0.0/pre-migration.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/migrations/14.0.1.0.0/pre-migration.py new file mode 100644 index 0000000..0907533 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/migrations/14.0.1.0.0/pre-migration.py @@ -0,0 +1,26 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade + +_model_renames = [ + ("iot.system", "iot.communication.system"), + ("iot.system.action", "iot.communication.system.action"), +] + +_table_renames = [ + ("iot_system", "iot_communication_system"), + ("iot_system_action", "iot_communication_system_action"), +] + +_column_renames = { + "iot_communication_system_action": [("system_id", "communication_system_id")], + "iot_device": [("system_id", "communication_system_id")], + "iot_device_action": [("system_action_id", "communication_system_action_id")], +} + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.rename_models(env.cr, _model_renames) + openupgrade.rename_tables(env.cr, _table_renames) + openupgrade.rename_columns(env.cr, _column_renames) diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/models/__init__.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/__init__.py new file mode 100644 index 0000000..164df93 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/__init__.py @@ -0,0 +1,6 @@ +from . import iot_device +from . import iot_device_action +from . import iot_communication_system +from . import iot_communication_system_action +from . import iot_device_group +from . import iot_device_tag diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system.py new file mode 100644 index 0000000..a1e430e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system.py @@ -0,0 +1,15 @@ +# 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): + _name = "iot.communication.system" + _description = "IoT Communication System" + # TODO: Rename it to iot.communication.system System is confusing + + name = fields.Char(required=True) + device_ids = fields.One2many("iot.device", inverse_name="communication_system_id") + communication_system_action_ids = fields.One2many( + "iot.communication.system.action", inverse_name="communication_system_id" + ) diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system_action.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system_action.py new file mode 100644 index 0000000..0c24d05 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_communication_system_action.py @@ -0,0 +1,32 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging +import traceback +from io import StringIO + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + + +class IoTSystemAction(models.Model): + _name = "iot.communication.system.action" + _description = "IoT Communication System action" + + name = fields.Char(required=True) + communication_system_id = fields.Many2one("iot.communication.system", required=True) + + def _run(self, device_action): + raise ValidationError(_("Action cannot be processed")) + + def run(self, device_action): + try: + result = self._run(device_action) + return "ok", result + except Exception: + buff = StringIO() + traceback.print_exc(file=buff) + error = buff.getvalue() + _logger.warning(error) + return "failed", error diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device.py new file mode 100644 index 0000000..eee04ea --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device.py @@ -0,0 +1,50 @@ +# 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" + _description = "IoT Device" + _inherit = "image.mixin" + + name = fields.Char(required=True) + communication_system_id = fields.Many2one("iot.communication.system", required=True) + action_ids = fields.One2many("iot.device.action", inverse_name="device_id") + active = fields.Boolean(default=True) + state = fields.Selection([], readonly=True) + model = fields.Char() + ip = fields.Char(string="IP") + action_count = fields.Integer(compute="_compute_action_count") + group_id = fields.Many2one("iot.device.group") + tag_ids = fields.Many2many("iot.device.tag") + color = fields.Integer() + last_contact_date = fields.Datetime(readonly=True) + icon = fields.Selection( + [ + ("fa fa-television fa-4x", "television"), + ("fa fa-wifi fa-4x", "wifi"), + ("fa fa-laptop fa-4x", "laptop"), + ("fa fa-desktop fa-4x", "desktop"), + ("fa fa-archive fa-4x", "archive"), + ("fa fa-mobile fa-6x", "mobile"), + ] + ) + + @api.depends("action_ids") + def _compute_action_count(self): + for record in self: + record.action_count = len(record.action_ids) + + 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: + action = self.env["iot.device.action"].create( + { + "device_id": rec.id, + "communication_system_action_id": system_action.id, + } + ) + action.run() diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_action.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_action.py new file mode 100644 index 0000000..32512cf --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_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 IoTDeviceAction(models.Model): + _name = "iot.device.action" + _description = "IoT Action" + _order = "date_ok desc" + + device_id = fields.Many2one("iot.device", 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("device_id", "communication_system_action_id") + def _check_system(self): + if self.filtered( + lambda r: r.device_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/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_group.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_group.py new file mode 100644 index 0000000..5c4db11 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_group.py @@ -0,0 +1,11 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IotDeviceGroup(models.Model): + _name = "iot.device.group" + _description = "Iot Group" + + name = fields.Char(required=True) diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_tag.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_tag.py new file mode 100644 index 0000000..f1f6c00 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/models/iot_device_tag.py @@ -0,0 +1,13 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IotDeviceTag(models.Model): + + _name = "iot.device.tag" + _description = "Device Tag" + + name = fields.Char(required=True) + color = fields.Integer(string="Color Index") diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-iot-iot_oca/iot_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..2c3751e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Enric Tobella +* ViraWeb123 diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/readme/DESCRIPTION.rst b/odoo-bringout-oca-iot-iot_oca/iot_oca/readme/DESCRIPTION.rst new file mode 100644 index 0000000..18b7de1 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This addon is a base module used for all iot modules. diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/security/iot_security.xml b/odoo-bringout-oca-iot-iot_oca/iot_oca/security/iot_security.xml new file mode 100644 index 0000000..1f5fd50 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/security/iot_security.xml @@ -0,0 +1,28 @@ + + + + + IoT + + + IoT User + Module user. + + + + Manager + Module administrator, able to modify configuration data. + + + + + diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/security/ir.model.access.csv b/odoo-bringout-oca-iot-iot_oca/iot_oca/security/ir.model.access.csv new file mode 100644 index 0000000..384d657 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/security/ir.model.access.csv @@ -0,0 +1,13 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_iot_device,access_iot_device,model_iot_device,group_iot_user,1,1,0,0 +manage_iot_device,access_iot_device,model_iot_device,group_iot_manager,1,1,1,0 +access_iot_device_action,access_iot_device_action,model_iot_device_action,group_iot_user,1,1,1,0 +manage_iot_device_action,access_iot_device_action,model_iot_device_action,group_iot_manager,1,1,1,0 +access_iot_system,access_iot_system,model_iot_communication_system,group_iot_user,1,0,0,0 +manage_iot_system,access_iot_system,model_iot_communication_system,group_iot_manager,1,1,1,0 +access_iot_system_action,access_iot_system_action,model_iot_communication_system_action,group_iot_user,1,0,0,0 +manage_iot_system_action,access_iot_system_action,model_iot_communication_system_action,group_iot_manager,1,1,1,0 +access_iot_device_group,access_iot_device_group,model_iot_device_group,group_iot_user,1,0,0,0 +manage_iot_device_group,manage_iot_device_group,model_iot_device_group,group_iot_manager,1,1,1,0 +access_iot_device_tag,access_iot_device_tag,model_iot_device_tag,group_iot_user,1,0,0,0 +manage_iot_device_tag,manage_iot_device_tag,model_iot_device_tag,group_iot_manager,1,1,1,0 diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.png b/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..325deacba30dd530983856f8859b29f243845482 GIT binary patch literal 6183 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 Q0|Nttr>mdKI;Vst0F|o+r2qf` literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.svg b/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.svg new file mode 100644 index 0000000..66bc24a --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.svg @@ -0,0 +1,141 @@ + + + + + + image/svg+xml + + icon + + + + + + + + + + + + + + + icon + + + + + + + + + diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/index.html b/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/index.html new file mode 100644 index 0000000..9e4e314 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/index.html @@ -0,0 +1,424 @@ + + + + + +IoT Base + + + +
+

IoT Base

+ + +

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

+

This addon is a base module used for all iot modules.

+

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 to smash 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/odoo-bringout-oca-iot-iot_oca/iot_oca/tests/__init__.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/tests/__init__.py new file mode 100644 index 0000000..c1763e1 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/tests/__init__.py @@ -0,0 +1 @@ +from . import test_iot diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/tests/test_iot.py b/odoo-bringout-oca-iot-iot_oca/iot_oca/tests/test_iot.py new file mode 100644 index 0000000..4a1908a --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/tests/test_iot.py @@ -0,0 +1,54 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from unittest.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", "communication_system_id": self.system.id} + ) + + def test_action(self): + self.assertEqual(self.device.action_count, 0) + with mute_logger("odoo.addons.iot_oca.models.iot_communication_system_action"): + self.device.with_context( + iot_communication_system_action_id=self.action.id + ).device_run_action() + self.assertEqual(self.device.action_count, 1) + self.assertEqual(self.device.action_ids.status, "failed") + + def test_correct_action(self): + self.assertEqual(self.device.action_count, 0) + with patch( + "odoo.addons.iot_oca.models.iot_communication_system_action." + "IoTSystemAction._run", + return_value=("ok", ""), + ): + self.device.with_context( + iot_communication_system_action_id=self.action.id + ).device_run_action() + self.assertEqual(self.device.action_count, 1) + self.assertEqual(self.device.action_ids.status, "ok") + + def test_constrains(self): + with self.assertRaises(ValidationError): + self.device.with_context( + iot_communication_system_action_id=self.action_2.id + ).device_run_action() diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_group.xml b/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_group.xml new file mode 100644 index 0000000..3bfddeb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_group.xml @@ -0,0 +1,51 @@ + + + + + iot.device.group.form (in iot_oca) + iot.device.group + +
+
+ + + + + + + + + + iot.device.group.search (in iot_oca) + iot.device.group + + + + + + + + iot.device.group.tree (in iot_oca) + iot.device.group + + + + + + + + Device Group + + iot.device.group + tree,form + [] + {} + + + Device Group + + + + + diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_tag.xml b/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_tag.xml new file mode 100644 index 0000000..1588058 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_tag.xml @@ -0,0 +1,55 @@ + + + + + iot.device.tag.form (in iot_oca) + iot.device.tag + +
+
+ + + + + + + + + + + + + iot.device.tag.search (in iot_oca) + iot.device.tag + + + + + + + + iot.device.tag.tree (in iot_oca) + iot.device.tag + + + + + + + + + Device Tag + + iot.device.tag + tree,form + [] + {} + + + Device Tag + + + + + diff --git a/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_views.xml b/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_views.xml new file mode 100644 index 0000000..13b4ab0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_oca/iot_oca/views/iot_device_views.xml @@ -0,0 +1,249 @@ + + + + iot.device.tree + iot.device + + + + + + + + + + + + + iot.device.form + iot.device + +
+
+ + +
+ + +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + iot.device.action.tree + iot.device.action + + + + + + + + + [('applies_to', '=', 'device')] + + + {'invisible': [('communication_system_id', '=', False)]} + + + + + + iot.device.kanban + iot.device + + + + + + Outputs + + + + + diff --git a/odoo-bringout-oca-iot-iot_output_oca/pyproject.toml b/odoo-bringout-oca-iot-iot_output_oca/pyproject.toml new file mode 100644 index 0000000..af5228e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_output_oca/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-iot-iot_output_oca" +version = "16.0.0" +description = "IoT Output - IoT allow multiple outputs" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-iot-iot_oca>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["iot_output_oca"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-iot-iot_rule/README.md b/odoo-bringout-oca-iot-iot_rule/README.md new file mode 100644 index 0000000..66eeba8 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/README.md @@ -0,0 +1,44 @@ +# IoT Rule + +Odoo addon: iot_rule + +## Installation + +```bash +pip install odoo-bringout-oca-iot-iot_rule +``` + +## Dependencies + +This addon depends on: +- iot_input_oca + +## Manifest Information + +- **Name**: IoT Rule +- **Version**: 16.0.1.0.0 +- **Category**: N/A +- **License**: AGPL-3 +- **Installable**: False + +## Source + +Based on [OCA/iot](https://github.com/OCA/iot) branch 16.0, addon `iot_rule`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-iot-iot_rule/doc/ARCHITECTURE.md b/odoo-bringout-oca-iot-iot_rule/doc/ARCHITECTURE.md new file mode 100644 index 0000000..282c40b --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Iot_rule Module - iot_rule + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/CONFIGURATION.md b/odoo-bringout-oca-iot-iot_rule/doc/CONFIGURATION.md new file mode 100644 index 0000000..5d9da17 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for iot_rule. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/CONTROLLERS.md b/odoo-bringout-oca-iot-iot_rule/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/DEPENDENCIES.md b/odoo-bringout-oca-iot-iot_rule/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b0a1980 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [iot_input_oca](https://github.com/bringout/oca-technical) diff --git a/odoo-bringout-oca-iot-iot_rule/doc/FAQ.md b/odoo-bringout-oca-iot-iot_rule/doc/FAQ.md new file mode 100644 index 0000000..d78654d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon iot_rule or install in UI. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/INSTALL.md b/odoo-bringout-oca-iot-iot_rule/doc/INSTALL.md new file mode 100644 index 0000000..7565aa5 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-iot-iot_rule" +# or +uv pip install odoo-bringout-oca-iot-iot_rule" +``` diff --git a/odoo-bringout-oca-iot-iot_rule/doc/MODELS.md b/odoo-bringout-oca-iot-iot_rule/doc/MODELS.md new file mode 100644 index 0000000..0e1b794 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/MODELS.md @@ -0,0 +1,19 @@ +# Models + +Detected core models and extensions in iot_rule. + +```mermaid +classDiagram + class iot_key + class iot_key_action + class iot_key_mixin + class iot_lock + class iot_rule + class res_partner + class iot_device + class iot_device_input +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/OVERVIEW.md b/odoo-bringout-oca-iot-iot_rule/doc/OVERVIEW.md new file mode 100644 index 0000000..e9f8a44 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: iot_rule. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon iot_rule +- License: LGPL-3 diff --git a/odoo-bringout-oca-iot-iot_rule/doc/REPORTS.md b/odoo-bringout-oca-iot-iot_rule/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/SECURITY.md b/odoo-bringout-oca-iot-iot_rule/doc/SECURITY.md new file mode 100644 index 0000000..d4a3e06 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/SECURITY.md @@ -0,0 +1,34 @@ +# Security + +Access control and security definitions in iot_rule. + +## Access Control Lists (ACLs) + +Model access permissions defined in: +- **[ir.model.access.csv](../iot_rule/security/ir.model.access.csv)** + - 8 model access rules + +## Record Rules + +Row-level security rules defined in: + +```mermaid +graph TB + subgraph "Security Layers" + A[Users] --> B[Groups] + B --> C[Access Control Lists] + C --> D[Models] + B --> E[Record Rules] + E --> F[Individual Records] + end +``` + +Security files overview: +- **[ir.model.access.csv](../iot_rule/security/ir.model.access.csv)** + - Model access permissions (CRUD rights) + +Notes +- Access Control Lists define which groups can access which models +- Record Rules provide row-level security (filter records by user/group) +- Security groups organize users and define permission sets +- All security is enforced at the ORM level by Odoo diff --git a/odoo-bringout-oca-iot-iot_rule/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-iot-iot_rule/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-iot-iot_rule/doc/USAGE.md b/odoo-bringout-oca-iot-iot_rule/doc/USAGE.md new file mode 100644 index 0000000..dd06d32 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon iot_rule +``` diff --git a/odoo-bringout-oca-iot-iot_rule/doc/WIZARDS.md b/odoo-bringout-oca-iot-iot_rule/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/README.rst b/odoo-bringout-oca-iot-iot_rule/iot_rule/README.rst new file mode 100644 index 0000000..4572f4e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/README.rst @@ -0,0 +1,86 @@ +======== +IoT Rule +======== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:8776ccfdb4eda7e7911d811faef3f33474c34c474237b9afd180e4fe5ca1b233 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/16.0/iot_rule + :alt: OCA/iot +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/iot-16-0/iot-16-0-iot_rule + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/iot&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon allows to define IoT Rules. + +A Rule specifies which Inputs that can be controlled by a certain Key. +The Key is owned by an Agent (Employee, Partner or anonymous). +The Input is a request from an IoT Device that executes a certain function in Odoo. +This function will check if the Key (= the Agent) is allowed by any Rule to "control" the Device. +If Odoo answers positively the Agent will be allowed the to execute some Function on the Device +(for example open a door or switch on a relay). + +**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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* CreuBlanca +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Enric Tobella +* Luis Burrel +* Aaron Henriquez + +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/odoo-bringout-oca-iot-iot_rule/iot_rule/__init__.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/__init__.py new file mode 100644 index 0000000..aee8895 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/__manifest__.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/__manifest__.py new file mode 100644 index 0000000..9dd78a7 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "IoT Rule", + "summary": """ + Define IoT Rules (Keys that control Inputs)""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "CreuBlanca,ForgeFlow,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/iot", + "depends": ["iot_input_oca"], + "data": [ + "wizards/iot_key_wizard.xml", + "security/ir.model.access.csv", + "views/iot_rule.xml", + "views/iot_key.xml", + "views/iot_key_action.xml", + "views/iot_lock.xml", + "views/res_partner.xml", + "views/iot_device_input.xml", + ], + "demo": [ + "demo/iot_rule_demo.xml", + "demo/iot_lock_demo.xml", + "demo/iot_key_demo.xml", + ], +} diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_key_demo.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_key_demo.xml new file mode 100644 index 0000000..400a026 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_key_demo.xml @@ -0,0 +1,22 @@ + + + + Room 101 + + + + Room 102 + + + + Admin + + + + Demo + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_lock_demo.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_lock_demo.xml new file mode 100644 index 0000000..1b92191 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_lock_demo.xml @@ -0,0 +1,35 @@ + + + + Room 101 + + + + Room 102 + + + + Gym + + + + Spa + + + + Janitor + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_rule_demo.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_rule_demo.xml new file mode 100644 index 0000000..f6e629d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/demo/iot_rule_demo.xml @@ -0,0 +1,22 @@ + + + + Employees + + + Premium Locks + + + + Standard Locks + + + + Room 101 + + + + Room 102 + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/bs.po b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/bs.po new file mode 100644 index 0000000..f7f84b4 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/bs.po @@ -0,0 +1,355 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_rule +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_rule +#. odoo-python +#: code:addons/iot_rule/models/iot_rule.py:0 +#, python-format +msgid "A recurssion was found" +msgstr "Pronađena je rekurzija" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__action_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__action_ids +msgid "Action" +msgstr "Akcija" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__active +msgid "Active" +msgstr "Aktivan" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +msgid "Authorized Lock Groups" +msgstr "Ovlašćene grupe brave" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Cancel" +msgstr "Otkaži" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Create" +msgstr "Kreiraj" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_wizard +msgid "Create a Key" +msgstr "Kreiraj ključ" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__description +msgid "Description" +msgstr "Opis" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device_input +msgid "Device input" +msgstr "Ulaz uređaja" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__expiration_date +msgid "Expiration Date" +msgstr "Datum isteka" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired" +msgstr "Istekao" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired Keys" +msgstr "Istekli ključevi" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "Generate IoT Lock for this Input" +msgstr "Generiraj IoT bravu za ovaj unos" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__id +msgid "ID" +msgstr "ID" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device +msgid "IoT Device" +msgstr "IoT uređaj" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key +msgid "IoT Key" +msgstr "IoT ključ" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_action +msgid "IoT Key - Actions Log" +msgstr "IoT ključ - Dnevnik radnji" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_wizard_act_window +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "IoT Key Wizard" +msgstr "Čarobnjak IoT ključa" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_lock +msgid "IoT Lock" +msgstr "IoT brava" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "IoT Lock associated" +msgstr "IoT brava povezana" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_rule +msgid "IoT Rule (Relation Key-Lock)" +msgstr "IoT pravilo (veza ključ-brava)" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__iot_key_id +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_ids +msgid "Iot Key" +msgstr "IoT ključ" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_count +msgid "Iot Key Count" +msgstr "Broj IoT ključa" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_id +msgid "Key" +msgstr "Ključ" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__key_type +msgid "Key Type" +msgstr "Tip ključa" + +#. module: iot_rule +#: model:ir.model.constraint,message:iot_rule.constraint_iot_key_unique_virtual_key_uniq +msgid "Key must be unique" +msgstr "Ključ mora biti jedinstven" + +#. module: iot_rule +#. odoo-python +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#, python-format +msgid "Key of %s" +msgstr "Ključ od %s" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_name +msgid "Key's Name" +msgstr "Naziv ključa" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.res_partner_form_view +msgid "Keys" +msgstr "Ključevi" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_menu +msgid "Keys (Persons)" +msgstr "Ključevi (osobe)" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule____last_update +msgid "Last Modified on" +msgstr "Zadnje mijenjano" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_device_input__lock_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__lock_id +msgid "Lock" +msgstr "Zaključaj" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__lock_ids +msgid "Locks" +msgstr "Brave" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_lock_act_window +#: model:ir.ui.menu,name:iot_rule.iot_lock_menu +msgid "Locks (Devices)" +msgstr "Brave (uređaji)" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Member of these Groups of Locks" +msgstr "Član ovih grupa brava" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_mixin +msgid "Mixin for relation between record and Iot Keys" +msgstr "Mixin za vezu između zapisa i IoT ključeva" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__name +msgid "Name" +msgstr "Naziv:" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not Expired" +msgstr "Neisteklo" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not expired Keys" +msgstr "Neistekli ključevi" + +#. module: iot_rule +#. odoo-python +#: code:addons/iot_rule/models/iot_key.py:0 +#, python-format +msgid "Only one key can be assigned to this model" +msgstr "Samo jedan ključ se može dodijeliti ovom modelu" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__parent_ids +msgid "Parent" +msgstr "Nasljeđeni" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_model +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_model +msgid "Res Model" +msgstr "Res model" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__result +msgid "Result" +msgstr "Rezultat" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__rule_ids +msgid "Rule" +msgstr "Pravilo" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_rule_act_window +#: model:ir.actions.act_window,name:iot_rule.iot_rule_action +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__rule_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__rule_ids +#: model:ir.ui.menu,name:iot_rule.iot_define_rules_menu +#: model:ir.ui.menu,name:iot_rule.iot_rule_menu +msgid "Rules" +msgstr "Pravila" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__timestamp +msgid "Time" +msgstr "Vrijeme" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__unique_virtual_key +msgid "Unique Virtual Key" +msgstr "Jedinstveni virtualni ključ" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Update" +msgstr "Ažuriraj" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_action_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_action_menu +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Usage Log" +msgstr "Dnevnik korištenja" diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/es.po b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/es.po new file mode 100644 index 0000000..816fb20 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/es.po @@ -0,0 +1,355 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_rule +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-15 17:38+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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_rule +#: code:addons/iot_rule/models/iot_rule.py:0 +#, python-format +msgid "A recurssion was found" +msgstr "Se ha encontrado una recursión" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__action_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__action_ids +msgid "Action" +msgstr "Acción" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__active +msgid "Active" +msgstr "Activo" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +msgid "Authorized Lock Groups" +msgstr "Grupos de Cierre Autorizados" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Create" +msgstr "Crear" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_wizard +msgid "Create a Key" +msgstr "Crear una clave" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__description +msgid "Description" +msgstr "Descripción" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device_input +msgid "Device input" +msgstr "Entrada del dispositivo" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__expiration_date +msgid "Expiration Date" +msgstr "Fecha de Vencimiento" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired" +msgstr "Expirado" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired Keys" +msgstr "Claves Expiradas" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "Generate IoT Lock for this Input" +msgstr "Generar bloqueo IoT para esta entrada" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key +msgid "IoT Key" +msgstr "Llave IoT" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_action +msgid "IoT Key - Actions Log" +msgstr "Clave IoT - Registro de Acciones" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_wizard_act_window +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "IoT Key Wizard" +msgstr "Asistente para claves IoT" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_lock +msgid "IoT Lock" +msgstr "Cerradura IoT" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "IoT Lock associated" +msgstr "Bloqueo IoT asociado" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_rule +msgid "IoT Rule (Relation Key-Lock)" +msgstr "Regla IoT (bloqueo de clave de relación)" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__iot_key_id +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_ids +msgid "Iot Key" +msgstr "Clave Iot" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_count +msgid "Iot Key Count" +msgstr "Recuento de claves Iot" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_id +msgid "Key" +msgstr "Clave" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__key_type +msgid "Key Type" +msgstr "Tipo de llave" + +#. module: iot_rule +#: model:ir.model.constraint,message:iot_rule.constraint_iot_key_unique_virtual_key_uniq +msgid "Key must be unique" +msgstr "La clave debe ser única" + +#. module: iot_rule +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#, python-format +msgid "Key of %s" +msgstr "Clave de %s" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_name +msgid "Key's Name" +msgstr "Nombre de la clave" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.res_partner_form_view +msgid "Keys" +msgstr "Llaves" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_menu +msgid "Keys (Persons)" +msgstr "Llaves (Personas)" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_device_input__lock_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__lock_id +msgid "Lock" +msgstr "Bloquear" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__lock_ids +msgid "Locks" +msgstr "Bloqueos" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_lock_act_window +#: model:ir.ui.menu,name:iot_rule.iot_lock_menu +msgid "Locks (Devices)" +msgstr "Cerraduras (dispositivos)" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Member of these Groups of Locks" +msgstr "Miembro de Estos Grupos de Bloqueos" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_mixin +msgid "Mixin for relation between record and Iot Keys" +msgstr "Mezcla para la relación entre registros y claves Iot" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__name +msgid "Name" +msgstr "Nombre" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not Expired" +msgstr "No Expirado" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not expired Keys" +msgstr "Claves no expiradas" + +#. module: iot_rule +#: code:addons/iot_rule/models/iot_key.py:0 +#, python-format +msgid "Only one key can be assigned to this model" +msgstr "Sólo se puede asignar una tecla a este modelo" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__parent_ids +msgid "Parent" +msgstr "Parental" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_id +msgid "Res" +msgstr "Rec" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_model +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_model +msgid "Res Model" +msgstr "Modelo Rec" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__result +msgid "Result" +msgstr "Resultado" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__rule_ids +msgid "Rule" +msgstr "Regla" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_rule_act_window +#: model:ir.actions.act_window,name:iot_rule.iot_rule_action +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__rule_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__rule_ids +#: model:ir.ui.menu,name:iot_rule.iot_define_rules_menu +#: model:ir.ui.menu,name:iot_rule.iot_rule_menu +msgid "Rules" +msgstr "Reglas" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__timestamp +msgid "Time" +msgstr "Tiempo" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__unique_virtual_key +msgid "Unique Virtual Key" +msgstr "Clave Virtual Única" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Update" +msgstr "Actualización" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_action_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_action_menu +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Usage Log" +msgstr "Registro de Utilización" diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/iot_rule.pot b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/iot_rule.pot new file mode 100644 index 0000000..9d3affb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/iot_rule.pot @@ -0,0 +1,355 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_rule +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_rule +#. odoo-python +#: code:addons/iot_rule/models/iot_rule.py:0 +#, python-format +msgid "A recurssion was found" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__action_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__action_ids +msgid "Action" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__active +msgid "Active" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +msgid "Authorized Lock Groups" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Cancel" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_res_partner +msgid "Contact" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Create" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_wizard +msgid "Create a Key" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_date +msgid "Created on" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__description +msgid "Description" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device_input +msgid "Device input" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__expiration_date +msgid "Expiration Date" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired Keys" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "Generate IoT Lock for this Input" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__id +msgid "ID" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device +msgid "IoT Device" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key +msgid "IoT Key" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_action +msgid "IoT Key - Actions Log" +msgstr "" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_wizard_act_window +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "IoT Key Wizard" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_lock +msgid "IoT Lock" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "IoT Lock associated" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_rule +msgid "IoT Rule (Relation Key-Lock)" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__iot_key_id +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_ids +msgid "Iot Key" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_count +msgid "Iot Key Count" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_id +msgid "Key" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__key_type +msgid "Key Type" +msgstr "" + +#. module: iot_rule +#: model:ir.model.constraint,message:iot_rule.constraint_iot_key_unique_virtual_key_uniq +msgid "Key must be unique" +msgstr "" + +#. module: iot_rule +#. odoo-python +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#, python-format +msgid "Key of %s" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_name +msgid "Key's Name" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.res_partner_form_view +msgid "Keys" +msgstr "" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_menu +msgid "Keys (Persons)" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_device_input__lock_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__lock_id +msgid "Lock" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__lock_ids +msgid "Locks" +msgstr "" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_lock_act_window +#: model:ir.ui.menu,name:iot_rule.iot_lock_menu +msgid "Locks (Devices)" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Member of these Groups of Locks" +msgstr "" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_mixin +msgid "Mixin for relation between record and Iot Keys" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__name +msgid "Name" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not Expired" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not expired Keys" +msgstr "" + +#. module: iot_rule +#. odoo-python +#: code:addons/iot_rule/models/iot_key.py:0 +#, python-format +msgid "Only one key can be assigned to this model" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__parent_ids +msgid "Parent" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_id +msgid "Res" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_model +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__result +msgid "Result" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__rule_ids +msgid "Rule" +msgstr "" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_rule_act_window +#: model:ir.actions.act_window,name:iot_rule.iot_rule_action +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__rule_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__rule_ids +#: model:ir.ui.menu,name:iot_rule.iot_define_rules_menu +#: model:ir.ui.menu,name:iot_rule.iot_rule_menu +msgid "Rules" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__timestamp +msgid "Time" +msgstr "" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__unique_virtual_key +msgid "Unique Virtual Key" +msgstr "" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Update" +msgstr "" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_action_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_action_menu +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Usage Log" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/it.po b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/it.po new file mode 100644 index 0000000..1e8523c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/i18n/it.po @@ -0,0 +1,354 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_rule +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-12 12:13+0000\n" +"Last-Translator: Francesco Foresti \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_rule +#: code:addons/iot_rule/models/iot_rule.py:0 +#, python-format +msgid "A recurssion was found" +msgstr "Trovata una ricorsione" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__action_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__action_ids +msgid "Action" +msgstr "Azione" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__active +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__active +msgid "Active" +msgstr "Attivo" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +msgid "Authorized Lock Groups" +msgstr "Gruppi blocco autorizzati" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Cancel" +msgstr "Annulla" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Create" +msgstr "Crea" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_wizard +msgid "Create a Key" +msgstr "Crea una chiave" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__create_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__description +msgid "Description" +msgstr "Descrizione" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device_input +msgid "Device input" +msgstr "Input dispositivo" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__display_name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__expiration_date +msgid "Expiration Date" +msgstr "Data di scadenza" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired" +msgstr "Scaduta" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Expired Keys" +msgstr "Chiavi scadute" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "Generate IoT Lock for this Input" +msgstr "Genera blocco IoT per questo input" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__id +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__id +msgid "ID" +msgstr "ID" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_device +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key +msgid "IoT Key" +msgstr "Chiave IoT" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_action +msgid "IoT Key - Actions Log" +msgstr "Chiave IoT - log azioni" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_wizard_act_window +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "IoT Key Wizard" +msgstr "Procedura guidata chiave ioT" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_lock +msgid "IoT Lock" +msgstr "Blocco IoT" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_device_input_form_view +msgid "IoT Lock associated" +msgstr "Blocco IoT associato" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_rule +msgid "IoT Rule (Relation Key-Lock)" +msgstr "Regola IoT (relazione chiave-blocco)" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__iot_key_id +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_ids +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_ids +msgid "Iot Key" +msgstr "Chiave IoT" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_mixin__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_partner__iot_key_count +#: model:ir.model.fields,field_description:iot_rule.field_res_users__iot_key_count +msgid "Iot Key Count" +msgstr "Conteggio chiave IoT" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_id +msgid "Key" +msgstr "Chiave" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__key_type +msgid "Key Type" +msgstr "Tipo chiave" + +#. module: iot_rule +#: model:ir.model.constraint,message:iot_rule.constraint_iot_key_unique_virtual_key_uniq +msgid "Key must be unique" +msgstr "La chiave deve essere univoca" + +#. module: iot_rule +#: code:addons/iot_rule/wizards/iot_key_wizard.py:0 +#, python-format +msgid "Key of %s" +msgstr "Chiave di %s" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__key_name +msgid "Key's Name" +msgstr "Nome chiave" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.res_partner_form_view +msgid "Keys" +msgstr "Chiavi" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_menu +msgid "Keys (Persons)" +msgstr "Chiave (persona)" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock____last_update +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_uid +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__write_date +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_device_input__lock_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__lock_id +msgid "Lock" +msgstr "Blocco" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__lock_ids +msgid "Locks" +msgstr "Blocchi" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_lock_act_window +#: model:ir.ui.menu,name:iot_rule.iot_lock_menu +msgid "Locks (Devices)" +msgstr "Blocchi (dispositivi)" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Member of these Groups of Locks" +msgstr "Componenti di questi gruppi di blocchi" + +#. module: iot_rule +#: model:ir.model,name:iot_rule.model_iot_key_mixin +msgid "Mixin for relation between record and Iot Keys" +msgstr "Mixin per la relazione tra record e chiavi lotto" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__name +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__name +msgid "Name" +msgstr "Nome" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not Expired" +msgstr "Non scaduto" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_search_view +msgid "Not expired Keys" +msgstr "Chiavi non scadute" + +#. module: iot_rule +#: code:addons/iot_rule/models/iot_key.py:0 +#, python-format +msgid "Only one key can be assigned to this model" +msgstr "Solo una chiave può essere associata a questo modello" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_rule__parent_ids +msgid "Parent" +msgstr "Padre" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_id +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__res_model +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__res_model +msgid "Res Model" +msgstr "Modello res" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__result +msgid "Result" +msgstr "Risultato" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__rule_ids +msgid "Rule" +msgstr "Regola" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_rule_act_window +#: model:ir.actions.act_window,name:iot_rule.iot_rule_action +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__rule_ids +#: model:ir.model.fields,field_description:iot_rule.field_iot_lock__rule_ids +#: model:ir.ui.menu,name:iot_rule.iot_define_rules_menu +#: model:ir.ui.menu,name:iot_rule.iot_rule_menu +msgid "Rules" +msgstr "Regole" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__timestamp +msgid "Time" +msgstr "Orario" + +#. module: iot_rule +#: model:ir.model.fields,field_description:iot_rule.field_iot_key__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_action__unique_virtual_key +#: model:ir.model.fields,field_description:iot_rule.field_iot_key_wizard__unique_virtual_key +msgid "Unique Virtual Key" +msgstr "Chiave virtuale univoca" + +#. module: iot_rule +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_wizard_form_view +msgid "Update" +msgstr "Aggiorna" + +#. module: iot_rule +#: model:ir.actions.act_window,name:iot_rule.iot_key_action_act_window +#: model:ir.ui.menu,name:iot_rule.iot_key_action_menu +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_key_form_view +#: model_terms:ir.ui.view,arch_db:iot_rule.iot_lock_form_view +msgid "Usage Log" +msgstr "Log utilizzo" diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/__init__.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/__init__.py new file mode 100644 index 0000000..41c53ba --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/__init__.py @@ -0,0 +1,7 @@ +from . import iot_lock +from . import iot_key +from . import iot_rule +from . import iot_key_action +from . import res_partner +from . import iot_device_input +from . import iot_device diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device.py new file mode 100644 index 0000000..0499650 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device.py @@ -0,0 +1,30 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models + + +class IotDevice(models.Model): + _inherit = "iot.device" + + def get_iot_keys(self, serial_of_input, type_of_key): + iot_input = self.env["iot.device.input"].search( + [("serial", "=", serial_of_input)], limit=1 + ) + if iot_input: + if iot_input.lock_id: + domain = [] + if type_of_key != "ALL": + domain.append(("key_type", "=", type_of_key)) + return {"keys": iot_input.lock_id.get_virtual_keys(domain)} + return {"error": "no input found"} + + def write(self, vals): + if vals.get("name", False): + for device in self: + for device_input in device.input_ids: + if device_input.lock_id: + input_name = device_input.name + device_input.lock_id.write( + {"name": vals.get("name") + " / " + input_name} + ) + return super().write(vals) diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device_input.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device_input.py new file mode 100644 index 0000000..3242333 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_device_input.py @@ -0,0 +1,29 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IotDeviceInput(models.Model): + _inherit = "iot.device.input" + + lock_id = fields.Many2one("iot.lock") + + def call_lock(self, value): + result = self.lock_id.check_access_unique_virtual_key(value) + return {"access_granted": result} + + def get_iot_keys(self, domain=None): + if domain is None: + domain = [] + return {"keys": self.lock_id.get_virtual_keys(domain)} + + def generate_iot_lock(self): + self.ensure_one() + if not self.lock_id: + device_name = self.device_id.name + lock = self.env["iot.lock"].create( + {"name": device_name + " / " + self.name} + ) + self.lock_id = lock.id + return {} diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key.py new file mode 100644 index 0000000..be5d7c6 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key.py @@ -0,0 +1,122 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import uuid +from datetime import datetime + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class IotKey(models.Model): + _name = "iot.key" + _description = "IoT Key" + _rec_name = "unique_virtual_key" + + name = fields.Char() + key_type = fields.Char() + unique_virtual_key = fields.Char( + readonly=True, + default="/", + required=True, + ) + expiration_date = fields.Datetime() + rule_ids = fields.Many2many("iot.rule", string="Rules") + action_ids = fields.One2many("iot.key.action", inverse_name="key_id") + active = fields.Boolean(default=True) + res_id = fields.Integer(index=True) + res_model = fields.Char(index=True) + + _sql_constraints = [ + ( + "unique_virtual_key_uniq", + "UNIQUE(unique_virtual_key)", + "Key must be unique", + ), + ] + + def _get_unique_virtual_key(self, vals): + """Hook that can be used to define the key according to needs""" + return uuid.uuid4() + + @api.model_create_multi + def create(self, mvals): + for vals in mvals: + if vals.get("unique_virtual_key", "/") == "/": + vals["unique_virtual_key"] = self._get_unique_virtual_key(vals) + return super().create(mvals) + + def view_actions(self): + self.ensure_one() + action = self.env.ref("iot_rule.iot_key_action_act_window").read()[0] + action["domain"] = [("key_id", "=", self.id)] + return action + + def get_iot_rule_values(self): + result = [] + for key in self: + result.append(key._get_iot_rule_values()) + return result + + def _get_iot_rule_values(self): + if self.expiration_date: + expiration_timestamp = int(datetime.timestamp(self.expiration_date)) + else: + expiration_timestamp = False + return { + "key_type": self.key_type, + "expiration_date": expiration_timestamp, + "unique_virtual_key": self.unique_virtual_key, + "id": self.id, + } + + def _get_unique_key_models(self): + return [] + + @api.constrains("res_model", "res_id") + def _constrain_key_model(self): + unique_models = self._get_unique_key_models() + for record in self: + if record.res_model not in unique_models: + continue + if self.with_context(active_test=False).search( + [ + ("id", "!=", record.id), + ("res_id", "=", record.res_id), + ("res_model", "=", record.res_model), + ], + limit=1, + ): + raise ValidationError(_("Only one key can be assigned to this model")) + + +class IotKeyMixin(models.AbstractModel): + _name = "iot.key.mixin" + _description = "Mixin for relation between record and Iot Keys" + + iot_key_ids = fields.One2many( + "iot.key", + inverse_name="res_id", + domain=lambda r: [("res_model", "=", r._name)], + ) + iot_key_count = fields.Integer(compute="_compute_iot_key_count") + + @api.depends("iot_key_ids") + def _compute_iot_key_count(self): + for record in self: + record.iot_key_count = len(record.iot_key_ids) + + def action_view_iot_key(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "iot_rule.iot_key_act_window" + ) + action["domain"] = [ + ("res_id", "=", self.id), + ("res_model", "=", self._name), + ] + action["context"] = { + "default_res_id": self.id, + "default_res_model": self._name, + } + return action diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key_action.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key_action.py new file mode 100644 index 0000000..85b655e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_key_action.py @@ -0,0 +1,20 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IotKeyAction(models.Model): + + _name = "iot.key.action" + _description = "IoT Key - Actions Log" + _order = "timestamp DESC" + + key_id = fields.Many2one("iot.key") + key_name = fields.Char(related="key_id.name", string="Key's Name") + unique_virtual_key = fields.Char() + lock_id = fields.Many2one("iot.lock", required=True) + result = fields.Char(required=True, default="undefined") + timestamp = fields.Datetime( + string="Time", default=fields.Datetime.now, required=True + ) diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_lock.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_lock.py new file mode 100644 index 0000000..dbdd648 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_lock.py @@ -0,0 +1,66 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IotLock(models.Model): + + _name = "iot.lock" + _description = "IoT Lock" + + name = fields.Char(required=True) + description = fields.Text() + rule_ids = fields.Many2many("iot.rule", string="Rules") + action_ids = fields.One2many("iot.key.action", inverse_name="lock_id") + active = fields.Boolean(default=True, required=True) + + def check_access_unique_virtual_key(self, unique_virtual_key): + self.ensure_one() + key = self.env["iot.key"].search( + [("unique_virtual_key", "=", unique_virtual_key)], limit=1 + ) + if not key: + self._missing_key(unique_virtual_key) + return False + return self.check_access(key) + + def _missing_key(self, unique_virtual_key): + return self.env["iot.key.action"].create( + self._missing_key_action_vals(unique_virtual_key) + ) + + def _missing_key_action_vals(self, unique_virtual_key): + return { + "lock_id": self.id, + "unique_virtual_key": unique_virtual_key, + "result": "refused", + } + + def check_access(self, key): + result = self.rule_ids._check_access(key) + self.create_action(key, result) + return result + + def create_action(self, key, result): + return self.env["iot.key.action"].create(self._create_action_vals(key, result)) + + def _create_action_vals(self, key, result): + return { + "lock_id": self.id, + "key_id": key.id, + "result": "accepted" if result else "refused", + } + + def view_actions(self): + self.ensure_one() + action = self.env.ref("iot_rule.iot_key_action_act_window").read()[0] + action["domain"] = [("lock_id", "=", self.id)] + return action + + def get_virtual_keys(self, domain=None): + self.ensure_one() + if domain is None: + domain = [] + keys = self.rule_ids._get_virtual_keys(domain) + return keys.get_iot_rule_values() diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_rule.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_rule.py new file mode 100644 index 0000000..fff92b8 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/iot_rule.py @@ -0,0 +1,55 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class IotRule(models.Model): + + _name = "iot.rule" + _description = "IoT Rule (Relation Key-Lock)" + + name = fields.Char() + active = fields.Boolean(default=True, required=True) + lock_ids = fields.Many2many("iot.lock", string="Locks") + parent_ids = fields.Many2many( + "iot.rule", + relation="iot_rule_implied_rel", + column1="rule_id", + column2="implied_rule_id", + ) + + def _check_access(self, key): + if key.expiration_date and key.expiration_date < fields.Datetime.now(): + return False + return self._check_access_recursion(key) + + def _check_access_recursion(self, key, limit=0): + if not self: + return False + if limit > 50: + return False + if self & key.rule_ids: + return True + return self.mapped("parent_ids")._check_access_recursion(key, limit + 1) + + @api.constrains("parent_ids") + def _check_recursion_parent_ids(self): + if not self._check_m2m_recursion("parent_ids"): + raise ValidationError(_("A recurssion was found")) + + def _get_virtual_keys(self, domain, limit=0): + if not self or limit > 50: + return self.env["iot.key"] + return self.mapped("parent_ids")._get_virtual_keys( + domain, limit + 1 + ) | self.env["iot.key"].search( + domain + + [ + ("rule_ids", "in", self.ids), + "|", + ("expiration_date", "=", False), + ("expiration_date", ">=", fields.Datetime.now()), + ] + ) diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/models/res_partner.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/res_partner.py new file mode 100644 index 0000000..944c1d7 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/models/res_partner.py @@ -0,0 +1,9 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class ResPartner(models.Model): + _name = "res.partner" + _inherit = ["res.partner", "iot.key.mixin"] diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-iot-iot_rule/iot_rule/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..21c844e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Enric Tobella +* Luis Burrel +* Aaron Henriquez diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/readme/DESCRIPTION.rst b/odoo-bringout-oca-iot-iot_rule/iot_rule/readme/DESCRIPTION.rst new file mode 100644 index 0000000..06cde52 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/readme/DESCRIPTION.rst @@ -0,0 +1,8 @@ +This addon allows to define IoT Rules. + +A Rule specifies which Inputs that can be controlled by a certain Key. +The Key is owned by an Agent (Employee, Partner or anonymous). +The Input is a request from an IoT Device that executes a certain function in Odoo. +This function will check if the Key (= the Agent) is allowed by any Rule to "control" the Device. +If Odoo answers positively the Agent will be allowed the to execute some Function on the Device +(for example open a door or switch on a relay). diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/security/ir.model.access.csv b/odoo-bringout-oca-iot-iot_rule/iot_rule/security/ir.model.access.csv new file mode 100644 index 0000000..040020c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/security/ir.model.access.csv @@ -0,0 +1,9 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_iot_key,access Key,model_iot_key,iot_oca.group_iot_user,1,0,0,0 +access_iot_lock,access Lock,model_iot_lock,iot_oca.group_iot_user,1,0,0,0 +access_iot_rule,access Group,model_iot_rule,iot_oca.group_iot_user,1,0,0,0 +access_iot_key_action,access Key Action,model_iot_key_action,iot_oca.group_iot_user,1,1,1,0 +manage_iot_key,Manage Key,model_iot_key,iot_oca.group_iot_user,1,1,1,0 +manage_iot_lock,Manage Lock,model_iot_lock,iot_oca.group_iot_manager,1,1,1,0 +manage_iot_rule,Manage Group,model_iot_rule,iot_oca.group_iot_manager,1,1,1,0 +access_iot_key_wizard,access_iot_key_wizard,model_iot_key_wizard,iot_oca.group_iot_user,1,1,1,0 diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.png b/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3004e5b91d3379cbde8b3067fc179d04a35c57 GIT binary patch literal 3305 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 B6(Rrt literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.svg b/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.svg new file mode 100644 index 0000000..41b0eb8 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.svg @@ -0,0 +1,143 @@ + + + + + + image/svg+xml + + icon + + + + + + + + + + + + + + + icon + + + + + + + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/index.html b/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/index.html new file mode 100644 index 0000000..58ad210 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/index.html @@ -0,0 +1,432 @@ + + + + + +IoT Rule + + + +
+

IoT Rule

+ + +

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

+

This addon allows to define IoT Rules.

+

A Rule specifies which Inputs that can be controlled by a certain Key. +The Key is owned by an Agent (Employee, Partner or anonymous). +The Input is a request from an IoT Device that executes a certain function in Odoo. +This function will check if the Key (= the Agent) is allowed by any Rule to “control” the Device. +If Odoo answers positively the Agent will be allowed the to execute some Function on the Device +(for example open a door or switch on a relay).

+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • CreuBlanca
  • +
  • ForgeFlow
  • +
+
+
+

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/odoo-bringout-oca-iot-iot_rule/iot_rule/tests/__init__.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/tests/__init__.py new file mode 100644 index 0000000..fcb64da --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/tests/__init__.py @@ -0,0 +1 @@ +from . import test_iot_rule diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/tests/test_iot_rule.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/tests/test_iot_rule.py new file mode 100644 index 0000000..ea4909f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/tests/test_iot_rule.py @@ -0,0 +1,299 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import timedelta +from unittest.mock import patch + +from odoo.exceptions import ValidationError +from odoo.fields import Datetime +from odoo.tests.common import TransactionCase + +from ..models.iot_key import IotKey + + +class TestIotRule(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.rule_1 = cls.env["iot.rule"].create({"name": "rule 1"}) + cls.rule_2 = cls.env["iot.rule"].create({"name": "rule 2"}) + cls.lock_1 = cls.env["iot.lock"].create( + {"name": "Lock 1", "rule_ids": [(4, cls.rule_1.id)]} + ) + cls.type_of_key_1 = "RFID" + cls.key_1 = cls.env["iot.key"].create( + { + "name": "Key 1", + "rule_ids": [(4, cls.rule_1.id)], + "key_type": cls.type_of_key_1, + } + ) + cls.type_of_key_2 = "UUID" + cls.key_2 = cls.env["iot.key"].create( + { + "name": "Key 2", + "rule_ids": [(4, cls.rule_2.id)], + "key_type": cls.type_of_key_2, + } + ) + cls.partner = cls.env["res.partner"].create({"name": "Demo partner"}) + cls.system = cls.env["iot.communication.system"].create({"name": "Testing"}) + cls.device_1 = cls.env["iot.device"].create( + {"name": "device 1", "communication_system_id": cls.system.id} + ) + cls.serial_of_input_1 = "serial 1" + cls.passphrase_of_input_1 = "password 1" + cls.name_of_input_1 = "name 1" + cls.device_input_1 = cls.env["iot.device.input"].create( + { + "name": cls.name_of_input_1, + "device_id": cls.device_1.id, + "active": True, + "serial": cls.serial_of_input_1, + "passphrase": cls.passphrase_of_input_1, + "call_model_id": cls.env.ref("iot_input_oca.model_iot_device_input").id, + "call_function": "test_input_device", + "lock_id": cls.lock_1.id, + } + ) + cls.device_2 = cls.env["iot.device"].create( + {"name": "device 2", "communication_system_id": cls.system.id} + ) + cls.serial_of_input_2 = "serial 2" + cls.passphrase_of_input_2 = "password 2" + cls.name_of_input_2 = "name 2" + cls.device_input_2 = cls.env["iot.device.input"].create( + { + "name": cls.name_of_input_2, + "device_id": cls.device_2.id, + "active": True, + "serial": cls.serial_of_input_2, + "passphrase": cls.passphrase_of_input_2, + "call_model_id": cls.env.ref("iot_input_oca.model_iot_device_input").id, + "call_function": "test_input_device", + } + ) + cls.serial_of_input_without_device = "foo orphan" + + def test_allowed_access(self): + self.assertTrue( + self.lock_1.check_access_unique_virtual_key(self.key_1.unique_virtual_key) + ) + + def test_not_allowed_access(self): + self.assertFalse( + self.lock_1.check_access_unique_virtual_key(self.key_2.unique_virtual_key) + ) + + def test_non_existing_key(self): + self.assertFalse(self.lock_1.action_ids) + self.assertFalse( + self.lock_1.check_access_unique_virtual_key( + self.key_1.unique_virtual_key + self.key_2.unique_virtual_key + ) + ) + self.assertTrue(self.lock_1.action_ids) + self.assertFalse(self.lock_1.action_ids.key_id) + + def test_not_unique_key_model(self): + self.key_1.write({"res_model": self.partner._name, "res_id": self.partner.id}) + + def test_unique_key_models(self): + with patch.object(IotKey, "_get_unique_key_models") as mocked: + mocked.return_value = [self.partner._name] + self.key_1.write( + {"res_model": self.partner._name, "res_id": self.partner.id} + ) + with self.assertRaises(ValidationError): + self.key_2.write( + {"res_model": self.partner._name, "res_id": self.partner.id} + ) + + def test_inheritance(self): + self.rule_1.parent_ids = [(4, self.rule_2.id)] + self.assertTrue( + self.lock_1.check_access_unique_virtual_key(self.key_2.unique_virtual_key) + ) + + def test_inheritance_loop(self): + rule = self.env["iot.rule"].create({"name": "rule 1 0"}) + self.rule_1.parent_ids = [(4, rule.id)] + for i in range(0, 50): + key = self.env["iot.key"].create( + {"name": "Key 2", "rule_ids": [(4, rule.id)]} + ) + self.assertTrue( + self.lock_1.check_access_unique_virtual_key(key.unique_virtual_key) + ) + new_rule = self.env["iot.rule"].create({"name": "rule 1 %s" % i}) + rule.parent_ids = [(4, new_rule.id)] + rule = new_rule + key = self.env["iot.key"].create({"name": "Key 2", "rule_ids": [(4, rule.id)]}) + self.assertFalse( + self.lock_1.check_access_unique_virtual_key(key.unique_virtual_key) + ) + + def test_recursion(self): + self.rule_1.parent_ids = [(4, self.rule_2.id)] + with self.assertRaises(ValidationError): + self.rule_2.parent_ids = [(4, self.rule_1.id)] + + def test_actions(self): + self.assertFalse(self.key_1.action_ids) + self.assertFalse(self.lock_1.action_ids) + self.lock_1.check_access_unique_virtual_key(self.key_1.unique_virtual_key) + self.assertTrue(self.key_1.action_ids) + self.assertTrue(self.lock_1.action_ids) + self.assertFalse(self.key_2.action_ids) + self.lock_1.check_access_unique_virtual_key(self.key_2.unique_virtual_key) + self.assertTrue(self.key_2.action_ids) + action = self.lock_1.view_actions() + self.assertEqual( + self.lock_1.action_ids, + self.env[action["res_model"]].search(action["domain"]), + ) + action = self.key_1.view_actions() + self.assertEqual( + self.env[action["res_model"]].search(action["domain"]), + self.key_1.action_ids, + ) + + def test_expiration(self): + self.assertTrue( + self.lock_1.check_access_unique_virtual_key(self.key_1.unique_virtual_key) + ) + now = Datetime.from_string(Datetime.now()) + self.key_1.expiration_date = Datetime.to_string(now + timedelta(hours=1)) + self.assertTrue( + self.lock_1.check_access_unique_virtual_key(self.key_1.unique_virtual_key) + ) + self.key_1.expiration_date = Datetime.to_string(now + timedelta(hours=-1)) + self.assertFalse( + self.lock_1.check_access_unique_virtual_key(self.key_1.unique_virtual_key) + ) + + def test_lock_find_keys(self): + result = self.lock_1.get_virtual_keys() + self.assertEqual(len(result), 1) + self.assertEqual(result[0]["id"], self.key_1.id) + key = self.env["iot.key"].create( + {"name": "Key 1", "rule_ids": [(4, self.rule_1.id)]} + ) + result = self.lock_1.get_virtual_keys() + self.assertEqual(len(result), 2) + ids = [r["id"] for r in result] + self.assertIn(self.key_1.id, ids) + self.assertIn(key.id, ids) + now = Datetime.from_string(Datetime.now()) + key.expiration_date = Datetime.to_string(now + timedelta(hours=-1)) + result = self.lock_1.get_virtual_keys() + self.assertEqual(len(result), 1) + self.assertEqual(result[0]["id"], self.key_1.id) + key.expiration_date = Datetime.to_string(now + timedelta(hours=1)) + result = self.lock_1.get_virtual_keys() + self.assertEqual(len(result), 2) + ids = [r["id"] for r in result] + self.assertIn(self.key_1.id, ids) + self.assertIn(key.id, ids) + + def test_wizard(self): + self.assertEqual(0, self.partner.iot_key_count) + wizard_key = self.env["iot.key.wizard"].create( + { + "res_id": self.partner.id, + "res_model": self.partner._name, + "unique_virtual_key": "Testing Key", + "rule_ids": [(4, self.rule_1.id)], + } + ) + wizard_key.create_key() + key = wizard_key.iot_key_id + self.assertEqual(key.unique_virtual_key, "Testing Key") + self.assertEqual(key.rule_ids, self.rule_1) + self.partner.invalidate_model() + self.assertEqual(1, self.partner.iot_key_count) + action = self.partner.action_view_iot_key() + self.assertEqual(key, self.env[action["res_model"]].search(action["domain"])) + original_key = key + wizard_key = self.env["iot.key.wizard"].create( + { + "res_id": self.partner.id, + "res_model": self.partner._name, + "iot_key_id": key.id, + "unique_virtual_key": "Testing Key 2", + "rule_ids": [(4, self.rule_1.id)], + } + ) + wizard_key.update_key() + key.invalidate_model() + self.assertEqual(key.unique_virtual_key, "Testing Key 2") + wizard_key = self.env["iot.key.wizard"].create( + { + "res_id": self.partner.id, + "res_model": self.partner._name, + "iot_key_id": key.id, + "unique_virtual_key": "Testing Key", + "rule_ids": [(4, self.rule_1.id)], + } + ) + wizard_key.create_key() + key.invalidate_model() + self.assertEqual(key.unique_virtual_key, "Testing Key") + self.assertEqual(key, original_key) + + def test_get_iot_keys_from_device_serial_and_type_of_key(self): + result = self.env["iot.device"].get_iot_keys( + self.serial_of_input_2, self.type_of_key_1 + ) + self.assertTrue(result.get("error", False)) + result = self.env["iot.device"].get_iot_keys( + self.serial_of_input_without_device, self.type_of_key_1 + ) + self.assertTrue(result.get("error", False)) + result = self.env["iot.device"].get_iot_keys( + self.serial_of_input_1, self.type_of_key_1 + ) + self.assertEqual(len(result["keys"]), 1) + self.assertEqual(result["keys"][0].get("key_type"), self.type_of_key_1) + result = self.env["iot.device"].get_iot_keys( + self.serial_of_input_1, self.type_of_key_2 + ) + self.assertEqual(len(result["keys"]), 0) + result = self.env["iot.device"].get_iot_keys(self.serial_of_input_1, "ALL") + self.assertEqual(len(result["keys"]), 1) + self.rule_1.write({"parent_ids": [(4, self.rule_2.id)]}) + result = self.env["iot.device"].get_iot_keys(self.serial_of_input_1, "ALL") + self.assertEqual(len(result["keys"]), 2) + + def test_get_iot_keys_from_device_input(self): + result = self.device_input_1.get_iot_keys() + self.assertEqual(len(result["keys"]), 1) + self.assertEqual(result["keys"][0].get("id"), self.key_1.id) + + def test_call_lock_of_a_device_input(self): + self.assertTrue( + self.device_input_1.call_lock(self.key_1.unique_virtual_key).get( + "access_granted" + ) + ) + + def test_generate_iot_lock_for_device_input(self): + self.device_2.write({"name": "Changing name"}) + self.assertFalse(self.device_input_2.lock_id) + self.device_input_2.generate_iot_lock() + lock = self.env["iot.lock"].search( + [("id", "=", self.device_input_2.lock_id.id)], limit=1 + ) + self.assertEqual( + lock.name, self.device_2.name + " / " + self.device_input_2.name + ) + self.device_input_2.generate_iot_lock() + self.assertEqual(lock, self.device_input_2.lock_id) + + def test_change_name_of_lock_if_device_name_changes(self): + self.device_1_new_name = "some funky cool new name" + self.device_1.write({"name": self.device_1_new_name}) + self.assertEqual( + self.lock_1.name, self.device_1_new_name + " / " + self.device_input_1.name + ) diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_device_input.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_device_input.xml new file mode 100644 index 0000000..7db68f5 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_device_input.xml @@ -0,0 +1,27 @@ + + + + + iot.device.input.form (in iot_rule) + iot.device.input + + + +
+
+

+ +

+
+ + + + + + + + + + + + + +
+ + + + + iot.key.search (in iot_rule) + iot.key + + + + + + + + + + + + iot.key.tree (in iot_rule) + iot.key + + + + + + + + + + + Keys (Persons) + iot.key + tree,form + [] + {} + + + Keys (Persons) + + + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_key_action.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_key_action.xml new file mode 100644 index 0000000..6c01fce --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_key_action.xml @@ -0,0 +1,62 @@ + + + + + iot.key.action.form (in iot_rule) + iot.key.action + +
+
+ + + + + + + + + + + + + + iot.key.action.search (in iot_rule) + iot.key.action + + + + + + + + + + + + iot.key.action.tree (in iot_rule) + iot.key.action + + + + + + + + + + + + Usage Log + iot.key.action + tree,form + [] + {} + + + Usage Log + + + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_lock.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_lock.xml new file mode 100644 index 0000000..0a52c50 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_lock.xml @@ -0,0 +1,76 @@ + + + + + iot.lock.form (in iot_rule) + iot.lock + +
+
+ + + +
+
+ + + + + + + +
+ + + + + iot.lock.search (in iot_rule) + iot.lock + + + + + + + + + iot.lock.tree (in iot_rule) + iot.lock + + + + + + + + + Locks (Devices) + iot.lock + tree,form + [] + {} + + + Locks (Devices) + + + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_rule.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_rule.xml new file mode 100644 index 0000000..ae2226d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/iot_rule.xml @@ -0,0 +1,73 @@ + + + + + iot.rule.form (in iot_rule) + iot.rule + +
+
+ + + +
+ + + + + + + + + + + iot.rule.search (in iot_rule) + iot.rule + + + + + + + + iot.rule.tree (in iot_rule) + iot.rule + + + + + + + + Rules + iot.rule + tree,form + [] + {} + + + Rules + ir.actions.act_window + iot.rule + tree,form + + + + diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/views/res_partner.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/res_partner.xml new file mode 100644 index 0000000..7097f63 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/views/res_partner.xml @@ -0,0 +1,30 @@ + + + + + res.partner.form (in iot_rule) + res.partner + + +
+ +
+
+
+
diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/__init__.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/__init__.py new file mode 100644 index 0000000..bec1785 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/__init__.py @@ -0,0 +1 @@ +from . import iot_key_wizard diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.py b/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.py new file mode 100644 index 0000000..9f9c9ea --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.py @@ -0,0 +1,48 @@ +# Copyright 2021 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models + + +class OddoorKeyWizard(models.TransientModel): + + _name = "iot.key.wizard" + _description = "Create a Key" + + res_id = fields.Integer(required=True) + res_model = fields.Char(required=True) + iot_key_id = fields.Many2one( + "iot.key", + ) + unique_virtual_key = fields.Char(required=True) + rule_ids = fields.Many2many("iot.rule") + + def _create_iot_key_vals(self): + record = self.env[self.res_model].browse(self.res_id) + return { + "res_id": self.res_id, + "res_model": self.res_model, + "name": _("Key of %s") % record.display_name, + "unique_virtual_key": self.unique_virtual_key, + "rule_ids": [(6, 0, self.rule_ids.ids)], + } + + def create_key(self): + self.ensure_one() + if not self.iot_key_id: + self.iot_key_id = self.env["iot.key"].create(self._create_iot_key_vals()) + return self.update_key(False) + return self.update_key() + + def _update_key_vals(self): + record = self.env[self.res_model].browse(self.res_id) + return { + "unique_virtual_key": self.unique_virtual_key, + "name": _("Key of %s") % record.display_name, + "rule_ids": [(6, 0, self.rule_ids.ids)], + } + + def update_key(self, update=True): + if update: + self.iot_key_id.write(self._update_key_vals()) + return {} diff --git a/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.xml b/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.xml new file mode 100644 index 0000000..90747cc --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/iot_rule/wizards/iot_key_wizard.xml @@ -0,0 +1,44 @@ + + + + + iot.key.wizard.form (in iot_rule) + iot.key.wizard + +
+ + + + + + + +
+
+ +
+
+ + IoT Key Wizard + iot.key.wizard + form + {} + new + +
diff --git a/odoo-bringout-oca-iot-iot_rule/pyproject.toml b/odoo-bringout-oca-iot-iot_rule/pyproject.toml new file mode 100644 index 0000000..4fa6e2d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_rule/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "odoo-bringout-oca-iot-iot_rule" +version = "16.0.0" +description = "IoT Rule - + Define IoT Rules (Keys that control Inputs)" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-iot-iot_input_oca>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["iot_rule"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-iot-iot_template_oca/README.md b/odoo-bringout-oca-iot-iot_template_oca/README.md new file mode 100644 index 0000000..5a08a4e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/README.md @@ -0,0 +1,45 @@ +# IoT Templates + +Odoo addon: iot_template_oca + +## Installation + +```bash +pip install odoo-bringout-oca-iot-iot_template_oca +``` + +## Dependencies + +This addon depends on: +- iot_input_oca +- iot_output_oca + +## Manifest Information + +- **Name**: IoT Templates +- **Version**: 16.0.1.0.1 +- **Category**: IoT +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/iot](https://github.com/OCA/iot) branch 16.0, addon `iot_template_oca`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/ARCHITECTURE.md b/odoo-bringout-oca-iot-iot_template_oca/doc/ARCHITECTURE.md new file mode 100644 index 0000000..3a4a9f1 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Iot_template_oca Module - iot_template_oca + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/CONFIGURATION.md b/odoo-bringout-oca-iot-iot_template_oca/doc/CONFIGURATION.md new file mode 100644 index 0000000..96079e2 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for iot_template_oca. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/CONTROLLERS.md b/odoo-bringout-oca-iot-iot_template_oca/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/DEPENDENCIES.md b/odoo-bringout-oca-iot-iot_template_oca/doc/DEPENDENCIES.md new file mode 100644 index 0000000..42c642e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/DEPENDENCIES.md @@ -0,0 +1,6 @@ +# Dependencies + +This addon depends on: + +- [iot_input_oca](https://github.com/bringout/oca-technical) +- [iot_output_oca](https://github.com/bringout/oca-technical) diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/FAQ.md b/odoo-bringout-oca-iot-iot_template_oca/doc/FAQ.md new file mode 100644 index 0000000..af28344 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon iot_template_oca or install in UI. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/INSTALL.md b/odoo-bringout-oca-iot-iot_template_oca/doc/INSTALL.md new file mode 100644 index 0000000..c5ee263 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-iot-iot_template_oca" +# or +uv pip install odoo-bringout-oca-iot-iot_template_oca" +``` diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/MODELS.md b/odoo-bringout-oca-iot-iot_template_oca/doc/MODELS.md new file mode 100644 index 0000000..56011da --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/MODELS.md @@ -0,0 +1,19 @@ +# Models + +Detected core models and extensions in iot_template_oca. + +```mermaid +classDiagram + class iot_template + class iot_template_input + class iot_template_key + class iot_template_output + class image_mixin + class iot_device + class iot_device_input + class iot_device_output +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/OVERVIEW.md b/odoo-bringout-oca-iot-iot_template_oca/doc/OVERVIEW.md new file mode 100644 index 0000000..548b773 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: iot_template_oca. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon iot_template_oca +- License: LGPL-3 diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/REPORTS.md b/odoo-bringout-oca-iot-iot_template_oca/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/SECURITY.md b/odoo-bringout-oca-iot-iot_template_oca/doc/SECURITY.md new file mode 100644 index 0000000..c5c6cd1 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/SECURITY.md @@ -0,0 +1,34 @@ +# Security + +Access control and security definitions in iot_template_oca. + +## Access Control Lists (ACLs) + +Model access permissions defined in: +- **[ir.model.access.csv](../iot_template_oca/security/ir.model.access.csv)** + - 9 model access rules + +## Record Rules + +Row-level security rules defined in: + +```mermaid +graph TB + subgraph "Security Layers" + A[Users] --> B[Groups] + B --> C[Access Control Lists] + C --> D[Models] + B --> E[Record Rules] + E --> F[Individual Records] + end +``` + +Security files overview: +- **[ir.model.access.csv](../iot_template_oca/security/ir.model.access.csv)** + - Model access permissions (CRUD rights) + +Notes +- Access Control Lists define which groups can access which models +- Record Rules provide row-level security (filter records by user/group) +- Security groups organize users and define permission sets +- All security is enforced at the ORM level by Odoo diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-iot-iot_template_oca/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/USAGE.md b/odoo-bringout-oca-iot-iot_template_oca/doc/USAGE.md new file mode 100644 index 0000000..0d2f986 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon iot_template_oca +``` diff --git a/odoo-bringout-oca-iot-iot_template_oca/doc/WIZARDS.md b/odoo-bringout-oca-iot-iot_template_oca/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/README.rst b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/README.rst new file mode 100644 index 0000000..2036243 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/README.rst @@ -0,0 +1,92 @@ +============= +IoT Templates +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:fc16a291813bfa9f574daf5a7d8f44ebc8ea2b4b22ea7446a45928e6094c0cf2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/16.0/iot_template_oca + :alt: OCA/iot +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/iot-16-0/iot-16-0-iot_template_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/iot&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Create a system of templates for IoT devices. + +When we are using a template we can configure a device +with a simple URL configuration. +The device will contact odoo and send the template name. +Odoo will create the device and respond with all the +expected data. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. Create a template with a module or in `Iot > Templates` +2. Access `Iot > Config Device` +3. Confirm that you want to configurate a new device +4. Copy the URL +5. Access the device and send it the configuration url +6. The device will contact odoo and automatically configure itself. + +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 to smash 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/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__init__.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__init__.py new file mode 100644 index 0000000..fa0ba4b --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__init__.py @@ -0,0 +1,3 @@ +from . import controller +from . import models +from . import wizards diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__manifest__.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__manifest__.py new file mode 100644 index 0000000..966a501 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright (C) 2018 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "IoT Templates", + "version": "16.0.1.0.1", + "category": "IoT", + "author": "Creu Blanca, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "summary": "IoT module for managing templates", + "depends": ["iot_input_oca", "iot_output_oca"], + "website": "https://github.com/OCA/iot", + "data": [ + "security/ir.model.access.csv", + "wizards/iot_device_configure.xml", + "views/iot_template_views.xml", + ], + "demo": ["demo/iot_template.xml"], +} diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/__init__.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/__init__.py new file mode 100644 index 0000000..96960bb --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/__init__.py @@ -0,0 +1 @@ +from . import iot_controller diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/iot_controller.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/iot_controller.py new file mode 100644 index 0000000..c7791e1 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/controller/iot_controller.py @@ -0,0 +1,25 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import json + +from odoo import http + + +class CallIot(http.Controller): + @http.route( + ["/iot//configure"], + type="http", + auth="none", + methods=["POST"], + csrf=False, + ) + def configure_iot(self, serial, template, **kwargs): + request = http.request + if not request.env: + return json.dumps(False) + return json.dumps( + request.env["iot.device.configure"] + .sudo() + .configure(serial, template, **kwargs) + ) diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/demo/iot_template.xml b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/demo/iot_template.xml new file mode 100644 index 0000000..b92ca8c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/demo/iot_template.xml @@ -0,0 +1,17 @@ + + + + demo_template + + + + serial + + + + demo_input + + test_input_device + {} + + diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/bs.po b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/bs.po new file mode 100644 index 0000000..3be9656 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/bs.po @@ -0,0 +1,289 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_template_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_device_configuration_menu +msgid "Add a new Device" +msgstr "Dodaj novi uređaj" + +#. module: iot_template_oca +#: model:ir.actions.server,name:iot_template_oca.configure_action +msgid "Apply Template" +msgstr "Primijeni predložak" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Apply template" +msgstr "Primijeni template" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_function +msgid "Call Function" +msgstr "Pozovi funkciju" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_model_id +msgid "Call Model" +msgstr "Pozovi model" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Close" +msgstr "Zatvori" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__communication_system_id +msgid "Communication System" +msgstr "Komunikacijski sistem" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Configuration URL" +msgstr "URL za konfiguraciju" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_configure +msgid "Configure a IoT device" +msgstr "Konfigurišite IoT uređaj" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_input +msgid "Device input" +msgstr "Ulaz uređaja" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__group_id +msgid "Group" +msgstr "Grupa" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__id +msgid "ID" +msgstr "ID" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__icon +msgid "Icon" +msgstr "Ikona" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1920 +msgid "Image" +msgstr "Slika" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1024 +msgid "Image 1024" +msgstr "Slika 1024" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_128 +msgid "Image 128" +msgstr "Slika 128" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_256 +msgid "Image 256" +msgstr "Slika 256" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_512 +msgid "Image 512" +msgstr "Slika 512" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__input_ids +msgid "Input" +msgstr "Ulaz" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Inputs" +msgstr "Ulazi" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device +#: model:ir.model,name:iot_template_oca.model_iot_device_output +msgid "IoT Device" +msgstr "IoT uređaj" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_input +msgid "IoT Input for Template" +msgstr "IoT ulaz za predložak" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_key +msgid "IoT Keys for configuration" +msgstr "IoT ključevi za konfiguraciju" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template +msgid "IoT Template for Device" +msgstr "IoT predložak za uređaj" + +#. module: iot_template_oca +#: model:ir.actions.act_window,name:iot_template_oca.iot_template_action +msgid "IoT Templates" +msgstr "IoT predlošci" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__key_ids +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__key +msgid "Key" +msgstr "Ključ" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Keys" +msgstr "Ključevi" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output____last_update +msgid "Last Modified on" +msgstr "Zadnje mijenjano" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__name +msgid "Name" +msgstr "Naziv:" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__output_ids +msgid "Output" +msgstr "Izlaz" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_output +msgid "Output templates for IoT" +msgstr "Izlazni predlošci za IoT" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Outputs" +msgstr "Izlazi" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__params +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__params +msgid "Params" +msgstr "Parametri" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_id +msgid "Parent" +msgstr "Nasljeđeni" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_path +msgid "Parent Path" +msgstr "Putanja nadređenih" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__serial +msgid "Serial" +msgstr "Serijski broj" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__tag_ids +msgid "Tag" +msgstr "Oznaka" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__template_id +msgid "Template" +msgstr "Prijedlog" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_input__template_input_id +msgid "Template Input" +msgstr "Ulaz predloška" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_output__template_output_id +msgid "Template Output" +msgstr "Izlaz predloška" + +#. module: iot_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_template_menu +msgid "Templates" +msgstr "Predlošci" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__url +msgid "Url" +msgstr "Url" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Use this URL on your device configuration" +msgstr "Koristi ovaj URL u konfiguraciji vašeg uređaja" diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/es.po b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/es.po new file mode 100644 index 0000000..0861cf0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/es.po @@ -0,0 +1,292 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_template_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-15 17:38+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_device_configuration_menu +msgid "Add a new Device" +msgstr "Añadir un nuevo Dispositivo" + +#. module: iot_template_oca +#: model:ir.actions.server,name:iot_template_oca.configure_action +msgid "Apply Template" +msgstr "Aplicar Plantilla" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Apply template" +msgstr "Aplicar plantilla" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_function +msgid "Call Function" +msgstr "Función de Llamada" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_model_id +msgid "Call Model" +msgstr "Modelo de Llamada" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Close" +msgstr "Cerrar" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__communication_system_id +msgid "Communication System" +msgstr "Sistema de Comunicación" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Configuration URL" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_configure +msgid "Configure a IoT device" +msgstr "Configurar un dispositivo IoT" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_input +msgid "Device input" +msgstr "Entrada del dispositivo" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__group_id +msgid "Group" +msgstr "Grupo" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__icon +msgid "Icon" +msgstr "Icono" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1920 +msgid "Image" +msgstr "Imagen" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1024 +msgid "Image 1024" +msgstr "Imagen 1024" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_128 +msgid "Image 128" +msgstr "Imagen 128" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_256 +msgid "Image 256" +msgstr "Imagen 256" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_512 +msgid "Image 512" +msgstr "Imagen 512" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__input_ids +msgid "Input" +msgstr "Entrada" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Inputs" +msgstr "Entradas" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device +#: model:ir.model,name:iot_template_oca.model_iot_device_output +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_input +msgid "IoT Input for Template" +msgstr "Entrada IoT para Plantilla" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_key +msgid "IoT Keys for configuration" +msgstr "Claves IoT para la configuración" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template +msgid "IoT Template for Device" +msgstr "Plantilla IoT para Dispositivos" + +#. module: iot_template_oca +#: model:ir.actions.act_window,name:iot_template_oca.iot_template_action +msgid "IoT Templates" +msgstr "Plantillas IoT" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__key_ids +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__key +msgid "Key" +msgstr "Clave" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Keys" +msgstr "Llaves" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__name +msgid "Name" +msgstr "Nombre" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__output_ids +msgid "Output" +msgstr "Salida" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_output +msgid "Output templates for IoT" +msgstr "Plantillas de salida para IoT" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Outputs" +msgstr "Salidas" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__params +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__params +msgid "Params" +msgstr "Parámetros" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_id +msgid "Parent" +msgstr "Parental" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_path +msgid "Parent Path" +msgstr "Ruta Parental" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__serial +msgid "Serial" +msgstr "Serie" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__tag_ids +msgid "Tag" +msgstr "Etiqueta" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__template_id +msgid "Template" +msgstr "Plantilla" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_input__template_input_id +msgid "Template Input" +msgstr "Entrada de Plantilla" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_output__template_output_id +msgid "Template Output" +msgstr "Salida de Plantilla" + +#. module: iot_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_template_menu +msgid "Templates" +msgstr "Plantillas" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__url +msgid "Url" +msgstr "Url" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Use this URL on your device configuration" +msgstr "Utilice esta URL en la configuración de su dispositivo" diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/fa.po b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/fa.po new file mode 100644 index 0000000..0138563 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/fa.po @@ -0,0 +1,290 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_template_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fa\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: iot_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_device_configuration_menu +msgid "Add a new Device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.actions.server,name:iot_template_oca.configure_action +msgid "Apply Template" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Apply template" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_function +msgid "Call Function" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_model_id +msgid "Call Model" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Close" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__communication_system_id +msgid "Communication System" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Configuration URL" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_configure +msgid "Configure a IoT device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_date +msgid "Created on" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_input +msgid "Device input" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__group_id +msgid "Group" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__id +msgid "ID" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__icon +msgid "Icon" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1920 +msgid "Image" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_128 +msgid "Image 128" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_256 +msgid "Image 256" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_512 +msgid "Image 512" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__input_ids +msgid "Input" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Inputs" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device +#: model:ir.model,name:iot_template_oca.model_iot_device_output +msgid "IoT Device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_input +msgid "IoT Input for Template" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_key +msgid "IoT Keys for configuration" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template +msgid "IoT Template for Device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.actions.act_window,name:iot_template_oca.iot_template_action +msgid "IoT Templates" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__key_ids +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__key +msgid "Key" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Keys" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__name +msgid "Name" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__output_ids +msgid "Output" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_output +msgid "Output templates for IoT" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Outputs" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__params +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__params +msgid "Params" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_id +msgid "Parent" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_path +msgid "Parent Path" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__serial +msgid "Serial" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__tag_ids +msgid "Tag" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__template_id +msgid "Template" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_input__template_input_id +msgid "Template Input" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_output__template_output_id +msgid "Template Output" +msgstr "" + +#. module: iot_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_template_menu +msgid "Templates" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__url +msgid "Url" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Use this URL on your device configuration" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/iot_template_oca.pot b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/iot_template_oca.pot new file mode 100644 index 0000000..4a85457 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/iot_template_oca.pot @@ -0,0 +1,289 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_template_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_device_configuration_menu +msgid "Add a new Device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.actions.server,name:iot_template_oca.configure_action +msgid "Apply Template" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Apply template" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_function +msgid "Call Function" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_model_id +msgid "Call Model" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Close" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__communication_system_id +msgid "Communication System" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Configuration URL" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_configure +msgid "Configure a IoT device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_uid +msgid "Created by" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_date +msgid "Created on" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_input +msgid "Device input" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__display_name +msgid "Display Name" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__group_id +msgid "Group" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__id +msgid "ID" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__icon +msgid "Icon" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1920 +msgid "Image" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_128 +msgid "Image 128" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_256 +msgid "Image 256" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_512 +msgid "Image 512" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__input_ids +msgid "Input" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Inputs" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device +#: model:ir.model,name:iot_template_oca.model_iot_device_output +msgid "IoT Device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_input +msgid "IoT Input for Template" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_key +msgid "IoT Keys for configuration" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template +msgid "IoT Template for Device" +msgstr "" + +#. module: iot_template_oca +#: model:ir.actions.act_window,name:iot_template_oca.iot_template_action +msgid "IoT Templates" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__key_ids +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__key +msgid "Key" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Keys" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output____last_update +msgid "Last Modified on" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_date +msgid "Last Updated on" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__name +msgid "Name" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__output_ids +msgid "Output" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_output +msgid "Output templates for IoT" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Outputs" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__params +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__params +msgid "Params" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_id +msgid "Parent" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_path +msgid "Parent Path" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__serial +msgid "Serial" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__tag_ids +msgid "Tag" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__template_id +msgid "Template" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_input__template_input_id +msgid "Template Input" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_output__template_output_id +msgid "Template Output" +msgstr "" + +#. module: iot_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_template_menu +msgid "Templates" +msgstr "" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__url +msgid "Url" +msgstr "" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Use this URL on your device configuration" +msgstr "" diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/it.po b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/it.po new file mode 100644 index 0000000..5f11c57 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/i18n/it.po @@ -0,0 +1,292 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * iot_template_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-05-02 16:37+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_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_device_configuration_menu +msgid "Add a new Device" +msgstr "Aggiungi nuovo dispositivo" + +#. module: iot_template_oca +#: model:ir.actions.server,name:iot_template_oca.configure_action +msgid "Apply Template" +msgstr "Applica modello" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Apply template" +msgstr "Applica modello" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_function +msgid "Call Function" +msgstr "Richiama funzione" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__call_model_id +msgid "Call Model" +msgstr "Richiama modello" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Close" +msgstr "Chiudi" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__communication_system_id +msgid "Communication System" +msgstr "Sistema di comunicazione" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Configuration URL" +msgstr "URL configurazione" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_configure +msgid "Configure a IoT device" +msgstr "Configura un dispositivo IoT" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__create_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device_input +msgid "Device input" +msgstr "Input dispositivo" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__display_name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__group_id +msgid "Group" +msgstr "Gruppo" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__id +msgid "ID" +msgstr "ID" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__icon +msgid "Icon" +msgstr "Icona" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1920 +msgid "Image" +msgstr "Immagine" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_1024 +msgid "Image 1024" +msgstr "Immagine 1024" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_128 +msgid "Image 128" +msgstr "Immagine 128" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_256 +msgid "Image 256" +msgstr "Immagine 256" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__image_512 +msgid "Image 512" +msgstr "Immagine 512" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__input_ids +msgid "Input" +msgstr "Input" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Inputs" +msgstr "Input" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_device +#: model:ir.model,name:iot_template_oca.model_iot_device_output +msgid "IoT Device" +msgstr "Dispositivo IoT" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_input +msgid "IoT Input for Template" +msgstr "Input IoT per modello" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_key +msgid "IoT Keys for configuration" +msgstr "Chiavi IoT per configurazione" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template +msgid "IoT Template for Device" +msgstr "Modello IoT per dispositivo" + +#. module: iot_template_oca +#: model:ir.actions.act_window,name:iot_template_oca.iot_template_action +msgid "IoT Templates" +msgstr "Modelli IoT" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__key_ids +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__key +msgid "Key" +msgstr "Chiave" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Keys" +msgstr "Chiavi" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key____last_update +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_uid +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__write_date +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__name +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__name +msgid "Name" +msgstr "Nome" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__output_ids +msgid "Output" +msgstr "Output" + +#. module: iot_template_oca +#: model:ir.model,name:iot_template_oca.model_iot_template_output +msgid "Output templates for IoT" +msgstr "Modello output per IoT" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.iot_template_form +msgid "Outputs" +msgstr "Output" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__params +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__params +msgid "Params" +msgstr "Parametri" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_id +msgid "Parent" +msgstr "Padre" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__parent_path +msgid "Parent Path" +msgstr "Percorso padre" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__serial +msgid "Serial" +msgstr "Seriale" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template__tag_ids +msgid "Tag" +msgstr "Etichetta" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_input__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_key__template_id +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_template_output__template_id +msgid "Template" +msgstr "Modello" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_input__template_input_id +msgid "Template Input" +msgstr "Modello input" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_output__template_output_id +msgid "Template Output" +msgstr "Modello output" + +#. module: iot_template_oca +#: model:ir.ui.menu,name:iot_template_oca.iot_template_menu +msgid "Templates" +msgstr "Modelli" + +#. module: iot_template_oca +#: model:ir.model.fields,field_description:iot_template_oca.field_iot_device_configure__url +msgid "Url" +msgstr "URL" + +#. module: iot_template_oca +#: model_terms:ir.ui.view,arch_db:iot_template_oca.configure_form +msgid "Use this URL on your device configuration" +msgstr "Utilizzare questo URLnella configurazione del dispositivo" diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/__init__.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/__init__.py new file mode 100644 index 0000000..947d0d6 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/__init__.py @@ -0,0 +1,4 @@ +from . import iot_device +from . import iot_device_input +from . import iot_device_output +from . import iot_template diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device.py new file mode 100644 index 0000000..98b7241 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device.py @@ -0,0 +1,21 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models + + +class IotDevice(models.Model): + _inherit = "iot.device" + + def get_iot_configuration(self): + self.ensure_one() + return { + "host": self.env["ir.config_parameter"].sudo().get_param("web.base.url"), + "name": self.name, + "outputs": { + output.name: output.get_configuration() for output in self.output_ids + }, + "inputs": { + iot_input.name: iot_input.get_configuration() + for iot_input in self.input_ids + }, + } diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_input.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_input.py new file mode 100644 index 0000000..012ad82 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_input.py @@ -0,0 +1,18 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class IotDeviceInput(models.Model): + _inherit = "iot.device.input" + + template_input_id = fields.Many2one( + "iot.template.input", + readonly=True, + ) + + def get_configuration(self): + return { + "serial": self.serial, + "passphrase": self.passphrase, + } diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_output.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_output.py new file mode 100644 index 0000000..ca24d6c --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_device_output.py @@ -0,0 +1,15 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class IotDeviceOutput(models.Model): + _inherit = "iot.device.output" + + template_output_id = fields.Many2one( + "iot.template.output", + readonly=True, + ) + + def get_configuration(self): + return {} diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_template.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_template.py new file mode 100644 index 0000000..93b5c26 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/models/iot_template.py @@ -0,0 +1,137 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from uuid import uuid4 + +from jinja2.sandbox import SandboxedEnvironment + +from odoo import fields, models +from odoo.tools.safe_eval import safe_eval + +mako_template_env = SandboxedEnvironment( + block_start_string="<%", + block_end_string="%>", + variable_start_string="${", + variable_end_string="}", + comment_start_string="<%doc>", + comment_end_string="", + line_statement_prefix="%", + line_comment_prefix="##", + trim_blocks=True, # do not output newline after blocks + autoescape=True, # XML/HTML automatic escaping +) + + +class IotTemplate(models.Model): + _name = "iot.template" + _inherit = "image.mixin" + _description = "IoT Template for Device" + _parent_name = "parent_id" + _parent_store = True + _parent_order = "name" + + parent_path = fields.Char(index=True, unaccent=False) + name = fields.Char(required=True) + input_ids = fields.One2many( + "iot.template.input", + inverse_name="template_id", + ) + output_ids = fields.One2many( + "iot.template.output", + inverse_name="template_id", + ) + key_ids = fields.One2many("iot.template.key", inverse_name="template_id") + parent_id = fields.Many2one("iot.template", ondelete="restrict") + tag_ids = fields.Many2many("iot.device.tag") + group_id = fields.Many2one("iot.device.group") + icon = fields.Selection( + selection=lambda r: r.env["iot.device"]._fields["icon"].selection + ) + + def _get_keys(self, serial): + if self.parent_id: + keys = self.parent_id._get_keys(serial) + else: + keys = {"serial": serial} + keys.update({key.key: key._generate_value() for key in self.key_ids}) + return keys + + def apply_template(self, device, keys): + self.ensure_one() + new_vals = {} + if self.group_id and not device.group_id: + new_vals["group_id"] = self.group_id.id + if self.tag_ids: + new_vals["tag_ids"] = [(4, tag_id) for tag_id in self.tag_ids.ids] + if self.image_1920 and not device.image_1920: + new_vals["image_1920"] = self.image_1920 + if self.icon and not device.icon: + new_vals["icon"] = self.icon + if new_vals: + device.write(new_vals) + for element in self.input_ids: + element._apply_template(device, keys) + for element in self.output_ids: + element._apply_template(device, keys) + if self.parent_id: + self.parent_id.apply_template(device, keys) + + +class IotTemplateInput(models.Model): + _name = "iot.template.input" + _description = "IoT Input for Template" + + template_id = fields.Many2one("iot.template", required=True) + name = fields.Char(required=True) + params = fields.Text() + call_model_id = fields.Many2one("ir.model") + call_function = fields.Char(required=True) + + def _apply_template(self, device, keys): + real_vals = { + "device_id": device.id, + "name": self.name, + "call_function": self.call_function, + "call_model_id": self.call_model_id.id, + "template_input_id": self.id, + "serial": uuid4(), + "passphrase": uuid4(), + } + vals = safe_eval(self.params) + for key in vals: + vals[key] = mako_template_env.from_string(vals[key]).render(keys) + real_vals.update(vals) + return self.env["iot.device.input"].create(real_vals) + + +class IotTemplateOutput(models.Model): + _name = "iot.template.output" + _description = "Output templates for IoT" + + template_id = fields.Many2one("iot.template", required=True) + name = fields.Char(required=True) + communication_system_id = fields.Many2one("iot.communication.system", required=True) + params = fields.Text() + + def _apply_template(self, device, keys): + real_vals = { + "device_id": device.id, + "name": self.name, + "communication_system_id": self.communication_system_id.id, + "template_output_id": self.id, + } + vals = safe_eval(self.params or "{}") + for key in vals: + vals[key] = mako_template_env.from_string(vals[key]).render(keys) + real_vals.update(vals) + return self.env["iot.device.output"].create(real_vals) + + +class IotTemplateKey(models.Model): + _name = "iot.template.key" + _description = "IoT Keys for configuration" + + template_id = fields.Many2one("iot.template", required=True) + key = fields.Char(required=True) + + def _generate_value(self): + return uuid4() diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..93ec993 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Enric Tobella diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/DESCRIPTION.rst b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/DESCRIPTION.rst new file mode 100644 index 0000000..6f0e14e --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +Create a system of templates for IoT devices. + +When we are using a template we can configure a device +with a simple URL configuration. +The device will contact odoo and send the template name. +Odoo will create the device and respond with all the +expected data. diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/USAGE.rst b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/USAGE.rst new file mode 100644 index 0000000..26a3e42 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/readme/USAGE.rst @@ -0,0 +1,6 @@ +1. Create a template with a module or in `Iot > Templates` +2. Access `Iot > Config Device` +3. Confirm that you want to configurate a new device +4. Copy the URL +5. Access the device and send it the configuration url +6. The device will contact odoo and automatically configure itself. diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/security/ir.model.access.csv b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/security/ir.model.access.csv new file mode 100644 index 0000000..0405b81 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/security/ir.model.access.csv @@ -0,0 +1,10 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_iot_template,access_iot_template,model_iot_template,iot_oca.group_iot_user,1,0,0,0 +manage_iot_template,access_iot_template,model_iot_template,iot_oca.group_iot_manager,1,1,1,1 +access_iot_template_input,access_iot_template_input,model_iot_template_input,iot_oca.group_iot_user,1,0,0,0 +manage_iot_template_input,access_iot_template_input,model_iot_template_input,iot_oca.group_iot_manager,1,1,1,1 +access_iot_template_output,access_iot_template_output,model_iot_template_output,iot_oca.group_iot_user,1,0,0,0 +manage_iot_template_output,access_iot_template_output,model_iot_template_output,iot_oca.group_iot_manager,1,1,1,1 +access_iot_template_key,access_iot_template_key,model_iot_template_key,iot_oca.group_iot_user,1,0,0,0 +manage_iot_template_key,access_iot_template_key,model_iot_template_key,iot_oca.group_iot_manager,1,1,1,1 +access_iot_device_configure,access_iot_device_configure,model_iot_device_configure,iot_oca.group_iot_manager,1,1,1,1 diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/icon.png b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..da43f6f07766d54a65259a14a0688ace6b65ccf0 GIT binary patch literal 4151 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 W4WBV~?P6eHVDNPHb6Mw<&;$Tn=gY1D literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/index.html b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/index.html new file mode 100644 index 0000000..e273f02 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/index.html @@ -0,0 +1,440 @@ + + + + + +IoT Templates + + + +
+

IoT Templates

+ + +

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

+

Create a system of templates for IoT devices.

+

When we are using a template we can configure a device +with a simple URL configuration. +The device will contact odoo and send the template name. +Odoo will create the device and respond with all the +expected data.

+

Table of contents

+ +
+

Usage

+
    +
  1. Create a template with a module or in Iot > Templates
  2. +
  3. Access Iot > Config Device
  4. +
  5. Confirm that you want to configurate a new device
  6. +
  7. Copy the URL
  8. +
  9. Access the device and send it the configuration url
  10. +
  11. The device will contact odoo and automatically configure itself.
  12. +
+
+
+

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 to smash 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/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/__init__.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/__init__.py new file mode 100644 index 0000000..c6ac672 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/__init__.py @@ -0,0 +1 @@ +from . import test_iot_template diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/test_iot_template.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/test_iot_template.py new file mode 100644 index 0000000..b213f03 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/tests/test_iot_template.py @@ -0,0 +1,141 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError +from odoo.tests.common import HttpCase + + +class TestIotTemplate(HttpCase): + def setUp(self): + super(TestIotTemplate, self).setUp() + self.system = self.env["iot.communication.system"].create({"name": "Testing"}) + self.system_2 = self.env["iot.communication.system"].create( + {"name": "Testing 2"} + ) + self.parent_template = self.env["iot.template"].create( + { + "name": "Parent template", + "key_ids": [(0, 0, {"key": "passphrase"})], + "input_ids": [ + ( + 0, + 0, + { + "name": "INPUT 1", + "call_model_id": False, + "call_function": "iot_ras_default_action", + "params": "{'serial': '${serial}', " + "'passphrase': '${passphrase}'}", + }, + ) + ], + "output_ids": [ + ( + 0, + 0, + {"name": "OUTPUT 1", "communication_system_id": self.system.id}, + ) + ], + } + ) + self.template = self.env["iot.template"].create( + { + "name": "template", + "parent_id": self.parent_template.id, + "key_ids": [(0, 0, {"key": "serial2"})], + "input_ids": [ + ( + 0, + 0, + { + "name": "INPUT 2", + "call_model_id": False, + "call_function": "iot_ras_default_action", + "params": "{'serial': '${serial2}', " + "'passphrase': '${passphrase}'}", + }, + ) + ], + "output_ids": [ + ( + 0, + 0, + { + "name": "OUTPUT 2", + "communication_system_id": self.system_2.id, + "params": "{'ip': '1234'}", + }, + ) + ], + } + ) + + def _get_wizard(self): + wizard = self.env["iot.device.configure"].create({}) + self.assertTrue(wizard.serial) + self.assertTrue(wizard.url) + return wizard + + def test_generation(self): + wizard = self._get_wizard() + device_config = self.url_open( + wizard.url, data={"template": self.template.name} + ).json() + device = self.env["iot.device"].search([("name", "=", device_config["name"])]) + self.assertTrue(device) + self.assertEqual(1, len(device)) + self.assertEqual(2, len(device.output_ids)) + self.assertEqual(2, len(device.input_ids)) + input1 = device.input_ids.filtered( + lambda r: r.template_input_id == self.parent_template.input_ids + ) + self.assertTrue(input1) + input2 = device.input_ids.filtered( + lambda r: r.template_input_id == self.template.input_ids + ) + self.assertTrue(input2) + self.assertNotEqual(input1, input2) + self.assertGreater(len(input1.passphrase), 0) + self.assertGreater(len(input2.passphrase), 0) + self.assertEqual(input1.passphrase, input2.passphrase) + self.assertGreater(len(input1.serial), 0) + self.assertGreater(len(input2.serial), 0) + self.assertNotEqual(input1.serial, input2.serial) + output1 = device.output_ids.filtered( + lambda r: r.template_output_id == self.parent_template.output_ids + ) + self.assertTrue(output1) + output2 = device.output_ids.filtered( + lambda r: r.template_output_id == self.template.output_ids + ) + self.assertTrue(output2) + self.assertNotEqual(output1, output2) + self.assertEqual(output1.communication_system_id, self.system) + self.assertFalse(output1.ip) + self.assertEqual(output2.communication_system_id, self.system_2) + self.assertEqual(output2.ip, "1234") + + def test_missing_configuration(self): + wizard = self._get_wizard() + url = wizard.url.replace(wizard.serial, wizard.serial + wizard.serial) + device_config = self.url_open(url, data={"template": self.template.name}).json() + self.assertFalse(device_config) + + def test_no_double_configuration(self): + """ + We expect that it is not allowed to do the same call twice, + the first it must work properly. + No result should be returned on the second one + """ + wizard = self._get_wizard() + url = wizard.url + device_config = self.url_open(url, data={"template": self.template.name}).json() + self.assertTrue(device_config) + device = self.env["iot.device"].search([("name", "=", device_config["name"])]) + self.assertTrue(device) + device_config = self.url_open(url, data={"template": self.template.name}).json() + self.assertFalse(device_config) + + def test_constrain_hierarchy(self): + with self.assertRaises(UserError): + self.parent_template.parent_id = self.template diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/views/iot_template_views.xml b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/views/iot_template_views.xml new file mode 100644 index 0000000..a53e3d5 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/views/iot_template_views.xml @@ -0,0 +1,109 @@ + + + + iot.template.form + iot.template + +
+
+ +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+ + + + + + +
+ + + + + + + +
+
+
+
+ + +
+ + + iot.template.form + iot.template + + + + + + + + IoT Templates + ir.actions.act_window + iot.template + tree,form + + + diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/__init__.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/__init__.py new file mode 100644 index 0000000..e77c356 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/__init__.py @@ -0,0 +1 @@ +from . import iot_device_configure diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.py b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.py new file mode 100644 index 0000000..c084417 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.py @@ -0,0 +1,35 @@ +# Copyright 2020 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from uuid import uuid4 + +from odoo import api, fields, models + + +class IotDeviceConfigure(models.TransientModel): + _name = "iot.device.configure" + _description = "Configure a IoT device" + + serial = fields.Char(readonly=True, required=True, default=lambda r: uuid4()) + url = fields.Char(compute="_compute_url") + + @api.depends("serial") + def _compute_url(self): + for record in self: + record.url = ( + self.env["ir.config_parameter"].sudo().get_param("web.base.url") + + "/iot/" + + record.serial + + "/configure" + ) + + @api.model + def configure(self, serial, template_id, ip=False, **kwargs): + config = self.search([("serial", "=", serial)]) + if not config: + return {} + config.unlink() + device = self.env["iot.device"].create({"name": serial, "ip": ip}) + template = self.env["iot.template"].search([("name", "=", template_id)]) + if template: + template.apply_template(device, template._get_keys(serial)) + return device.get_iot_configuration() diff --git a/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.xml b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.xml new file mode 100644 index 0000000..cfff1d7 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/wizards/iot_device_configure.xml @@ -0,0 +1,45 @@ + + + + + iot.device.configure + iot.device.configure + form + +
+
+ Use this URL on your device configuration +
+ + + +
+
+
+
+
+ + Apply Template + + code + action = model.create({}).get_formview_action() +action["target"] = "new" + + +
diff --git a/odoo-bringout-oca-iot-iot_template_oca/pyproject.toml b/odoo-bringout-oca-iot-iot_template_oca/pyproject.toml new file mode 100644 index 0000000..d5d9aa0 --- /dev/null +++ b/odoo-bringout-oca-iot-iot_template_oca/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "odoo-bringout-oca-iot-iot_template_oca" +version = "16.0.0" +description = "IoT Templates - IoT module for managing templates" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-iot-iot_input_oca>=16.0.0", + "odoo-bringout-oca-iot-iot_output_oca>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["iot_template_oca"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +]