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,48 @@
# Base Binary URL Import
Odoo addon: base_binary_url_import
## Installation
```bash
pip install odoo-bringout-oca-server-ux-base_binary_url_import
```
## Dependencies
This addon depends on:
- base
- base_import
- web_domain_field
## Manifest Information
- **Name**: Base Binary URL Import
- **Version**: 16.0.1.0.0
- **Category**: Uncategorized
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/server-ux](https://github.com/OCA/server-ux) branch 16.0, addon `base_binary_url_import`.
## 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,129 @@
======================
Base Binary URL Import
======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:98aa6009c212e72aa0059f3e08631c8656ff33fa1892e7a1c6005bc4d0e79e33
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png
:target: https://odoo-community.org/page/development-status
:alt: Alpha
.. |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%2Fserver--ux-lightgray.png?logo=github
:target: https://github.com/OCA/server-ux/tree/16.0/base_binary_url_import
:alt: OCA/server-ux
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-base_binary_url_import
: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/server-ux&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This modules provides a wizard that allows mass importation of Binary files
from URLs into selected model/field of multiple records.
As the standard CSV import only allows to import Binaries from URLs into image
fields, this module provides the possibility to import any kind of Binary such
as Texts, PDFs, and anything else.
.. IMPORTANT::
This is an alpha version, the data model and design can change at any time without warning.
Only for development or testing purpose, do not use in production.
`More details on development status <https://odoo-community.org/page/development-status>`_
**Table of contents**
.. contents::
:local:
Configuration
=============
Configuration shouldn't be needed, however you can customize the import using
following `ir.config_parameter`:
* `binary.url.import.max.size`: Maximum size (in Bytes) of imported Binaries.
(default = 10485760 = 10MB)
* `binary.url.import.timeout`: Timeout limit (in seconds) for HTTP requests to
get an answer.
(default = 5)
Usage
=====
The importation wizard will be available in the Settings > Technical menu.
An admin user can select the target model and field of the importation, and
select a Char field where to store the file name of the Binary being downloaded.
He can then list record IDs (either using Database ID or XML ID) and the URL
of the file to download and write into these records.
To create new records, a standard import can be made without the binary field first,
then a CSV like list can be copy pasted into the wizard to allow mass importation
without having to upload or list URLs one by one.
Known issues / Roadmap
======================
* No check is done on the target records if the target field is not empty.
* Target records can not be created and must be created first before being
able to import Binaries from URL on it.
* Restriction of models to be selected could be improved
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-ux/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/server-ux/issues/new?body=module:%20base_binary_url_import%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
~~~~~~~
* Camptocamp
Contributors
~~~~~~~~~~~~
* Akim Juillerat <akim.juillerat@camptocamp.com>
* `Trobz <https://trobz.com>`_:
* Jack Le <anlh@trobz.com>
Other credits
~~~~~~~~~~~~~
The migration of this module from 13.0 to 16.0 was financially supported by Camptocamp
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/server-ux <https://github.com/OCA/server-ux/tree/16.0/base_binary_url_import>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

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

View file

@ -0,0 +1,21 @@
# Copyright 2022 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
{
"name": "Base Binary URL Import",
"summary": "Wizard to import binary files from URL on existing records",
"version": "16.0.1.0.0",
"development_status": "Alpha",
"category": "Uncategorized",
"website": "https://github.com/OCA/server-ux",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"installable": True,
"application": False,
"depends": ["base", "base_import", "web_domain_field"],
"data": [
"security/ir.model.access.csv",
"data/ir_config_parameter.xml",
"wizard/base_binary_url_import_view.xml",
],
"external_dependencies": {"python": ["pyrfc6266"]},
}

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo noupdate="1">
<record model="ir.config_parameter" id="binary_url_import_max_size_parameter">
<field name="key">binary.url.import.max.size</field>
<field name="value">10485760</field>
</record>
<record model="ir.config_parameter" id="binary_url_import_timeout_parameter">
<field name="key">binary.url.import.timeout</field>
<field name="value">5</field>
</record>
</odoo>

View file

@ -0,0 +1,235 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_binary_url_import
#
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: base_binary_url_import
#: model:ir.actions.act_window,name:base_binary_url_import.action_wizard_base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_binary_url_import
msgid "Binary Import From URL"
msgstr ""
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Cancel"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Could not retrieve URL: %(url)s : %(error)s"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_uid
msgid "Created by"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_date
msgid "Created on"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__display_name
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__display_name
msgid "Display Name"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "File size exceeds configured maximum (%s bytes)"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following DB IDs intersect with XML IDs:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following IDs do not exist in database:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following XML IDs do not exist in database:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__id
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__id
msgid "ID"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Identifier %s is not an Integer or XMLID"
msgstr ""
#. module: base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Import"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import
msgid "Import of binaries from URL wizard"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import_line
msgid "Import of binaries from URL wizard line"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__is_target_record_identifier_required
msgid "Is Target Record Identifier Required"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import____last_update
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__line_ids
msgid "Line"
msgstr ""
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Record ID or XMLID"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same XML IDs are duplicated:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same database IDs are duplicated:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_id
msgid "Target Binary Field"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_domain
msgid "Target Binary Field Domain"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_id
msgid "Target Binary Filename Field"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_domain
msgid "Target Binary Filename Field Domain"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_model_id
msgid "Target Model"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__target_record_identifier
msgid "Target record ID"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__binary_url_to_import
msgid "URL to import"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Updated records"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__wizard_id
msgid "Wizard"
msgstr ""
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Write your lines one by one or copy paste a CSV-like list with ID,URL."
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"XML ID %(xml_id)s matches a record of model %(model_name)s instead of model "
"%(tagert_model_name)s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"You can not import files via URL, check with your administrator for the "
"reason."
msgstr ""

View file

@ -0,0 +1,235 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_binary_url_import
#
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: base_binary_url_import
#: model:ir.actions.act_window,name:base_binary_url_import.action_wizard_base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_binary_url_import
msgid "Binary Import From URL"
msgstr "Binarni uvoz s URL-a"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Cancel"
msgstr "Otkaži"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Could not retrieve URL: %(url)s : %(error)s"
msgstr "Ne mogu dohvatiti URL: %(url)s : %(error)s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__display_name
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "File size exceeds configured maximum (%s bytes)"
msgstr "Datoteka prekoračuje definirani maksimum (%s bajtova)"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following DB IDs intersect with XML IDs:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following IDs do not exist in database:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following XML IDs do not exist in database:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__id
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__id
msgid "ID"
msgstr "ID"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Identifier %s is not an Integer or XMLID"
msgstr "Identifikator %s nije cijeli broj ili XMLID"
#. module: base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Import"
msgstr "Uvoz"
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import
msgid "Import of binaries from URL wizard"
msgstr "Čarobnjak uvoza binarnih datoteka s URL-a"
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import_line
msgid "Import of binaries from URL wizard line"
msgstr "Linija čarobnjaka uvoza binarnih datoteka s URL-a"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__is_target_record_identifier_required
msgid "Is Target Record Identifier Required"
msgstr "Je identifikator ciljanog zapisa obavezan"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import____last_update
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__line_ids
msgid "Line"
msgstr "Linija"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Record ID or XMLID"
msgstr "ID zapisa ili XMLID"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same XML IDs are duplicated:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same database IDs are duplicated:\n"
" %s"
msgstr ""
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_id
msgid "Target Binary Field"
msgstr "Ciljano binarno polje"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_domain
msgid "Target Binary Field Domain"
msgstr "Domen ciljanog binarnog polja"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_id
msgid "Target Binary Filename Field"
msgstr "Polje naziva ciljane binarne datoteke"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_domain
msgid "Target Binary Filename Field Domain"
msgstr "Domen polja naziva ciljane binarne datoteke"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_model_id
msgid "Target Model"
msgstr "Ciljani model"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__target_record_identifier
msgid "Target record ID"
msgstr "ID ciljanog zapisa"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__binary_url_to_import
msgid "URL to import"
msgstr "URL za uvoz"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Updated records"
msgstr "Ažurirani zapisi"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__wizard_id
msgid "Wizard"
msgstr "ID čarobnjaka"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Write your lines one by one or copy paste a CSV-like list with ID,URL."
msgstr "Napišite svoje linije jednu po jednu ili kopirajte zalijepite CSV-like listu s ID,URL."
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"XML ID %(xml_id)s matches a record of model %(model_name)s instead of model "
"%(tagert_model_name)s"
msgstr ""
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"You can not import files via URL, check with your administrator for the "
"reason."
msgstr ""

View file

@ -0,0 +1,253 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_binary_url_import
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-11-11 15:17+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\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: base_binary_url_import
#: model:ir.actions.act_window,name:base_binary_url_import.action_wizard_base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_binary_url_import
msgid "Binary Import From URL"
msgstr "Importación Binaria desde URL"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Cancel"
msgstr "Cancelar"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Could not retrieve URL: %(url)s : %(error)s"
msgstr "No se ha podido recuperar la URL: %(url)s : %(error)s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_date
msgid "Created on"
msgstr "Creado el"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__display_name
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "File size exceeds configured maximum (%s bytes)"
msgstr "El tamaño del archivo supera el máximo configurado (%s bytes)"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following DB IDs intersect with XML IDs:\n"
" %s"
msgstr ""
"Los siguientes ID de BD se cruzan con los ID de XML:\n"
" %s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following IDs do not exist in database:\n"
" %s"
msgstr ""
"Los siguientes IDs no existen en la base de datos:\n"
" %s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following XML IDs do not exist in database:\n"
" %s"
msgstr ""
"Los siguientes ID XML no existen en la base de datos:\n"
" %s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__id
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__id
msgid "ID"
msgstr "ID (Identificación)"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Identifier %s is not an Integer or XMLID"
msgstr "Identificador %s no es un Integer o XMLID"
#. module: base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Import"
msgstr "Importar"
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import
msgid "Import of binaries from URL wizard"
msgstr "Importación de binarios desde el asistente de URL"
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import_line
msgid "Import of binaries from URL wizard line"
msgstr "Importación de binarios desde la línea del asistente URL"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__is_target_record_identifier_required
msgid "Is Target Record Identifier Required"
msgstr "Es Obligatorio el Identificador de Registro de Destino"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import____last_update
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line____last_update
msgid "Last Modified on"
msgstr "Última Modifiación el"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_uid
msgid "Last Updated by"
msgstr "Última Actualización por"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_date
msgid "Last Updated on"
msgstr "Última Actualización el"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__line_ids
msgid "Line"
msgstr "Línea"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Record ID or XMLID"
msgstr "ID de registro o XMLID"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same XML IDs are duplicated:\n"
" %s"
msgstr ""
"Los mismos ID XML están duplicados:\n"
" %s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same database IDs are duplicated:\n"
" %s"
msgstr ""
"Los mismos ID de base de datos están duplicados:\n"
" %s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_id
msgid "Target Binary Field"
msgstr "Campo Binario Objetivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_domain
msgid "Target Binary Field Domain"
msgstr "Dominio del Campo Binario del Objetivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_id
msgid "Target Binary Filename Field"
msgstr "Campo de Nombre de Archivo Binario del Objetivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_domain
msgid "Target Binary Filename Field Domain"
msgstr "Dominio del Campo de Nombre de Archivo Binario del Objetivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_model_id
msgid "Target Model"
msgstr "Modelo de Objetivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__target_record_identifier
msgid "Target record ID"
msgstr "ID del Registro de Objetivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__binary_url_to_import
msgid "URL to import"
msgstr "URL a importar"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Updated records"
msgstr "Registros Actualizados"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__wizard_id
msgid "Wizard"
msgstr "Asistente"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Write your lines one by one or copy paste a CSV-like list with ID,URL."
msgstr ""
"Escriba sus líneas una a una o copie y pegue una lista tipo CSV con ID,URL."
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"XML ID %(xml_id)s matches a record of model %(model_name)s instead of model "
"%(tagert_model_name)s"
msgstr ""
"XML ID %(xml_id)s coincide con un registro del modelo %(model_name)s en "
"lugar del modelo %(tagert_model_name)s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"You can not import files via URL, check with your administrator for the "
"reason."
msgstr ""
"No se pueden importar ficheros vía URL, consulte con su administrador el "
"motivo."

View file

@ -0,0 +1,253 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_binary_url_import
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-01-03 09:36+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 4.17\n"
#. module: base_binary_url_import
#: model:ir.actions.act_window,name:base_binary_url_import.action_wizard_base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_binary_url_import
msgid "Binary Import From URL"
msgstr "Importazione binaria da URL"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Cancel"
msgstr "Annulla"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Could not retrieve URL: %(url)s : %(error)s"
msgstr "Impossibile recuperare URL: %(url)s : %(error)s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__create_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__create_date
msgid "Created on"
msgstr "Creato il"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__display_name
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "File size exceeds configured maximum (%s bytes)"
msgstr "La dimensione del file supera il massimo configurato (%s byte)"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following DB IDs intersect with XML IDs:\n"
" %s"
msgstr ""
"I seguenti ID del DB coincidono con gli ID XML:\n"
" %s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following IDs do not exist in database:\n"
" %s"
msgstr ""
"I seguenti ID non esistono nel database:\n"
" %s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Following XML IDs do not exist in database:\n"
" %s"
msgstr ""
"I seguenti ID XML non esistono nel database:\n"
" %s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__id
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__id
msgid "ID"
msgstr "ID"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Identifier %s is not an Integer or XMLID"
msgstr "L'identificativo %s non è un intero o un ID XML"
#. module: base_binary_url_import
#: model:ir.ui.menu,name:base_binary_url_import.menu_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Import"
msgstr "Importa"
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import
msgid "Import of binaries from URL wizard"
msgstr "Procedura guidata importazione binari da URL"
#. module: base_binary_url_import
#: model:ir.model,name:base_binary_url_import.model_base_binary_url_import_line
msgid "Import of binaries from URL wizard line"
msgstr "Riga procedura guidata importazione binari da URL"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__is_target_record_identifier_required
msgid "Is Target Record Identifier Required"
msgstr "È richiesto l'identificativo del record obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import____last_update
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_uid
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__write_date
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__line_ids
msgid "Line"
msgstr "Riga"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Record ID or XMLID"
msgstr "ID record o ID XML"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same XML IDs are duplicated:\n"
" %s"
msgstr ""
"Alcuni ID XML sono duplicati:\n"
" %s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"Same database IDs are duplicated:\n"
" %s"
msgstr ""
"Alcuni ID database sono duplicati:\n"
" %s"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_id
msgid "Target Binary Field"
msgstr "Campo binario obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_field_domain
msgid "Target Binary Field Domain"
msgstr "Dominio campo binario obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_id
msgid "Target Binary Filename Field"
msgstr "Campo nome file binario obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_binary_filename_field_domain
msgid "Target Binary Filename Field Domain"
msgstr "Dominio campo nome file binario obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import__target_model_id
msgid "Target Model"
msgstr "Modello obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__target_record_identifier
msgid "Target record ID"
msgstr "ID record obiettivo"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__binary_url_to_import
msgid "URL to import"
msgstr "URL da importare"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid "Updated records"
msgstr "Record aggiornati"
#. module: base_binary_url_import
#: model:ir.model.fields,field_description:base_binary_url_import.field_base_binary_url_import_line__wizard_id
msgid "Wizard"
msgstr "Procedura guidata"
#. module: base_binary_url_import
#: model_terms:ir.ui.view,arch_db:base_binary_url_import.base_binary_url_import_form
msgid "Write your lines one by one or copy paste a CSV-like list with ID,URL."
msgstr ""
"Scrivere le righe una per uno o incollare una lista tipo CSV con ID,URL."
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"XML ID %(xml_id)s matches a record of model %(model_name)s instead of model "
"%(tagert_model_name)s"
msgstr ""
"L'ID XML %(xml_id)s corrisponde ad un record del modello %(model_name)s "
"anzichè del modello %(tagert_model_name)s"
#. module: base_binary_url_import
#. odoo-python
#: code:addons/base_binary_url_import/wizard/base_binary_url_import.py:0
#, python-format
msgid ""
"You can not import files via URL, check with your administrator for the "
"reason."
msgstr ""
"Non è possibile importare file da URL, verificare il motivo con "
"l'amministratore."

View file

@ -0,0 +1,9 @@
Configuration shouldn't be needed, however you can customize the import using
following `ir.config_parameter`:
* `binary.url.import.max.size`: Maximum size (in Bytes) of imported Binaries.
(default = 10485760 = 10MB)
* `binary.url.import.timeout`: Timeout limit (in seconds) for HTTP requests to
get an answer.
(default = 5)

View file

@ -0,0 +1,3 @@
* Akim Juillerat <akim.juillerat@camptocamp.com>
* `Trobz <https://trobz.com>`_:
* Jack Le <anlh@trobz.com>

View file

@ -0,0 +1 @@
The migration of this module from 13.0 to 16.0 was financially supported by Camptocamp

View file

@ -0,0 +1,6 @@
This modules provides a wizard that allows mass importation of Binary files
from URLs into selected model/field of multiple records.
As the standard CSV import only allows to import Binaries from URLs into image
fields, this module provides the possibility to import any kind of Binary such
as Texts, PDFs, and anything else.

View file

@ -0,0 +1,4 @@
* No check is done on the target records if the target field is not empty.
* Target records can not be created and must be created first before being
able to import Binaries from URL on it.
* Restriction of models to be selected could be improved

View file

@ -0,0 +1,11 @@
The importation wizard will be available in the Settings > Technical menu.
An admin user can select the target model and field of the importation, and
select a Char field where to store the file name of the Binary being downloaded.
He can then list record IDs (either using Database ID or XML ID) and the URL
of the file to download and write into these records.
To create new records, a standard import can be made without the binary field first,
then a CSV like list can be copy pasted into the wizard to allow mass importation
without having to upload or list URLs one by one.

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_base_binary_url_import,base.binary.url.import,model_base_binary_url_import,base.group_user,1,1,1,1
access_base_binary_url_import_line,base.binary.url.import.line,model_base_binary_url_import_line,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_base_binary_url_import base.binary.url.import model_base_binary_url_import base.group_user 1 1 1 1
3 access_base_binary_url_import_line base.binary.url.import.line model_base_binary_url_import_line base.group_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,479 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>Base Binary URL Import</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
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: grey; } /* 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 {
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" id="base-binary-url-import">
<h1 class="title">Base Binary URL Import</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:98aa6009c212e72aa0059f3e08631c8656ff33fa1892e7a1c6005bc4d0e79e33
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Alpha" src="https://img.shields.io/badge/maturity-Alpha-red.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/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/server-ux/tree/16.0/base_binary_url_import"><img alt="OCA/server-ux" src="https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-base_binary_url_import"><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/server-ux&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 modules provides a wizard that allows mass importation of Binary files
from URLs into selected model/field of multiple records.</p>
<p>As the standard CSV import only allows to import Binaries from URLs into image
fields, this module provides the possibility to import any kind of Binary such
as Texts, PDFs, and anything else.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<p class="last">This is an alpha version, the data model and design can change at any time without warning.
Only for development or testing purpose, do not use in production.
<a class="reference external" href="https://odoo-community.org/page/development-status">More details on development status</a></p>
</div>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-3">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-7">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="toc-entry-8">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-9">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>Configuration shouldnt be needed, however you can customize the import using
following <cite>ir.config_parameter</cite>:</p>
<ul class="simple">
<li><cite>binary.url.import.max.size</cite>: Maximum size (in Bytes) of imported Binaries.
(default = 10485760 = 10MB)</li>
<li><cite>binary.url.import.timeout</cite>: Timeout limit (in seconds) for HTTP requests to
get an answer.
(default = 5)</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>The importation wizard will be available in the Settings &gt; Technical menu.</p>
<p>An admin user can select the target model and field of the importation, and
select a Char field where to store the file name of the Binary being downloaded.</p>
<p>He can then list record IDs (either using Database ID or XML ID) and the URL
of the file to download and write into these records.</p>
<p>To create new records, a standard import can be made without the binary field first,
then a CSV like list can be copy pasted into the wizard to allow mass importation
without having to upload or list URLs one by one.</p>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#toc-entry-3">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>No check is done on the target records if the target field is not empty.</li>
<li>Target records can not be created and must be created first before being
able to import Binaries from URL on it.</li>
<li>Restriction of models to be selected could be improved</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-ux/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/server-ux/issues/new?body=module:%20base_binary_url_import%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">
<h1><a class="toc-backref" href="#toc-entry-5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-6">Authors</a></h2>
<ul class="simple">
<li>Camptocamp</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-7">Contributors</a></h2>
<ul class="simple">
<li>Akim Juillerat &lt;<a class="reference external" href="mailto:akim.juillerat&#64;camptocamp.com">akim.juillerat&#64;camptocamp.com</a>&gt;</li>
<li><dl class="first docutils">
<dt><a class="reference external" href="https://trobz.com">Trobz</a>:</dt>
<dd><ul class="first last">
<li>Jack Le &lt;<a class="reference external" href="mailto:anlh&#64;trobz.com">anlh&#64;trobz.com</a>&gt;</li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#toc-entry-8">Other credits</a></h2>
<p>The migration of this module from 13.0 to 16.0 was financially supported by Camptocamp</p>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-9">Maintainers</a></h2>
<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>This module is part of the <a class="reference external" href="https://github.com/OCA/server-ux/tree/16.0/base_binary_url_import">OCA/server-ux</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>
</body>
</html>

View file

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

View file

@ -0,0 +1,333 @@
# Copyright 2022 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
import base64
import json
import logging
from collections import Counter
import pyrfc6266
import requests
from requests.exceptions import HTTPError
from odoo import _, api, fields, models
from odoo.exceptions import AccessError, UserError
DEFAULT_BINARY_CHUNK_SIZE = 32768
DEFAULT_BINARY_IMPORT_TIMEOUT = 5
DEFAULT_BINARY_IMPORT_MAXBYTES = 10 * 1024 * 1024
LINE_BREAK_CHAR = "\n"
SEPARATOR_CHAR = ","
_logger = logging.getLogger(__name__)
class BaseBinaryURLImport(models.TransientModel):
_name = "base.binary.url.import"
_description = "Import of binaries from URL wizard"
target_model_id = fields.Many2one(
"ir.model", domain=[("transient", "=", False)], required=True
)
target_binary_field_id = fields.Many2one("ir.model.fields", required=True)
target_binary_field_domain = fields.Char(
compute="_compute_allowed_target_fields_domain"
)
target_binary_filename_field_id = fields.Many2one("ir.model.fields")
target_binary_filename_field_domain = fields.Char(
compute="_compute_allowed_target_fields_domain"
)
line_ids = fields.One2many("base.binary.url.import.line", "wizard_id")
@api.model
def check_access_rights(self, operation, raise_exception=True):
res = super().check_access_rights(operation, raise_exception=raise_exception)
if not self.env.user._can_import_remote_urls():
raise AccessError(
_(
"You can not import files via URL, check with your "
"administrator for the reason."
)
)
return res
def _get_ir_model_fields_domain(self, ttype):
self.ensure_one()
return [("ttype", "=", ttype), ("model_id", "=", self.target_model_id.id)]
@api.depends("target_model_id")
def _compute_allowed_target_fields_domain(self):
for wiz in self:
binary_domain = wiz._get_ir_model_fields_domain("binary")
char_domain = wiz._get_ir_model_fields_domain("char")
wiz.target_binary_field_domain = json.dumps(binary_domain)
wiz.target_binary_filename_field_domain = json.dumps(char_domain)
@api.onchange("line_ids")
def onchange_line_ids(self):
for wiz_line in self.line_ids:
if LINE_BREAK_CHAR in (wiz_line.binary_url_to_import or ""):
split_lines = wiz_line.binary_url_to_import.split(LINE_BREAK_CHAR)
split_lines = list(filter(None, split_lines))
if SEPARATOR_CHAR in split_lines[0]:
line_identifier, url = split_lines[0].split(SEPARATOR_CHAR)
wiz_line.update(self._prepare_wiz_line_vals(line_identifier, url))
wiz_lines_commands = self._generate_wiz_lines_commands(split_lines[1:])
self.update({"line_ids": wiz_lines_commands})
break
if self.line_ids:
self.lines_sanity_check()
def _generate_wiz_lines_commands(self, split_lines):
commands = []
for line in split_lines:
line_identifier, url = line.split(SEPARATOR_CHAR)
line_vals = self._prepare_wiz_line_vals(line_identifier, url)
commands.append((0, 0, line_vals))
return commands
def _prepare_wiz_line_vals(self, identifier, url):
return {
"target_record_identifier": identifier,
"binary_url_to_import": url,
}
def _get_db_and_xml_ids(self):
db_ids = []
xml_ids = []
# Check target IDs are integers or XMLIDs
for wiz_line in self.line_ids:
id_type = wiz_line._get_identifier_type()
if id_type == "db_id":
db_ids.append(int(wiz_line.target_record_identifier))
elif id_type == "xml_id":
xml_ids.append(wiz_line.target_record_identifier)
return db_ids, xml_ids
def _check_db_ids_exist(self, db_ids):
db_ids_records = self.env[self.target_model_id.model].browse(db_ids).exists()
unexisting_ids = set(db_ids) - set(db_ids_records.ids)
if unexisting_ids:
raise UserError(
_("Following IDs do not exist in database:\n %s")
% LINE_BREAK_CHAR.join([str(db_id) for db_id in unexisting_ids])
)
def _check_db_ids_duplicated(self, db_ids):
db_ids_set = set(db_ids)
if len(db_ids_set) != len(db_ids):
db_ids_counter = Counter(db_ids)
duplicated_db_ids = [
db_id for db_id in db_ids_counter.keys() if db_ids_counter[db_id] > 1
]
raise UserError(
_("Same database IDs are duplicated:\n %s")
% LINE_BREAK_CHAR.join([str(db_id) for db_id in duplicated_db_ids])
)
def _check_xml_ids_exist(self, xml_ids):
unexisting_xml_ids = []
for xml_id in xml_ids:
xml_id_rec = self.env.ref(xml_id, raise_if_not_found=False)
if xml_id_rec is None:
unexisting_xml_ids.append(xml_id)
elif xml_id_rec._name != self.target_model_id.model:
raise UserError(
_(
"XML ID %(xml_id)s matches a record of model "
"%(model_name)s instead of model %(tagert_model_name)s"
)
% {
"xml_id": xml_id,
"model_name": xml_id_rec._name,
"tagert_model_name": self.target_model_id._name,
}
)
if unexisting_xml_ids:
raise UserError(
_("Following XML IDs do not exist in database:\n %s")
% LINE_BREAK_CHAR.join(unexisting_xml_ids)
)
def _check_xml_ids_duplicated(self, xml_ids):
xml_ids_set = set(xml_ids)
if len(xml_ids_set) != len(xml_ids):
xml_ids_counter = Counter(xml_ids)
duplicated_xml_ids = [
xml_id
for xml_id in xml_ids_counter.keys()
if xml_ids_counter[xml_id] > 1
]
raise UserError(
_("Same XML IDs are duplicated:\n %s")
% LINE_BREAK_CHAR.join(duplicated_xml_ids)
)
def _check_db_ids_xml_ids_intersecting(self, db_ids, xml_ids):
xml_ids_records_ids_map = {
xml_id: self.env.ref(xml_id, raise_if_not_found=False).id
for xml_id in xml_ids
}
db_ids_set = set(db_ids)
xml_ids_db_ids_set = set(xml_ids_records_ids_map.values())
intersects = db_ids_set.intersection(xml_ids_db_ids_set)
if intersects:
raise UserError(
_("Following DB IDs intersect with XML IDs:\n %s")
% LINE_BREAK_CHAR.join([str(db_id) for db_id in intersects])
)
def lines_sanity_check(self):
"""Check if IDs are existing for selected model and we don't have two
lines matching same record"""
self.ensure_one()
db_ids, xml_ids = self._get_db_and_xml_ids()
# Check DB IDs exist
self._check_db_ids_exist(db_ids)
# Check we don't have two lines targeting same DB ID
self._check_db_ids_duplicated(db_ids)
# Check XML IDs exist and match target model
self._check_xml_ids_exist(xml_ids)
# Check we don't have two lines targeting same XML ID
self._check_xml_ids_duplicated(xml_ids)
# Check no intersection between XML IDs and DB IDs
self._check_db_ids_xml_ids_intersecting(db_ids, xml_ids)
def action_import_lines(self):
self.ensure_one()
self.lines_sanity_check()
updated_ids = []
with requests.Session() as session:
for line in self.line_ids:
updated_ids.append(line.import_binary_from_url(session))
domain = [("id", "in", updated_ids)]
return {
"name": _("Updated records"),
"type": "ir.actions.act_window",
"res_model": self.target_model_id.model,
"domain": domain,
"view_mode": "tree,form",
}
class BaseBinaryURLImportLine(models.TransientModel):
_name = "base.binary.url.import.line"
_description = "Import of binaries from URL wizard line"
wizard_id = fields.Many2one("base.binary.url.import", required=True)
target_record_identifier = fields.Char(string="Target record ID")
is_target_record_identifier_required = fields.Boolean(
compute="_compute_is_target_record_identifier_required"
)
binary_url_to_import = fields.Char(string="URL to import", required=True)
@api.depends("binary_url_to_import")
def _compute_is_target_record_identifier_required(self):
for line in self:
line.is_target_record_identifier_required = (
SEPARATOR_CHAR not in line.binary_url_to_import
if line.binary_url_to_import
else False
)
def _get_identifier_type(self):
self.ensure_one()
target_id = self.target_record_identifier
if not target_id:
return
if target_id.isdigit():
return "db_id"
elif "." in target_id:
return "xml_id"
else:
raise UserError(_("Identifier %s is not an Integer or XMLID") % target_id)
def _get_target_record(self):
self.ensure_one()
rec = None
if self._get_identifier_type() == "db_id":
rec = self.env[self.wizard_id.target_model_id.model].browse(
int(self.target_record_identifier)
)
elif self._get_identifier_type() == "xml_id":
rec = self.env.ref(self.target_record_identifier)
return rec
def import_binary_from_url(self, request_session=None):
self.ensure_one()
if request_session is None:
request_session = requests
binary_content, filename = self._import_content_from_url(request_session)
target_record = self._get_target_record()
vals = {
self.wizard_id.target_binary_field_id.name: base64.b64encode(binary_content)
}
if self.wizard_id.target_binary_filename_field_id:
vals.update(
{
self.wizard_id.target_binary_filename_field_id.name: filename,
}
)
target_record.write(vals)
return target_record.id
def _import_content_from_url(self, request_session):
# Adapted from base_import module
maxsize = (
int(
self.env["ir.config_parameter"].get_param("binary.url.import.max.size")
or "0"
)
or DEFAULT_BINARY_IMPORT_MAXBYTES
)
timeout = (
int(
self.env["ir.config_parameter"].get_param("binary.url.import.timeout")
or "0"
)
or DEFAULT_BINARY_IMPORT_TIMEOUT
)
_logger.debug(
"Trying to import Binary from URL: %s " % self.binary_url_to_import
)
except_message = ""
try:
with request_session.get(
self.binary_url_to_import, timeout=timeout, stream=True
) as response:
response.raise_for_status()
if (
response.headers.get("Content-Length")
and int(response.headers["Content-Length"]) > maxsize
):
raise ValueError(
_("File size exceeds configured maximum (%s bytes)") % maxsize
)
content = bytearray()
for chunk in response.iter_content(DEFAULT_BINARY_CHUNK_SIZE):
content += chunk
if len(content) > maxsize:
raise ValueError(
_("File size exceeds configured maximum (%s bytes)")
% maxsize
)
# Use pyrfc6266 to get the filename from
# Content-Disposition in the HTTP response header
filename = pyrfc6266.requests_response_to_filename(response)
except HTTPError as e:
_logger.exception(e)
except_message = e
if except_message:
raise UserError(
_("Could not retrieve URL: %(url)s : %(error)s")
% {"url": self.binary_url_to_import, "error": except_message}
)
return content, filename

View file

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record model="ir.ui.view" id="base_binary_url_import_form">
<field name="name">base.binary.url.import.form</field>
<field name="model">base.binary.url.import</field>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="target_model_id" options="{'no_create': True}" />
<field
name="target_binary_field_id"
options="{'no_create': True}"
domain="target_binary_field_domain"
/>
<field name="target_binary_field_domain" invisible="1" />
<field
name="target_binary_filename_field_id"
options="{'no_create': True}"
domain="target_binary_filename_field_domain"
/>
<field
name="target_binary_filename_field_domain"
invisible="1"
/>
</group>
<field name="line_ids">
<tree editable="bottom">
<field
name="target_record_identifier"
placeholder="Record ID or XMLID"
attrs="{'required': [('is_target_record_identifier_required', '=', True)]}"
/>
<field
name="is_target_record_identifier_required"
invisible="1"
/>
<field
name="binary_url_to_import"
widget="text"
placeholder="Write your lines one by one or copy paste a CSV-like list with ID,URL."
/>
</tree>
</field>
</group>
<footer>
<button
name="action_import_lines"
string="Import"
type="object"
class="btn-primary"
/>
<button string="Cancel" class="btn-secondary" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_wizard_base_binary_url_import">
<field name="name">Binary Import From URL</field>
<field name="res_model">base.binary.url.import</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem
id="menu_import"
name="Import"
sequence="50"
action="action_wizard_base_binary_url_import"
parent="base.menu_custom"
/>
<menuitem
id="menu_binary_url_import"
name="Binary Import From URL"
sequence="10"
action="action_wizard_base_binary_url_import"
parent="menu_import"
/>
</odoo>

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 Base_binary_url_import Module - base_binary_url_import
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 base_binary_url_import. 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,7 @@
# Dependencies
This addon depends on:
- base
- [base_import](../../odoo-bringout-oca-ocb-base_import)
- [web_domain_field](../../odoo-bringout-oca-web-web_domain_field)

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 base_binary_url_import or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-server-ux-base_binary_url_import"
# or
uv pip install odoo-bringout-oca-server-ux-base_binary_url_import"
```

View file

@ -0,0 +1,11 @@
# Models
Detected core models and extensions in base_binary_url_import.
```mermaid
classDiagram
```
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: base_binary_url_import. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon base_binary_url_import
- 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 base_binary_url_import.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../base_binary_url_import/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](../base_binary_url_import/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 base_binary_url_import
```

View file

@ -0,0 +1,9 @@
# Wizards
Transient models exposed as UI wizards in base_binary_url_import.
```mermaid
classDiagram
class BaseBinaryURLImport
class BaseBinaryURLImportLine
```

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-oca-server-ux-base_binary_url_import"
version = "16.0.0"
description = "Base Binary URL Import - Wizard to import binary files from URL on existing records"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-base>=16.0.0",
"odoo-bringout-oca-server-ux-base_import>=16.0.0",
"odoo-bringout-oca-server-ux-web_domain_field>=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 = ["base_binary_url_import"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]