Browse Source

Merge branch '9.0' of github.com:OCA/web into 9.0-mig-web_dashboard_tile

pull/507/head
Nicolas Mac Rouillon 7 years ago
parent
commit
f9843d4ec1
  1. 7
      README.md
  2. 69
      help_online/README.rst
  3. 23
      help_online/__init__.py
  4. 51
      help_online/__openerp__.py
  5. 22
      help_online/controllers/__init__.py
  6. 21
      help_online/controllers/help_online_controllers.py
  7. 244
      help_online/i18n/es.po
  8. 177
      help_online/i18n/fr.po
  9. 168
      help_online/i18n/sl.po
  10. 24
      help_online/models/__init__.py
  11. 33
      help_online/models/help_online.py
  12. 49
      help_online/models/import_help_wizard.py
  13. 40
      help_online/models/ir_model.py
  14. 32
      help_online/security/help_online_groups.xml
  15. 60
      help_online/security/help_online_rules.xml
  16. 13
      help_online/static/src/css/help_online.css
  17. 175
      help_online/static/src/js/help_online.js
  18. 21
      help_online/static/src/js/website_help_online.editor.js
  19. 43
      help_online/static/src/xml/help_online.xml
  20. 30
      help_online/tests/__init__.py
  21. 100
      help_online/tests/common.py
  22. 2
      help_online/tests/data/help_test_data.xml
  23. 121
      help_online/tests/test_export_help_wizard.py
  24. 58
      help_online/tests/test_help_online.py
  25. 59
      help_online/tests/test_import_help_wizard.py
  26. 52
      help_online/views/export_help_wizard_view.xml
  27. 50
      help_online/views/help_online_view.xml
  28. 46
      help_online/views/import_help_wizard_view.xml
  29. 48
      help_online/views/ir_ui_view_view.xml
  30. 12
      help_online/views/website_help_online.xml
  31. 6
      help_online/wizards/__init__.py
  32. 231
      help_online/wizards/export_help_wizard.py
  33. 50
      help_online/wizards/export_help_wizard_view.xml
  34. 53
      help_online/wizards/import_help_wizard.py
  35. 43
      help_online/wizards/import_help_wizard_view.xml
  36. 1
      setup/help_online/odoo_addons/__init__.py
  37. 1
      setup/help_online/odoo_addons/help_online
  38. 6
      setup/help_online/setup.py
  39. 1
      setup/web_menu_collapsible/odoo_addons/__init__.py
  40. 1
      setup/web_menu_collapsible/odoo_addons/web_menu_collapsible
  41. 6
      setup/web_menu_collapsible/setup.py
  42. 2
      web_dialog_size/__openerp__.py
  43. 2
      web_export_view/__openerp__.py
  44. 10
      web_export_view/i18n/de.po
  45. 10
      web_export_view/i18n/es.po
  46. 10
      web_export_view/i18n/fr.po
  47. 10
      web_export_view/i18n/is.po
  48. 10
      web_export_view/i18n/nl.po
  49. 10
      web_export_view/i18n/sl.po
  50. 11
      web_export_view/static/src/js/web_export_view.js
  51. 17
      web_m2x_options/i18n/es.po
  52. 2
      web_m2x_options/static/src/js/form.js
  53. 67
      web_menu_collapsible/README.rst
  54. 3
      web_menu_collapsible/__init__.py
  55. 18
      web_menu_collapsible/__openerp__.py
  56. BIN
      web_menu_collapsible/static/description/icon.png
  57. BIN
      web_menu_collapsible/static/description/menu_collapsible_1.png
  58. BIN
      web_menu_collapsible/static/description/menu_collapsible_2.png
  59. 43
      web_menu_collapsible/static/src/css/menu_collapsible.css
  60. 23
      web_menu_collapsible/static/src/js/menu_collapsible.js
  61. 9
      web_menu_collapsible/templates/menu_collapsible.xml
  62. 5
      web_responsive/README.rst
  63. 2
      web_responsive/__openerp__.py
  64. 9
      web_responsive/i18n/es.po
  65. 9
      web_responsive/static/lib/css/drawer.3.2.0.css
  66. 10
      web_responsive/static/lib/js/drawer.3.2.0.js
  67. 26
      web_responsive/static/src/js/web_responsive.js
  68. 13
      web_responsive/static/src/less/app_drawer.less
  69. 94
      web_responsive/static/src/less/form_view.less
  70. 46
      web_responsive/static/src/less/main.less
  71. 187
      web_responsive/static/src/less/navbar.less
  72. 11
      web_responsive/static/src/less/variables.less
  73. 2
      web_responsive/tests/test_ui.py
  74. 5
      web_responsive/views/assets.xml
  75. 44
      web_responsive/views/web.xml
  76. 26
      web_tree_dynamic_colored_field/i18n/es.po
  77. 54
      web_widget_image_webcam/i18n/es.po
  78. 54
      web_widget_image_webcam/i18n/fr.po
  79. 54
      web_widget_image_webcam/i18n/sl.po
  80. 7
      web_widget_x2many_2d_matrix/static/src/js/web_widget_x2many_2d_matrix.js
  81. 27
      web_x2many_delete_all/i18n/es.po

7
README.md

@ -17,19 +17,21 @@ Available addons
----------------
addon | version | summary
--- | --- | ---
[help_online](help_online/) | 9.0.1.0.0 | Help Online
[support_branding](support_branding/) | 9.0.2.0.0 | Adds your branding to an Odoo instance
[web_access_rule_buttons](web_access_rule_buttons/) | 9.0.1.0.0 | Disable Edit button if access rules prevent this action
[web_dialog_size](web_dialog_size/) | 9.0.1.0.0 | A module that lets the user expand a dialog box to the full screen width.
[web_duplicate_visibility](web_duplicate_visibility/) | 9.0.1.0.1 | Manage the duplicate button visibiliy
[web_easy_switch_company](web_easy_switch_company/) | 9.0.1.0.0 | Multicompany - Easy Switch Company
[web_environment_ribbon](web_environment_ribbon/) | 9.0.1.0.0 | Web Environment Ribbon
[web_export_view](web_export_view/) | 9.0.1.0.0 | Export Current View
[web_export_view](web_export_view/) | 9.0.1.0.1 | Export Current View
[web_favicon](web_favicon/) | 9.0.1.0.0 | Allows to set a custom shortcut icon (aka favicon)
[web_hide_db_manager_link](web_hide_db_manager_link/) | 9.0.1.0.0 | Hide link to database manager in login screen
[web_m2x_options](web_m2x_options/) | 9.0.1.0.0 | web_m2x_options
[web_menu_collapsible](web_menu_collapsible/) | 9.0.1.0.0 | Foldable second level Odoo menu
[web_notify](web_notify/) | 9.0.1.0.0 | Send notification messages to user
[web_readonly_bypass](web_readonly_bypass/) | 9.0.1.0.1 | Allow to save onchange modifications to readonly fields
[web_responsive](web_responsive/) | 9.0.1.0.0 | It provides a mobile compliant interface for Odoo Community web
[web_responsive](web_responsive/) | 9.0.2.0.0 | It provides a mobile compliant interface for Odoo Community web
[web_searchbar_full_width](web_searchbar_full_width/) | 9.0.1.0.0 | Show search bar in full screen width
[web_send_message_popup](web_send_message_popup/) | 9.0.1.0.0 | Web Send Message as Popup
[web_sheet_full_width](web_sheet_full_width/) | 9.0.1.0.0 | Use the whole available screen width when displaying sheets
@ -50,7 +52,6 @@ Unported addons
---------------
addon | version | summary
--- | --- | ---
[help_online](help_online/) | 8.0.1.0.0 (unported) | Help Online
[help_popup](help_popup/) | 8.0.0.5.0 (unported) | Help Popup
[web_action_conditionable](web_action_conditionable/) | 8.0.0.1.0 (unported) | web_action_conditionable
[web_advanced_search_x2x](web_advanced_search_x2x/) | 8.0.1.0.0 (unported) | Use a search widget in advanced search for x2x fields

69
help_online/README.rst

@ -0,0 +1,69 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
===========
Help Online
===========
This module allows the creation of an online help available from the lists
and forms in Odoo.
When loading a view, the module generates a button allowing access to an help
page for the related model if the page exists and the user is member of the
group 'Help reader'. If the page doesn't exist and the user is member of
the group 'Help writer', the module generate a button allowing the creation an
help page.
The help pages are created and managed via the website Module.
Note: When updating the page prefix parameters, the record rules must be
adapted.
Usage
=====
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/162/9.0
Known issues / Roadmap
======================
Even if the generated urls to the documentation contains an anchor (website/hel-xx#view_type),
it's no more possible to insert/edit anchors elements into the website since this functionnality is not supported
by the new html editor in Odoo 9.0 (summernote).
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/web/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.
Credits
=======
Contributors
------------
* Laurent Mignon <laurent.mignon@acsone.eu>
* Jonathan Nemry <jonathan.nemry@acsone.eu>
* Cédric Pigeon <cedric.pigeon@acsone.eu>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
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.
To contribute to this module, please visit https://odoo-community.org.

23
help_online/__init__.py

@ -1,22 +1,7 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Nemry Jonathan
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import controllers
from . import models
from . import wizards

51
help_online/__openerp__.py

@ -1,65 +1,30 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Nemry Jonathan
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
'name': 'Help Online',
'version': '8.0.1.0.0',
'version': '9.0.1.0.0',
'author': "ACSONE SA/NV,Odoo Community Association (OCA)",
'maintainer': 'ACSONE SA/NV',
'website': 'http://www.acsone.eu',
'license': 'AGPL-3',
'category': 'Documentation',
'depends': [
'base',
'website',
],
'description': """
Help Online
===========
This module allows the creation of an online help available from the lists
and forms in Odoo.
When loading a view, the module generates a button allowing access to an help
page for the related model if the page exists and the user is member of the
group 'Help reader'. If the page doesn't exist and the user is member of
the group 'Help writer', the module generate a button allowing the creation an
help page.
The help pages are created and managed via the website Module.
Note: When updating the page prefix parameters, the record rules must be
adapted.
""",
'data': [
'security/help_online_groups.xml',
'security/help_online_rules.xml',
'views/export_help_wizard_view.xml',
'views/import_help_wizard_view.xml',
'wizards/export_help_wizard_view.xml',
'wizards/import_help_wizard_view.xml',
'views/ir_ui_view_view.xml',
'views/help_online_view.xml',
'views/website_help_online.xml',
'data/ir_config_parameter_data.xml',
],
'qweb': [
'static/src/xml/help_online.xml',
],
'installable': False,
'auto_install': False,
'installable': True,
}

22
help_online/controllers/__init__.py

@ -1,21 +1,5 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laurent Mignon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from .import help_online_controllers

21
help_online/controllers/help_online_controllers.py

@ -1,23 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laurent Mignon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import openerp.http as http
from openerp.http import request

244
help_online/i18n/es.po

@ -0,0 +1,244 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * help_online
#
# Translators:
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-14 02:26+0000\n"
"PO-Revision-Date: 2017-01-14 02:26+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Close"
msgstr "Cerrar"
#. module: help_online
#: code:addons/help_online/models/help_online.py:45
#, python-format
msgid "Create Help page for %s"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_create_uid
#: model:ir.model.fields,field_description:help_online.field_help_online_create_uid
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_create_date
#: model:ir.model.fields,field_description:help_online.field_help_online_create_date
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_create_date
msgid "Created on"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_display_name
#: model:ir.model.fields,field_description:help_online.field_help_online_display_name
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_display_name
msgid "Display Name"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid "Export"
msgstr ""
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:302
#: model:ir.actions.act_window,name:help_online.action_export_help_wizard
#, python-format
msgid "Export Help"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid "Export Help Data"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_export_help_wizard
#: model:ir.ui.menu,name:help_online.menu_help_export
msgid "Export Help Online"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_export_filename
msgid "Export XML Filename"
msgstr ""
#. module: help_online
#: model:ir.ui.menu,name:help_online.menu_help
#: model:ir.ui.menu,name:help_online.menu_help_main
msgid "Help Online"
msgstr ""
#. module: help_online
#: code:addons/help_online/models/help_online.py:40
#, python-format
msgid "Help on %s"
msgstr ""
#. module: help_online
#: model:res.groups,name:help_online.help_online_group_reader
msgid "Help reader"
msgstr ""
#. module: help_online
#: model:res.groups,name:help_online.help_online_group_writer
msgid "Help writer"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_id
#: model:ir.model.fields,field_description:help_online.field_help_online_id
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_id
msgid "ID"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Import"
msgstr ""
#. module: help_online
#: model:ir.actions.act_window,name:help_online.action_import_help_wizard
msgid "Import Help"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Import Help Data"
msgstr ""
#. module: help_online
#: model:ir.ui.menu,name:help_online.menu_help_import
msgid "Import Help Online"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard___last_update
#: model:ir.model.fields,field_description:help_online.field_help_online___last_update
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard___last_update
msgid "Last Modified on"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_write_uid
#: model:ir.model.fields,field_description:help_online.field_help_online_write_uid
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_write_date
#: model:ir.model.fields,field_description:help_online.field_help_online_write_date
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:295
#, python-format
msgid "No data to export !"
msgstr ""
#. module: help_online
#: code:addons/help_online/models/help_online.py:17
#, python-format
msgid "No page prefix parameter specified !"
msgstr ""
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:99
#, python-format
msgid "Only images from ir.attachment are supported when exporting help pages"
msgstr ""
#. module: help_online
#. openerp-web
#: code:addons/help_online/static/src/js/help_online.js:37
#, python-format
msgid "Page does not exist. Do you want to create?"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_source_file
msgid "Source File"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid ""
"This wizard allow you to export all QWeb views\n"
" related to help online. The result will be an Odoo\n"
" data xml file."
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid ""
"This wizard allow you to import QWeb views\n"
" related to help online. The required file format is an Odoo\n"
" data xml file."
msgstr ""
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:332
#, python-format
msgid "Unable to write autobackup file in given directory: %s"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.view_view_search
msgid "Website Page"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.view_view_form
msgid "Website Page?"
msgstr ""
#. module: help_online
#: model:ir.actions.act_window,name:help_online.action_website_pages
#: model:ir.ui.menu,name:help_online.menu_help_pages
msgid "Website Pages"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_data
msgid "XML"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_help_online
msgid "help.online"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_import_help_wizard
msgid "import.help.wizard"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_ir_model_data
msgid "ir.model.data"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "or"
msgstr ""

