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,45 @@
# Web Editor Media Dialog DMS
Odoo addon: web_editor_media_dialog_dms
## Installation
```bash
pip install odoo-bringout-oca-dms-web_editor_media_dialog_dms
```
## Dependencies
This addon depends on:
- dms
- web_editor
## Manifest Information
- **Name**: Web Editor Media Dialog DMS
- **Version**: 16.0.1.0.0
- **Category**: N/A
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/dms](https://github.com/OCA/dms) branch 16.0, addon `web_editor_media_dialog_dms`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

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 Web_editor_media_dialog_dms Module - web_editor_media_dialog_dms
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 web_editor_media_dialog_dms. 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,6 @@
# Dependencies
This addon depends on:
- [dms](../../odoo-bringout-oca-dms-dms)
- [web_editor](../../odoo-bringout-oca-ocb-web_editor)

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

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-dms-web_editor_media_dialog_dms"
# or
uv pip install odoo-bringout-oca-dms-web_editor_media_dialog_dms"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in web_editor_media_dialog_dms.
```mermaid
classDiagram
class dms_file
class ir_binary
```
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: web_editor_media_dialog_dms. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon web_editor_media_dialog_dms
- License: LGPL-3

View file

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

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

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 web_editor_media_dialog_dms
```

View file

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

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-dms-web_editor_media_dialog_dms"
version = "16.0.0"
description = "Web Editor Media Dialog DMS - Integrate DMS with media dialog of web editor"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-dms-dms>=16.0.0",
"odoo-bringout-oca-ocb-web_editor>=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 = ["web_editor_media_dialog_dms"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,97 @@
===========================
Web Editor Media Dialog DMS
===========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:cc57658ce5d4b5187afb21e817001519e004eb3e2e10fa4e3897b5c9e3e3f129
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github
:target: https://github.com/OCA/dms/tree/16.0/web_editor_media_dialog_dms
:alt: OCA/dms
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/dms-16-0/dms-16-0-web_editor_media_dialog_dms
: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/dms&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds the option in the web editor to include an image with the
corresponding link to open/download the linked files.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, we need:
#. Navigate to a model that has an HTML field
#. Edit the field
#. Type /image to open the media dialog
#. Select the DMS tab
#. Select the DMS file to be added
You can also edit the selected file making a double click on the image added to web
editor.
If you want to share the file to a public user, you can do it by selecting the option
**Allow open to public users** which is located on DMS tab of media dialog.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/dms/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/dms/issues/new?body=module:%20web_editor_media_dialog_dms%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
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* Pedro M. Baeza
* Carlos Roca
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/dms <https://github.com/OCA/dms/tree/16.0/web_editor_media_dialog_dms>`_ 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 models

View file

@ -0,0 +1,17 @@
# Copyright 2024 Tecnativa - Carlos Roca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Web Editor Media Dialog DMS",
"summary": "Integrate DMS with media dialog of web editor",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/dms",
"depends": ["dms", "web_editor"],
"assets": {
"web_editor.assets_media_dialog": [
"web_editor_media_dialog_dms/static/src/media_dialog/*",
]
},
}

View file

@ -0,0 +1,66 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_editor_media_dialog_dms
#
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: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "All DMS files have been loaded"
msgstr "Sve DMS datoteke su učitane"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Allow open to public users"
msgstr "Dozvoli otvaranje javnim korisnicima"
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file
msgid "File"
msgstr "Datoteka"
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary
msgid "File streaming helper model for controllers"
msgstr "Model pomoćnika za streaming datoteka za kontrolere"
#. module: web_editor_media_dialog_dms
#. odoo-python
#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0
#, python-format
msgid "Invalid access token"
msgstr "Nevaljan pristupni token"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Load more..."
msgstr "Učitaj više..."
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "No DMS files found."
msgstr "Nijedna DMS datoteka nije pronađena."
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0
#, python-format
msgid "Search a dms file"
msgstr "Pretraži dms datoteku"

View file

@ -0,0 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_editor_media_dialog_dms
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-22 09:04+0000\n"
"PO-Revision-Date: 2024-08-22 11:05+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0.1\n"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "All DMS files have been loaded"
msgstr "Todos los archivos DMS han sido cargados"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Allow open to public users"
msgstr "Permitir abrir enlace a usuarios públicos"
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file
msgid "File"
msgstr "Archivo"
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary
msgid "File streaming helper model for controllers"
msgstr "Modelo de ayuda para la transmisión de archivos para controladores"
#. module: web_editor_media_dialog_dms
#. odoo-python
#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0
#, python-format
msgid "Invalid access token"
msgstr "Token de acceso inválido"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Load more..."
msgstr "Cargar más..."
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "No DMS files found."
msgstr "No se encontraron archivos DMS."
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0
#, python-format
msgid "Search a dms file"
msgstr "Buscar un archivo DMS"

