Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# FastAPI Encrypted Errors
Odoo addon: fastapi_encrypted_errors
## Installation
```bash
pip install odoo-bringout-oca-rest-framework-fastapi_encrypted_errors
```
## Dependencies
This addon depends on:
- fastapi
## Manifest Information
- **Name**: FastAPI Encrypted Errors
- **Version**: 16.0.1.0.1
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/rest-framework](https://github.com/OCA/rest-framework) branch 16.0, addon `fastapi_encrypted_errors`.
## 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
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.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

View file

@ -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 Fastapi_encrypted_errors Module - fastapi_encrypted_errors
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.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for fastapi_encrypted_errors. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [fastapi](../../odoo-bringout-oca-rest-framework-fastapi)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon fastapi_encrypted_errors or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-rest-framework-fastapi_encrypted_errors"
# or
uv pip install odoo-bringout-oca-rest-framework-fastapi_encrypted_errors"
```

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in fastapi_encrypted_errors.
```mermaid
classDiagram
class fastapi_endpoint
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: fastapi_encrypted_errors. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon fastapi_encrypted_errors
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in fastapi_encrypted_errors.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../fastapi_encrypted_errors/security/ir.model.access.csv)**
- 1 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](../fastapi_encrypted_errors/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

View file

@ -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.

View file

@ -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 fastapi_encrypted_errors
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,103 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
========================
FastAPI Encrypted Errors
========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:15dc8276c61dfb1e08999782de2a451f1d9531ada4979f1d4e02ae39e873406c
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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%2Frest--framework-lightgray.png?logo=github
:target: https://github.com/OCA/rest-framework/tree/16.0/fastapi_encrypted_errors
:alt: OCA/rest-framework
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/rest-framework-16-0/rest-framework-16-0-fastapi_encrypted_errors
: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/rest-framework&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds a "ref" field in the error response of FastAPI.
This field is an AES encrypted string that contains the error message / traceback.
This encrypted string can be decrypted using the endpoint decrypt error wizard.
**Table of contents**
.. contents::
:local:
Usage
=====
First you have to enable the encryption for an endpoint by checking the `Encrypt Errors` checkbox
in the endpoint configuration.
To decrypt an error message, you can use the "Decrypt Error" wizard in the
FastAPI menu.
You can regenerate a new key by clicking on the "Regenerate Key" button next to the `Errors Secret Key` field.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/rest-framework/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 <https://github.com/OCA/rest-framework/issues/new?body=module:%20fastapi_encrypted_errors%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Akretion
Contributors
~~~~~~~~~~~~
* `Akretion <https://www.akretion.com>`_:
* Florian Mounier
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-paradoxxxzero| image:: https://github.com/paradoxxxzero.png?size=40px
:target: https://github.com/paradoxxxzero
:alt: paradoxxxzero
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-paradoxxxzero|
This module is part of the `OCA/rest-framework <https://github.com/OCA/rest-framework/tree/16.0/fastapi_encrypted_errors>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,3 @@
from . import models
from . import wizards
from . import fastapi_dispatcher

View file

@ -0,0 +1,25 @@
# Copyright 2024 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "FastAPI Encrypted Errors",
"summary": "Adds encrypted error messages to FastAPI error responses.",
"version": "16.0.1.0.1",
"license": "AGPL-3",
"author": "Akretion,Odoo Community Association (OCA)",
"maintainers": ["paradoxxxzero"],
"website": "https://github.com/OCA/rest-framework",
"depends": [
"fastapi",
],
"data": [
"security/ir.model.access.csv",
"views/fastapi_endpoint_views.xml",
"wizards/wizard_fastapi_decrypt_errors_views.xml",
],
"demo": [],
"external_dependencies": {
"python": ["cryptography"],
},
}

View file

@ -0,0 +1,35 @@
# Copyright 2024 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.http import _dispatchers
from odoo.addons.fastapi.error_handlers import convert_exception_to_status_body
from odoo.addons.fastapi.fastapi_dispatcher import (
FastApiDispatcher as BaseFastApiDispatcher,
)
# Inherit from last registered fastapi dispatcher
# This handles multiple overload of dispatchers
class FastApiDispatcher(_dispatchers.get("fastapi", BaseFastApiDispatcher)):
routing_type = "fastapi"
def handle_error(self, exc):
environ = self._get_environ()
root_path = "/" + environ["PATH_INFO"].split("/")[1]
fastapi_endpoint = (
self.request.env["fastapi.endpoint"]
.sudo()
.search([("root_path", "=", root_path)])
)
if fastapi_endpoint.encrypt_errors:
headers = getattr(exc, "headers", None)
status_code, body = convert_exception_to_status_body(exc)
if body:
body["ref"] = fastapi_endpoint._encrypt_error(exc)
return self.request.make_json_response(
body, status=status_code, headers=headers
)
return super().handle_error(exc)

View file

@ -0,0 +1,113 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * fastapi_encrypted_errors
#
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: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Close"
msgstr "Zatvori"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: fastapi_encrypted_errors
#: model:ir.actions.act_window,name:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_action_decrypt_error
#: model:ir.ui.menu,name:fastapi_encrypted_errors.menu_fastapi_decrypt_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Decrypt Error"
msgstr "Greška dešifriranja"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__decrypted_error
msgid "Decrypted Error"
msgstr "Dešifrirana greška"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_fastapi_endpoint__encrypt_errors
msgid "Encrypt Errors"
msgstr "Šifriraj greške"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,help:fastapi_encrypted_errors.field_fastapi_endpoint__encrypt_errors
msgid "Encrypt errors before sending them to the client."
msgstr "Šifriraj greške prije slanja klijentima."
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_fastapi_endpoint__encrypted_errors_secret_key
msgid "Encrypted Errors Secret Key"
msgstr "Tajni ključ šifriranih grešaka"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__error
msgid "Error"
msgstr "Greška"
#. module: fastapi_encrypted_errors
#: model:ir.model,name:fastapi_encrypted_errors.model_fastapi_endpoint
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__fastapi_endpoint_id
msgid "FastAPI Endpoint"
msgstr "FastAPI krajnja točka"
#. module: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.fastapi_endpoint_form_view
msgid "Generate Secret Key"
msgstr "Generiraj tajni ključ"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__id
msgid "ID"
msgstr "ID"
#. module: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Label"
msgstr "Opis"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,help:fastapi_encrypted_errors.field_fastapi_endpoint__encrypted_errors_secret_key
msgid ""
"The secret key used to encrypt errors before sending them to the client."
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model,name:fastapi_encrypted_errors.model_wizard_fastapi_decrypt_errors
msgid "Wizard to decrypt FastAPI errors"
msgstr "Čarobnjak za dešifriranje FastAPI grešaka"

View file

@ -0,0 +1,113 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * fastapi_encrypted_errors
#
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: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Close"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__create_uid
msgid "Created by"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__create_date
msgid "Created on"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.actions.act_window,name:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_action_decrypt_error
#: model:ir.ui.menu,name:fastapi_encrypted_errors.menu_fastapi_decrypt_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Decrypt Error"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__decrypted_error
msgid "Decrypted Error"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__display_name
msgid "Display Name"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_fastapi_endpoint__encrypt_errors
msgid "Encrypt Errors"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,help:fastapi_encrypted_errors.field_fastapi_endpoint__encrypt_errors
msgid "Encrypt errors before sending them to the client."
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_fastapi_endpoint__encrypted_errors_secret_key
msgid "Encrypted Errors Secret Key"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__error
msgid "Error"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model,name:fastapi_encrypted_errors.model_fastapi_endpoint
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__fastapi_endpoint_id
msgid "FastAPI Endpoint"
msgstr ""
#. module: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.fastapi_endpoint_form_view
msgid "Generate Secret Key"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__id
msgid "ID"
msgstr ""
#. module: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Label"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors____last_update
msgid "Last Modified on"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__write_uid
msgid "Last Updated by"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__write_date
msgid "Last Updated on"
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,help:fastapi_encrypted_errors.field_fastapi_endpoint__encrypted_errors_secret_key
msgid ""
"The secret key used to encrypt errors before sending them to the client."
msgstr ""
#. module: fastapi_encrypted_errors
#: model:ir.model,name:fastapi_encrypted_errors.model_wizard_fastapi_decrypt_errors
msgid "Wizard to decrypt FastAPI errors"
msgstr ""

View file

@ -0,0 +1,118 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * fastapi_encrypted_errors
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-06-04 16:26+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\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: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Close"
msgstr "Chiudi"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__create_date
msgid "Created on"
msgstr "Creato il"
#. module: fastapi_encrypted_errors
#: model:ir.actions.act_window,name:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_action_decrypt_error
#: model:ir.ui.menu,name:fastapi_encrypted_errors.menu_fastapi_decrypt_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Decrypt Error"
msgstr "Decifra errore"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__decrypted_error
msgid "Decrypted Error"
msgstr "Errore decifrato"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_fastapi_endpoint__encrypt_errors
msgid "Encrypt Errors"
msgstr "Errori cifrati"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,help:fastapi_encrypted_errors.field_fastapi_endpoint__encrypt_errors
msgid "Encrypt errors before sending them to the client."
msgstr "Cifra gli errori prima di inviarli al client."
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_fastapi_endpoint__encrypted_errors_secret_key
msgid "Encrypted Errors Secret Key"
msgstr "Chiave segreta errori cifrati"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__error
msgid "Error"
msgstr "Errore"
#. module: fastapi_encrypted_errors
#: model:ir.model,name:fastapi_encrypted_errors.model_fastapi_endpoint
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__fastapi_endpoint_id
msgid "FastAPI Endpoint"
msgstr "Endpoint FastAPI"
#. module: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.fastapi_endpoint_form_view
msgid "Generate Secret Key"
msgstr "Genera chiave segreta"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__id
msgid "ID"
msgstr "ID"
#. module: fastapi_encrypted_errors
#: model_terms:ir.ui.view,arch_db:fastapi_encrypted_errors.wizard_fastapi_decrypt_errors_view_form
msgid "Label"
msgstr "Etichetta"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,field_description:fastapi_encrypted_errors.field_wizard_fastapi_decrypt_errors__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: fastapi_encrypted_errors
#: model:ir.model.fields,help:fastapi_encrypted_errors.field_fastapi_endpoint__encrypted_errors_secret_key
msgid ""
"The secret key used to encrypt errors before sending them to the client."
msgstr ""
"La chiave segreta utilizzata per cifrare gli errori prima di inviarli al "
"client."
#. module: fastapi_encrypted_errors
#: model:ir.model,name:fastapi_encrypted_errors.model_wizard_fastapi_decrypt_errors
msgid "Wizard to decrypt FastAPI errors"
msgstr "Procedura guidata per decifrare gli errori FastAPI"

View file

@ -0,0 +1 @@
from . import fastapi_endpoint

View file

@ -0,0 +1,47 @@
# Copyright 2024 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import traceback
import zlib
from cryptography.fernet import Fernet
from odoo import fields, models
class FastapiEndpoint(models.Model):
_inherit = "fastapi.endpoint"
encrypt_errors = fields.Boolean(
help="Encrypt errors before sending them to the client.",
)
encrypted_errors_secret_key = fields.Char(
help="The secret key used to encrypt errors before sending them to the client.",
default=lambda _: Fernet.generate_key(),
readonly=True,
)
def action_generate_encrypted_errors_secret_key(self):
for record in self:
record.encrypted_errors_secret_key = Fernet.generate_key()
def _encrypt_error(self, exc):
self.ensure_one()
if not self.encrypt_errors or not self.encrypted_errors_secret_key:
return
# Get full traceback
error = "".join(traceback.format_exception(exc))
# zlib compression works quite well on tracebacks
error = zlib.compress(error.encode("utf-8"))
f = Fernet(self.encrypted_errors_secret_key)
return f.encrypt(error)
def _decrypt_error(self, error):
self.ensure_one()
if not self.encrypt_errors or not self.encrypted_errors_secret_key:
return
f = Fernet(self.encrypted_errors_secret_key)
error = f.decrypt(error)
return zlib.decompress(error).decode("utf-8")

View file

@ -0,0 +1,3 @@
* `Akretion <https://www.akretion.com>`_:
* Florian Mounier

View file

@ -0,0 +1,3 @@
This module adds a "ref" field in the error response of FastAPI.
This field is an AES encrypted string that contains the error message / traceback.
This encrypted string can be decrypted using the endpoint decrypt error wizard.

View file

@ -0,0 +1,7 @@
First you have to enable the encryption for an endpoint by checking the `Encrypt Errors` checkbox
in the endpoint configuration.
To decrypt an error message, you can use the "Decrypt Error" wizard in the
FastAPI menu.
You can regenerate a new key by clicking on the "Regenerate Key" button next to the `Errors Secret Key` field.

View file

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_fastapi_wizard_auth_partner_impersonate,wizard_fastapi_decrypt_errors,model_wizard_fastapi_decrypt_errors,fastapi.group_fastapi_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_fastapi_wizard_auth_partner_impersonate wizard_fastapi_decrypt_errors model_wizard_fastapi_decrypt_errors fastapi.group_fastapi_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,445 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="fastapi-encrypted-errors">
<h1>FastAPI Encrypted Errors</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:15dc8276c61dfb1e08999782de2a451f1d9531ada4979f1d4e02ae39e873406c
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/rest-framework/tree/16.0/fastapi_encrypted_errors"><img alt="OCA/rest-framework" src="https://img.shields.io/badge/github-OCA%2Frest--framework-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/rest-framework-16-0/rest-framework-16-0-fastapi_encrypted_errors"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/rest-framework&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module adds a “ref” field in the error response of FastAPI.
This field is an AES encrypted string that contains the error message / traceback.
This encrypted string can be decrypted using the endpoint decrypt error wizard.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-1">Usage</a></h2>
<p>First you have to enable the encryption for an endpoint by checking the <cite>Encrypt Errors</cite> checkbox
in the endpoint configuration.</p>
<p>To decrypt an error message, you can use the “Decrypt Error” wizard in the
FastAPI menu.</p>
<p>You can regenerate a new key by clicking on the “Regenerate Key” button next to the <cite>Errors Secret Key</cite> field.</p>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/rest-framework/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/rest-framework/issues/new?body=module:%20fastapi_encrypted_errors%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-3">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-4">Authors</a></h3>
<ul class="simple">
<li>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-5">Contributors</a></h3>
<ul class="simple">
<li><a class="reference external" href="https://www.akretion.com">Akretion</a>:<ul>
<li>Florian Mounier</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h3>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/paradoxxxzero"><img alt="paradoxxxzero" src="https://github.com/paradoxxxzero.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/rest-framework/tree/16.0/fastapi_encrypted_errors">OCA/rest-framework</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
from . import test_fastapi_encrypted_errors

View file

@ -0,0 +1,74 @@
# Copyright 2024 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import os
import unittest
from odoo.tests.common import HttpCase
from odoo.addons.fastapi.schemas import DemoExceptionType
from fastapi import status
@unittest.skipIf(os.getenv("SKIP_HTTP_CASE"), "FastAPIEncryptedErrorsCase skipped")
class FastAPIEncryptedErrorsCase(HttpCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.fastapi_demo_app = cls.env.ref("fastapi.fastapi_endpoint_demo")
cls.fastapi_demo_app._handle_registry_sync()
cls.fastapi_demo_app.write({"encrypt_errors": True})
lang = (
cls.env["res.lang"]
.with_context(active_test=False)
.search([("code", "=", "fr_BE")])
)
lang.active = True
def test_encrypted_errors_in_response(self):
route = (
"/fastapi_demo/demo/exception?"
f"exception_type={DemoExceptionType.user_error.value}"
"&error_message=User Error"
)
response = self.url_open(route, timeout=200)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
res = response.json()
self.assertEqual(res["detail"], "User Error")
self.assertIn("ref", res)
route = (
"/fastapi_demo/demo/exception?"
f"exception_type={DemoExceptionType.bare_exception.value}"
"&error_message=Internal Server Error"
)
response = self.url_open(route, timeout=200)
self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
res = response.json()
self.assertEqual(res["detail"], "Internal Server Error")
self.assertIn("ref", res)
def test_encrypted_errors_decrypt(self):
route = (
"/fastapi_demo/demo/exception?"
f"exception_type={DemoExceptionType.bare_exception.value}"
"&error_message=Internal Server Error"
)
response = self.url_open(route, timeout=200)
self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
res = response.json()
self.assertEqual(res["detail"], "Internal Server Error")
self.assertIn("ref", res)
ref = res["ref"]
self.assertNotIn("Traceback (most recent call last)", ref)
self.assertNotIn("NotImplementedError: Internal Server Error", ref)
wizard = self.env["wizard.fastapi.decrypt.errors"].create({"error": ref})
wizard.action_decrypt_error()
self.assertIn("Traceback (most recent call last)", wizard.decrypted_error)
self.assertIn(
"NotImplementedError: Internal Server Error", wizard.decrypted_error
)

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 ACSONE SA/NV
License LGPL-3.0 or later (http://www.gnu.org/licenses/LGPL). -->
<odoo>
<record id="fastapi_endpoint_form_view" model="ir.ui.view">
<field name="model">fastapi.endpoint</field>
<field name="inherit_id" ref="fastapi.fastapi_endpoint_form_view" />
<field name="arch" type="xml">
<field name="save_http_session" position="after">
<field name="encrypt_errors" />
<div class="o_row" colspan="2">
<label for="encrypted_errors_secret_key" />
<field
name="encrypted_errors_secret_key"
attrs="{'invisible': [('encrypt_errors', '=', False)]}"
groups="fastapi.group_fastapi_manager"
/>
<button
name="action_generate_encrypted_errors_secret_key"
attrs="{'invisible': [('encrypt_errors', '=', False)]}"
type="object"
icon="fa-refresh"
title="Generate Secret Key"
groups="fastapi.group_fastapi_manager"
/>
</div>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1 @@
from . import wizard_fastapi_decrypt_errors

View file

@ -0,0 +1,40 @@
# Copyright 2024 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import traceback
from odoo import fields, models
class WizardFastapiDecryptErrors(models.TransientModel):
_name = "wizard.fastapi.decrypt.errors"
_description = "Wizard to decrypt FastAPI errors"
error = fields.Text(required=True)
fastapi_endpoint_id = fields.Many2one(
"fastapi.endpoint",
string="FastAPI Endpoint",
required=True,
default=lambda self: self.env["fastapi.endpoint"].search([], limit=1),
)
decrypted_error = fields.Text(readonly=True)
def action_decrypt_error(self):
self.ensure_one()
try:
error = self.fastapi_endpoint_id._decrypt_error(self.error.encode("utf-8"))
except Exception:
self.decrypted_error = (
"Error while decrypting error: \n\n" + traceback.format_exc()
)
else:
self.decrypted_error = error
return {
"type": "ir.actions.act_window",
"res_model": "wizard.fastapi.decrypt.errors",
"view_mode": "form",
"view_type": "form",
"res_id": self.id,
"target": "new",
}

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="wizard_fastapi_decrypt_errors_view_form" model="ir.ui.view">
<field name="model">wizard.fastapi.decrypt.errors</field>
<field name="arch" type="xml">
<form string="Label">
<group>
<field name="fastapi_endpoint_id" />
<field name="error" />
<field name="decrypted_error" />
</group>
<footer>
<button
name="action_decrypt_error"
string="Decrypt Error"
type="object"
class="oe_highlight"
/>
<button string="Close" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record
id="wizard_fastapi_decrypt_errors_action_decrypt_error"
model="ir.actions.act_window"
>
<field name="name">Decrypt Error</field>
<field name="res_model">wizard.fastapi.decrypt.errors</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="groups_id" eval="[(4, ref('fastapi.group_fastapi_manager'))]" />
</record>
<menuitem
id="menu_fastapi_decrypt_errors"
name="Decrypt Error"
parent="fastapi.menu_fastapi_root"
action="wizard_fastapi_decrypt_errors_action_decrypt_error"
sequence="100"
/>
</odoo>

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-rest-framework-fastapi_encrypted_errors"
version = "16.0.0"
description = "FastAPI Encrypted Errors - Adds encrypted error messages to FastAPI error responses."
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-rest-framework-fastapi>=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 = ["fastapi_encrypted_errors"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]