177
help_online/i18n/fr.po

@ -1,72 +1,71 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * help_online
#
# * help_online
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
# leemannd <denis.leemann@camptocamp.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-14 09:06+0000\n"
"PO-Revision-Date: 2014-10-14 09:06+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"POT-Creation-Date: 2017-01-14 02:26+0000\n"
"PO-Revision-Date: 2017-01-14 02:26+0000\n"
"Last-Translator: leemannd <denis.leemann@camptocamp.com>, 2017\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: help_online
#. openerp-web
#: code:addons/help_online/static/src/js/help_online.js:83
#, python-format
msgid "Cancel"
msgstr "Annuler"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Close"
msgstr "Fermer"
#. module: help_online
#. openerp-web
#: code:addons/help_online/static/src/js/help_online.js:81
#, python-format
msgid "Confirm"
msgstr "Confirmer"
#. module: help_online
#: code:addons/help_online/models/help_online.py:60
#: code:addons/help_online/models/help_online.py:45
#, python-format
msgid "Create Help page for %s"
msgstr "Créer la page d'aide pour %s"
#. module: help_online
#: field:export.help.wizard,create_uid:0
#: field:help.online,create_uid:0
#: field:import.help.wizard,create_uid:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_create_uid
#: model:ir.model.fields,field_description:help_online.field_help_online_create_uid
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: help_online
#: field:export.help.wizard,create_date:0
#: field:help.online,create_date:0
#: field:import.help.wizard,create_date:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_create_date
#: model:ir.model.fields,field_description:help_online.field_help_online_create_date
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_create_date
msgid "Created on"
msgstr "Créé le"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_display_name
#: model:ir.model.fields,field_description:help_online.field_help_online_display_name
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid "Export"
msgstr "Export"
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:302
#: model:ir.actions.act_window,name:help_online.action_export_help_wizard
#, python-format
msgid "Export Help"
msgstr "Export des pages d'aide"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid "Export Help Data"
msgstr "Export des pages d'aide"
@ -77,7 +76,7 @@ msgid "Export Help Online"
msgstr "Export des pages d'aide"
#. module: help_online
#: field:export.help.wizard,export_filename:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_export_filename
msgid "Export XML Filename"
msgstr "Fichier XML"
@ -88,7 +87,7 @@ msgid "Help Online"
msgstr "Aide en ligne"
#. module: help_online
#: code:addons/help_online/models/help_online.py:55
#: code:addons/help_online/models/help_online.py:40
#, python-format
msgid "Help on %s"
msgstr "Aide sur %s"
@ -104,14 +103,14 @@ msgid "Help writer"
msgstr "Aide: rédacteur"
#. module: help_online
#: field:export.help.wizard,id:0
#: field:help.online,id:0
#: field:import.help.wizard,id:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_id
#: model:ir.model.fields,field_description:help_online.field_help_online_id
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_id
msgid "ID"
msgstr "ID"
#. module: help_online
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Import"
msgstr "Import"
@ -121,7 +120,7 @@ msgid "Import Help"
msgstr "Import des pages d'aide"
#. module: help_online
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Import Help Data"
msgstr "Import des pages d'aide"
@ -131,81 +130,93 @@ msgid "Import Help Online"
msgstr "Import des pages d'aide"
#. module: help_online
#: field:export.help.wizard,write_uid:0
#: field:help.online,write_uid:0
#: field:import.help.wizard,write_uid:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard___last_update
#: model:ir.model.fields,field_description:help_online.field_help_online___last_update
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard___last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_write_uid
#: model:ir.model.fields,field_description:help_online.field_help_online_write_uid
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_write_uid
msgid "Last Updated by"
msgstr "Mis à jour par"
#. module: help_online
#: field:export.help.wizard,write_date:0
#: field:help.online,write_date:0
#: field:import.help.wizard,write_date:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_write_date
#: model:ir.model.fields,field_description:help_online.field_help_online_write_date
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_write_date
msgid "Last Updated on"
msgstr "Mis à jour le"
#. module: help_online
#: code:addons/help_online/models/export_help_wizard.py:238
#: code:addons/help_online/wizards/export_help_wizard.py:295
#, python-format
msgid "No data to export !"
msgstr "Aucune page à exporter !"
#. module: help_online
#: code:addons/help_online/models/help_online.py:33
#: code:addons/help_online/models/help_online.py:17
#, python-format
msgid "No page prefix parameter specified !"
msgstr "Le paramètre spécifiant le préfixe des pages n'est pas configuré !"
#. module: help_online
#. openerp-web
#: code:addons/help_online/static/src/js/help_online.js:88
#: code:addons/help_online/wizards/export_help_wizard.py:99
#, python-format
msgid "Ok"
msgstr "Ok"
msgid "Only images from ir.attachment are supported when exporting help pages"
msgstr ""
"Seules les images provenant de ir.attachement sont supportées lors de "
"l'export de pages d'aide"
#. module: help_online
#. openerp-web
#: code:addons/help_online/static/src/js/help_online.js:107
#: code:addons/help_online/static/src/js/help_online.js:37
#, python-format
msgid "Page does not exist. Do you want to create?"
msgstr "La page n'existe pas. Voulez-vous la créer?"
#. module: help_online
#: field:import.help.wizard,source_file:0
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_source_file
msgid "Source File"
msgstr "Fichier de données"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
msgid "This wizard allow you to export all QWeb views\n"
" related to help online. The result will be an Odoo\n"
" data xml file."
msgstr "Cet assistant vous permet d'exporter toutes les vues QWeb \n"
" concernant l'aide. Le résultat sera un\n"
" fichier de données Odoo."
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid ""
"This wizard allow you to export all QWeb views\n"
" related to help online. The result will be an Odoo\n"
" data xml file."
msgstr ""
"Cette fenêtre de l'assistant permet l'export de toutes les vues QWeb\n"
"liées à l'aide en ligne. Le résultat sera sous la forme d'un fichier de données xml."
#. module: help_online
#: view:import.help.wizard:help_online.import_help_wizard_view
msgid "This wizard allow you to import QWeb views\n"
" related to help online. The required file format is an Odoo\n"
" data xml file."
msgstr "Cet assistant vous permet d'importer toutes les vues QWeb\n"
" concernant l'aide. Le format de fichier requis est un\n"
" fichier de données Odoo."
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid ""
"This wizard allow you to import QWeb views\n"
" related to help online. The required file format is an Odoo\n"
" data xml file."
msgstr ""
"Cette fenêtre de l'assistant permet l'import de toutes les vues QWeb\n"
"liées à l'aide en ligne. Le fichier doit être un fichier \n"
"de donnés au format xml"
#. module: help_online
#: code:addons/help_online/models/export_help_wizard.py:275
#: code:addons/help_online/wizards/export_help_wizard.py:332
#, python-format
msgid "Unable to write autobackup file in given directory: %s"
msgstr "Impossible d'écrire le fichier de sauvegarde dans le répertoire spécifié: %s"
msgstr ""
"Impossible d'écrire le fichier de sauvegarde dans le répertoire spécifié: %s"
#. module: help_online
#: view:ir.ui.view:help_online.view_view_search
#: model:ir.ui.view,arch_db:help_online.view_view_search
msgid "Website Page"
msgstr "Page du site"
#. module: help_online
#: view:ir.ui.view:help_online.view_view_form
#: model:ir.ui.view,arch_db:help_online.view_view_form
msgid "Website Page?"
msgstr "Page du site?"
@ -216,7 +227,27 @@ msgid "Website Pages"
msgstr "Pages du site"
#. module: help_online
#: field:export.help.wizard,data:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_data
msgid "XML"
msgstr "XML"
#. module: help_online
#: model:ir.model,name:help_online.model_help_online
msgid "help.online"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_import_help_wizard
msgid "import.help.wizard"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_ir_model_data
msgid "ir.model.data"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "or"
msgstr "ou"

168
help_online/i18n/sl.po

@ -1,53 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * help_online
#
# Matjaž Mozetič <m.mozetic@matmoz.si>, 2015.
# * help_online
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-02 10:20+0200\n"
"PO-Revision-Date: 2015-08-02 10:20+0200\n"
"Last-Translator: Matjaz Mozetic <m.mozetic@matmoz.si>\n"
"Language-Team: Slovenian <translate@matmoz.si>\n"
"Language: sl\n"
"POT-Creation-Date: 2017-01-14 02:26+0000\n"
"PO-Revision-Date: 2017-01-14 02:26+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
"X-Generator: Poedit 1.8.2\n"
"Content-Transfer-Encoding: \n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Close"
msgstr "Zaključi"
#. module: help_online
#: field:export.help.wizard,create_uid:0 field:help.online,create_uid:0
#: field:import.help.wizard,create_uid:0
#: code:addons/help_online/models/help_online.py:45
#, python-format
msgid "Create Help page for %s"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_create_uid
#: model:ir.model.fields,field_description:help_online.field_help_online_create_uid
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_create_uid
msgid "Created by"
msgstr "Ustvaril"
#. module: help_online
#: field:export.help.wizard,create_date:0 field:help.online,create_date:0
#: field:import.help.wizard,create_date:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_create_date
#: model:ir.model.fields,field_description:help_online.field_help_online_create_date
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_create_date
msgid "Created on"
msgstr "Ustvarjeno"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_display_name
#: model:ir.model.fields,field_description:help_online.field_help_online_display_name
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_display_name
msgid "Display Name"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid "Export"
msgstr "Izvoz"
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:302
#: model:ir.actions.act_window,name:help_online.action_export_help_wizard
#, python-format
msgid "Export Help"
msgstr "Izvoz navodil"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid "Export Help Data"
msgstr "Izvoz podatkov spletnih navodil"
@ -58,7 +75,7 @@ msgid "Export Help Online"
msgstr "Izvozi spletna navodila"
#. module: help_online
#: field:export.help.wizard,export_filename:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_export_filename
msgid "Export XML Filename"
msgstr "Naziv izvožene XML datoteke"
@ -68,6 +85,12 @@ msgstr "Naziv izvožene XML datoteke"
msgid "Help Online"
msgstr "Spletna navodila"
#. module: help_online
#: code:addons/help_online/models/help_online.py:40
#, python-format
msgid "Help on %s"
msgstr ""
#. module: help_online
#: model:res.groups,name:help_online.help_online_group_reader
msgid "Help reader"
@ -79,13 +102,14 @@ msgid "Help writer"
msgstr "Avtor navodil"
#. module: help_online
#: field:export.help.wizard,id:0 field:help.online,id:0
#: field:import.help.wizard,id:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_id
#: model:ir.model.fields,field_description:help_online.field_help_online_id
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_id
msgid "ID"
msgstr "ID"
#. module: help_online
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Import"
msgstr "Uvoz"
@ -95,7 +119,7 @@ msgid "Import Help"
msgstr "Uvoz navodil"
#. module: help_online
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "Import Help Data"
msgstr "Uvoz podatkov navodil"
@ -105,52 +129,85 @@ msgid "Import Help Online"
msgstr "Uvoz spletnih navodil"
#. module: help_online
#: field:export.help.wizard,write_uid:0 field:help.online,write_uid:0
#: field:import.help.wizard,write_uid:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard___last_update
#: model:ir.model.fields,field_description:help_online.field_help_online___last_update
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard___last_update
msgid "Last Modified on"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_write_uid
#: model:ir.model.fields,field_description:help_online.field_help_online_write_uid
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_write_uid
msgid "Last Updated by"
msgstr "Zadnjič posodobil"
#. module: help_online
#: field:export.help.wizard,write_date:0 field:help.online,write_date:0
#: field:import.help.wizard,write_date:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_write_date
#: model:ir.model.fields,field_description:help_online.field_help_online_write_date
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_write_date
msgid "Last Updated on"
msgstr "Zadnjič posodobljeno"
#. module: help_online
#: field:import.help.wizard,source_file:0
#: code:addons/help_online/wizards/export_help_wizard.py:295
#, python-format
msgid "No data to export !"
msgstr ""
#. module: help_online
#: code:addons/help_online/models/help_online.py:17
#, python-format
msgid "No page prefix parameter specified !"
msgstr ""
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:99
#, python-format
msgid "Only images from ir.attachment are supported when exporting help pages"
msgstr ""
#. module: help_online
#. openerp-web
#: code:addons/help_online/static/src/js/help_online.js:37
#, python-format
msgid "Page does not exist. Do you want to create?"
msgstr ""
#. module: help_online
#: model:ir.model.fields,field_description:help_online.field_import_help_wizard_source_file
msgid "Source File"
msgstr "Izvorna datoteka"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
msgid ""
"This wizard allow you to export all QWeb views\n"
" related to help online. The result will be an Odoo\n"
" data xml file."
" related to help online. The result will be an Odoo\n"
" data xml file."
msgstr ""
"Ta čarovnik omogoča izvoz vseh QWeb pogledov,\n"
" ki se tičejo spletnih navodil v Odoo\n"
" xml podatkovno datoteko."
#. module: help_online
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid ""
"This wizard allow you to import QWeb views\n"
" related to help online. The required file format is "
"an Odoo\n"
" data xml file."
" related to help online. The required file format is an Odoo\n"
" data xml file."
msgstr ""
#. module: help_online
#: code:addons/help_online/wizards/export_help_wizard.py:332
#, python-format
msgid "Unable to write autobackup file in given directory: %s"
msgstr ""
"Ta čarovnik omogoča uvoz QWeb pogledov,\n"
" ki se tičejo spletnih navodil iz Odoo\n"
" xml podatkovne datoteke."
#. module: help_online
#: view:ir.ui.view:help_online.view_view_search
#: model:ir.ui.view,arch_db:help_online.view_view_search
msgid "Website Page"
msgstr "Spletna stran"
#. module: help_online
#: view:ir.ui.view:help_online.view_view_form
#: model:ir.ui.view,arch_db:help_online.view_view_form
msgid "Website Page?"
msgstr "Spletna stran?"
@ -161,12 +218,27 @@ msgid "Website Pages"
msgstr "Spletne strani"
#. module: help_online
#: field:export.help.wizard,data:0
#: model:ir.model.fields,field_description:help_online.field_export_help_wizard_data
msgid "XML"
msgstr "XML"
#. module: help_online
#: view:export.help.wizard:help_online.export_help_wizard_view
#: view:import.help.wizard:help_online.import_help_wizard_view
#: model:ir.model,name:help_online.model_help_online
msgid "help.online"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_import_help_wizard
msgid "import.help.wizard"
msgstr ""
#. module: help_online
#: model:ir.model,name:help_online.model_ir_model_data
msgid "ir.model.data"
msgstr ""
#. module: help_online
#: model:ir.ui.view,arch_db:help_online.export_help_wizard_view
#: model:ir.ui.view,arch_db:help_online.import_help_wizard_view
msgid "or"
msgstr "ali"

