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 0000000..da43f6f Binary files /dev/null and b/odoo-bringout-oca-iot-iot_amqp_oca/iot_amqp_oca/static/description/icon.png differ 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 0000000..3a0328b Binary files /dev/null and b/odoo-bringout-oca-iot-iot_key_employee_rfid/iot_key_employee_rfid/static/description/icon.png differ 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 0000000..325deac Binary files /dev/null and b/odoo-bringout-oca-iot-iot_oca/iot_oca/static/description/icon.png differ 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 0000000..ed3004e Binary files /dev/null and b/odoo-bringout-oca-iot-iot_rule/iot_rule/static/description/icon.png differ 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 0000000..da43f6f Binary files /dev/null and b/odoo-bringout-oca-iot-iot_template_oca/iot_template_oca/static/description/icon.png differ 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", +]