View file

@ -0,0 +1,69 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_editor_media_dialog_dms
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-08-29 13:06+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.6.2\n"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "All DMS files have been loaded"
msgstr "Tutti i file DMS sono stati caricati"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Allow open to public users"
msgstr "Consenti l'apertura a utenti pubblici"
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file
msgid "File"
msgstr "File"
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary
msgid "File streaming helper model for controllers"
msgstr "Modello aiuto streaming file per controller"
#. module: web_editor_media_dialog_dms
#. odoo-python
#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0
#, python-format
msgid "Invalid access token"
msgstr "Token accesso non valido"
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Load more..."
msgstr "Carica altri..."
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "No DMS files found."
msgstr "Nessun file DMS trovato."
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0
#, python-format
msgid "Search a dms file"
msgstr "Cerca un file DMS"

View file

@ -0,0 +1,66 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_editor_media_dialog_dms
#
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: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "All DMS files have been loaded"
msgstr ""
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Allow open to public users"
msgstr ""
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file
msgid "File"
msgstr ""
#. module: web_editor_media_dialog_dms
#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary
msgid "File streaming helper model for controllers"
msgstr ""
#. module: web_editor_media_dialog_dms
#. odoo-python
#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0
#, python-format
msgid "Invalid access token"
msgstr ""
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "Load more..."
msgstr ""
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0
#, python-format
msgid "No DMS files found."
msgstr ""
#. module: web_editor_media_dialog_dms
#. odoo-javascript
#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0
#, python-format
msgid "Search a dms file"
msgstr ""

View file

@ -0,0 +1,2 @@
from . import dms_file
from . import ir_binary

View file

@ -0,0 +1,26 @@
# Copyright 2024 Tecnativa - Carlos Roca
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from odoo import _, models
from odoo.exceptions import AccessError
from odoo.tools import consteq
class File(models.Model):
_inherit = "dms.file"
def get_access_token(self):
self.ensure_one()
return self._portal_ensure_token()
def validate_access(self, access_token):
# Validate if token provided is correct for the record checked
self.ensure_one()
record_sudo = self.sudo()
if access_token:
tok = record_sudo.with_context(prefetch_fields=False).access_token
valid_token = consteq(tok or "", access_token)
if not valid_token:
raise AccessError(_("Invalid access token"))
return record_sudo
return self

View file

@ -0,0 +1,15 @@
# Copyright 2024 Tecnativa - Carlos Roca
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from odoo import models
class IrBinary(models.AbstractModel):
_inherit = "ir.binary"
def _find_record_check_access(self, record, access_token):
# The method is overridden to allow access to the media attached to the
# dms.file records using an access_token.
if record._name == "dms.file":
return record.validate_access(access_token)
return super()._find_record_check_access(record, access_token)

View file

@ -0,0 +1,4 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Pedro M. Baeza
* Carlos Roca

View file

@ -0,0 +1,2 @@
This module adds the option in the web editor to include an image with the
corresponding link to open/download the linked files.

View file