24
help_online/models/__init__.py

@ -1,24 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Nemry Jonathan
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import help_online
from . import export_help_wizard
from . import import_help_wizard
from . import ir_model

33
help_online/models/help_online.py

@ -1,23 +1,7 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Laurent Mignon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import models, exceptions
from openerp.tools.translate import _
@ -34,9 +18,9 @@ class HelpOnline(models.TransientModel):
name = '%s-%s' % (page_prefix, model.replace('.', '-'))
return name
def page_exists(self, name):
website_model = self.env['website']
return website_model.page_exists(name)
def get_existing_pages(self, name, limit=None):
website = self.env['website']
return website.search_pages(needle=name, limit=limit)
def get_page_url(self, model, view_type, domain=None, context=None):
user_model = self.env['res.users']
@ -48,8 +32,9 @@ class HelpOnline(models.TransientModel):
if res:
description = res[0][1]
name = self._get_view_name(model, view_type, domain, context)
if self.page_exists(name):
url = '/page/%s' % name
pages = self.get_existing_pages(name, limit=1)
if pages:
url = pages[0]['loc']
if view_type:
url = url + '#' + view_type
title = _('Help on %s') % description

49
help_online/models/import_help_wizard.py

@ -1,49 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
# All Rights Reserved
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs.
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly advised to contact a Free Software
# Service Company.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api
from openerp.tools import convert
import base64
from cStringIO import StringIO
class ImportHelpWizard(models.TransientModel):
_name = "import.help.wizard"
source_file = fields.Binary('Source File')
@api.one
def import_help(self):
source_file = base64.decodestring(self.source_file)
convert.convert_xml_import(self.env.cr,
self._module,
StringIO(source_file),
idref=None,
mode='init',
noupdate=False,
report=None)

40
help_online/models/ir_model.py

@ -1,29 +1,13 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Cédric Pigeon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import models, api
from lxml import etree as ET
class ir_model_data(models.Model):
class IrModelData(models.Model):
_inherit = 'ir.model.data'
@api.model
@ -38,14 +22,14 @@ class ir_model_data(models.Model):
xml_str = self.manageImageReferences(values['arch'], module)
values['arch'] = xml_str
return super(ir_model_data, self)._update(model,
module,
values,
xml_id=xml_id,
store=store,
noupdate=noupdate,
mode=mode,
res_id=res_id)
return super(IrModelData, self)._update(model,
module,
values,
xml_id=xml_id,
store=store,
noupdate=noupdate,
mode=mode,
res_id=res_id)
def manageImageReferences(self, xml_str, module):
parser = ET.XMLParser(remove_blank_text=True)

32
help_online/security/help_online_groups.xml

@ -1,16 +1,16 @@
<openerp>
<data>
<record id="help_online_group_reader" model="res.groups">
<field name="name">Help reader</field>
<field name="category_id" ref="base.module_category_documentation"/>
</record>
<record id="help_online_group_writer" model="res.groups">
<field name="name">Help writer</field>
<field name="category_id" ref="base.module_category_documentation"/>
<field name="implied_ids" eval="[
(4, ref('help_online_group_reader')),
(4, ref('base.group_website_publisher')),
]"/>
</record>
</data>
</openerp>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="help_online_group_reader" model="res.groups">
<field name="name">Help reader</field>
<field name="category_id" ref="base.module_category_documentation"/>
</record>
<record id="help_online_group_writer" model="res.groups">
<field name="name">Help writer</field>
<field name="category_id" ref="base.module_category_documentation"/>
<field name="implied_ids" eval="[
(4, ref('help_online_group_reader')),
(4, ref('base.group_website_publisher')),
]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
</odoo>

60
help_online/security/help_online_rules.xml

@ -1,32 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="online_help_confidential_rule" model="ir.rule">
<field name="name">Online Help Hidden by Default</field>
<field name="model_id" ref="base.model_ir_ui_view"/>
<field name="domain_force">[
'|',
('type', '!=', 'qweb'),
('name','not like','help-%'),
]</field>
<field name="groups" eval="[(6, 0, [
ref('base.group_portal'),
ref('base.group_public'),
ref('base.group_user'),
])]"/>
<field name="perm_read" eval="1"/><field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/><field name="perm_unlink" eval="0"/>
</record>
<record id="online_help_reader_rule" model="ir.rule">
<field name="name">Online Help for Help Reader</field>
<field name="model_id" ref="base.model_ir_ui_view"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(6, 0, [
ref('help_online.help_online_group_reader'),
])]"/>
<field name="perm_read" eval="1"/><field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/><field name="perm_unlink" eval="0"/>
</record>
</data>
</openerp>
<odoo noupdate="1">
<record id="online_help_confidential_rule" model="ir.rule">
<field name="name">Online Help Hidden by Default</field>
<field name="model_id" ref="base.model_ir_ui_view"/>
<field name="domain_force">[
'|',
('type', '!=', 'qweb'),
('name','not like','help-%'),
]</field>
<field name="groups" eval="[(6, 0, [
ref('base.group_portal'),
ref('base.group_public'),
ref('base.group_user'),
])]"/>
<field name="perm_read" eval="1"/><field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/><field name="perm_unlink" eval="0"/>
</record>
<record id="online_help_reader_rule" model="ir.rule">
<field name="name">Online Help for Help Reader</field>
<field name="model_id" ref="base.model_ir_ui_view"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(6, 0, [
ref('help_online.help_online_group_reader'),
])]"/>
<field name="perm_read" eval="1"/><field name="perm_write" eval="0"/>
<field name="perm_create" eval="0"/><field name="perm_unlink" eval="0"/>
</record>
</odoo>

13
help_online/static/src/css/help_online.css

@ -1,12 +1,3 @@
li.oe_help_online_not_found {
a.o_help_online_not_found {
background-color: #df3f3f;
}
.openerp .oe_view_manager .oe_view_manager_switch .oe_list_button_help_online:after {
font-size: 28px;
content: "?";
text-align: center;
margin: 3px auto 4px;
position: relative;
display: inline-block;
}
}

175
help_online/static/src/js/help_online.js

@ -1,115 +1,86 @@
openerp.help_online = function (instance) {
var QWeb = instance.web.qweb;
var _t = instance.web._t;
var _lt = instance.web._lt;
odoo.define('oca.HelpOnline', function (require) {
"use strict";
instance.web.ListView.include({
load_list: function () {
var self = this;
var add_button = false;
if (!this.$buttons) {
add_button = true;
}
var core = require('web.core');
var QWeb = core.qweb;
var _t = core._t;
var ViewManager = require('web.ViewManager');
var ControlPanel = require('web.ControlPanel');
var Dialog = require('web.Dialog');
ControlPanel.include({
start: function(){
this._super.apply(this, arguments);
this.$buttons.on('click', '.oe_list_button_help_online', function() {
self.do_action({
type: 'ir.actions.act_url',
url: '/partner_mobile',
target: 'self',
});
});
},
});
openerp.web.TreeView.include({
view_loading: function(r) {
var ret = this._super(r);
if(! _.isUndefined(this.ViewManager.load_help_buttons)){
this.ViewManager.load_help_buttons();
}
return ret
},
});
openerp.web.ListView.include({
view_loading: function(r) {
var ret = this._super(r);
if(! _.isUndefined(this.ViewManager.load_help_buttons)){
this.ViewManager.load_help_buttons();
}
return ret
this._toggle_visibility(true);
this.nodes = _.extend(
this.nodes,
{$help_online_buttons: this.$('.o_help_online_buttons')});
this._toggle_visibility(false);
},
});
openerp.web.FormView.include({
view_loading: function(r) {
var ret = this._super(r);
if(!_.isUndefined(this.ViewManager.clean_help_buttons)){
this.ViewManager.clean_help_buttons();
}
return ret
},
do_show: function (options){
var ret = this._super(options);
if(! _.isUndefined(this.ViewManager.load_help_buttons)){
this.ViewManager.load_help_buttons();
ViewManager.include({
/**
* This function render the help button with the informations received
* from the call to the method build_url from the help_online controller
*/
render_help_button: function(url_info){
var $helpButton = $(QWeb.render("HelpOnline.Button", {'view_manager':this, 'url_info': url_info}));
$helpButton.tooltip();
if (url_info.exists === false) {
$helpButton.on('click', function (event) {
var evt = event;
evt.preventDefault();
Dialog.confirm(
self,
_t('Page does not exist. Do you want to create?'),
{confirm_callback: function() {
var form = $("<form></form>");
form.attr({
id : "formform",
// The location given in the link itself
action : evt.target.href,
method : "GET",
// Open in new window/tab
target : evt.target.target
});
$("body").append(form);
$("#formform").submit();
$("#formform").remove();
return false;
}
});
});
}
return ret
return $helpButton;
},
});
openerp.web.ViewManager.include({
clean_help_buttons:function() {
this.$el.find("div.oe_help_online_buttons").first().remove();
},
load_help_buttons:function() {
var self = this;
this.rpc('/help_online/build_url', {model: this.dataset.model, view_type: this.active_view}).then(function(result) {
self.clean_help_buttons();
/**
* This function render the help buttons container on the view.
* It should be called after start() by render_view_control_elements.
* @param {control_elements} the list of control elements to display into the ControlPanel
*/
render_help_buttons: function(control_elements){
if (! control_elements.$help_online_buttons){
control_elements.$help_online_buttons = $('<div/>');
}
var self = this;
this.rpc('/help_online/build_url', {model: this.dataset.model, view_type: this.active_view.type}).then(function(result) {
if (result && ! _.isEmpty(result)) {
self.$helpButtonsEl = $(QWeb.render("HelpOnline.Buttons", {'view_manager':self, 'url_info': result}));
self.$el.find("ul.oe_view_manager_switch.oe_button_group.oe_right").first().before(self.$helpButtonsEl);
self.$helpButtonsEl.find('a.oe_list_button_help_online').tooltip();
if (result.exists === false) {
self.$helpButtonsEl.find('li').addClass('oe_help_online_not_found')
self.$helpButtonsEl.find('a.oe_list_button_help_online').on('click', function (event) {
var evt = event;
evt.preventDefault();
var dialog = new instance.web.Dialog(this, {
title: _t('Confirm'),
buttons: [
{text: _t("Cancel"), click: function() {
this.parents('.modal').modal('hide');
return false;
}
},
{text: _t("Ok"), click: function() {
this.parents('.modal').modal('hide');
var form = $("<form></form>");
form.attr(
{
id : "formform",
// The location given in the link itself
action : evt.target.href,
method : "GET",
// Open in new window/tab
target : evt.target.target
});
$("body").append(form);
$("#formform").submit();
$("#formform").remove();
return false;
}
}
],
}, $('<div/>').text(_t('Page does not exist. Do you want to create?'))).open();
});
}
var $helpButton = self.render_help_button(result);
control_elements.$help_online_buttons = $helpButton;
// update the control panel with the new help button
self.update_control_panel({cp_content: _.extend({}, self.searchview_elements, control_elements)}, {clear: false});
}
});
},
render_view_control_elements: function() {
var control_elements = this._super.apply(this, arguments);
this.render_help_buttons(control_elements);
return control_elements;
},
});
}
});

21
help_online/static/src/js/website_help_online.editor.js

@ -1,21 +0,0 @@
(function () {
'use strict';
var website = openerp.website;
var _t = openerp._t;
website.RTE.include({
_config: function () {
// add anchor button
var config = this._super();
config.plugins = config.plugins.concat(',link');
_.each(config.toolbar, function (tb) {
if (tb.name === 'span'){
tb.items.unshift('Anchor');
}
});
return config;
},
});
})();

43
help_online/static/src/xml/help_online.xml

@ -1,13 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<templates>
<t t-name='HelpOnline.Buttons'>
<div class='oe_help_online_buttons'>
<ul class='oe_view_manager_switch oe_button_group oe_right'>
<li class='oe_i'>
<a class='oe_list_button_help_online'
t-att-title='url_info.title'
t-att-href='url_info.url' target='_blank'></a>
</li>
</ul>
<t t-name='HelpOnline.Button'>
<t t-if='url_info'>
<a t-att-class="'fa fa-question-circle btn btn-icon o_help_online_button ' + (url_info.exists? '': 'o_help_online_not_found')"
t-att-title='url_info.title' t-att-href='url_info.url'
target='_blank'></a>
</t>
</t>
<t t-name='HelpOnline.ButtonsContainer'>
<div class='hidden-xs btn-group btn-group-sm o_help_online_buttons'>
</div>
</t>
</t>
<t t-extend="ControlPanel">
<t t-jquery="div.o_cp_switch_buttons" t-operation="after">
<t t-call='HelpOnline.ButtonsContainer' />
</t>
<t t-jquery="div.oe-cp-switch-buttons" t-operation="after">
<t t-call='HelpOnline.ButtonsContainer' />
</t>
</t>
<t t-extend="X2ManyControlPanel">
<t t-jquery="div.o_cp_pager" t-operation="after">
<t t-call='HelpOnline.ButtonsContainer' />
</t>
<t t-jquery="div.oe-cp-pager" t-operation="after">
<div class="pull-right">
<t t-call='HelpOnline.ButtonsContainer' />
</div>
</t>
</t>
</templates>

30
help_online/tests/__init__.py

@ -1,27 +1,7 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import test_export_help_wizard
fast_suite = [
]
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
checks = [
test_export_help_wizard,
]
from . import test_help_online
from . import test_export_help_wizard
from . import test_import_help_wizard

100
help_online/tests/common.py

@ -0,0 +1,100 @@
# -*- coding: utf-8 -*-
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import os
import sys
from lxml import etree as ET
from openerp.tools.convert import convert_xml_import
class TestWizardCommon(object):
_data_files = ('data/help_test_data.xml',)
_module_ns = 'help_online'
def createPage(self, pageName, imgXmlId=False):
imgId = False
if imgXmlId:
imgId = self.ref(imgXmlId)
rootNode = ET.Element('t')
rootNode.attrib['name'] = pageName
rootNode.attrib['t-name'] = "website.%s" % pageName
tNode = ET.SubElement(rootNode,
't',
attrib={'t-call': 'website.layout'})
structDivNode = ET.SubElement(tNode,
'div',
attrib={'class': 'oe_structure oe_empty',
'id': 'wrap'})
sectionNode = ET.SubElement(structDivNode,
'section',
attrib={'class': 'mt16 mb16'})
containerNode = ET.SubElement(sectionNode,
'div',
attrib={'class': 'container'})
rowNode = ET.SubElement(containerNode,
'div',
attrib={'class': 'row'})
bodyDivNode = ET.SubElement(rowNode,
'div',
attrib={'class': 'col-md-12 '
'text-center mt16 mb32'})
style = "font-family: 'Helvetica Neue', Helvetica,"\
" Arial, sans-serif; color: rgb(51, 51, 51);"\
" text-align: left;"
h2Node = ET.SubElement(bodyDivNode,
'h2',
attrib={'style': style})
h2Node.text = "Test Sample Title"
if imgId:
imgDivNode = ET.SubElement(bodyDivNode,
'div',
attrib={'style': 'text-align: left;'})
src = "/website/image?field=datas&"\
"model=ir.attachment&id=%s" % str(imgId)
ET.SubElement(imgDivNode,
'img',
attrib={'class': 'img-thumbnail',
'src': src})
imgDivNode = ET.SubElement(bodyDivNode,
'div',
attrib={'style': 'text-align: left;'})
src = "/website/image/ir.attachment/%s_ccc838d/datas" % str(imgId)
ET.SubElement(imgDivNode,
'img',
attrib={'class': 'img-thumbnail',
'src': src})
imgDivNode = ET.SubElement(bodyDivNode,
'div',
attrib={'style': 'text-align: left;'})
src = "/web/image/%s" % str(imgId)
ET.SubElement(imgDivNode,
'img',
attrib={'class': 'img-thumbnail',
'src': src})
arch = ET.tostring(rootNode, encoding='utf-8', xml_declaration=False)
vals = {
'name': pageName,
'type': 'qweb',
'arch': arch,
'page': True,
}
view_id = self.env['ir.ui.view'].create(vals)
return view_id.id
def setUp(self):
super(TestWizardCommon, self).setUp()
self.pageName = False
self.imgXmlId = False
self.pageTemplate = False
# Loads the data file before
module = sys.modules[self.__class__.__module__]
base_path = os.path.dirname(module.__file__)
for path in self._data_files:
path = path.split('/')
path.insert(0, base_path)
path = os.path.join(*path)
convert_xml_import(self.cr, self._module_ns, path)

2
help_online/tests/data/help_test_data.xml

@ -75,4 +75,4 @@ YFBaQ6YYbTbt679Y0nIRIfKXS1d/8J7oqRWRGxO2b92S+NyzK2n3aAwoCf/7jpEfsQAoxU3nESI/
<field name="mimetype">image/png</field>
</record>
</data>
</openerp>
</openerp>

121
help_online/tests/test_export_help_wizard.py

@ -1,105 +1,17 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Cédric Pigeon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import base64
from lxml import etree as ET
from anybox.testing.openerp import SharedSetupTransactionCase
_logger = logging.getLogger(__name__)
class test_export_help_wizard(object):
_data_files = ('data/help_test_data.xml',)
import openerp.tests.common as common
from .common import TestWizardCommon
_module_ns = 'help_online'
def createPage(self, pageName, imgXmlId=False):
imgId = False
if imgXmlId:
imgId = self.ref('%s.%s' % (self._module_ns, imgXmlId))
rootNode = ET.Element('t')
rootNode.attrib['name'] = pageName
rootNode.attrib['t-name'] = "website.%s" % pageName
tNode = ET.SubElement(rootNode,
't',
attrib={'t-call': 'website.layout'})
structDivNode = ET.SubElement(tNode,
'div',
attrib={'class': 'oe_structure oe_empty',
'id': 'wrap'})
sectionNode = ET.SubElement(structDivNode,
'section',
attrib={'class': 'mt16 mb16'})
containerNode = ET.SubElement(sectionNode,
'div',
attrib={'class': 'container'})
rowNode = ET.SubElement(containerNode,
'div',
attrib={'class': 'row'})
bodyDivNode = ET.SubElement(rowNode,
'div',
attrib={'class': 'col-md-12 '
'text-center mt16 mb32'})
style = "font-family: 'Helvetica Neue', Helvetica,"\
" Arial, sans-serif; color: rgb(51, 51, 51);"\
" text-align: left;"
h2Node = ET.SubElement(bodyDivNode,
'h2',
attrib={'style': style})
h2Node.text = "Test Sample Title"
if imgId:
imgDivNode = ET.SubElement(bodyDivNode,
'div',
attrib={'style': 'text-align: left;'})
src = "/website/image?field=datas&"\
"model=ir.attachment&id=%s" % str(imgId)
ET.SubElement(imgDivNode,
'img',
attrib={'class': 'img-thumbnail',
'src': src})
imgDivNode = ET.SubElement(bodyDivNode,
'div',
attrib={'style': 'text-align: left;'})
src = "/website/image/ir.attachment/%s_ccc838d/datas" % str(imgId)
ET.SubElement(imgDivNode,
'img',
attrib={'class': 'img-thumbnail',
'src': src})
arch = ET.tostring(rootNode, encoding='utf-8', xml_declaration=False)
vals = {
'name': pageName,
'type': 'qweb',
'arch': arch,
'page': True,
}
view_id = self.env['ir.ui.view'].create(vals)
return view_id.id
def setUp(self):
super(test_export_help_wizard, self).setUp()
self.pageName = False
self.imgXmlId = False
self.pageTemplate = False
class TestExportHelpWizard(TestWizardCommon):
pageName = None
imgXmlId = None
def test_export_help(self):
"""
@ -123,7 +35,8 @@ class test_export_help_wizard(object):
if self.imgXmlId:
xPath = ".//record[@id='%s']" % self.imgXmlId
imgNodeList = rootXml.findall(xPath)
self.assertEqual(len(imgNodeList), 2)
self.assertEqual(len(imgNodeList), 1,
'The same image should be exported only once')
for imgElem in templateNodeList[0].iter('img'):
imgSrc = imgElem.get('src')
@ -131,7 +44,7 @@ class test_export_help_wizard(object):
self.assertIn("/ir.attachment/%s|"
% self.imgXmlId, imgSrc)
else:
self.assertIn("id=%s" % self.imgXmlId, imgSrc)
self.assertIn("/web/image/%s" % self.imgXmlId, imgSrc)
if self.pageTemplate:
xPath = ".//template[@id='website.%s_snippet']" % self.pageName
@ -140,20 +53,18 @@ class test_export_help_wizard(object):
self.assertNotIn("website.", templateNodeList[0].attrib['name'])
class test_export_help_with_image(test_export_help_wizard,
SharedSetupTransactionCase):
class TestExportHelpWithImage(TestExportHelpWizard, common.TransactionCase):
def setUp(self):
super(test_export_help_with_image, self).setUp()
super(TestExportHelpWithImage, self).setUp()
parameter_model = self.env['ir.config_parameter']
page_prefix = parameter_model.get_param('help_online_page_prefix')
self.pageName = '%stest-page' % page_prefix
self.imgXmlId = 'test_img_1'
self.imgXmlId = '%s.test_img_1' % self._module_ns
class test_export_help_template(test_export_help_wizard,
SharedSetupTransactionCase):
class TestExportHelpTemplate(TestExportHelpWizard, common.TransactionCase):
def setUp(self):
super(test_export_help_template, self).setUp()
super(TestExportHelpTemplate, self).setUp()
parameter_model = self.env['ir.config_parameter']
param = 'help_online_template_prefix'
template_prefix = parameter_model.get_param(param)

58
help_online/tests/test_help_online.py

@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import mock
import openerp.tests.common as common
from .common import TestWizardCommon
class TestHelpOnline(TestWizardCommon, common.TransactionCase):
def test_get_page_url(self):
model = 'res.partner'
help_online = self.env['help.online']
user = self.env.user
group_writer = self.env.ref('help_online.help_online_group_writer')
group_reader = self.env.ref('help_online.help_online_group_reader')
self.assertTrue(user.has_group('help_online.help_online_group_writer'))
with mock.patch('openerp.addons.website.models.website'
'.website.search_pages') as search_pages:
# The expected page dosn't exist
search_pages.return_value = []
info = help_online.get_page_url(model, 'form')
self.assertDictEqual(
{'exists': False,
'title': 'Create Help page for Partner',
'url': 'website/add/help-res-partner'}, info,
"If the user is member of help_online_group_writer "
"and the page doesn't exist, the module should return an url "
"to create the page")
# remove user of group writer.
group_writer.write({'users': [(3, self.env.user.id)]})
info = help_online.get_page_url(model, 'form')
self.assertDictEqual(
{}, info,
"If the user is not member of help_online_group_writer "
"and the page doesn't exist, the module should return an "
"empty dict")
# The expected page exists
search_pages.return_value = [{'loc': 'pages/help-res-partner'}]
self.assertTrue(
user.has_group('help_online.help_online_group_reader'))
info = help_online.get_page_url(model, 'form')
self.assertDictEqual(
{'exists': True,
'title': 'Help on Partner',
'url': 'pages/help-res-partner#form'}, info,
"If the user is member of help_online_group_reader "
"and the page exists, the module should return an url "
"to the page")
# remove user from group reader
group_reader.write({'users': [(3, self.env.user.id)]})
info = help_online.get_page_url(model, 'form')
self.assertDictEqual(
{}, info,
"If the user is not member of help_online_group_reader "
"and the page exists, the module should return an empty dict")

59
help_online/tests/test_import_help_wizard.py

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import base64
import openerp.tests.common as common
from .common import TestWizardCommon
class TestImportHelpWizard(TestWizardCommon, common.TransactionCase):
def setUp(self):
super(TestImportHelpWizard, self).setUp()
self.page_name = "export_import_help"
self.img_xml_id = '%s.test_img_1' % self._module_ns
self.img_name = self.env.ref(self.img_xml_id).name
self.ir_attchement = self.env['ir.attachment']
self.ir_ui_view = self.env['ir.ui.view']
self.export_help_wizard = self.env['export.help.wizard']
self.import_help_wizard = self.env['import.help.wizard']
def _do_check_resources(self, expected=1):
pages = self.ir_ui_view.search([('name', '=', self.page_name)])
self.assertEqual(expected, len(pages))
attachments = self.ir_attchement.search(
[('name', '=', self.img_name)])
self.assertEqual(expected, len(attachments))
def test_import_help(self):
self.createPage(pageName=self.page_name, imgXmlId=self.img_xml_id)
self._do_check_resources()
wizard = self.export_help_wizard.create({})
wizard.export_help()
xmlData = base64.decodestring(wizard.data)
self.env.ref(self.img_xml_id).unlink()
self.ir_ui_view.search([('name', '=', self.page_name)]).unlink()
self._do_check_resources(0)
wizard = self.import_help_wizard.create({
'source_file': base64.encodestring(xmlData)
})
wizard.import_help()
self._do_check_resources()
def test_import_export_help(self):
"""Check that exported data are not ducplicated by export / import
"""
self.createPage(pageName=self.page_name, imgXmlId=self.img_xml_id)
self._do_check_resources()
# export
wizard = self.export_help_wizard.create({})
wizard.export_help()
xmlData = base64.decodestring(wizard.data)
self._do_check_resources()
wizard = self.import_help_wizard.create({
'source_file': base64.encodestring(xmlData)
})
wizard.import_help()
self._do_check_resources()

52
help_online/views/export_help_wizard_view.xml

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="export_help_wizard_view">
<field name="name">export.help.wizard.view</field>
<field name="model">export.help.wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Export Help Data">
<group colspan="2">
<field name="export_filename"
invisible="1"/>
</group>
<group>
<p>
This wizard allow you to export all QWeb views
related to help online. The result will be an Odoo
data xml file.
</p>
</group>
<group>
<field name="data"
nolabel="1"
readonly="1"
filename="export_filename" />
</group>
<footer>
<span name="go-wizard" attrs="{'invisible': [('export_filename', '!=', False)]}">
<button name="export_help"
string="Export"
type="object"
icon="gtk-execute"
class="oe_highlight" />
or
</span>
<button string="Close" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_export_help_wizard">
<field name="name">Export Help</field>
<field name="res_model">export.help.wizard</field>
<field name="view_id" ref="export_help_wizard_view"/>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="type">ir.actions.act_window</field>
</record>
</data>
</openerp>

50
help_online/views/help_online_view.xml

@ -1,28 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- vim:fdn=3:
-->
<openerp>
<data>
<template id="assets_backend" name="help.online.assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/help_online/static/src/css/help_online.css" type="text/css"/>
<script type="text/javascript" src="/help_online/static/src/js/help_online.js"></script>
</xpath>
</template>
<record model="ir.actions.act_window" id="action_website_pages">
<field name="name">Website Pages</field>
<field name="res_model">ir.ui.view</field>
<field name="search_view_id" ref="view_view_search" />
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{"search_default_website":1}</field>
</record>
<menuitem id="menu_help_main" name="Help Online" groups="help_online_group_writer"/>
<menuitem id="menu_help" name="Help Online" parent="menu_help_main" sequence="90" groups="help_online_group_writer"/>
<menuitem id="menu_help_pages" name="Website Pages" parent="menu_help" sequence="10" action="action_website_pages" groups="help_online_group_writer"/>
<menuitem id="menu_help_import" name="Import Help Online" parent="menu_help" sequence="20" action="action_import_help_wizard" groups="help_online_group_writer"/>
<menuitem id="menu_help_export" name="Export Help Online" parent="menu_help" sequence="30" action="action_export_help_wizard" groups="help_online_group_writer"/>
</data>
</openerp>
<odoo>
<template id="assets_backend" name="help.online.assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/help_online/static/src/css/help_online.css" type="text/css"/>
<script type="text/javascript" src="/help_online/static/src/js/help_online.js"></script>
</xpath>
</template>
<record model="ir.actions.act_window" id="action_website_pages">
<field name="name">Website Pages</field>
<field name="res_model">ir.ui.view</field>
<field name="search_view_id" ref="view_view_search" />
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{"search_default_website":1}</field>
</record>
<menuitem id="menu_help_main" name="Help Online" groups="help_online_group_writer"/>
<menuitem id="menu_help" name="Help Online" parent="menu_help_main" sequence="90" groups="help_online_group_writer"/>
<menuitem id="menu_help_pages" name="Website Pages" parent="menu_help" sequence="10" action="action_website_pages" groups="help_online_group_writer"/>
<menuitem id="menu_help_import" name="Import Help Online" parent="menu_help" sequence="20" action="action_import_help_wizard" groups="help_online_group_writer"/>
<menuitem id="menu_help_export" name="Export Help Online" parent="menu_help" sequence="30" action="action_export_help_wizard" groups="help_online_group_writer"/>
</odoo>

46
help_online/views/import_help_wizard_view.xml

@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="import_help_wizard_view">
<field name="name">import.help.wizard.view</field>
<field name="model">import.help.wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Import Help Data">
<group>
<p>
This wizard allow you to import QWeb views
related to help online. The required file format is an Odoo
data xml file.
</p>
</group>
<group>
<field name="source_file"/>
</group>
<footer>
<span name="go-wizard" attrs="{'invisible': [('source_file', '=', False)]}">
<button name="import_help"
string="Import"
type="object"
icon="gtk-execute"
class="oe_highlight" />
or
</span>
<button string="Close" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_import_help_wizard">
<field name="name">Import Help</field>
<field name="res_model">import.help.wizard</field>
<field name="view_id" ref="import_help_wizard_view"/>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="type">ir.actions.act_window</field>
</record>
</data>
</openerp>

48
help_online/views/ir_ui_view_view.xml

@ -1,28 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="0">
<odoo>
<record id="view_view_search" model="ir.ui.view">
<field name="name">ir.ui.view search (help_online)</field>
<field name="inherit_id" ref="base.view_view_search"/>
<field name="model">ir.ui.view</field>
<field name="arch" type="xml">
<xpath expr="//filter[last()]" position="after">
<filter name="website" string="Website Page" domain="[('type', '=', 'qweb'),('page', '=', True)]"/>
</xpath>
</field>
</record>
<record id="view_view_search" model="ir.ui.view">
<field name="name">ir.ui.view search (help_online)</field>
<field name="inherit_id" ref="base.view_view_search"/>
<field name="model">ir.ui.view</field>
<field name="arch" type="xml">
<xpath expr="//filter[@string='QWeb']" position="after">
<filter name="website" string="Website Page" domain="[('type', '=', 'qweb'),('page', '=', True)]"/>
</xpath>
</field>
</record>
<record id="view_view_form" model="ir.ui.view">
<field name="name">ir.ui.view form (help_online)</field>
<field name="inherit_id" ref="base.view_view_form"/>
<field name="model">ir.ui.view</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='type']" position="after">
<field name="page" string="Website Page?" readonly="1" attrs="{'invisible': [('type', '!=', 'qweb')]}"/>
</xpath>
</field>
</record>
</data>
</openerp>
<record id="view_view_form" model="ir.ui.view">
<field name="name">ir.ui.view form (help_online)</field>
<field name="inherit_id" ref="base.view_view_form"/>
<field name="model">ir.ui.view</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='type']" position="after">
<field name="page" string="Website Page?" readonly="1" attrs="{'invisible': [('type', '!=', 'qweb')]}"/>
</xpath>
</field>
</record>
</odoo>

12
help_online/views/website_help_online.xml

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="assets_editor" inherit_id="website.assets_editor" name="Help online customization">
<xpath expr="." position="inside">
<script type="text/javascript" src="/help_online/static/src/js/website_help_online.editor.js" groups="base.group_website_publisher"></script>
</xpath>
</template>
</data>
</openerp>

6
help_online/wizards/__init__.py

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import export_help_wizard
from . import import_help_wizard

231
help_online/models/export_help_wizard.py → help_online/wizards/export_help_wizard.py

@ -1,31 +1,18 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Authors: Cédric Pigeon
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
import base64
import time
import copy
import urlparse
from werkzeug.routing import Map, Rule
from lxml import etree as ET
from openerp import models, fields, api, exceptions
from openerp.tools.translate import _
from openerp.addons.web.controllers.main import Binary
from openerp.addons.website.controllers.main import WebsiteBinary
_logger = logging.getLogger(__name__)
@ -43,94 +30,114 @@ class ExportHelpWizard(models.TransientModel):
data = fields.Binary('XML', readonly=True)
export_filename = fields.Char('Export XML Filename', size=128)
def _manage_images_on_page(self, page_node, data_node, images_reference):
binary = Binary()
websiteBinary = WebsiteBinary()
img_url_map = Map([
Rule('/web/image'),
Rule('/web/image/<string:xmlid>'),
Rule('/web/image/<string:xmlid>/<string:filename>'),
Rule('/web/image/<string:xmlid>/<int:width>x<int:height>'),
Rule('/web/image/<string:xmlid>/<int:width>x<int:height>/'
'<string:filename>'),
Rule('/web/image/<string:model>/<int:id>/<string:field>'),
Rule('/web/image/<string:model>/<int:id>/<string:field>/'
'<string:filename>'),
Rule('/web/image/<string:model>/<int:id>/<string:field>/'
'<int:width>x<int:height>'),
Rule('/web/image/<string:model>/<int:id>/<string:field>/'
'<int:width>x<int:height>/<string:filename>'),
Rule('/web/image/<int:id>'),
Rule('/web/image/<int:id>/<string:filename>'),
Rule('/web/image/<int:id>/<int:width>x<int:height>'),
Rule('/web/image/<int:id>/<int:width>x<int:height>/<string:filename>'),
Rule('/web/image/<int:id>-<string:unique>'),
Rule('/web/image/<int:id>-<string:unique>/<string:filename>'),
Rule('/web/image/<int:id>-<string:unique>/<int:width>x<int:height>'),
Rule('/web/image/<int:id>-<string:unique>/<int:width>x<int:height>'
'/<string:filename>'),
Rule('/website/image'),
Rule('/website/image/<xmlid>'),
Rule('/website/image/<xmlid>/<int:width>x<int:height>'),
Rule('/website/image/<xmlid>/<field>'),
Rule('/website/image/<xmlid>/<field>/<int:width>x<int:height>'),
Rule('/website/image/<model>/<id>/<field>'),
Rule('/website/image/<model>/<id>/<field>/<int:width>x<int:height>')
])
def _manage_images_on_page(self, page_node, data_node, exported_resources):
"""
- Extract images from page and generate a xml node
- Extract images from page and generate an xml node
- Replace db id in url with xml id
"""
def get_attach_id(images_reference,
img_model, img_src, generated_xml_id=False):
attach_id = False
if 'id=' in img_src:
id_pos = img_src.index('id=') + 3
attach_id = img_src[id_pos:]
else:
fragments = img_src.split('ir.attachment/')
attach_id, _ = fragments[1].split('_', 1)
if attach_id in images_reference:
xml_id = images_reference[attach_id]
else:
ir_data = self.env['ir.model.data'].search(
[('model', '=', img_model),
('res_id', '=', attach_id)])
xml_id = generated_xml_id
if ir_data:
xml_id = ir_data[0].name
images_reference[attach_id] = xml_id
return attach_id, xml_id
def substitute_id_by_xml_id(img_src, attach_id, xml_id):
new_src = False
if 'id=' in img_src:
new_src = img_src.replace(attach_id, xml_id)
else:
fragments = img_src.split('ir.attachment/')
_, trail = fragments[1].split('_', 1)
new_src = "/website/image/ir.attachment/%s|%s" % \
(xml_id, trail)
return new_src
i_img = 0
img_model = 'ir.attachment'
urls = self.img_url_map.bind("dummy.org", "/")
for img_elem in page_node.iter('img'):
img_src = img_elem.get('src')
if img_model in img_src:
i_img += 1
generated_xml_id = "%s_img_%s" % \
(page_node.attrib['name'], str(i_img).rjust(2, '0'))
attach_id, xml_id = get_attach_id(images_reference,
img_model,
img_src,
generated_xml_id)
new_src = substitute_id_by_xml_id(img_src, attach_id, xml_id)
if not attach_id:
continue
image = self.env[img_model].browse(int(attach_id))
if not image:
continue
parse_result = urlparse.urlparse(img_src)
path = parse_result.path
query_args = parse_result.query
if urls.test(parse_result.path, "GET"):
endpoint, kwargs = urls.match(path, "GET",
query_args=query_args)
kwargs.update(dict(urlparse.parse_qsl(query_args)))
image = None
# get the binary object
xml_id = kwargs.get('xmlid')
if xml_id:
image = self.env.ref(xml_id, False)
else:
_id = kwargs.get('id')
model = kwargs.get('model', 'ir.attachment')
if _id and model:
_id, _, unique = str(_id).partition('_')
image = self.env[model].browse(int(_id))
if (not image or
not image.exists() or
image._name != img_model):
raise exceptions.UserError(
_('Only images from ir.attachment are supported when '
'exporting help pages'))
exported_data = image.export_data(
['id',
'datas',
'datas_fname',
'name',
'res_model',
'mimetype'],
raw_data=False)['datas'][0]
xml_id = exported_data[0]
new_src = '/web/image/%s' % xml_id
img_elem.attrib['src'] = new_src
img_node = ET.SubElement(data_node,
'record',
attrib={'id': xml_id,
'model': img_model})
if xml_id in exported_resources:
continue
img_node = ET.SubElement(
data_node,
'record',
attrib={'id': xml_id,
'model': image._name})
field_node = ET.SubElement(img_node,
'field',
attrib={'name': 'datas'})
field_node.text = str(image.datas)
field_node.text = str(exported_data[1])
field_node = ET.SubElement(img_node,
'field',
attrib={'name': 'datas_fname'})
field_node.text = image.datas_fname
field_node.text = exported_data[2]
field_node = ET.SubElement(img_node,
'field',
attrib={'name': 'name'})
field_node.text = image.name
field_node.text = exported_data[3]
field_node = ET.SubElement(img_node,
'field',
attrib={'name': 'res_model'})
field_node.text = image.res_model
field_node.text = exported_data[4]
field_node = ET.SubElement(img_node,
'field',
attrib={'name': 'mimetype'})
field_node.text = image.mimetype
field_node.text = exported_data[5]
data_node.append(img_node)
exported_resources.add(xml_id)
def _clean_href_urls(self, page_node, page_prefix, template_prefix):
"""
@ -216,39 +223,67 @@ class ExportHelpWizard(models.TransientModel):
('name', 'like', '%s%%' % page_prefix),
('name', 'like', '%s%%' % template_prefix)]
view_data_list = self.env['ir.ui.view'].search_read(domain,
['arch', 'name'],
order='name')
ir_ui_views = self.env['ir.ui.view'].search(domain, order='name')
xml_to_export = ET.Element('openerp')
data_node = ET.SubElement(xml_to_export, 'data')
images_reference = {}
for view_data in view_data_list:
exported_resources = set()
for ir_ui_view in ir_ui_views:
parser = ET.XMLParser(remove_blank_text=True)
root = ET.XML(view_data['arch'], parser=parser)
root = ET.XML(ir_ui_view.arch, parser=parser)
root.tag = 'template'
template_id = root.attrib.pop('t-name')
root.attrib['name'] = view_data['name'].replace('website.', '')
root.attrib['id'] = template_id
xml_id = self._get_ir_ui_view_xml_id(
ir_ui_view, root.attrib.pop('t-name'))
root.attrib['name'] = ir_ui_view.name.replace('website.', '')
root.attrib['id'] = xml_id
root.attrib['page'] = 'True'
self._manage_images_on_page(root, data_node, images_reference)
self._manage_images_on_page(root, data_node, exported_resources)
self._clean_href_urls(root, page_prefix, template_prefix)
data_node.append(root)
if root.attrib['name'].startswith(template_prefix):
snippet = self._generate_snippet_from_template(root,
template_id,
xml_id,
template_prefix)
data_node.append(snippet)
if len(view_data_list) > 0:
if len(ir_ui_views) > 0:
return ET.tostring(xml_to_export, encoding='utf-8',
xml_declaration=True,
pretty_print=True)
else:
return False
@api.model
def _get_ir_ui_view_xml_id(self, ir_ui_view, template_name):
"""This method check if an xml_id exists for the given ir.ui.view
If no xml_id exists, a new one is created with template name as
value to ensure that the import of the generated file will update
the existing view in place of creating new copies.
"""
ir_model_data = self.sudo().env['ir.model.data']
data = ir_model_data.search([('model', '=', ir_ui_view._name),
('res_id', '=', ir_ui_view.id)])
if data:
if data[0].module:
return '%s.%s' % (data[0].module, data[0].name)
else:
return data[0].name
else:
module, name = template_name.split('.')
postfix = ir_model_data.search_count(
[('module', '=', module),
('name', 'like', name)])
if postfix:
name = '%s_%s' % (name, postfix)
ir_model_data.create({
'model': ir_ui_view._name,
'res_id': ir_ui_view.id,
'module': module,
'name': name,
})
return module + '.' + name
@api.multi
def export_help(self):
"""

50
help_online/wizards/export_help_wizard_view.xml

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="export_help_wizard_view">
<field name="name">export.help.wizard.view</field>
<field name="model">export.help.wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Export Help Data">
<group colspan="2">
<field name="export_filename"
invisible="1"/>
</group>
<group>
<p>
This wizard allow you to export all QWeb views
related to help online. The result will be an Odoo
data xml file.
</p>
</group>
<group>
<field name="data"
nolabel="1"
readonly="1"
filename="export_filename" />
</group>
<footer>
<span name="go-wizard" attrs="{'invisible': [('export_filename', '!=', False)]}">
<button name="export_help"
string="Export"
type="object"
icon="gtk-execute"
class="oe_highlight" />
or
</span>
<button string="Close" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_export_help_wizard">
<field name="name">Export Help</field>
<field name="res_model">export.help.wizard</field>
<field name="view_id" ref="export_help_wizard_view"/>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="type">ir.actions.act_window</field>
</record>
</odoo>

53
help_online/wizards/import_help_wizard.py

@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
# Copyright 2014 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import base64
from cStringIO import StringIO
from lxml import etree
import logging
import os
from openerp import api, fields, models
from openerp.tools import convert, misc
from openerp.tools.config import config
_logger = logging.getLogger(__name__)
class XmlImport(convert.xml_import):
"""Override base xml_import to be able to import record with an exported
xml_id ('__export__.XXX-XXX')
"""
def _test_xml_id(self, xml_id):
if '.' in xml_id:
module, _id = xml_id.split('.')
if module == '__export__':
return True
super(XmlImport, self)._test_xml_id(xml_id)
class ImportHelpWizard(models.TransientModel):
_name = "import.help.wizard"
source_file = fields.Binary('Source File')
@api.multi
def import_help(self):
for this in self:
xmlfile = StringIO(base64.decodestring(this.source_file))
doc = etree.parse(xmlfile)
relaxng = etree.RelaxNG(
etree.parse(
os.path.join(config['root_path'], 'import_xml.rng')))
try:
relaxng.assert_(doc)
except Exception:
_logger.info('The XML file does not fit the required schema !',
exc_info=True)
_logger.info(misc.ustr(relaxng.error_log.last_error))
raise
obj = XmlImport(self.env.cr, self._module, idref={}, mode='init',
report=None, noupdate=False, xml_filename=None)
obj.parse(doc.getroot(), mode='init')

43
help_online/wizards/import_help_wizard_view.xml

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="import_help_wizard_view">
<field name="name">import.help.wizard.view</field>
<field name="model">import.help.wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Import Help Data">
<group>
<p>
This wizard allow you to import QWeb views
related to help online. The required file format is an Odoo
data xml file.
</p>
</group>
<group>
<field name="source_file"/>
</group>
<footer>
<span name="go-wizard" attrs="{'invisible': [('source_file', '=', False)]}">
<button name="import_help"
string="Import"
type="object"
icon="gtk-execute"
class="oe_highlight" />
or
</span>
<button string="Close" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_import_help_wizard">
<field name="name">Import Help</field>
<field name="res_model">import.help.wizard</field>
<field name="view_id" ref="import_help_wizard_view"/>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="type">ir.actions.act_window</field>
</record>
</odoo>

1
setup/help_online/odoo_addons/__init__.py

@ -0,0 +1 @@
__import__('pkg_resources').declare_namespace(__name__)

1
setup/help_online/odoo_addons/help_online

@ -0,0 +1 @@
../../../help_online

6
setup/help_online/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_menu_collapsible/odoo_addons/__init__.py

@ -0,0 +1 @@
__import__('pkg_resources').declare_namespace(__name__)

1
setup/web_menu_collapsible/odoo_addons/web_menu_collapsible

@ -0,0 +1 @@
../../../web_menu_collapsible

6
setup/web_menu_collapsible/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

2
web_dialog_size/__openerp__.py

@ -29,7 +29,7 @@
dialog box to the full screen width.""",
'author': "ACSONE SA/NV, "
"Serv. Tecnol. Avanzados - Pedro M. Baeza, "
"Tecnativa, "
"Therp BV, "
"Odoo Community Association (OCA), "
"Siddharth Bhalgami",

2
web_export_view/__openerp__.py

@ -5,7 +5,7 @@
{
'name': 'Export Current View',
'version': '9.0.1.0.0',
'version': '9.0.1.0.1',
'category': 'Web',
'author': "Agile Business Group,Odoo Community Association (OCA)",
'website': 'http://www.agilebg.com',

10
web_export_view/i18n/de.po

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
"MIME-Version: 1.0\n"
@ -20,21 +20,21 @@ msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:20
#: code:addons/web_export_view/static/src/js/web_export_view.js:21
#, python-format
msgid "Export Current View"
msgstr "Aktuelle Liste exportieren"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#: code:addons/web_export_view/static/src/js/web_export_view.js:89
#, python-format
msgid "False"
msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:83
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#, python-format
msgid "True"
msgstr ""

10
web_export_view/i18n/es.po

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
@ -20,21 +20,21 @@ msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:20
#: code:addons/web_export_view/static/src/js/web_export_view.js:21
#, python-format
msgid "Export Current View"
msgstr "Exportar vista actual"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#: code:addons/web_export_view/static/src/js/web_export_view.js:89
#, python-format
msgid "False"
msgstr "Falso"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:83
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#, python-format
msgid "True"
msgstr "Verdadero"

10
web_export_view/i18n/fr.po

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
"MIME-Version: 1.0\n"
@ -20,21 +20,21 @@ msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:20
#: code:addons/web_export_view/static/src/js/web_export_view.js:21
#, python-format
msgid "Export Current View"
msgstr "Exporter la vue courante"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#: code:addons/web_export_view/static/src/js/web_export_view.js:89
#, python-format
msgid "False"
msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:83
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#, python-format
msgid "True"
msgstr ""

10
web_export_view/i18n/is.po

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"Language-Team: Icelandic (https://www.transifex.com/oca/teams/23907/is/)\n"
"MIME-Version: 1.0\n"
@ -20,21 +20,21 @@ msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:20
#: code:addons/web_export_view/static/src/js/web_export_view.js:21
#, python-format
msgid "Export Current View"
msgstr "Flytja út núverandi sýn"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#: code:addons/web_export_view/static/src/js/web_export_view.js:89
#, python-format
msgid "False"
msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:83
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#, python-format
msgid "True"
msgstr ""

10
web_export_view/i18n/nl.po

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n"
"MIME-Version: 1.0\n"
@ -20,21 +20,21 @@ msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:20
#: code:addons/web_export_view/static/src/js/web_export_view.js:21
#, python-format
msgid "Export Current View"
msgstr "Huidige lijst exporteren"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#: code:addons/web_export_view/static/src/js/web_export_view.js:89
#, python-format
msgid "False"
msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:83
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#, python-format
msgid "True"
msgstr ""

10
web_export_view/i18n/sl.po

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
"MIME-Version: 1.0\n"
@ -20,21 +20,21 @@ msgstr ""
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:20
#: code:addons/web_export_view/static/src/js/web_export_view.js:21
#, python-format
msgid "Export Current View"
msgstr "Izvoz trenutnega pogleda"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#: code:addons/web_export_view/static/src/js/web_export_view.js:89
#, python-format
msgid "False"
msgstr "Nepravilno"
#. module: web_export_view
#. openerp-web
#: code:addons/web_export_view/static/src/js/web_export_view.js:83
#: code:addons/web_export_view/static/src/js/web_export_view.js:86
#, python-format
msgid "True"
msgstr "Pravilno"

11
web_export_view/static/src/js/web_export_view.js

@ -7,6 +7,7 @@ odoo.define('web_export_view.Sidebar', function (require) {
"use strict";
var core = require('web.core');
var formats = require('web.formats');
var Sidebar = require('web.Sidebar');
var _t = core._t;
@ -75,7 +76,9 @@ Sidebar.include({
var cell = $row.find('td[data-field="' + this + '"]').get(0);
var text = cell.text || cell.textContent || cell.innerHTML || "";
if (cell.classList.contains("oe_list_field_float")) {
export_row.push(instance.web.parse_value(text, {'type': "float"}));
export_row.push(
formats.parse_value(text, {'type': "float"})
);
}
else if (cell.classList.contains("oe_list_field_boolean")) {
var data_id = $('<div>' + cell.innerHTML + '</div>');
@ -90,7 +93,10 @@ Sidebar.include({
var tmp2 = text;
do {
tmp = tmp2;
tmp2 = tmp.replace(instance.web._t.database.parameters.thousands_sep, "");
tmp2 = tmp.replace(
_t.database.parameters.thousands_sep,
""
);
} while (tmp !== tmp2);
export_row.push(parseInt(tmp2));
@ -116,4 +122,3 @@ Sidebar.include({
});
});

17
web_m2x_options/i18n/es.po

@ -4,13 +4,14 @@
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2016
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -23,14 +24,14 @@ msgstr ""
#: code:addons/web_m2x_options/static/src/js/form.js:49
#, python-format
msgid "Cancel"
msgstr ""
msgstr "Cancelar"
#. module: web_m2x_options
#. openerp-web
#: code:addons/web_m2x_options/static/src/js/form.js:35
#, python-format
msgid "Create"
msgstr ""
msgstr "Crear"
#. module: web_m2x_options
#. openerp-web
@ -45,7 +46,7 @@ msgstr "Crear \"<strong>%s</strong>\""
#: code:addons/web_m2x_options/static/src/js/form.js:32
#, python-format
msgid "Create a %s"
msgstr ""
msgstr "Crear un %s"
#. module: web_m2x_options
#. openerp-web
@ -60,7 +61,7 @@ msgstr "Crear y editar..."
#: code:addons/web_m2x_options/static/src/js/form.js:45
#, python-format
msgid "Create and edit"
msgstr ""
msgstr "Crear y editar"
#. module: web_m2x_options
#. openerp-web
@ -75,4 +76,4 @@ msgstr "Buscar más..."
#: code:addons/web_m2x_options/static/src/js/form.js:54
#, python-format
msgid "You are creating a new %s, are you sure it does not exist yet?"
msgstr ""
msgstr "Está creando un nuevo %s, ¿está seguro de no existe ya?"

2
web_m2x_options/static/src/js/form.js

@ -412,7 +412,7 @@ odoo.define('web_m2x_options.web_m2x_options', function (require) {
var open = (self.options && self.is_option_set(self.options.open));
if(open){
self.mutex.exec(function(){
var id = parseInt($(ev.handleObj.selector).attr('data-id'));
var id = parseInt($(ev.currentTarget).data('id'));
self.do_action({
type: 'ir.actions.act_window',
res_model: self.field.relation,

67
web_menu_collapsible/README.rst

@ -0,0 +1,67 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
================
Collapsible menu
================
This module makes all menus collapsible for all users.
Second level menus are collapsed by default.
.. image:: /web_menu_collapsible/static/description/menu_collapsible_1.png
:alt: In case first level menu is collapsed, click it to expand.
.. image:: /web_menu_collapsible/static/description/menu_collapsible_2.png
:alt: In case first level menu is expanded, click it to collapse.
Configuration
=============
No configuration is needed.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/162/9.0
Known issues / Roadmap
======================
* The visual hint is initially in state 'collapsed' when is actually 'expanded' (this is Odoo's menu standard mechanism).
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/162/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Dennis Sluijk <d.sluijk@onestein.nl>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
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.
To contribute to this module, please visit https://odoo-community.org.

3
web_menu_collapsible/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
# © 2016 Onestein (<http://www.onestein.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

18
web_menu_collapsible/__openerp__.py

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
# © 2016 Onestein (<http://www.onestein.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
'name': 'Collapsible menu',
'license': 'AGPL-3',
'images': [],
'summary': 'Foldable second level Odoo menu',
'author': 'Onestein,Odoo Community Association (OCA)',
'website': 'http://www.onestein.eu',
'category': 'Web',
'version': '9.0.1.0.0',
'depends': ['web'],
'data': [
'templates/menu_collapsible.xml',
],
}

BIN
web_menu_collapsible/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

BIN
web_menu_collapsible/static/description/menu_collapsible_1.png

After

Width: 214  |  Height: 446  |  Size: 34 KiB

BIN
web_menu_collapsible/static/description/menu_collapsible_2.png

After

Width: 214  |  Height: 273  |  Size: 18 KiB

43
web_menu_collapsible/static/src/css/menu_collapsible.css

@ -0,0 +1,43 @@
.oe_secondary_menu_section {
height: 26px;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.oe_secondary_menu_section.oe_menu_toggler {
margin-left: 18px;
}
.oe_secondary_submenu > li > a.oe_menu_leaf,
.oe_secondary_submenu > li > a.oe_menu_toggler {
padding-left: 27px;
}
.oe_secondary_menu_section.oe_menu_toggler::before {
width: 0;
height: 0;
display: inline-block;
content: "&darr";
text-indent: -99999px;
vertical-align: top;
margin-left: -12px;
margin-top: 4px;
margin-right: 4px;
border-top: 4px solid transparent;
border-bottom: 4px solid transparent;
border-left: 4px solid #4c4c4c;
filter: alpha(opacity=50);
opacity: 0.5;
}
.oe_secondary_menu_section.oe_menu_toggler.oe_menu_opened::before {
margin-top: 6px;
margin-left: -16px;
margin-right: 4px;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 4px solid #4c4c4c;
}

23
web_menu_collapsible/static/src/js/menu_collapsible.js

@ -0,0 +1,23 @@
odoo.define('web_menu_collapsible.Menu', function(require) {
"use strict";
var $ = require('$'),
Menu = require('web.Menu');
Menu.include({
start: function() {
var self = this;
$(".oe_secondary_submenu").hide();
$(".oe_secondary_menu_section").each(function() {
if($(this).next().hasClass('oe_secondary_submenu')) {
$(this).unbind("click");
$(this).click(self.section_clicked);
$(this).addClass('oe_menu_toggler');
}
});
return this._super.apply(this, arguments);
},
section_clicked: function() {
$(this).toggleClass('oe_menu_opened').next().toggle();
}
});
});

9
web_menu_collapsible/templates/menu_collapsible.xml

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_backend_menu_collapsible" name="assets.backend.menu.collapsible" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/web_menu_collapsible/static/src/css/menu_collapsible.css" />
<script type="text/javascript" src="/web_menu_collapsible/static/src/js/menu_collapsible.js"></script>
</xpath>
</template>
</odoo>

5
web_responsive/README.rst

@ -12,6 +12,8 @@ Features:
* New navigation with an App drawer
* Keyboard shortcuts for easier navigation
* Display kanban views for small screens format if an action or field One2x
has a kanban view
Installation
@ -52,6 +54,8 @@ this module.
* Adding ``oe_main_menu_navbar`` ID to the top navigation bar triggers some
great styles, but also `JavaScript that causes issues on mobile
<https://github.com/OCA/web/pull/446#issuecomment-254827880>`_
* The kanban view not is shown if an action window has no kanban mode view
Bug Tracker
===========
@ -75,6 +79,7 @@ Contributors
* Dave Lasley <dave@laslabs.com>
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Sergio Teruel <sergio.teruel@tecnativa.com>
Maintainer
----------

2
web_responsive/__openerp__.py

@ -6,7 +6,7 @@
"name": "Web Responsive",
"summary": "It provides a mobile compliant interface for Odoo Community "
"web",
"version": "9.0.1.0.0",
"version": "9.0.2.0.0",
"category": "Website",
"website": "https://laslabs.com/",
"author": "LasLabs, Tecnativa, Odoo Community Association (OCA)",

9
web_responsive/i18n/es.po

@ -3,13 +3,14 @@
# * web_responsive
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2016
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-23 03:40+0000\n"
"PO-Revision-Date: 2016-11-23 03:40+0000\n"
"POT-Creation-Date: 2016-12-23 02:13+0000\n"
"PO-Revision-Date: 2016-12-23 02:13+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2016\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
@ -26,12 +27,12 @@ msgstr "<span class=\"sr-only\">Mostrar/ocultar selector de aplicaciones</span>"
#. module: web_responsive
#: model:ir.ui.view,arch_db:web_responsive.webclient_bootstrap
msgid "<span class=\"sr-only\">Toggle Navigation</span>"
msgstr ""
msgstr "<span class=\"sr-only\">Mostrar/Ocultar navegación</span>"
#. module: web_responsive
#: model:ir.ui.view,arch_db:web_responsive.menu
msgid "Apps"
msgstr ""
msgstr "Aplicaciones"
#. module: web_responsive
#: model:ir.ui.view,arch_db:web_responsive.menu

9
web_responsive/static/lib/css/drawer.3.2.0.css

@ -66,6 +66,15 @@
.drawer-open .drawer-overlay {
display: block;
}
/* XXX: local patch waiting for:
https://github.com/blivesta/drawer/pull/36
*/
.drawer-open {
overflow: hidden;
}
/* end local patch */
/*!------------------------------------*\
Top
\*!------------------------------------*/

10
web_responsive/static/lib/js/drawer.3.2.0.js

@ -121,7 +121,10 @@
return $this
.removeClass(__.settings.class.close)
.addClass(__.settings.class.open)
.css({ 'overflow': 'hidden' })
// XXX: local patch waiting for:
// https://github.com/blivesta/drawer/pull/36
//.css({ 'overflow': 'hidden' })
// end local patch
.drawerCallback(function triggerOpenedListeners() {
__.settings.state = true;
$this.trigger(__.settings.events.opened);
@ -136,7 +139,10 @@
return $this
.removeClass(__.settings.class.open)
.addClass(__.settings.class.close)
.css({ 'overflow': 'auto' })
// XXX: local patch waiting for:
// https://github.com/blivesta/drawer/pull/36
//.css("overflow", "auto")
// end local patch
.drawerCallback(function triggerClosedListeners() {
__.settings.state = false;
$this.trigger(__.settings.events.closed);

26
web_responsive/static/src/js/web_responsive.js

@ -4,11 +4,13 @@
odoo.define('web_responsive', function(require) {
'use strict';
var $ = require('$');
var Menu = require('web.Menu');
var Class = require('web.Class');
var SearchView = require('web.SearchView');
var core = require('web.core');
var config = require('web.config');
var FieldOne2Many = core.form_widget_registry.get('one2many');
var ViewManager = require('web.ViewManager');
Menu.include({
@ -83,12 +85,18 @@ odoo.define('web_responsive', function(require) {
'-': this.LEFT,
};
this.initDrawer();
var $clickZones = $('.openerp_webclient_container, ' +
var $clickZones = $('.odoo_webclient_container, ' +
'a.oe_menu_leaf, ' +
'a.oe_menu_toggler, ' +
'a.oe_logo, ' +
'i.oe_logo_edit'
);
$('.o_content').scroll(function() {
$('.o_control_panel').css(
'margin-top',
-$(this).scrollTop() + 'px'
);
});
$clickZones.click($.proxy(this.handleClickZones, this));
core.bus.on('resize', this, this.handleWindowResize);
core.bus.on('keydown', this, this.handleNavKeys);
@ -287,10 +295,24 @@ odoo.define('web_responsive', function(require) {
new AppDrawer();
});
// if we are in small screen change default view to kanban if exists
ViewManager.include({
get_default_view: function() {
var default_view = this._super()
if (config.device.size_class <= config.device.SIZES.XS &&
default_view != 'kanban' &&
this.views['kanban']){
default_view = 'kanban';
};
return default_view;
},
});
return {
'AppDrawer': AppDrawer,
'SearchView': SearchView,
'Menu': Menu,
'ViewManager': ViewManager,
};
});

13
web_responsive/static/src/less/app_drawer.less

@ -11,10 +11,15 @@
border-radius: @border-radius-base;
.box-shadow(0 6px 12px rgba(0, 0, 0, .175));
background-clip: padding-box;
z-index: 10000;
.o_tooltip {
z-index: 1051;
}
.oe_logo {
img {
margin-top: -@app-drawer-navbar-padding-vertical;
margin-top: -@app-drawer-navbar-padding-vertical * 2;
height: @app-drawer-title-height;
}
.oe_logo_edit {
@ -24,7 +29,7 @@
padding: 4px;
margin: 14px 0;
display: none;
color: #eee;
color: @odoo-list-footer-bg-color;
background: rgba(37,37,37,0.9);
}
&:hover .oe_logo_edit_admin {
@ -45,7 +50,7 @@
}
.app-drawer-panel-title {
margin-top: 5px;
margin-top: 4px;
}
.app-drawer-icon-app {
@ -65,14 +70,12 @@
position: absolute;
height: @app-drawer-title-height;
width: 100%;
z-index: 9999;
}
}
.drawer-nav {
width: @app-drawer-width;
z-index: 9999;
}
.drawer--left .drawer-nav {

94
web_responsive/static/src/less/form_view.less

@ -0,0 +1,94 @@
/* Copyright 2016 Ponto Suprimentos Ltda.
* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */
.openerp .oe_formview .oe_form {
// Form must fill 100% width in any size
.oe_form_sheetbg {
padding: 16px;
.oe_form_sheet_width {
min-width: auto;
max-width: 100%;
}
@media (max-width: @screen-sm-max) {
padding: 0;
.oe_form_sheet_width {
border: none;
}
}
}
// No overflowing buttons or titles
.oe_button_box, .oe_title {
max-width: 100%;
}
@media (max-width: @screen-sm-max) {
.oe_form_field > .ui-autocomplete-input {
width: 80%;
}
.oe_form_group_row .oe_form_group_row {
margin: 0;
}
.oe_form_group, .oe_form_group_row, .oe_form_group_cell {
&, & tbody {
display: block;
margin-top: 8px;
width: 100%;
}
&.oe_group_right {
padding: 0;
}
.oe_form_group_row {
display: table;
}
.oe_form_group_cell {
margin: 0;
width: 100%;
}
.oe_form_group_cell_label {
@media (min-width: @screen-sm-min) {
display: table-cell;
min-width: 30%;
width: 30%;
}
@media (max-width: @screen-xs-max) {
border: none;
}
+ .oe_form_group_cell {
@media (min-width: @screen-sm-min) {
display: table-cell;
max-width: 70%;
width: 70%;
}
}
}
}
}
// Make image editing controls always available, instead of depending on
// resolution or hover
.oe_form_field_image > .oe_form_field_image_controls {
display: block;
opacity: 0.7;
.oe_hidden_input_file {
display: none;
}
}
// Adapt chatter widget to small viewports
.oe_chatter {
min-width: inherit;
}
}

46
web_responsive/static/src/less/main.less

@ -22,6 +22,48 @@ main {
overflow: hidden;
}
div.oe_footer {
display: none;
.navbar {
z-index: 10;
}
.o_cp_switch_buttons {
.active {
z-index: 10;
}
}
.oe_leftbar {
.oe_logo {
display: none;
}
.oe_footer {
display: none;
}
}
.o_tooltip.active {
z-index: 1051;
}
.o_web_client {
>.o_main {
overflow: auto;
> .o_main_content {
overflow: initial;
> .o_content {
overflow: initial;
}
}
}
}
// Remove z-index from CP buttons so it doesn't overlap the menu
.o_control_panel {
.btn-group > .btn.active {
z-index: initial;
}
}
.o_chat_window {
z-index: 1000;
}

187
web_responsive/static/src/less/navbar.less

@ -1,23 +1,178 @@
/* Copyright 2016 LasLabs Inc.
* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */
.main-nav {
margin-bottom: 0;
min-height: @app-drawer-navbar-height;
}
header {
margin: 0;
padding: 0;
.main-nav ul.nav > li > a {
padding: @app-drawer-navbar-padding-vertical @app-drawer-padding-horizontal;
}
> .main-nav {
display: block;
white-space: nowrap;
.navbar-systray {
white-space: nowrap;
@media (max-width: @screen-xs-max) {
position: absolute;
top: 0;
right: 56px;
}
> .oe_user_menu_placeholder > li > a {
> .oe_topbar_avatar {
border-radius: 50%;
margin-top: -8px;
max-height: 36px;
height: 36px;
width: 36px;
}
.oe_topbar_name {
position: relative;
top: -3px;
@media (max-width: @screen-xs-max) {
display: none;
}
}
.caret {
position: relative;
top: -3.5px;
}
}
> .oe_systray > li > a {
.fa {
position: relative;
top: 3px;
font-size: 16px;
}
.caret {
position: relative;
top: 0.5px;
}
}
}
.navbar-right {
float: right;
> li {
float: left;
}
@media (max-width: @screen-xs-max) {
.navbar-nav .open .dropdown-menu {
position: fixed;
top: 46px;
bottom: 0;
left: 0;
right: 0;
overflow: auto;
float: left;
background-color: @odoo-view-background-color;
border: 1px solid rgba(0, 0, 0, 0.15);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
}
}
}
.container-fluid:before, .container-fluid:after, .navbar-collapse:before, .navbar-collapse:after {
display: inline;
}
> .container-fluid {
margin: 0;
padding: 0;
@media (max-width: @screen-xs-max) {
> .navbar-collapse {
margin: 0;
padding: 0;
overflow: auto;
&.collapsing {
overflow: hidden;
}
}
}
> .navbar-header {
margin: 0;
padding: 0;
> .drawer-toggle, .navbar-toggle {
margin: 0;
padding: 0;
border: 1px solid @nav-tabs-active-link-hover-border-color;
> i.fa, div.fa {
padding: 16px 14px 15px;
}
}
}
.oe_leftbar > .oe_secondary_menus_container > .oe_secondary_menu {
ul.dropdown-menu > li.dropdown-header {
color: @odoo-view-background-color;
text-decoration: none;
background-color: @odoo-main-color-muted;
font-weight: bold;
}
@media (min-width: @screen-sm-min) {
height: @navbar-height;
}
margin: 0;
padding: 0;
> li {
@media (min-width: @screen-sm-min) {
height: @navbar-height;
}
margin: 0;
padding: 0;
&.app-name {
display: block;
padding: 7px 8px;
> .oe_menu_text {
font-size: 20px;
}
@media (min-width: @screen-sm-min) {
padding: 8.5px 12px;
}
}
> a {
margin: 0;
@media (min-width: @screen-sm-min) {
height: @navbar-height;
padding: 14px 8px;
}
}
}
}
}
.oe_topbar_avatar {
margin-top: -@app-drawer-padding-horizontal;
height: @app-drawer-navbar-height;
border-radius: 50%;
> .navbar-right.o_menu_systray {
display: inline;
margin: 0;
padding: 0;
> ul {
margin: 0;
padding: 0;
> li > a {
margin: 0;
padding: 13px 8px;
height: @navbar-height;
}
}
}
.badge {
position: absolute;
top: 3px;
right: @navbar-padding-horizontal / 2;
}
ul.nav > li > a {
padding: @app-drawer-navbar-padding-vertical @app-drawer-padding-horizontal;
}
.o_planner_systray > .progress {
margin-top: 15px;
}
}
}
a.navbar-collapse.collapse {
@media (min-width: @screen-sm) {
@media (min-width: @screen-sm-min) {
padding-bottom: @app-drawer-navbar-padding-vertical;
padding-top: @app-drawer-navbar-padding-vertical;
}
@ -26,11 +181,3 @@ a.navbar-collapse.collapse {
.dropdown-scrollable {
overflow-x: hidden;
}
@media (max-width: @screen-xs-max) {
#odooMenuBarNav[aria-expanded="false"] {
/* Hack to hide the visibly expanded mobile menu on load. */
position: absolute;
z-index: -9999;
}
}

11
web_responsive/static/src/less/variables.less

@ -5,9 +5,18 @@
@app-drawer-icon-size: 6em;
@app-drawer-icon-margin: 1em;
@app-drawer-width: 80%;
@app-drawer-title-height: @navbar-height;
@app-drawer-title-height: 54px;
// Navbar
@navbar-height: 46px;
@navbar-margin-bottom: 0;
@app-drawer-navbar-height: @navbar-height / 2;
@app-drawer-navbar-padding-vertical: @navbar-padding-vertical / 2;
@app-drawer-padding-horizontal: @navbar-padding-horizontal / 2;
// Drawer Toggle
@drawer-toggle-height: @navbar-height;
@drawer-toggle-width: @navbar-height;
// Backported from v10
@odoo-list-footer-bg-color: #eee;

2
web_responsive/tests/test_ui.py

@ -2,7 +2,7 @@
# Copyright 2016 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from openerp.tests import HttpCase
from odoo.tests import HttpCase
class TestUi(HttpCase):

5
web_responsive/views/assets.xml

@ -22,6 +22,9 @@
<link rel="stylesheet"
href="/web_responsive/static/src/less/app_drawer.less"
/>
<link rel="stylesheet"
href="/web_responsive/static/src/less/form_view.less"
/>
<link rel="stylesheet"
href="/web_responsive/static/src/less/variables.less"
/>
@ -37,7 +40,7 @@
</xpath>
</template>
<template id="qunit_suite" inherit_id="web.qunit_suite">
<xpath expr="//html/head" position="inside">
<xpath expr="//head" position="inside">
<script type="application/javascript"
src="/web_responsive/static/tests/js/web_responsive.js"
/>

44
web_responsive/views/web.xml

@ -25,7 +25,7 @@
<xpath expr="//nav[@id='oe_main_menu_navbar']" position="replace">
<t t-set="body_classname" t-value="'drawer drawer--left'" />
<t t-set="body_classname" t-value="'drawer drawer--left o_web_client'" />
<header role="banner">
<nav id="odooAppDrawer" class="app-drawer-nav drawer-nav" role="navigation">
@ -40,8 +40,7 @@
<div class="navbar-header">
<a href="#"
class="drawer-toggle navbar-collapse collapse btn btn-default app-drawer-toggle"
<a class="drawer-toggle navbar-collapse collapse btn btn-default app-drawer-toggle"
accesskey="A"
>
<span class="sr-only">Toggle App Drawer</span>
@ -73,7 +72,7 @@
</div>
<div class="collapse navbar-collapse text-center"
<div class="collapse navbar-collapse"
id="odooMenuBarNav"
data-parent="#odooMenuBarToggle"
aria-expanded="false"
@ -83,16 +82,12 @@
>
<t t-call="web.menu_secondary" />
</div>
<div class="nav navbar-nav navbar-right">
<ul class="nav navbar-nav navbar-right oe_user_menu_placeholder"
style="display: none;"
/>
<ul class="nav navbar-nav navbar-right oe_systray"
style="display: none;"
/>
</div>
</div>
</div>
<div class="nav navbar-nav navbar-right navbar-systray o_menu_systray">
<ul class="nav navbar-nav navbar-right navbar-systray-item oe_user_menu_placeholder"/>
<ul class="nav navbar-nav navbar-right navbar-systray-item oe_systray"/>
</div>
</nav>
</header>
@ -106,16 +101,20 @@
name="App Drawer - Secondary Menu"
>
<xpath expr="//a[@class='oe_logo']" position="replace" />
<xpath expr="//div[@class='oe_secondary_menus_container']/t" position="replace">
<t t-foreach="menu_data['children']" t-as="menu">
<ul class="oe_secondary_menu nav navbar-nav"
t-att-data-menu-parent="menu['id']"
style="display: none;"
>
<t t-call="web.menu_secondary_submenu" />
<ul style="display: none"
class="oe_secondary_menu nav navbar-nav"
t-att-data-menu-parent="menu['id']">
<li class="app-name">
<span class="oe_menu_text">
<t t-esc="menu['name']"/>
</span>
</li>
<li>
<t t-call="web.menu_secondary_submenu" />
</li>
</ul>
</t>
@ -140,8 +139,7 @@
</t>
</t>
<t t-if="not submenu">
<a href="#"
class="dropdown-toggle"
<a class="dropdown-toggle"
data-toggle="dropdown"
role="button"
aria-haspopup="true"
@ -215,7 +213,7 @@
<div class="panel-heading" id="appDrawerAppPanelHead">
<div class="col-xs-6">
<h4 class="app-drawer-panel-title pull-left">
<a href="#" class="app-drawer-icon-close drawer-toggle">
<a class="app-drawer-icon-close drawer-toggle">
<i class="fa fa-lg fa-chevron-left"
t-translation="off"
aria-hidden="true"
@ -244,7 +242,7 @@
</t>
</li>
<li id="menu_more_container" class="dropdown" style="display: none;">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">More <b class="caret"></b></a>
<a class="dropdown-toggle" data-toggle="dropdown">More <b class="caret"></b></a>
<ul id="menu_more" class="dropdown-menu"></ul>
</li>
</ul>

26
web_tree_dynamic_colored_field/i18n/es.po

@ -0,0 +1,26 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_tree_dynamic_colored_field
#
# Translators:
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: web_tree_dynamic_colored_field
#. openerp-web
#: code:addons/web_tree_dynamic_colored_field/static/src/xml/web_tree_dynamic_colored_field.xml:7
#, python-format
msgid "columns.fct_colorize(record, column)"
msgstr "columns.fct_colorize(record, column)"

54
web_widget_image_webcam/i18n/es.po

@ -0,0 +1,54 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_image_webcam
#
# Translators:
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:98
#, python-format
msgid "Close"
msgstr "Cerrar"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:74
#, python-format
msgid "Save & Close"
msgstr "Guardar y cerrar"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:62
#, python-format
msgid "Take Snapshot"
msgstr "Capturar instantánea"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/xml/web_widget_image_webcam.xml:8
#, python-format
msgid "WebCam"
msgstr "WebCam"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:58
#, python-format
msgid "WebCam Booth"
msgstr "Soporte de WebCam"

54
web_widget_image_webcam/i18n/fr.po

@ -0,0 +1,54 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_image_webcam
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-14 02:26+0000\n"
"PO-Revision-Date: 2017-01-14 02:26+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:98
#, python-format
msgid "Close"
msgstr "Fermer"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:74
#, python-format
msgid "Save & Close"
msgstr ""
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:62
#, python-format
msgid "Take Snapshot"
msgstr ""
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/xml/web_widget_image_webcam.xml:8
#, python-format
msgid "WebCam"
msgstr ""
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:58
#, python-format
msgid "WebCam Booth"
msgstr ""

54
web_widget_image_webcam/i18n/sl.po

@ -0,0 +1,54 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_image_webcam
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-14 02:26+0000\n"
"PO-Revision-Date: 2017-01-14 02:26+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:98
#, python-format
msgid "Close"
msgstr "Zaključi"
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:74
#, python-format
msgid "Save & Close"
msgstr ""
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:62
#, python-format
msgid "Take Snapshot"
msgstr ""
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/xml/web_widget_image_webcam.xml:8
#, python-format
msgid "WebCam"
msgstr ""
#. module: web_widget_image_webcam
#. openerp-web
#: code:addons/web_widget_image_webcam/static/src/js/webcam_widget.js:58
#, python-format
msgid "WebCam Booth"
msgstr ""

7
web_widget_x2many_2d_matrix/static/src/js/web_widget_x2many_2d_matrix.js

@ -16,6 +16,9 @@ odoo.define('web_widget_x2many_2d_matrix.widget', function (require) {
var WidgetX2Many2dMatrix = FieldOne2Many.extend({
template: 'FieldX2Many2dMatrix',
widget_class: 'oe_form_field_x2many_2d_matrix',
events: {
"change .edit": "xy_value_change",
},
// those will be filled with rows from the dataset
by_x_axis: {},
@ -144,8 +147,6 @@ odoo.define('web_widget_x2many_2d_matrix.widget', function (require) {
self.renderElement();
self.compute_totals();
self.setup_many2one_axes();
self.$el.find('.edit').on(
'change', self.proxy(self.xy_value_change));
self.effective_readonly_change();
}
});
@ -347,8 +348,6 @@ odoo.define('web_widget_x2many_2d_matrix.widget', function (require) {
start: function()
{
var self = this;
this.$el.find('.edit').on(
'change', self.proxy(this.xy_value_change));
this.compute_totals();
this.setup_many2one_axes();
this.on("change:effective_readonly",

27
web_x2many_delete_all/i18n/es.po

@ -0,0 +1,27 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_x2many_delete_all
#
# Translators:
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-05 01:38+0000\n"
"PO-Revision-Date: 2017-01-05 01:38+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: web_x2many_delete_all
#. openerp-web
#: code:addons/web_x2many_delete_all/static/src/xml/web_x2many_delete_all.xml:8
#: code:addons/web_x2many_delete_all/static/src/xml/web_x2many_delete_all.xml:13
#, python-format
msgid "Delete all"
msgstr "Eliminar todo"
Loading…
Cancel
Save