@ -0,0 +1,13 @@
To use this module, we need:
#. Navigate to a model that has an HTML field
#. Edit the field
#. Type /image to open the media dialog
#. Select the DMS tab
#. Select the DMS file to be added
You can also edit the selected file making a double click on the image added to web
editor.
If you want to share the file to a public user, you can do it by selecting the option
**Allow open to public users** which is located on DMS tab of media dialog.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,444 @@
<!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>Web Editor Media Dialog DMS</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" id="web-editor-media-dialog-dms">
<h1 class="title">Web Editor Media Dialog DMS</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:cc57658ce5d4b5187afb21e817001519e004eb3e2e10fa4e3897b5c9e3e3f129
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/dms/tree/16.0/web_editor_media_dialog_dms"><img alt="OCA/dms" src="https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/dms-16-0/dms-16-0-web_editor_media_dialog_dms"><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/dms&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 the option in the web editor to include an image with the
corresponding link to open/download the linked files.</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">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>To use this module, we need:</p>
<ol class="arabic simple">
<li>Navigate to a model that has an HTML field</li>
<li>Edit the field</li>
<li>Type /image to open the media dialog</li>
<li>Select the DMS tab</li>
<li>Select the DMS file to be added</li>
</ol>
<p>You can also edit the selected file making a double click on the image added to web
editor.</p>
<p>If you want to share the file to a public user, you can do it by selecting the option
<strong>Allow open to public users</strong> which is located on DMS tab of media dialog.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/dms/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/dms/issues/new?body=module:%20web_editor_media_dialog_dms%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-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Pedro M. Baeza</li>
<li>Carlos Roca</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">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/dms/tree/16.0/web_editor_media_dialog_dms">OCA/dms</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,209 @@
/** @odoo-module */
import {SearchMedia} from "@web_editor/components/media_dialog/search_media";
import {KeepLast} from "@web/core/utils/concurrency";
import {useDebounced} from "@web/core/utils/timing";
import {useService} from "@web/core/utils/hooks";
import {Component, onWillStart, useRef, useState} from "@odoo/owl";
export class DMSFile extends Component {}
DMSFile.template = "web_editor_media_dialog_dms.DMSFile";
export class DMSSelector extends Component {
setup() {
this.orm = useService("orm");
this.keepLast = new KeepLast();
this.loadMoreButtonRef = useRef("load-more-button");
this.state = useState({
dmsFiles: [],
canLoadMoreFiles: true,
isFetchingFiles: false,
needle: "",
});
this.allowOpenPublic = false;
this.NUMBER_OF_FILES_TO_DISPLAY = 30;
this.searchPlaceholder = this.env._t("Search a dms file");
onWillStart(async () => {
this.state.dmsFiles = await this.fetchFiles(
this.NUMBER_OF_FILES_TO_DISPLAY,
0
);
});
this.debouncedScroll = useDebounced(this.scrollToLoadMoreButton, 500);
}
get canLoadMore() {
return this.state.canLoadMoreFiles;
}
get hasContent() {
return this.state.dmsFiles.length;
}
get isFetching() {
return this.state.isFetchingFiles;
}
get selectedFileIds() {
return this.props.selectedMedia[this.props.id]
.filter((media) => media.mediaType === "dms")
.map(({id}) => id);
}
async fetchFiles(limit, offset) {
this.state.isFetchingFiles = true;
let files = [];
try {
files = await this.orm.searchRead(
"dms.file",
[["name", "ilike", this.state.needle]],
["name", "mimetype"],
{
order: "id desc",
limit,
offset,
}
);
} catch (e) {
if (e.exceptionName !== "odoo.exceptions.AccessError") {
throw e;
}
}
this.state.canLoadMoreFiles = files.length >= this.NUMBER_OF_FILES_TO_DISPLAY;
this.state.isFetchingFiles = false;
if (this.selectInitialMedia()) {
for (const file of files) {
if (
`/web/content/dms.file/${file.id}/content` ===
this.props.media.getAttribute("href").replace(/[?].*/, "")
) {
this.selectFile(file);
}
}
}
for (const file of files) {
file.allowOpenPublic = this.allowOpenPublic;
}
return files;
}
async handleLoadMore() {
await this.loadMore();
this.debouncedScroll();
}
async loadMore() {
return this.keepLast
.add(
this.fetchFiles(
this.NUMBER_OF_FILES_TO_DISPLAY,
this.state.dmsFiles.length
)
)
.then((newFiles) => {
// This is never reached if another search or loadMore occurred.
this.state.dmsFiles.push(...newFiles);
});
}
async handleSearch(needle) {
await this.search(needle);
this.debouncedScroll();
}
search(needle) {
this.state.dmsFiles = [];
this.state.needle = needle;
return this.keepLast
.add(this.fetchFiles(this.NUMBER_OF_FILES_TO_DISPLAY, 0))
.then((files) => {
this.state.dmsFiles = files;
});
}
scrollToLoadMoreButton() {
if (
this.state.needle ||
this.state.dmsFiles.length > this.NUMBER_OF_FILES_TO_DISPLAY
) {
this.loadMoreButtonRef.el.scrollIntoView({
block: "end",
inline: "nearest",
behavior: "smooth",
});
}
}
async onClickFile(file) {
this.props.selectMedia({...file, mediaType: "dms"});
await this.props.save();
}
static async createElements(selectedMedia, {orm}) {
return Promise.all(
selectedMedia.map(async (file) => {
const linkEl = document.createElement("a");
let href = `/web/content/dms.file/${encodeURIComponent(
file.id
)}/content`;
// Download svg images because are considered images but are not
// visualized correctly on new tab. Other files than pdf or image are
// downloaded by default
var extra_added = false;
if (file.mimetype === "image/svg+xml") {
href += "?download=true";
extra_added = true;
}
if (file.allowOpenPublic) {
const accessToken = await orm.call("dms.file", "get_access_token", [
file.id,
]);
href += `${
extra_added ? "&" : "?"
}access_token=${encodeURIComponent(accessToken)}`;
extra_added = true;
}
linkEl.href = href;
linkEl.title = file.name;
linkEl.dataset.mimetype = file.mimetype;
return linkEl;
})
);
}
selectFile(file) {
this.props.selectMedia({...file, mediaType: "dms"});
}
selectInitialMedia() {
return (
this.props.media &&
this.constructor.tagNames.includes(this.props.media.tagName) &&
!this.selectedFileIds.length
);
}
async handleChangeAllowOpenPublic() {
await this.changeAllowOpenPublic();
this.debouncedScroll();
}
changeAllowOpenPublic() {
this.allowOpenPublic = !this.allowOpenPublic;
return this.keepLast
.add(this.fetchFiles(this.state.dmsFiles.length, 0))
.then((files) => {
this.state.dmsFiles = files;
});
}
}
DMSSelector.template = "web_editor_media_dialog_dms.DMSSelector";
DMSSelector.mediaSpecificClasses = ["o_image", "o_dms_file"];
DMSSelector.mediaSpecificStyles = [];
DMSSelector.mediaExtraClasses = [];
DMSSelector.tagNames = ["A"];
DMSSelector.components = {
DMSFile,
SearchMedia,
};

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8" ?>
<templates id="template" xml:space="preserve">
<t t-name="web_editor_media_dialog_dms.DMSFile" owl="1">
<div
class="o_existing_attachment_cell o_we_attachment_highlight card col-2 position-relative mb-2 p-2 opacity-trigger-hover cursor-pointer"
t-att-class="{ o_we_attachment_selected: props.selected }"
t-on-click="props.selectFile"
>
<div
role="img"
t-att-aria-label="props.name"
t-att-title="props.name"
t-att-data-mimetype="props.mimetype"
class="o_image d-flex align-items-center justify-content-center"
/>
<small class="o_file_name d-block text-truncate" t-esc="props.name" />
</div>
</t>
<t t-name="web_editor_media_dialog_dms.DMSSelector" owl="1">
<div>
<div class="d-flex gap-2 align-items-center py-4">
<SearchMedia
searchPlaceholder="searchPlaceholder"
search.bind="this.search"
needle="state.needle"
/>
<div class="d-flex gap-3 justify-content-start align-items-center">
<div
class="flex-shrink-0 form-check form-switch align-items-center"
t-on-change="handleChangeAllowOpenPublic"
>
<input
class="o_we_open_public form-check-input"
type="checkbox"
t-att-checked="allowOpenPublic"
id="o_we_open_public_switch"
/>
<label class="form-check-label" for="o_we_open_public_switch">
Allow open to public users
</label>
</div>
</div>
</div>
<div t-if="!hasContent" class="o_nocontent_help">
<p class="o_empty_folder_image">No DMS files found.</p>
</div>
<div t-else="" class="d-flex flex-wrap gap-2">
<t t-foreach="state.dmsFiles" t-as="file" t-key="file.id">
<DMSFile
name="file.name"
mimetype="file.mimetype"
id="file.id"
selected="this.selectedFileIds.includes(file.id)"
selectFile="() => this.onClickFile(file)"
/>
</t>
</div>
<div
name="load_more_files"
class="mt-4 text-center mx-auto o_we_load_more"
t-ref="load-more-button"
>
<button
t-if="canLoadMore"
class="btn btn-odoo o_load_more"
type="button"
t-on-click="loadMore"
>Load more...</button>
<div t-if="hasContent and !canLoadMore" class="mt-4 o_load_done_msg">
<span><i>All DMS files have been loaded</i></span>
</div>
</div>
</div>
</t>
</templates>

View file

@ -0,0 +1,43 @@
/** @odoo-module **/
import {MediaDialog, TABS} from "@web_editor/components/media_dialog/media_dialog";
import {DMSSelector} from "./dms_selector.esm";
import {patch} from "@web/core/utils/patch";
patch(TABS, "web_editor_media_dialog_dms.TABS", {
DMS: {
id: "DMS",
title: "DMS",
Component: DMSSelector,
},
});
patch(MediaDialog.prototype, "web_editor_media_dialog_dms.MediaDialog", {
get initialActiveTab() {
const dmsTab = this.tabs.find((tab) => tab.id === "DMS");
if (
!this.props.activeTab &&
dmsTab &&
this.props.media &&
this.props.media.classList.contains("o_dms_file")
) {
return dmsTab.id;
}
return this._super(...arguments);
},
addTabs() {
const res = this._super(...arguments);
const onlyImages =
this.props.onlyImages ||
this.props.multiImages ||
(this.props.media &&
this.props.media.parentElement &&
(this.props.media.parentElement.dataset.oeField === "image" ||
this.props.media.parentElement.dataset.oeType === "image"));
const noDMS = onlyImages || this.props.noDMS;
if (!noDMS) {
this.addTab(TABS.DMS);
}
return res;
},
});