Compare commits

...

No commits in common. '11.0' and '8.0' have entirely different histories.
11.0 ... 8.0

  1. 36
      .gitignore
  2. 56
      .travis.yml
  3. 18
      README.md
  4. 89
      contact_search_form/README.rst
  5. 3
      contact_search_form/__init__.py
  6. 33
      contact_search_form/__manifest__.py
  7. 156
      contact_search_form/i18n/contact_search_form.pot
  8. 161
      contact_search_form/i18n/de.po
  9. 161
      contact_search_form/i18n/en_US.po
  10. 158
      contact_search_form/i18n/fr.po
  11. 158
      contact_search_form/i18n/it.po
  12. 3
      contact_search_form/models/__init__.py
  13. 84
      contact_search_form/models/contact_search.py
  14. 3
      contact_search_form/readme/CONFIGURE.rst
  15. 2
      contact_search_form/readme/DESCRIPTION.rst
  16. 9
      contact_search_form/readme/USAGE.rst
  17. 8
      contact_search_form/security/gdpr_security.xml
  18. 3
      contact_search_form/security/ir.model.access.csv
  19. 431
      contact_search_form/static/description/index.html
  20. 79
      contact_search_form/views/contact_search.xml
  21. 4
      oca_dependencies.txt
  22. 86
      privacy/README.rst
  23. 1
      privacy/__init__.py
  24. 28
      privacy/__manifest__.py
  25. 10
      privacy/demo/res_users.xml
  26. 206
      privacy/i18n/de.po
  27. 210
      privacy/i18n/es.po
  28. 207
      privacy/i18n/fr.po
  29. 205
      privacy/i18n/it.po
  30. 200
      privacy/i18n/privacy.pot
  31. 204
      privacy/i18n/pt.po
  32. 1
      privacy/models/__init__.py
  33. 52
      privacy/models/privacy_activity.py
  34. 2
      privacy/readme/CONFIGURATION.rst
  35. 2
      privacy/readme/CONTRIBUTORS.rst
  36. 2
      privacy/readme/DESCRIPTION.rst
  37. 6
      privacy/readme/USAGE.rst
  38. 30
      privacy/security/data_protection.xml
  39. 3
      privacy/security/ir.model.access.csv
  40. BIN
      privacy/static/description/icon.png
  41. 115
      privacy/static/description/icon.svg
  42. 432
      privacy/static/description/index.html
  43. 61
      privacy/views/data_protection_menu_view.xml
  44. 127
      privacy/views/privacy_activity_view.xml
  45. 178
      privacy_consent/README.rst
  46. 2
      privacy_consent/__init__.py
  47. 28
      privacy_consent/__manifest__.py
  48. 1
      privacy_consent/controllers/__init__.py
  49. 46
      privacy_consent/controllers/main.py
  50. 16
      privacy_consent/data/ir_actions_server.xml
  51. 18
      privacy_consent/data/ir_cron.xml
  52. 158
      privacy_consent/data/mail.xml
  53. 552
      privacy_consent/i18n/de.po
  54. 676
      privacy_consent/i18n/es.po
  55. 661
      privacy_consent/i18n/fr.po
  56. 489
      privacy_consent/i18n/privacy_consent.pot
  57. 665
      privacy_consent/i18n/pt.po
  58. 5
      privacy_consent/models/__init__.py
  59. 53
      privacy_consent/models/mail_mail.py
  60. 32
      privacy_consent/models/mail_template.py
  61. 142
      privacy_consent/models/privacy_activity.py
  62. 186
      privacy_consent/models/privacy_consent.py
  63. 31
      privacy_consent/models/res_partner.py
  64. 7
      privacy_consent/readme/CONTRIBUTORS.rst
  65. 7
      privacy_consent/readme/DESCRIPTION.rst
  66. 15
      privacy_consent/readme/INSTALL.rst
  67. 69
      privacy_consent/readme/USAGE.rst
  68. 3
      privacy_consent/security/ir.model.access.csv
  69. BIN
      privacy_consent/static/description/icon.png
  70. 525
      privacy_consent/static/description/index.html
  71. 63
      privacy_consent/templates/form.xml
  72. 1
      privacy_consent/tests/__init__.py
  73. 252
      privacy_consent/tests/test_consent.py
  74. 88
      privacy_consent/views/privacy_activity.xml
  75. 113
      privacy_consent/views/privacy_consent.xml
  76. 34
      privacy_consent/views/res_partner.xml
  77. 91
      privacy_partner_report/README.rst
  78. 2
      privacy_partner_report/__init__.py
  79. 20
      privacy_partner_report/__manifest__.py
  80. 174
      privacy_partner_report/i18n/de.po
  81. 174
      privacy_partner_report/i18n/it.po
  82. 172
      privacy_partner_report/i18n/privacy_partner_report.pot
  83. 1
      privacy_partner_report/readme/CONTRIBUTORS.rst
  84. 2
      privacy_partner_report/readme/DESCRIPTION.rst
  85. 5
      privacy_partner_report/readme/USAGE.rst
  86. 1
      privacy_partner_report/report/__init__.py
  87. 83
      privacy_partner_report/report/privacy_partner_xlsx.py
  88. BIN
      privacy_partner_report/static/description/icon.png
  89. 432
      privacy_partner_report/static/description/index.html
  90. 14
      privacy_partner_report/views/privacy_menu_view.xml
  91. 12
      privacy_partner_report/views/privacy_report.xml
  92. 1
      privacy_partner_report/wizard/__init__.py
  93. 253
      privacy_partner_report/wizard/privacy_report_partner.py
  94. 51
      privacy_partner_report/wizard/privacy_report_partner_wizard.xml
  95. 71
      privacy_right_to_be_forgotten/README.rst
  96. 4
      privacy_right_to_be_forgotten/__init__.py
  97. 20
      privacy_right_to_be_forgotten/__openerp__.py
  98. 16
      privacy_right_to_be_forgotten/data/ir_actions_act_window.xml
  99. 87
      privacy_right_to_be_forgotten/i18n/fr.po
  100. 87
      privacy_right_to_be_forgotten/i18n/privacy_right_to_be_forgotten.pot

36
.gitignore

@ -5,24 +5,6 @@ __pycache__/
# C extensions
*.so
# Distribution / packaging
.Python
env/
bin/
build/
develop-eggs/
dist/
eggs/
# Project specific
oca.cfg
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
@ -39,7 +21,6 @@ var/
*.egg-info/
.installed.cfg
*.egg
*.eggs
# Installer logs
pip-log.txt
@ -55,23 +36,10 @@ coverage.xml
# Translations
*.mo
*.pot
# Pycharm
.idea
# Eclipse
.settings
# Visual Studio cache/options directory
.vs/
# OSX Files
.DS_Store
# Django stuff:
*.log
# Mr Developer
.mr.developer.cfg
.project
@ -87,5 +55,5 @@ docs/_build/
*~
*.swp
# OCA rules
!static/lib/
# OSX Files
*.DS_Store

56
.travis.yml

@ -3,62 +3,28 @@ sudo: false
cache: pip
python:
# For branches <= 10.0, put `- "2.7.13"`
- "3.5"
- "2.7"
addons:
# By default postgresql-9.1 is installed but there is issue related:
# https://github.com/OCA/maintainer-quality-tools/issues/432#issuecomment-281580935
# Better use higher PostgreSQL version
postgresql: "9.5"
apt:
# sources:
# Search your sources alias here:
# https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json
packages:
- expect-dev # provides unbuffer utility
# Search your packages here:
# https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise
# For wkhtmltopdf, see the env section below
# Sometimes complicated website repos need Compass & SaSS:
#before_install:
# - rvm install ruby --latest
# - gem install bootstrap-sass
# - gem install compass --pre
- python-lxml # because pip installation is slow
- python-simplejson
- python-serial
- python-yaml
env:
global:
- VERSION="11.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0"
# Set this variable to some version existing as linux-generic build on
# https://github.com/wkhtmltopdf/wkhtmltopdf/releases
# if you need to install wkhtmltopdf
# - WKHTMLTOPDF_VERSION="0.12.4"
# Set the above to install a `wkhtmltopdf` version that is not the one provided
# by the `pov-wkhtmltopdf` repo.
- PHANTOMJS_VERSION="latest"
# The above line controls the PhantomJS version that is used for JS testing.
# It is not necessary to include this value unless you are altering the default.
# Use `OS` to skip the PhantomJS upgrade & use the system version instead.
- WEBSITE_REPO="1"
# Use the above line to install dependencies that are required for website repos:
# * SASS & Bootstrap-SASS
# * Compass
- VERSION="8.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0"
matrix:
- LINT_CHECK="1"
# use this to install a standalone database to export .pot files
# - MAKEPOT="1"
# add MAKEPOT="1" to a TEST line to export .pot files from
# the test database after test success
- TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
- TESTS="1" ODOO_REPO="OCA/OCB"
# either use the two lines above or the two below. Don't change the default if
# it's not necessary (it is only necessary if modules in your repository can't
# be installed in the same database. And you get a huge speed penalty in your
# tests)
# - TESTS="1.0" ODOO_REPO="odoo/odoo" UNIT_TEST="1"
# - TESTS="1.0" ODOO_REPO="OCA/OCB" UNIT_TEST="1"
- TESTS="1" ODOO_REPO="odoo/odoo"
- TESTS="1" ODOO_REPO="OCA/OCB" MAKEPOT="1"
virtualenv:
system_site_packages: true
install:
- git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools

18
README.md

@ -1,24 +1,10 @@
[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/263/11.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-data-protection-263)
[![Build Status](https://travis-ci.org/OCA/data-protection.svg?branch=11.0)](https://travis-ci.org/OCA/data-protection)
[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/263/8.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-data-protection-263)
[![Build Status](https://travis-ci.org/OCA/data-protection.svg?branch=8.0)](https://travis-ci.org/OCA/data-protection)
# Data Protection
Odoo modules for data protection (like GDPR).
[//]: # (addons)
Available addons
----------------
addon | version | maintainers | summary
--- | --- | --- | ---
[contact_search_form](contact_search_form/) | 11.0.1.0.0 | | Multiple models can be searched for specified string by DPO
[privacy](privacy/) | 11.0.1.0.0 | | Provides data privacy and protection features to comply to regulations, such as GDPR.
[privacy_consent](privacy_consent/) | 11.0.1.0.0 | | Allow people to explicitly accept or reject inclusion in some activity, GDPR compliant
[privacy_partner_report](privacy_partner_report/) | 11.0.1.0.0 | [![mreficent](https://github.com/mreficent.png?size=30px)](https://github.com/mreficent) | Show the transactions that a specific partner is involved in.
[website_contact_extend](website_contact_extend/) | 11.0.1.0.0 | | Extended Website Contact View
[//]: # (end addons)
----
OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit organization whose

89
contact_search_form/README.rst

@ -1,89 +0,0 @@
===================
Contact Search Form
===================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github
:target: https://github.com/OCA/data-protection/tree/11.0/contact_search_form
:alt: OCA/data-protection
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-contact_search_form
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/263/11.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
View containing a search function for Data Protection Officers (DPO) to look up Customer Data.
All available Odoo models can be included in the search query looking for a specified string.
**Table of contents**
.. contents::
:local:
Configuration
=============
To access contact search view in contacts view, the user has to activate the 'Data Protection Officer' checkbox
in User -> Technical Settings.
After that a new menu item 'Contact Search' will appear in the Contacts App.
Usage
=====
The new menu Contact Search is located in the Contacts App
When accessing the Contact Search form a new query can be defined by
clicking on the Create button.
To perform a search the search string is required and the Odoo models that
should be searched have to be selected in the dropdown 'Search in model'.
The search results are stored and can be accessed at a later time from the
tree view of 'Contact Search'.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/data-protection/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 <https://github.com/OCA/data-protection/issues/new?body=module:%20contact_search_form%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* IT IS AG
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/data-protection <https://github.com/OCA/data-protection/tree/11.0/contact_search_form>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

3
contact_search_form/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models

33
contact_search_form/__manifest__.py

@ -1,33 +0,0 @@
#####################################################################
#
# IT IS AG, software solutions: http://www.itis.de
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
#
#####################################################################
{
'name': 'Contact Search Form',
'summary': "Multiple models can be searched for specified string by DPO",
'author': 'IT IS AG, Odoo Community Association (OCA)',
'website': 'https://github.com/OCA/data-protection',
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/
# openerp/addons/base/module/module_data.xml
# for the full list
'version': '11.0.1.0.0',
'license': 'AGPL-3',
'category': 'Contacts',
'depends': ['base',
'contacts',
],
'data': [
'security/gdpr_security.xml',
'security/ir.model.access.csv',
'views/contact_search.xml',
],
}

156
contact_search_form/i18n/contact_search_form.pot

@ -1,156 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * contact_search_form
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: contact_search_form
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info_base
msgid "Contact Search"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_uid
msgid "Created by"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_date
msgid "Created on"
msgstr ""
#. module: contact_search_form
#: model:ir.actions.act_window,name:contact_search_form.action_dpo_view_itis
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Customer Info"
msgstr ""
#. module: contact_search_form
#: model:res.groups,name:contact_search_form.group_dpo
msgid "Data Protection Officer"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_display_name
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_display_name
msgid "Display Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_field_list
msgid "Fields Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_model_id
msgid "Found in Model"
msgstr ""
#. module: contact_search_form
#: code:addons/contact_search_form/models/contact_search.py:20
#, python-format
msgid "Found record"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_id
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_id
msgid "ID"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view___last_update
#: model:ir.model.fields,field_description:contact_search_form.field_search_line___last_update
msgid "Last Modified on"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_uid
msgid "Last Updated by"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_date
msgid "Last Updated on"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_name
msgid "Model Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_id
msgid "Record ID"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_name
msgid "Record Name"
msgstr ""
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "SEARCH"
msgstr ""
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.dpo_view_tree
msgid "Search Contact"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_search_lines
msgid "Search Result"
msgstr ""
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "Search Results"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_name
msgid "Search Term"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_search_id
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Search Terms"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_model_ids
msgid "Search in Model"
msgstr ""
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "VIEW RECORD"
msgstr ""
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_dpo_view
msgid "dpo.view"
msgstr ""
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_search_line
msgid "search.line"
msgstr ""

161
contact_search_form/i18n/de.po

@ -1,161 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * contact_search_form
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-02 12:16+0000\n"
"PO-Revision-Date: 2018-07-02 14:16+0100\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"
#. module: contact_search_form
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info_base
msgid "Contact Search"
msgstr "Kontakt Suche"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_uid
msgid "Created by"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_date
msgid "Created on"
msgstr ""
#. module: contact_search_form
#: model:ir.actions.act_window,name:contact_search_form.action_dpo_view_itis
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Customer Info"
msgstr "Kundeninformation"
#. module: contact_search_form
#: model:res.groups,name:contact_search_form.group_dpo
msgid "Data Protection Officer"
msgstr "Data Protection Officer"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_display_name
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_display_name
msgid "Display Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_field_list
msgid "Fields Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_model_id
msgid "Found in Model"
msgstr ""
#. module: contact_search_form
#: code:addons/contact_search_form/models/contact_search.py:20
#, python-format
msgid "Found record"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_id
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_id
msgid "ID"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view___last_update
#: model:ir.model.fields,field_description:contact_search_form.field_search_line___last_update
msgid "Last Modified on"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_uid
msgid "Last Updated by"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_date
msgid "Last Updated on"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_name
msgid "Model Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_id
msgid "Record ID"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_name
msgid "Record Name"
msgstr ""
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "SEARCH"
msgstr "Suche"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.dpo_view_tree
msgid "Search Contact"
msgstr "Kontakt Suchen"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_search_lines
#, fuzzy
msgid "Search Result"
msgstr "Suchergebnisse"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "Search Results"
msgstr "Suchergebnisse"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_name
#, fuzzy
msgid "Search Term"
msgstr "Suchbegriffe"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_search_id
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Search Terms"
msgstr "Suchbegriffe"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_model_ids
#, fuzzy
msgid "Search in Model"
msgstr "Suchergebnisse"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "VIEW RECORD"
msgstr "VIEW RECORD"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_dpo_view
msgid "dpo.view"
msgstr "dpo.view"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_search_line
msgid "search.line"
msgstr "search.line"

161
contact_search_form/i18n/en_US.po

@ -1,161 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * contact_search_form
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-02 12:15+0000\n"
"PO-Revision-Date: 2018-07-02 12:15+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: contact_search_form
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info_base
msgid "Contact Search"
msgstr "Contact Search"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_uid
msgid "Created by"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_date
msgid "Created on"
msgstr ""
#. module: contact_search_form
#: model:ir.actions.act_window,name:contact_search_form.action_dpo_view_itis
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Customer Info"
msgstr "Customer Info"
#. module: contact_search_form
#: model:res.groups,name:contact_search_form.group_dpo
msgid "Data Protection Officer"
msgstr "Data Protection Officer"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_display_name
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_display_name
msgid "Display Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_field_list
msgid "Fields Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_model_id
msgid "Found in Model"
msgstr ""
#. module: contact_search_form
#: code:addons/contact_search_form/models/contact_search.py:20
#, python-format
msgid "Found record"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_id
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_id
msgid "ID"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view___last_update
#: model:ir.model.fields,field_description:contact_search_form.field_search_line___last_update
msgid "Last Modified on"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_uid
msgid "Last Updated by"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_date
msgid "Last Updated on"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_name
msgid "Model Name"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_id
msgid "Record ID"
msgstr ""
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_name
msgid "Record Name"
msgstr ""
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "SEARCH"
msgstr "SEARCH"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.dpo_view_tree
msgid "Search Contact"
msgstr "Search Contact"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_search_lines
#, fuzzy
msgid "Search Result"
msgstr "Search Results"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "Search Results"
msgstr "Search Results"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_name
#, fuzzy
msgid "Search Term"
msgstr "Search Terms"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_search_id
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Search Terms"
msgstr "Search Terms"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_model_ids
#, fuzzy
msgid "Search in Model"
msgstr "Search Results"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "VIEW RECORD"
msgstr "VIEW RECORD"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_dpo_view
msgid "dpo.view"
msgstr "dpo.view"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_search_line
msgid "search.line"
msgstr "search.line"

158
contact_search_form/i18n/fr.po

@ -1,158 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * contact_search_form
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-01-27 16:03+0000\n"
"Last-Translator: Nicolas JEUDY <njeudy@panda-chi.io>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.4\n"
#. module: contact_search_form
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info_base
msgid "Contact Search"
msgstr "Rechercher un contact"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_date
msgid "Created on"
msgstr "Crée le"
#. module: contact_search_form
#: model:ir.actions.act_window,name:contact_search_form.action_dpo_view_itis
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Customer Info"
msgstr "Infos client"
#. module: contact_search_form
#: model:res.groups,name:contact_search_form.group_dpo
msgid "Data Protection Officer"
msgstr "Délégué à la protection des données"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_display_name
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_display_name
msgid "Display Name"
msgstr "Nom d'affichage"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_field_list
msgid "Fields Name"
msgstr "Nom des champs"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_model_id
msgid "Found in Model"
msgstr "Trouvé dans le modèle"
#. module: contact_search_form
#: code:addons/contact_search_form/models/contact_search.py:20
#, python-format
msgid "Found record"
msgstr "Enregistrement trouvé"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_id
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_id
msgid "ID"
msgstr "ID"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view___last_update
#: model:ir.model.fields,field_description:contact_search_form.field_search_line___last_update
msgid "Last Modified on"
msgstr "Modifié le"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_uid
msgid "Last Updated by"
msgstr "Mis à jour par"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_date
msgid "Last Updated on"
msgstr "Mis à jour le"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_name
msgid "Model Name"
msgstr "Nom du Modèle"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_id
msgid "Record ID"
msgstr "ID de l'enregistrement"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_name
msgid "Record Name"
msgstr "Nom de l'enregistrement"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "SEARCH"
msgstr "RECHERCHER"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.dpo_view_tree
msgid "Search Contact"
msgstr "Rechercher un Contact"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_search_lines
msgid "Search Result"
msgstr "Résultat de la recherche"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "Search Results"
msgstr "Résultats de la recherche"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_name
msgid "Search Term"
msgstr "Critère de recherche"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_search_id
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Search Terms"
msgstr "Critères de recherche"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_model_ids
msgid "Search in Model"
msgstr "Rechercher dans un Modèle"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "VIEW RECORD"
msgstr "Voir l'enregistrement"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_dpo_view
msgid "dpo.view"
msgstr "dpo.view"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_search_line
msgid "search.line"
msgstr "search.line"

158
contact_search_form/i18n/it.po

@ -1,158 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * contact_search_form
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-03-20 12:14+0000\n"
"Last-Translator: Sergio Zanchetta <primes2h@gmail.com>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5.1\n"
#. module: contact_search_form
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info
#: model:ir.ui.menu,name:contact_search_form.menu_customer_info_base
msgid "Contact Search"
msgstr "Ricerca contatto"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_uid
msgid "Created by"
msgstr "Creato da"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_create_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_create_date
msgid "Created on"
msgstr "Creato il"
#. module: contact_search_form
#: model:ir.actions.act_window,name:contact_search_form.action_dpo_view_itis
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Customer Info"
msgstr "Informazioni cliente"
#. module: contact_search_form
#: model:res.groups,name:contact_search_form.group_dpo
msgid "Data Protection Officer"
msgstr "Responsabile protezione dati (DPO)"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_display_name
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_field_list
msgid "Fields Name"
msgstr "Nome campi"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_model_id
msgid "Found in Model"
msgstr "Trovato nel modello"
#. module: contact_search_form
#: code:addons/contact_search_form/models/contact_search.py:20
#, python-format
msgid "Found record"
msgstr "Trovato record"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_id
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_id
msgid "ID"
msgstr "ID"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view___last_update
#: model:ir.model.fields,field_description:contact_search_form.field_search_line___last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_uid
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_write_date
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_name
msgid "Model Name"
msgstr "Nome modello"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_id
msgid "Record ID"
msgstr "ID record"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_record_name
msgid "Record Name"
msgstr "Nome record"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "SEARCH"
msgstr "RICERCA"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.dpo_view_tree
msgid "Search Contact"
msgstr "Ricerca contatto"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_search_lines
msgid "Search Result"
msgstr "Risultato ricerca"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "Search Results"
msgstr "Risultati ricerca"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_name
msgid "Search Term"
msgstr "Termine di ricerca"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_search_line_search_id
#: model:ir.ui.view,arch_db:contact_search_form.view_dpo_form_view_itis
msgid "Search Terms"
msgstr "Termini di ricerca"
#. module: contact_search_form
#: model:ir.model.fields,field_description:contact_search_form.field_dpo_view_model_ids
msgid "Search in Model"
msgstr "Ricerca nel modello"
#. module: contact_search_form
#: model:ir.ui.view,arch_db:contact_search_form.search_line_tree_view_itis
msgid "VIEW RECORD"
msgstr ""
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_dpo_view
msgid "dpo.view"
msgstr "dpo.view"
#. module: contact_search_form
#: model:ir.model,name:contact_search_form.model_search_line
msgid "search.line"
msgstr "search.line"

3
contact_search_form/models/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import contact_search

84
contact_search_form/models/contact_search.py

@ -1,84 +0,0 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models, _
class SearchLine(models.Model):
_name = "search.line"
name = fields.Char(string="Model Name")
field_list = fields.Char(string="Fields Name")
model_id = fields.Many2one('ir.model', string="Found in Model")
record_id = fields.Integer(string="Record ID")
search_id = fields.Many2one("dpo.view", string="Search Terms")
record_name = fields.Char(string="Record Name",
compute="_compute_record_name")
@api.multi
def open_record(self):
return {
'name': _('Found record'),
'view_type': 'form',
'view_mode': 'form',
'res_model': self.model_id.model,
'type': 'ir.actions.act_window',
'res_id': self.record_id,
'target': 'new'
}
def _compute_record_name(self):
for record in self:
record_object = self.env[self.model_id.model].browse([
self.record_id
])
record.record_name = record_object.name_get()[0][1]
class DpoView(models.Model):
_name = "dpo.view"
name = fields.Char(string="Search Term")
model_ids = fields.Many2many('ir.model',
'dpo_view_ir_model_rel',
string='Search in Model')
search_lines = fields.One2many('search.line',
'search_id',
string='Search Result')
@api.multi
def search_string(self):
search_line_ids = self.env['search.line'].search([
('search_id', '=', self.id)
])
search_line_ids.unlink()
final_list = []
for model_id in self.model_ids:
field_list = []
found_match = {}
for field_id in model_id.field_id:
if field_id.ttype in ['char', 'html', 'text'] \
and field_id.store:
field_list.append(field_id.name)
for field in field_list:
records = self.env[model_id.model].search([
(field, 'ilike', self.name),
(field, '!=', '')
])
for rec in records:
temp_list = found_match.get(rec.id, False)
if temp_list:
temp_list.append(field)
found_match[rec.id] = temp_list
else:
found_match[rec.id] = [field]
for key, value in found_match.items():
founded_json = {}
founded_json["field_list"] = str(list(set(value)))
founded_json["name"] = str(model_id.name)
founded_json["model_id"] = model_id.id
founded_json["search_id"] = self.id
founded_json["record_id"] = key
final_list.append(founded_json)
if final_list:
for vals in final_list:
self.env['search.line'].create(vals)

3
contact_search_form/readme/CONFIGURE.rst

@ -1,3 +0,0 @@
To access contact search view in contacts view, the user has to activate the 'Data Protection Officer' checkbox
in User -> Technical Settings.
After that a new menu item 'Contact Search' will appear in the Contacts App.

2
contact_search_form/readme/DESCRIPTION.rst

@ -1,2 +0,0 @@
View containing a search function for Data Protection Officers (DPO) to look up Customer Data.
All available Odoo models can be included in the search query looking for a specified string.

9
contact_search_form/readme/USAGE.rst

@ -1,9 +0,0 @@
The new menu Contact Search is located in the Contacts App
When accessing the Contact Search form a new query can be defined by
clicking on the Create button.
To perform a search the search string is required and the Odoo models that
should be searched have to be selected in the dropdown 'Search in model'.
The search results are stored and can be accessed at a later time from the
tree view of 'Contact Search'.

8
contact_search_form/security/gdpr_security.xml

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="group_dpo" model="res.groups">
<field name="name">Data Protection Officer</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
</odoo>

3
contact_search_form/security/ir.model.access.csv

@ -1,3 +0,0 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
access_dpo_view,access_dpo_view,model_dpo_view,group_dpo,1,1,1,1
access_search_line,access_search_line,model_search_line,group_dpo,1,1,1,1

431
contact_search_form/static/description/index.html

@ -1,431 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Contact Search Form</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="contact-search-form">
<h1 class="title">Contact Search Form</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/contact_search_form"><img alt="OCA/data-protection" src="https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-contact_search_form"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/263/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>View containing a search function for Data Protection Officers (DPO) to look up Customer Data.
All available Odoo models can be included in the search query looking for a specified string.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>To access contact search view in contacts view, the user has to activate the ‘Data Protection Officer’ checkbox
in User -&gt; Technical Settings.
After that a new menu item ‘Contact Search’ will appear in the Contacts App.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>The new menu Contact Search is located in the Contacts App</p>
<p>When accessing the Contact Search form a new query can be defined by
clicking on the Create button.
To perform a search the search string is required and the Odoo models that
should be searched have to be selected in the dropdown ‘Search in model’.</p>
<p>The search results are stored and can be accessed at a later time from the
tree view of ‘Contact Search’.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/data-protection/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/data-protection/issues/new?body=module:%20contact_search_form%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>IT IS AG</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/contact_search_form">OCA/data-protection</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

79
contact_search_form/views/contact_search.xml

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_dpo_form_view_itis" model="ir.ui.view">
<field name="name">view.dpo.form.view.itis</field>
<field name="model">dpo.view</field>
<field name="arch" type="xml">
<form string="Customer Info">
<div class="oe_title">
<h1>
<field name="name" default_focus="1" placeholder="Search Terms" required="1"/>
</h1>
</div>
<group>
<field name="model_ids" widget="many2many_tags"/>
</group>
<br/>
<br/>
<center>
<button name="search_string" type="object" string="SEARCH" class="btn-primary"/>
</center>
<br/>
<field name="search_lines"/>
</form>
</field>
</record>
<record id="dpo_view_tree" model="ir.ui.view">
<field name="name">DPO Tree view</field>
<field name="model">dpo.view</field>
<field name="priority">1</field>
<field name="arch" type="xml">
<tree string="Search Contact">
<field name='name'/>
<field name="model_ids"/>
<field name="search_lines"/>
</tree>
</field>
</record>
<record id="action_dpo_view_itis" model="ir.actions.act_window">
<field name="name">Customer Info</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dpo.view</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="dpo_view_tree"/>
<field name="view_type">form</field>
</record>
<menuitem id="menu_customer_info_base"
name="Contact Search"
parent="contacts.menu_contacts"
sequence="20"
groups="contact_search_form.group_dpo"/>
<menuitem id="menu_customer_info"
name="Contact Search"
action="action_dpo_view_itis"
parent="menu_customer_info_base"
sequence="21"
groups="contact_search_form.group_dpo"/>
<record id="search_line_tree_view_itis" model="ir.ui.view">
<field name="name">search.line.tree.view.itis</field>
<field name="model">search.line</field>
<field name="arch" type="xml">
<tree string="Search Results" create="false" delete="false" edit="false">
<field name="model_id"/>
<field name="record_id"/>
<field name="record_name"/>
<field name="field_list"/>
<button name="open_record" type="object" string="VIEW RECORD" class="btn-primary"/>
</tree>
</field>
</record>
</odoo>

4
oca_dependencies.txt

@ -1,4 +0,0 @@
# List the OCA project dependencies, one per line
# Add a repository url and branch if you need a forked version
#
reporting-engine

86
privacy/README.rst

@ -1,86 +0,0 @@
===========================
Data Privacy and Protection
===========================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github
:target: https://github.com/OCA/data-protection/tree/11.0/privacy
:alt: OCA/data-protection
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-privacy
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/263/11.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This application provides data protection and privacy feature,
to comply with regulations such as GDPR.
**Table of contents**
.. contents::
:local:
Usage
=====
To define data processing activities:
#. Go to *Privacy > Master Data > Activities* and create one.
#. Define the data processing activity using the provided tools.
Consult your lawyer!
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/data-protection/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 <https://github.com/OCA/data-protection/issues/new?body=module:%20privacy%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Eficent
* Tecnativa
Contributors
~~~~~~~~~~~~
* Miquel Raïch <miquel.raich@eficent.com>
* Daniel Reis <dreis.pt@hotmail.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/data-protection <https://github.com/OCA/data-protection/tree/11.0/privacy>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
privacy/__init__.py

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

28
privacy/__manifest__.py

@ -1,28 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
'name': 'Data Privacy and Protection',
'version': '11.0.1.0.0',
'category': 'Data Protection',
'summary': 'Provides data privacy and protection features '
'to comply to regulations, such as GDPR.',
'author': "Eficent, "
"Tecnativa, "
"Odoo Community Association (OCA)",
'website': 'http://www.github.com/OCA/data-protection',
'license': 'AGPL-3',
'data': [
'security/data_protection.xml',
'security/ir.model.access.csv',
'views/data_protection_menu_view.xml',
'views/privacy_activity_view.xml',
],
'demo': [
'demo/res_users.xml',
],
'depends': [
'mail',
],
'installable': True,
'application': True,
}

10
privacy/demo/res_users.xml

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record id="base.user_demo" model="res.users">
<field name="groups_id" eval="[(4, ref('group_data_protection_user'))]"/>
</record>
</data>

206
privacy/i18n/de.po

@ -1,206 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-07-31 14:44+0000\n"
"Last-Translator: Malin Kienke <malin.kienke@initos.com>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.7.1\n"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_active
msgid "Active"
msgstr "Aktiv"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.activity_action
#: model:ir.ui.menu,name:privacy.menu_privacy_activity
msgid "Activities"
msgstr "Tätigkeiten"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Archived"
msgstr "Archiviert"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_find
msgid "Are affected subjects present in this database?"
msgstr "Sind betroffene Personen in der Datenbank enthalten?"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Click to add a data processing activity."
msgstr "Klicken Sie hier, um eine Verarbeitungstätigkeit hinzuzufügen."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_controller_id
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Controller"
msgstr "Verantwortlicher"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: privacy
#: model:ir.module.category,name:privacy.module_category_data_protection
msgid "Data Protection"
msgstr "Datenschutz"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_manager
msgid "Data Protection Manager"
msgstr "Datenschutzbeauftragter"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_config
msgid "Data Protection Settings"
msgstr "Datenschutzeinstellungen"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_user
msgid "Data Protection User"
msgstr ""
#. module: privacy
#: model:ir.model,name:privacy.model_privacy_activity
msgid "Data processing activities"
msgstr "Verarbeitungstätigkeiten"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Data processing activities define why, how and what you do\n"
" with subjects' personal data."
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_find
msgid "Define subjects"
msgstr "Zuordnung betroffener Personen"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_description
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Description"
msgstr "Beschreibung"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Details"
msgstr "Details"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Group By"
msgstr "Gruppieren nach"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_description
msgid "How is personal data used here? Why? Etc."
msgstr "Wie werden hier personenbezogene Daten verwendet? Warum? Etc."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_id
msgid "ID"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity___last_update
msgid "Last Modified on"
msgstr "Letzte Änderung am"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert von"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_master_data
msgid "Master Data"
msgstr "Stammdaten"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_name
msgid "Name"
msgstr "Bezeichnung"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_partner_form
#: model:ir.ui.menu,name:privacy.menu_data_protection_partner
msgid "Partners"
msgstr "Partner"
#. module: privacy
#: model:ir.ui.menu,name:privacy.parent_menu_data_protection
msgid "Privacy"
msgstr "Datenschutz"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_processor_ids
msgid "Processors"
msgstr "Auftragsverarbeiter"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_report
msgid "Reports"
msgstr "Berichte"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_domain
msgid "Selection filter to find specific subjects included."
msgstr "Auswahlfilter, um bestimmte betroffene Personen auszuwählen."
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_setting
msgid "Settings"
msgstr "Einstellungen"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_domain
msgid "Subjects filter"
msgstr ""
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_transaction
msgid "Transactions"
msgstr "Vorgänge"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_controller_id
msgid "Whoever determines the purposes and means of the processing of personal data."
msgstr ""
"Die Stelle, welche über die Zwecke und Mittel der Verarbeitung von "
"personenbezogenen Daten entscheidet."
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_processor_ids
msgid "Whoever processes personal data on behalf of the controller."
msgstr ""
"Die Stelle, die personenbezogene Daten im Auftrag des Verantwortlichen "
"verarbeitet."

210
privacy/i18n/es.po

@ -1,210 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-11 08:39+0000\n"
"PO-Revision-Date: 2019-02-04 14:50+0000\n"
"Last-Translator: Marta Vázquez Rodríguez <vazrodmar@gmail.com>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.4\n"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_active
msgid "Active"
msgstr "Activa"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.activity_action
#: model:ir.ui.menu,name:privacy.menu_privacy_activity
msgid "Activities"
msgstr "Actividades"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Archived"
msgstr "Archivada"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_find
msgid "Are affected subjects present in this database?"
msgstr "¿Los sujetos interesados se encuentran en esta base de datos?"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Click to add a data processing activity."
msgstr "Pulse para añadir una actividad de tratamiento de datos."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_controller_id
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Controller"
msgstr "Responsable"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_uid
msgid "Created by"
msgstr "Creado por"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_date
msgid "Created on"
msgstr "Creado el"
#. module: privacy
#: model:ir.module.category,name:privacy.module_category_data_protection
msgid "Data Protection"
msgstr "Protección de datos"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_manager
msgid "Data Protection Manager"
msgstr "Gestor de protección de datos"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_config
msgid "Data Protection Settings"
msgstr "Usuario de protección de datos"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_user
msgid "Data Protection User"
msgstr "Usuario de protección de datos"
#. module: privacy
#: model:ir.model,name:privacy.model_privacy_activity
msgid "Data processing activities"
msgstr "Actividades de tratamiento de datos"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid ""
"Data processing activities define why, how and what you do\n"
" with subjects' personal data."
msgstr ""
"Las actividades de tratamiento definen por qué, cómo y qué se hace\n"
"\t\tcon los datos personales de los interesados."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_find
msgid "Define subjects"
msgstr "Definir interesados"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_description
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Description"
msgstr "Descripción"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Details"
msgstr "Detalles"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Group By"
msgstr "Agrupar por"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_description
msgid "How is personal data used here? Why? Etc."
msgstr "¿Cómo se usan los datos personales aquí? ¿Por qué? Etc."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_id
msgid "ID"
msgstr "ID"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity___last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_master_data
msgid "Master Data"
msgstr "Datos maestros"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_name
msgid "Name"
msgstr "Nombre"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_partner_form
#: model:ir.ui.menu,name:privacy.menu_data_protection_partner
msgid "Partners"
msgstr "Contactos"
#. module: privacy
#: model:ir.ui.menu,name:privacy.parent_menu_data_protection
msgid "Privacy"
msgstr "Privacidad"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_processor_ids
msgid "Processors"
msgstr "Encargados del tratamiento"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_report
msgid "Reports"
msgstr "Informes"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_domain
msgid "Selection filter to find specific subjects included."
msgstr ""
"Filtro de selección para encontrar los interesados específicos incluidos."
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_setting
msgid "Settings"
msgstr "Configuración"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_domain
msgid "Subjects filter"
msgstr "Filtro de interesados"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_transaction
msgid "Transactions"
msgstr "Transacciones"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_controller_id
msgid ""
"Whoever determines the purposes and means of the processing of personal data."
msgstr ""
"Quien determina los propósitos y medios del procesamiento de datos "
"personales."
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_processor_ids
msgid "Whoever processes personal data on behalf of the controller."
msgstr "Quien procesa los datos personales en nombre del responsable."

207
privacy/i18n/fr.po

@ -1,207 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-01-27 16:03+0000\n"
"Last-Translator: Nicolas JEUDY <njeudy@panda-chi.io>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.4\n"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_active
msgid "Active"
msgstr "Actif"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.activity_action
#: model:ir.ui.menu,name:privacy.menu_privacy_activity
msgid "Activities"
msgstr "Traitements"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Archived"
msgstr "Archivé"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_find
msgid "Are affected subjects present in this database?"
msgstr "Est ce que les personnes impactées sont dans cette base de données ?"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Click to add a data processing activity."
msgstr "Cliquez pour ajouter un traitement au registre."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_controller_id
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Controller"
msgstr "Responsable"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_date
msgid "Created on"
msgstr "Créé le"
#. module: privacy
#: model:ir.module.category,name:privacy.module_category_data_protection
msgid "Data Protection"
msgstr "Protection des données"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_manager
msgid "Data Protection Manager"
msgstr "Responsable des traitements"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_config
msgid "Data Protection Settings"
msgstr "Protection des données - Paramètres"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_user
msgid "Data Protection User"
msgstr "Protection des données - Utilisateur"
#. module: privacy
#: model:ir.model,name:privacy.model_privacy_activity
msgid "Data processing activities"
msgstr "Traitements des données personnelles"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Data processing activities define why, how and what you do\n"
" with subjects' personal data."
msgstr ""
"Le registre des traitements des données personnelles définit\n"
"…………pourquoi et comment sont utilisées les données personnelles."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_find
msgid "Define subjects"
msgstr "Filtrer les personnes impactées"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_description
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Description"
msgstr "Description"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Details"
msgstr "Détails"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Group By"
msgstr "Grouper par"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_description
msgid "How is personal data used here? Why? Etc."
msgstr "Comment sont utilisées les données personnelles ? Pourquoi ? Etc."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_id
msgid "ID"
msgstr "ID"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity___last_update
msgid "Last Modified on"
msgstr "Modificatié le"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_uid
msgid "Last Updated by"
msgstr "Mis à jour par"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_date
msgid "Last Updated on"
msgstr "Mis à jour le"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_master_data
msgid "Master Data"
msgstr "Registre(s)"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_name
msgid "Name"
msgstr "Nom"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_partner_form
#: model:ir.ui.menu,name:privacy.menu_data_protection_partner
msgid "Partners"
msgstr "Contacts"
#. module: privacy
#: model:ir.ui.menu,name:privacy.parent_menu_data_protection
msgid "Privacy"
msgstr "Vie privée"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_processor_ids
msgid "Processors"
msgstr "Sous-traitants"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_report
msgid "Reports"
msgstr "Rapports"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_domain
msgid "Selection filter to find specific subjects included."
msgstr "Ajouter des filtres pour associer les personnes concernées."
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_setting
msgid "Settings"
msgstr "Configuration"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_domain
msgid "Subjects filter"
msgstr "Filtre des personnes concernées"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_transaction
#, fuzzy
msgid "Transactions"
msgstr "Traitements"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_controller_id
msgid "Whoever determines the purposes and means of the processing of personal data."
msgstr ""
"Personnes définissant les finalités et les raisons du traitement des "
"données personnelles."
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_processor_ids
msgid "Whoever processes personal data on behalf of the controller."
msgstr "Sous-traitants utilisant ces données personnelles."

205
privacy/i18n/it.po

@ -1,205 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-06-06 22:20+0000\n"
"Last-Translator: Sergio Zanchetta <primes2h@gmail.com>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.6.1\n"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_active
msgid "Active"
msgstr "Attiva"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.activity_action
#: model:ir.ui.menu,name:privacy.menu_privacy_activity
msgid "Activities"
msgstr "Attività"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Archived"
msgstr "Archiviata"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_find
msgid "Are affected subjects present in this database?"
msgstr "I soggetti interessati sono presenti nel database?"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Click to add a data processing activity."
msgstr "Fare clic per aggiungere un'attività di elaborazione dei dati."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_controller_id
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Controller"
msgstr "Titolare trattamento"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_uid
msgid "Created by"
msgstr "Creato da"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_date
msgid "Created on"
msgstr "Creato il"
#. module: privacy
#: model:ir.module.category,name:privacy.module_category_data_protection
msgid "Data Protection"
msgstr "Protezione dati"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_manager
msgid "Data Protection Manager"
msgstr "Responsabile protezione dati (DPO)"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_config
msgid "Data Protection Settings"
msgstr "Impostazioni protezione dati"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_user
msgid "Data Protection User"
msgstr "Utente protezione dati"
#. module: privacy
#: model:ir.model,name:privacy.model_privacy_activity
msgid "Data processing activities"
msgstr "Attività di elaborazione dei dati"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Data processing activities define why, how and what you do\n"
" with subjects' personal data."
msgstr ""
"Le attività di elaborazione dei dati definiscono perché, come e cosa viene "
"fatto\n"
" dei dati personali dei soggetti interessati."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_find
msgid "Define subjects"
msgstr "Indicare soggetti"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_description
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Description"
msgstr "Descrizione"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Details"
msgstr "Dettagli"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Group By"
msgstr "Raggruppa per"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_description
msgid "How is personal data used here? Why? Etc."
msgstr "Come vengono usati i dati personali? Perché? Ecc."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_id
msgid "ID"
msgstr "ID"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity___last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_master_data
msgid "Master Data"
msgstr "Dati principali"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_name
msgid "Name"
msgstr "Nome"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_partner_form
#: model:ir.ui.menu,name:privacy.menu_data_protection_partner
msgid "Partners"
msgstr "Partner"
#. module: privacy
#: model:ir.ui.menu,name:privacy.parent_menu_data_protection
msgid "Privacy"
msgstr "Privacy"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_processor_ids
msgid "Processors"
msgstr "Responsabili del trattamento"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_report
msgid "Reports"
msgstr "Informative"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_domain
msgid "Selection filter to find specific subjects included."
msgstr "Filtro di selezione per trovare specifici soggetti interessati inclusi."
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_setting
msgid "Settings"
msgstr "Impostazioni"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_domain
msgid "Subjects filter"
msgstr "Filtro per soggetti interessati"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_transaction
msgid "Transactions"
msgstr "Operazioni"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_controller_id
msgid "Whoever determines the purposes and means of the processing of personal data."
msgstr "Chiunque determini i fini e i mezzi di elaborazione dei dati personali."
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_processor_ids
msgid "Whoever processes personal data on behalf of the controller."
msgstr "Chiunque elabori dati personali per conto del titolare del trattamento."

200
privacy/i18n/privacy.pot

@ -1,200 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_active
msgid "Active"
msgstr ""
#. module: privacy
#: model:ir.actions.act_window,name:privacy.activity_action
#: model:ir.ui.menu,name:privacy.menu_privacy_activity
msgid "Activities"
msgstr ""
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Archived"
msgstr ""
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_find
msgid "Are affected subjects present in this database?"
msgstr ""
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Click to add a data processing activity."
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_controller_id
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Controller"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_uid
msgid "Created by"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_date
msgid "Created on"
msgstr ""
#. module: privacy
#: model:ir.module.category,name:privacy.module_category_data_protection
msgid "Data Protection"
msgstr ""
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_manager
msgid "Data Protection Manager"
msgstr ""
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_config
msgid "Data Protection Settings"
msgstr ""
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_user
msgid "Data Protection User"
msgstr ""
#. module: privacy
#: model:ir.model,name:privacy.model_privacy_activity
msgid "Data processing activities"
msgstr ""
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Data processing activities define why, how and what you do\n"
" with subjects' personal data."
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_find
msgid "Define subjects"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_description
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Description"
msgstr ""
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Details"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_display_name
msgid "Display Name"
msgstr ""
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Group By"
msgstr ""
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_description
msgid "How is personal data used here? Why? Etc."
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_id
msgid "ID"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity___last_update
msgid "Last Modified on"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_uid
msgid "Last Updated by"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_date
msgid "Last Updated on"
msgstr ""
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_master_data
msgid "Master Data"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_name
msgid "Name"
msgstr ""
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_partner_form
#: model:ir.ui.menu,name:privacy.menu_data_protection_partner
msgid "Partners"
msgstr ""
#. module: privacy
#: model:ir.ui.menu,name:privacy.parent_menu_data_protection
msgid "Privacy"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_processor_ids
msgid "Processors"
msgstr ""
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_report
msgid "Reports"
msgstr ""
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_domain
msgid "Selection filter to find specific subjects included."
msgstr ""
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_setting
msgid "Settings"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_domain
msgid "Subjects filter"
msgstr ""
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_transaction
msgid "Transactions"
msgstr ""
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_controller_id
msgid "Whoever determines the purposes and means of the processing of personal data."
msgstr ""
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_processor_ids
msgid "Whoever processes personal data on behalf of the controller."
msgstr ""

204
privacy/i18n/pt.po

@ -1,204 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: Portuguese (data-protection-10.0)\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2018-09-22 09:43+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@exo.pt>\n"
"Language-Team: Portuguese <https://translation.odoo-community.org/projects/"
"data-protection-10-0/data-protection-10-0-privacy/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.1.1\n"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_active
msgid "Active"
msgstr "Ativo"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.activity_action
#: model:ir.ui.menu,name:privacy.menu_privacy_activity
msgid "Activities"
msgstr "Atividades"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Archived"
msgstr "Arquivado"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_find
msgid "Are affected subjects present in this database?"
msgstr "Os titulares afetados estão presentes nesta base de dados?"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid "Click to add a data processing activity."
msgstr "Clique para adicionar uma atividade de processamento de dados."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_controller_id
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Controller"
msgstr "Controlador"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_uid
msgid "Created by"
msgstr "Criado por"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_create_date
msgid "Created on"
msgstr "Criado em"
#. module: privacy
#: model:ir.module.category,name:privacy.module_category_data_protection
msgid "Data Protection"
msgstr "Proteção de Dados"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_manager
msgid "Data Protection Manager"
msgstr "Gestor de Proteção de Dados"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_config
#, fuzzy
msgid "Data Protection Settings"
msgstr "Utilizador de Proteção de Dados"
#. module: privacy
#: model:res.groups,name:privacy.group_data_protection_user
msgid "Data Protection User"
msgstr "Utilizador de Proteção de Dados"
#. module: privacy
#: model:ir.model,name:privacy.model_privacy_activity
msgid "Data processing activities"
msgstr "Atividades de processamento de dados"
#. module: privacy
#: model:ir.actions.act_window,help:privacy.activity_action
msgid ""
"Data processing activities define why, how and what you do\n"
" with subjects' personal data."
msgstr ""
"As atividades de processamento de dados definem porquê, como e o que faz com "
"os dados pessoais dos titulares."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_find
msgid "Define subjects"
msgstr "Definir titulares"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_description
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Description"
msgstr "Descrição"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_form
msgid "Details"
msgstr "Detalhes"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_display_name
msgid "Display Name"
msgstr "Nome a Exibir"
#. module: privacy
#: model:ir.ui.view,arch_db:privacy.activity_search
msgid "Group By"
msgstr "Agrupar Por"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_description
msgid "How is personal data used here? Why? Etc."
msgstr "Como são usados os dados pessoais aqui? Porquê? Etc."
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_id
msgid "ID"
msgstr ""
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity___last_update
msgid "Last Modified on"
msgstr "Última Modificação em"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_uid
msgid "Last Updated by"
msgstr "Última Atualização por"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_write_date
msgid "Last Updated on"
msgstr "Última Atualização em"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_master_data
msgid "Master Data"
msgstr "Dados Principais"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_name
msgid "Name"
msgstr "Nome"
#. module: privacy
#: model:ir.actions.act_window,name:privacy.action_data_protection_partner_form
#: model:ir.ui.menu,name:privacy.menu_data_protection_partner
msgid "Partners"
msgstr "Parceiros"
#. module: privacy
#: model:ir.ui.menu,name:privacy.parent_menu_data_protection
msgid "Privacy"
msgstr "Privacidade"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_processor_ids
msgid "Processors"
msgstr "Processadores"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_report
msgid "Reports"
msgstr "Relatórios"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_subject_domain
msgid "Selection filter to find specific subjects included."
msgstr "Filtro de seleção para procurar titulares específicos incluídos."
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_setting
msgid "Settings"
msgstr "Configurações"
#. module: privacy
#: model:ir.model.fields,field_description:privacy.field_privacy_activity_subject_domain
msgid "Subjects filter"
msgstr "Filtro de titulares"
#. module: privacy
#: model:ir.ui.menu,name:privacy.menu_data_protection_transaction
msgid "Transactions"
msgstr "Transações"
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_controller_id
msgid ""
"Whoever determines the purposes and means of the processing of personal data."
msgstr "Quem determina os fins e meios do processamento de dados pessoais."
#. module: privacy
#: model:ir.model.fields,help:privacy.field_privacy_activity_processor_ids
msgid "Whoever processes personal data on behalf of the controller."
msgstr "Quem processa dados pessoais em nome do controlador."

1
privacy/models/__init__.py

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

52
privacy/models/privacy_activity.py

@ -1,52 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class PrivacyActivity(models.Model):
_name = "privacy.activity"
_description = "Data processing activities"
_inherit = "mail.thread"
active = fields.Boolean(
default=True,
index=True,
)
name = fields.Char(
index=True,
required=True,
translate=True,
)
description = fields.Html(
translate=True,
help="How is personal data used here? Why? Etc."
)
controller_id = fields.Many2one(
"res.partner",
string="Controller",
required=True,
default=lambda self: self._default_controller_id(),
help="Whoever determines the purposes and means of the processing "
"of personal data.",
)
processor_ids = fields.Many2many(
"res.partner",
"privacy_activity_res_partner_processor_ids",
string="Processors",
help="Whoever processes personal data on behalf of the controller.",
)
subject_find = fields.Boolean(
"Define subjects",
help="Are affected subjects present in this database?",
)
subject_domain = fields.Char(
"Subjects filter",
default="[]",
help="Selection filter to find specific subjects included.",
)
@api.model
def _default_controller_id(self):
"""By default it should be the current user's company."""
return self.env.user.company_id

2
privacy/readme/CONFIGURATION.rst

@ -1,2 +0,0 @@
In the "Privacy", open the "Settings" menu to find and enable
the main features available.

2
privacy/readme/CONTRIBUTORS.rst

@ -1,2 +0,0 @@
* Miquel Raïch <miquel.raich@eficent.com>
* Daniel Reis <dreis.pt@hotmail.com>

2
privacy/readme/DESCRIPTION.rst

@ -1,2 +0,0 @@
This application provides data protection and privacy feature,
to comply with regulations such as GDPR.

6
privacy/readme/USAGE.rst

@ -1,6 +0,0 @@
To define data processing activities:
#. Go to *Privacy > Master Data > Activities* and create one.
#. Define the data processing activity using the provided tools.
Consult your lawyer!

30
privacy/security/data_protection.xml

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<data noupdate="0">
<record model="ir.module.category" id="module_category_data_protection">
<field name="name">Data Protection</field>
<field name="sequence">30</field>
</record>
<record id="group_data_protection_user" model="res.groups">
<field name="name">Data Protection User</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="category_id" ref="module_category_data_protection"/>
</record>
<record id="group_data_protection_manager" model="res.groups">
<field name="name">Data Protection Manager</field>
<field name="implied_ids" eval="[(4, ref('privacy.group_data_protection_user'))]"/>
<field name="category_id" ref="module_category_data_protection"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<record id="base.user_root" model="res.users">
<field name="groups_id" eval="[(4, ref('group_data_protection_manager'))]"/>
</record>
</data>
</odoo>

3
privacy/security/ir.model.access.csv

@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
read,Permission to read activities,model_privacy_activity,group_data_protection_user,1,0,0,0
write,Permission to write activities,model_privacy_activity,group_data_protection_manager,1,1,1,1

BIN
privacy/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 2.1 KiB

115
privacy/static/description/icon.svg

@ -1,115 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
width="60"
height="60"
viewBox="0 0 60 60"
sodipodi:docname="icon.svg"
inkscape:export-filename="icon.png"
inkscape:export-xdpi="204.8"
inkscape:export-ydpi="204.8">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1853"
inkscape:window-height="1018"
id="namedview4"
showgrid="false"
inkscape:zoom="5.6568542"
inkscape:cx="-13.498037"
inkscape:cy="27.319233"
inkscape:window-x="67"
inkscape:window-y="34"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
position="0,41.75"
orientation="1,0"
id="guide3360"
inkscape:locked="false" />
<sodipodi:guide
position="60,60.074219"
orientation="1,0"
id="guide3362"
inkscape:locked="false" />
<sodipodi:guide
position="0.17578125,60"
orientation="0,1"
id="guide3364"
inkscape:locked="false" />
<sodipodi:guide
position="58.71196,-0.0055242717"
orientation="0,1"
id="guide3366"
inkscape:locked="false" />
<sodipodi:guide
position="47.0625,10.9375"
orientation="-0.70710678,0.70710678"
id="guide3347"
inkscape:locked="false" />
<sodipodi:guide
position="21.743534,47.376154"
orientation="-0.70710678,0.70710678"
id="guide23"
inkscape:locked="false" />
</sodipodi:namedview>
<rect
style="opacity:1;fill:#0092d7;fill-opacity:1"
id="rect4147"
width="60"
height="60"
x="0"
y="0" />
<path
style="opacity:1;fill:#000000;fill-opacity:0.39215686"
d="M 0.0078125,34.359568 0,60 36.1162,60.0088 47.0625,49.0625 37.871757,16.233181 21.743534,12.623846 Z"
id="rect4171"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<g
id="g4169"
transform="matrix(0.3061173,0,0,0.3061173,-1.0360053,-1.0457906)"
style="fill:#ffffff;stroke:none" />
<g
aria-label=""
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.38242626px;line-height:0%;font-family:FontAwesome;-inkscape-font-specification:FontAwesome;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.78186888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text3352">
<path
d="m 44.064502,27.442816 c 1.038855,0 1.917886,0.399559 2.717006,1.118767 0.719207,0.799119 1.118767,1.67815 1.118767,2.717006 v 15.343092 c 0,1.118767 -0.39956,1.997799 -1.118767,2.717006 -0.79912,0.799119 -1.678151,1.118767 -2.717006,1.118767 H 15.935499 c -1.118767,0 -1.997799,-0.319648 -2.717006,-1.118767 -0.79912,-0.719207 -1.118767,-1.598239 -1.118767,-2.717006 V 31.278589 c 0,-1.038856 0.319647,-1.917887 1.118767,-2.717006 0.719207,-0.719208 1.598239,-1.118767 2.717006,-1.118767 h 1.917886 v -5.75366 c 0,-2.157622 0.479472,-4.155421 1.598239,-6.073308 1.118767,-1.837974 2.557182,-3.276389 4.475069,-4.395156 C 25.764667,10.101925 27.762466,9.542541 30,9.542541 c 2.157623,0 4.155421,0.559384 6.073308,1.678151 1.837974,1.118767 3.276389,2.557182 4.395156,4.395156 1.118768,1.917887 1.678151,3.915686 1.678151,6.073308 v 5.75366 z m -8.310842,0 v -5.75366 c 0,-1.598239 -0.559384,-2.956742 -1.678151,-4.075509 C 32.956742,16.49488 31.598239,15.935496 30,15.935496 c -1.598239,0 -2.956742,0.559384 -4.075509,1.678151 -1.118767,1.118767 -1.67815,2.47727 -1.67815,4.075509 v 5.75366 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40.91491318px;line-height:1.25;font-family:'Font Awesome 5 Free';-inkscape-font-specification:'Font Awesome 5 Free';stroke-width:0.78186888px"
id="path25" />
</g>
</svg>

432
privacy/static/description/index.html

@ -1,432 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Data Privacy and Protection</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="data-privacy-and-protection">
<h1 class="title">Data Privacy and Protection</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/privacy"><img alt="OCA/data-protection" src="https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-privacy"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/263/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This application provides data protection and privacy feature,
to comply with regulations such as GDPR.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>To define data processing activities:</p>
<ol class="arabic simple">
<li>Go to <em>Privacy &gt; Master Data &gt; Activities</em> and create one.</li>
<li>Define the data processing activity using the provided tools.</li>
</ol>
<p>Consult your lawyer!</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/data-protection/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/data-protection/issues/new?body=module:%20privacy%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Eficent</li>
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Miquel Raïch &lt;<a class="reference external" href="mailto:miquel.raich&#64;eficent.com">miquel.raich&#64;eficent.com</a>&gt;</li>
<li>Daniel Reis &lt;<a class="reference external" href="mailto:dreis.pt&#64;hotmail.com">dreis.pt&#64;hotmail.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/privacy">OCA/data-protection</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

61
privacy/views/data_protection_menu_view.xml

@ -1,61 +0,0 @@
<?xml version="1.0"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<data>
<record id="action_data_protection_partner_form" model="ir.actions.act_window">
<field name="name">Partners</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
</record>
<menuitem id="parent_menu_data_protection"
name="Privacy"
groups="group_data_protection_user"
web_icon="privacy,static/description/icon.png"
/>
<menuitem id="menu_data_protection_master_data"
name="Master Data"
parent="parent_menu_data_protection"
groups="group_data_protection_user"
sequence="10"
/>
<menuitem id="menu_data_protection_partner"
name="Partners"
parent="menu_data_protection_master_data"
action="action_data_protection_partner_form"
sequence="1010"
/>
<menuitem id="menu_data_protection_transaction"
name="Transactions"
parent="parent_menu_data_protection"
groups="group_data_protection_user"
sequence="20"
/>
<menuitem id="menu_data_protection_report"
name="Reports"
parent="parent_menu_data_protection"
groups="group_data_protection_user"
sequence="30"
/>
<record id="action_data_protection_config" model="ir.actions.act_window">
<field name="name">Data Protection Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module': 'data_protection'}</field>
</record>
<menuitem id="menu_data_protection_setting"
name="Settings"
parent="parent_menu_data_protection"
action="action_data_protection_config"
groups="group_data_protection_manager"
sequence="90"
/>
</data>

127
privacy/views/privacy_activity_view.xml

@ -1,127 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record model="ir.ui.view" id="activity_form">
<field name="name">Privacy Activity Form</field>
<field name="model">privacy.activity</field>
<field name="arch" type="xml">
<form>
<header>
<!-- Placeholder for submodules -->
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button
class="oe_stat_button"
icon="fa-archive"
name="toggle_active"
type="object"
>
<field
name="active"
options='{"terminology": "archive"}'
widget="boolean_button"
/>
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
<group name="basic">
<group name="owners">
<field name="controller_id"/>
<field
name="processor_ids"
widget="many2many_tags"
/>
</group>
<group name="subjects">
<field name="subject_find"/>
<field
name="subject_domain"
widget="domain"
options='{"model": "res.partner"}'
attrs='{"required": [("subject_find", "=", True)],
"invisible": [("subject_find", "=", False)]}'
/>
</group>
</group>
<notebook string="Details" name="advanced">
<page string="Description">
<group>
<field name="description" nolabel="1"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="activity_tree">
<field name="name">Privacy Activity Tree</field>
<field name="model">privacy.activity</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="controller_id"/>
<field name="processor_ids"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="activity_search">
<field name="name">Privacy Activity Search</field>
<field name="model">privacy.activity</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="controller_id"/>
<field name="processor_ids"/>
<separator/>
<filter
string="Archived"
name="inactive"
domain="[('active', '=', False)]"
/>
<separator/>
<group string="Group By" name="groupby">
<filter
name="controller_id_groupby"
string="Controller"
context="{'group_by': 'controller_id'}"
/>
</group>
</search>
</field>
</record>
<record id="activity_action" model="ir.actions.act_window">
<field name="name">Activities</field>
<field name="res_model">privacy.activity</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a data processing activity.
</p><p>
Data processing activities define why, how and what you do
with subjects' personal data.
</p>
</field>
</record>
<menuitem
action="activity_action"
groups="group_data_protection_user"
id="menu_privacy_activity"
parent="menu_data_protection_master_data"
/>
</data>

178
privacy_consent/README.rst

@ -1,178 +0,0 @@
=================
Privacy - Consent
=================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
:alt: Production/Stable
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github
:target: https://github.com/OCA/data-protection/tree/11.0/privacy_consent
:alt: OCA/data-protection
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-privacy_consent
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/263/11.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows the user to define a set of subjects (partners)
affected by any data processing activity, and establish
a process to ask them for consent to include them in that activity.
For those that need explicit consent as a lawfulness base for personal data
processing, as required by GDPR (article 6.1.a), this module provides the
needed tools to automate it.
**Table of contents**
.. contents::
:local:
Installation
============
You may want to install, along with this module, one of OCA's
``mail_tracking`` module collection, such as ``mail_tracking_mailgun``, so
you can provide more undeniable proof that some consent request was sent, and
to whom.
However, the most important proof to provide is the answer itself (more than
the question), and this addon provides enough tooling for that.
Multi-database instances
~~~~~~~~~~~~~~~~~~~~~~~~
To enable multi-database support, you must load this addon as a server-wide
addon. Example command to boot Odoo::
odoo-bin --load=web,privacy_consent
Usage
=====
New options for data processing activities:
#. Go to *Privacy > Master Data > Activities* and create one.
#. Give it a name, such as *Sending mass mailings to customers*.
#. Go to tab *Consent* and choose one option in *Ask subjects for consent*:
* *Manual* tells the activity that you will want to create and send the
consent requests manually, and only provides some helpers for you to
be able to batch-generate them.
* *Automatic* enables this module's full power: send all consent requests
to selected partners automatically, every day and under your demand.
#. When you do this, all the consent-related options appear. Configure them:
* A smart button tells you how many consents have been generated, and lets you
access them.
* Choose one *Email template* to send to subjects. This email itself is what
asks for consent, and it gets recorded, to serve as a proof that it was sent.
The module provides a default template that should be good for most usage
cases; and if you create one directly from that field, some good defaults
are provided for your comfortability.
* *Subjects filter* defines what partners will be elegible for inclusion in
this data processing activity.
* You can enable *Accepted by default* if you want to assume subjects
accepted their data processing. You should possibly consult your
lawyer to use this.
* You can choose a *Server action* (developer mode only) that will
be executed whenever a new non-draft consent request is created,
or when its acceptance status changes.
This module supplies a server action by default, called
*Update partner's opt out*, that syncs the acceptance status with the
partner's *Elegible for mass mailings* option.
#. Click on *Generate consent requests* link to create new consent requests.
* If you chose *Manual* mode, all missing consent request are created as
drafts, and nothing else is done now.
* If you chose *Automatic* mode, also those request e-mails are enqueued
and, when the mail queue is cleared, they will be set as *Sent*.
#. You will be presented with the list of just-created consent requests.
See below.
New options for consent requests:
#. Access the consent requests by either:
* Generating new consent requests from a data processing activity.
* Pressing the *Consents* smart button in a data processing activity.
* Going to *Privacy > Privacy > Consents*.
#. A consent will include the partner, the activity, the acceptance status,
and the request state.
#. You can manually ask for consent by pressing the button labeled as
*Ask for consent*.
#. All consent requests and responses are recorded in the mail thread below.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/data-protection/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 <https://github.com/OCA/data-protection/issues/new?body=module:%20privacy_consent%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
* initOS GmbH
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* Jairo Llopis
* `initOS GmbH <https://www.initos.com>`_:
* Florian Kantelberg
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/data-protection <https://github.com/OCA/data-protection/tree/11.0/privacy_consent>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

2
privacy_consent/__init__.py

@ -1,2 +0,0 @@
from . import controllers
from . import models

28
privacy_consent/__manifest__.py

@ -1,28 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Privacy - Consent",
"summary": "Allow people to explicitly accept or reject inclusion "
"in some activity, GDPR compliant",
"version": "11.0.1.0.0",
"development_status": "Production/Stable",
"category": "Privacy",
"website": "https://github.com/OCA/management-activity",
"author": "Tecnativa, initOS GmbH, Odoo Community Association (OCA)",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": [
"privacy",
],
"data": [
"security/ir.model.access.csv",
"data/ir_actions_server.xml",
"data/ir_cron.xml",
"data/mail.xml",
"templates/form.xml",
"views/privacy_consent.xml",
"views/privacy_activity.xml",
"views/res_partner.xml",
],
}

1
privacy_consent/controllers/__init__.py

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

46
privacy_consent/controllers/main.py

@ -1,46 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from datetime import datetime
from werkzeug.exceptions import NotFound
from odoo.http import Controller, request, route
from odoo.addons.web.controllers.main import ensure_db
class ConsentController(Controller):
@route("/privacy/consent/<any(accept,reject):choice>/"
"<int:consent_id>/<token>",
type="http", auth="none", website=True)
def consent(self, choice, consent_id, token, *args, **kwargs):
"""Process user's consent acceptance or rejection."""
ensure_db()
try:
# If there's a website, we need a user to render the template
request.uid = request.website.user_id.id
except AttributeError:
# If there's no website, the default is OK
pass
consent = request.env["privacy.consent"] \
.with_context(subject_answering=True) \
.sudo().browse(consent_id)
if not (consent.exists() and consent._token() == token):
raise NotFound
if consent.partner_id.lang:
consent = consent.with_context(lang=consent.partner_id.lang)
request.context = consent.env.context
consent.action_answer(choice == "accept", self._metadata())
return request.render("privacy_consent.form", {
"consent": consent,
})
def _metadata(self):
return (u"User agent: {}\n"
u"Remote IP: {}\n"
u"Date and time: {:%Y-%m-%d %H:%M:%S}").format(
request.httprequest.environ.get("HTTP_USER_AGENT"),
request.httprequest.environ.get("REMOTE_ADDRESS"),
datetime.now(),
)

16
privacy_consent/data/ir_actions_server.xml

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
Copyright 2019 initOS GmbH - Florian Kantelberg
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record id="update_opt_out" model="ir.actions.server">
<field name="name">Update partner's opt out</field>
<field name="model_id" ref="model_privacy_consent"/>
<field name="crud_model_id" ref="base.model_res_partner"/>
<field name="state">code</field>
<field name="code">records.mapped('partner_id').write({'opt_out': not record.accepted})</field>
</record>
</data>

18
privacy_consent/data/ir_cron.xml

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
Copyright 2019 initOS GmbH - Florian Kantelberg
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record id="cron_auto_consent" model="ir.cron">
<field name="name">Request automatic data processing consents</field>
<field name="model_id" ref="model_privacy_activity"/>
<field name="state">code</field>
<field name="code">model._cron_new_consents()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
</record>
</data>

158
privacy_consent/data/mail.xml

@ -1,158 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
Copyright 2019 Tecnativa - Cristina Martin R.
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<!-- Mail templates -->
<record id="template_consent" model="mail.template">
<field name="auto_delete" eval="False"/>
<field name="name">Personal data processing consent request</field>
<field name="subject">Data processing consent request for ${object.activity_id.display_name|safe}</field>
<field name="model_id" ref="model_privacy_consent"/>
<field name="use_default_to" eval="True"/>
<field name="lang">${object.partner_id.lang}</field>
<field name="body_html" type="xml">
<div style="background:#F3F5F6;color:#515166;padding:25px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;">
<table style="width:600px;margin:5px auto;">
<tbody>
<tr>
<td>
<a href="/">
<img src="/logo" alt="${object.activity_id.controller_id.display_name|safe}" style="vertical-align:baseline;max-width:100px;"/>
</a>
</td>
</tr>
</tbody>
</table>
<table style="width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;">
<tbody>
<tr>
<td colspan="2" style="padding:15px 20px 0px 20px; font-size:16px;">
<p>
Hello, ${object.partner_id.name|safe}
</p>
<p>
We contacted you to ask you to give us your explicit consent to include your data in a data processing activity called
<b>${object.activity_id.display_name|safe}</b>, property of
<i>${object.activity_id.controller_id.display_name|safe}</i>
</p>
${object.description or ""}
<p>
% if object.state == "answered":
The last time you answered, you
% elif object.state == "sent":
If you do nothing, we will assume you have
% endif
% if object.accepted:
<b>accepted</b>
% else:
<b>rejected</b>
% endif
such data processing.
</p>
<p>
You can update your preferences below:
</p>
</td>
</tr>
<tr>
<td style="padding:15px 20px 0px 20px; font-size:16px; text-align:right;">
<a href="/privacy/consent/accept/" style="background-color: #449d44; padding: 12px; font-weight: 12px; text-decoration: none; color: #fff; border-radius: 5px; font-size:16px;">
Accept
</a>
</td>
<td style="padding:15px 20px 0px 20px; font-size:16px; text-align:left;">
<a href="/privacy/consent/reject/" style="background-color: #d9534f; padding: 12px; font-weight: 12px; text-decoration: none; color: #fff; border-radius: 5px; font-size:16px;">
Reject
</a>
</td>
</tr>
<tr>
<td colspan="2" style="padding:15px 20px 15px 20px; font-size:16px;">
<p>
If you need further information, please respond to this email and we will attend your request as soon as possible.
</p>
<p>
Thank you!
</p>
</td>
</tr>
</tbody>
</table>
<table style="width:600px;margin:0px auto;text-align:center;">
<tbody>
<tr>
<td style="padding-top:10px;font-size: 12px;">
<p>
Sent by
<a href="/" style="color:#717188;">${object.activity_id.controller_id.display_name|safe}</a>.
</p>
</td>
</tr>
</tbody>
</table>
</div>
</field>
</record>
<!-- Mail subtypes -->
<record id="mt_consent_consent_new" model="mail.message.subtype">
<field name="name">New Consent</field>
<field name="description">Privacy consent request created</field>
<field name="res_model">privacy.consent</field>
<field name="default" eval="False"/>
<field name="hidden" eval="False"/>
<field name="internal" eval="True"/>
</record>
<record id="mt_consent_acceptance_changed" model="mail.message.subtype">
<field name="name">Acceptance Changed by Subject</field>
<field name="description">Acceptance status updated by subject</field>
<field name="res_model">privacy.consent</field>
<field name="default" eval="False"/>
<field name="hidden" eval="False"/>
<field name="internal" eval="True"/>
</record>
<record id="mt_consent_state_changed" model="mail.message.subtype">
<field name="name">State Changed</field>
<field name="description">Privacy consent request state changed</field>
<field name="res_model">privacy.consent</field>
<field name="default" eval="False"/>
<field name="hidden" eval="False"/>
<field name="internal" eval="True"/>
</record>
<record id="mt_activity_consent_new" model="mail.message.subtype">
<field name="name">New Consent</field>
<field name="description">Privacy consent request created</field>
<field name="res_model">privacy.activity</field>
<field name="default" eval="True"/>
<field name="hidden" eval="False"/>
<field name="internal" eval="True"/>
<field name="parent_id" ref="mt_consent_consent_new"/>
<field name="relation_field">activity_id</field>
</record>
<record id="mt_activity_acceptance_changed" model="mail.message.subtype">
<field name="name">Acceptance Changed</field>
<field name="description">Privacy consent request acceptance status changed</field>
<field name="res_model">privacy.activity</field>
<field name="default" eval="True"/>
<field name="hidden" eval="False"/>
<field name="internal" eval="True"/>
<field name="parent_id" ref="mt_consent_acceptance_changed"/>
<field name="relation_field">activity_id</field>
</record>
<record id="mt_activity_state_changed" model="mail.message.subtype">
<field name="name">State Changed</field>
<field name="description">Privacy consent request state changed</field>
<field name="res_model">privacy.activity</field>
<field name="default" eval="False"/>
<field name="hidden" eval="False"/>
<field name="internal" eval="True"/>
<field name="parent_id" ref="mt_consent_state_changed"/>
<field name="relation_field">activity_id</field>
</record>
</data>

552
privacy_consent/i18n/de.po

@ -1,552 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_consent
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-13 17:04+0000\n"
"PO-Revision-Date: 2019-04-11 11:16+0000\n"
"Last-Translator: dw3gn3r <denise.wegner@initos.com>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5\n"
#. module: privacy_consent
#: model:mail.template,body_html:privacy_consent.template_consent
msgid ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:"
"Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-align:"
"baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;"
"border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Hello, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" We contacted you to ask you to give us "
"your explicit consent to include your data in a data processing activity "
"called\n"
" <b>${object.activity_id.display_name|"
"safe}</b>, property of\n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" The last time you answered, you\n"
" % elif object.state == \"sent\":\n"
" If you do nothing, we will assume "
"you have\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>accepted</b>\n"
" % else:\n"
" <b>rejected</b>\n"
" % endif\n"
" such data processing.\n"
" </p>\n"
" <p>\n"
" You can update your preferences below:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style="
"\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Accept\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style="
"\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Reject\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" If you need further information, please "
"respond to this email and we will attend your request as soon as possible.\n"
" </p>\n"
" <p>\n"
" Thank you!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;"
"\">\n"
" <p>\n"
" Sent by\n"
" <a href=\"/\" style=\"color:#717188;\">"
"${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_acceptance_changed
msgid "Acceptance Changed"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance Changed by Subject"
msgstr "Zustimmung durch den Betroffenen geändert"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance status updated by subject"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_accepted
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Accepted"
msgstr "Akzeptiert"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_default_consent
msgid "Accepted by default"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_active
msgid "Active"
msgstr "Aktiv"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_activity_id
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Activity"
msgstr "Aktivität"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Answered"
msgstr "Beantwortet"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Archived"
msgstr "Archiviert"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_form
msgid "Ask for consent"
msgstr "Einwilligung einholen"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_required
msgid "Ask subjects for consent"
msgstr "Einwilligung beim Betroffenen einholen"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Automatically"
msgstr "Automatisch"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Awaiting response"
msgstr "Warten auf Antwort"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Consent"
msgstr "Einwilligung"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_body_html
#, fuzzy
msgid "Consent Template Default Body Html"
msgstr "Einverständniserklärung Standardtext html"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_subject
#, fuzzy
msgid "Consent Template Default Subject"
msgstr "Standardmäßige Einverständniserklärung Betroffener"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_consent
msgid "Consent of data processing"
msgstr "Einwilligung in die Datenverarbeitung"
#. module: privacy_consent
#: model:ir.actions.act_window,name:privacy_consent.consent_action
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_count
#: model:ir.ui.menu,name:privacy_consent.menu_privacy_consent
msgid "Consents"
msgstr "Einwilligungen"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_res_partner
msgid "Contact"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_activity
msgid "Data processing activities"
msgstr "Verarbeitungstätigkeiten"
#. module: privacy_consent
#: model:mail.template,subject:privacy_consent.template_consent
msgid ""
"Data processing consent request for ${object.activity_id.display_name|safe}"
msgstr "Bitte um Erteilung der Einwilligung zur Datenverarbeitung:"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Draft"
msgstr "Entwurf"
#. module: privacy_consent
#: sql_constraint:privacy.consent:0
msgid "Duplicated partner in this data processing activity"
msgstr "Doppelter Partner in dieser Verarbeitungsaktivität"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_template
msgid "Email Templates"
msgstr "E-Mail-Vorlagen"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_id
msgid "Email template"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_template_id
msgid ""
"Email to be sent to subjects to ask for consent. A good template should "
"include details about the current consent request status, how to change it, "
"and where to get more information."
msgstr ""
"E-Mail, die an die Betroffenen geschickt werden soll, um die Einwilligung "
"einzuholen. Eine gute Vorlage sollte Details über den aktuellen Status der "
"Einwilligungsanfrage enthalten, sowie Hinweise darüber, wie man den Status "
"der Einwilligung ändern kann und wo man weitere Informationen erhält."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_required
msgid ""
"Enable if you need to track any kind of consent from the affected subjects"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
#, fuzzy
msgid "Generate and enqueue missing consent requests"
msgstr "Erstellung und Versand fehlender Einwilligungsanfragen"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate missing draft consent requests"
msgstr "Fehlende Entwürfe von Einwilligungsanfragen erstellen"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:138
#, python-format
msgid "Generated consents"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Group By"
msgstr "Gruppieren nach"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Hello,"
msgstr "Hallo"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>accept</b> this processing of my data"
msgstr "Ich <b>akzeptiere</b> die Verarbeitung meiner Daten"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>reject</b> this processing of my data"
msgstr "Ich <b>lehne</b> die Verarbeitung meiner Daten ab"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_id
msgid "ID"
msgstr "Ausweis"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "If it was a mistake, you can undo it here:"
msgstr "Wenn es ein Fehler war, können Sie diesen hier rückgängig machen:"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_accepted
msgid ""
"Indicates current acceptance status, which can come from subject's last "
"answer, or from the default specified in the related data processing "
"activity."
msgstr ""
"Zeigt den aktuellen Akzeptanzstatus an, der sich aus der letzten Antwort des "
"Betreffenden oder aus dem in der zugehörigen Datenverarbeitungsaktivität "
"angegebenen Standard ergeben kann."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_last_metadata
#, fuzzy
msgid "Last Metadata"
msgstr "Letzte Metadaten"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent___last_update
msgid "Last Modified on"
msgstr "Letzte Änderung am"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert von"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Manually"
msgstr "Manuell"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_last_metadata
msgid "Metadata from the last acceptance or rejection by the subject"
msgstr "Metadaten aus der letzten Annahme oder Ablehnung durch den Betroffenen"
#. module: privacy_consent
#: code:addons/privacy_consent/models/mail_template.py:24
#, python-format
msgid ""
"Missing privacy consent link placeholders. You need at least these two "
"links:\n"
"<a href=\"%s\">Accept</a>\n"
"<a href=\"%s\">Reject</a>"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,name:privacy_consent.mt_consent_consent_new
msgid "New Consent"
msgstr "Neue Einwilligung"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_mail
msgid "Outgoing Mails"
msgstr "Ausgehende Mails"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_acceptance_changed
msgid "Privacy consent request acceptance status changed"
msgstr ""
"Der Akzeptanzstatus der Anfrage 'Einwilligung zum Datenschutz' wurde "
"geändert."
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,description:privacy_consent.mt_consent_consent_new
msgid "Privacy consent request created"
msgstr "Anfrage zur Einwilligung erstellt"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,description:privacy_consent.mt_consent_state_changed
msgid "Privacy consent request state changed"
msgstr "Status der Anfrage zur Einwilligung geändert"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,help:privacy_consent.field_res_users_privacy_consent_count
msgid "Privacy consent requests amount"
msgstr "Anzahl der Anfragen zur Einwilligung"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_ids
msgid "Privacy consents"
msgstr "Einwilligung zum Datenschutz"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.cron_auto_consent_ir_actions_server
#: model:ir.cron,cron_name:privacy_consent.cron_auto_consent
#: model:ir.cron,name:privacy_consent.cron_auto_consent
msgid "Request automatic data processing consents"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:99
#, python-format
msgid "Require consent is available only for subjects in current database."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_server_action_id
msgid ""
"Run this action when a new consent request is created or its acceptance "
"status is updated."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_server_action_id
msgid "Server action"
msgstr "Server-Aktion"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_default_consent
msgid "Should we assume the subject has accepted if we receive no response?"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Sincerely,<br/>"
msgstr "Mit freundlichen Grüßen<br/>"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:91
#, python-format
msgid "Specify a mail template to ask automated consent."
msgstr ""
"Wählen Sie eine E-Mail-Vorlage aus, um eine automatische Einwilligung "
"einzuholen."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_state
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "State"
msgstr "Status"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,name:privacy_consent.mt_consent_state_changed
msgid "State Changed"
msgstr "Status geändert"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_partner_id
msgid "Subject"
msgstr "Betroffener"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_partner_id
msgid "Subject asked for consent."
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thank you!"
msgstr "Vielen Dank."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thanks for your response."
msgstr "Vielen Dank für Ihre Antwort."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
#, fuzzy
msgid "This could enqueue many consent emails, are you sure to proceed?"
msgstr ""
"Hiermit könnten viele Einwilligungs-E-Mails verschickt werden. Sind Sie "
"sicher, dass Sie fortfahren wollen?"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.update_opt_out
msgid "Update partner's opt out"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid ""
"We asked you to authorize us to process your data in this data processing "
"activity:"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "We have recorded this action on your side."
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-danger\">rejected</b> such processing."
msgstr ""
"Du hast diese Verarbeitungstätigkeit <b class=\"text-danger\">abgelehnt</b>."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-success\">accepted</b> such processing."
msgstr ""
"Du hast dieser Verarbeitungstätigkeit <b class=\"text-success\">zugestimmt</"
"b>."
#~ msgid "Partner"
#~ msgstr "Partner"

676
privacy_consent/i18n/es.po

@ -1,676 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_consent
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-13 17:04+0000\n"
"PO-Revision-Date: 2019-05-13 18:08+0100\n"
"Last-Translator: Jairo Llopis <yajo.sk8@gmail.com>\n"
"Language-Team: \n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n"
#. module: privacy_consent
#: model:mail.template,body_html:privacy_consent.template_consent
msgid ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:"
"Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-align:"
"baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;"
"border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Hello, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" We contacted you to ask you to give us "
"your explicit consent to include your data in a data processing activity "
"called\n"
" <b>${object.activity_id.display_name|"
"safe}</b>, property of\n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" The last time you answered, you\n"
" % elif object.state == \"sent\":\n"
" If you do nothing, we will assume "
"you have\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>accepted</b>\n"
" % else:\n"
" <b>rejected</b>\n"
" % endif\n"
" such data processing.\n"
" </p>\n"
" <p>\n"
" You can update your preferences below:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style="
"\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Accept\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style="
"\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Reject\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" If you need further information, please "
"respond to this email and we will attend your request as soon as possible.\n"
" </p>\n"
" <p>\n"
" Thank you!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;"
"\">\n"
" <p>\n"
" Sent by\n"
" <a href=\"/\" style=\"color:#717188;\">"
"${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
msgstr ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:"
"Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-align:"
"baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;"
"border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Hola, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" Le hemos contactado para pedirle su "
"consentimiento explícito para incluir sus datos en una actividad de "
"tratamiento llamada\n"
" <b>${object.activity_id.display_name|"
"safe}</b>, propiedad de\n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" Según su última respuesta,\n"
" % elif object.state == \"sent\":\n"
" Si no recibimos respuesta, "
"asumiremos que\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>ha aceptado</b>\n"
" % else:\n"
" <b>ha rechazado</b>\n"
" % endif\n"
" dicho procesamiento de datos.\n"
" </p>\n"
" <p>\n"
" Puede cambiar sus preferencias aquí "
"abajo:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style="
"\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Aceptar\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style="
"\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Rechazar\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Si necesita más información, por favor "
"responda a este correo electrónico y atenderemos su solicitud a la mayor "
"brevedad posible.\n"
" </p>\n"
" <p>\n"
" ¡Gracias!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;"
"\">\n"
" <p>\n"
" Enviado por\n"
" <a href=\"/\" style=\"color:#717188;\">"
"${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_acceptance_changed
msgid "Acceptance Changed"
msgstr "Aceptación cambiada"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance Changed by Subject"
msgstr "Aceptación cambiada por el interesado"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance status updated by subject"
msgstr "Estado de aceptación modificado por el interesado"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_accepted
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Accepted"
msgstr "Aceptado"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_default_consent
msgid "Accepted by default"
msgstr "Aceptado por defecto"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_active
msgid "Active"
msgstr "Activo"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_activity_id
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Activity"
msgstr "Actividad"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Answered"
msgstr "Respondido"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Archived"
msgstr "Archivado"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_form
msgid "Ask for consent"
msgstr "Solicitar consentimiento"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_required
msgid "Ask subjects for consent"
msgstr "Solicitar consentimiento a los interesados"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Automatically"
msgstr "Automáticamente"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Awaiting response"
msgstr "Esperando respuesta"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Consent"
msgstr "Consentimiento"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_body_html
#, fuzzy
msgid "Consent Template Default Body Html"
msgstr "HTML por defecto para el cuerpo de la plantilla de consentimiento"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_subject
#, fuzzy
msgid "Consent Template Default Subject"
msgstr "HTML por defecto para el asunto de la plantilla de consentimiento"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_consent
msgid "Consent of data processing"
msgstr "Consentimiento para tratamiento de datos"
#. module: privacy_consent
#: model:ir.actions.act_window,name:privacy_consent.consent_action
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_count
#: model:ir.ui.menu,name:privacy_consent.menu_privacy_consent
msgid "Consents"
msgstr "Consents"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_res_partner
msgid "Contact"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_uid
msgid "Created by"
msgstr "Creado por"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_date
msgid "Created on"
msgstr "Creado el"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_activity
msgid "Data processing activities"
msgstr "Actividades de tratamiento de datos"
#. module: privacy_consent
#: model:mail.template,subject:privacy_consent.template_consent
msgid ""
"Data processing consent request for ${object.activity_id.display_name|safe}"
msgstr ""
"Solicitud de consentimiento para el tratamiento de datos personales para "
"${object.activity_id.display_name|safe}"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Draft"
msgstr "Borrador"
#. module: privacy_consent
#: sql_constraint:privacy.consent:0
msgid "Duplicated partner in this data processing activity"
msgstr "Contacto duplicado en esta actividad de tratamiento"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_template
msgid "Email Templates"
msgstr "Plantillas de correo electrónico"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_id
msgid "Email template"
msgstr "Plantilla de correo electrónico"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_template_id
msgid ""
"Email to be sent to subjects to ask for consent. A good template should "
"include details about the current consent request status, how to change it, "
"and where to get more information."
msgstr ""
"Correo electrónico a enviar a los interesados para solicitarles el "
"consentimiento. Una buena plantilla debería incluir detalles sobre el estado "
"actual del consentimiento, cómo cambiarlo, y dónde obtener más información."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_required
msgid ""
"Enable if you need to track any kind of consent from the affected subjects"
msgstr ""
"Actívelo si necesita registrar cualquier tipo de consentimiento de los "
"interesados"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate and enqueue missing consent requests"
msgstr ""
"Generar y colocar en la bandeja de salida las solicitudes de consentimiento "
"que falten"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate missing draft consent requests"
msgstr "Generar borradores de las solicitudes de consentimiento faltantes"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:138
#, python-format
msgid "Generated consents"
msgstr "Consentimientos generados"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Group By"
msgstr "Agrupar por"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Hello,"
msgstr "Hola,"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>accept</b> this processing of my data"
msgstr "<b>Acepto</b> este tratamiento de mis datos"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>reject</b> this processing of my data"
msgstr "<b>Rechazo</b> este tratamiento de mis datos"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_id
msgid "ID"
msgstr "ID"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "If it was a mistake, you can undo it here:"
msgstr "Si ha sido un error, puede deshacerlo aquí:"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_accepted
msgid ""
"Indicates current acceptance status, which can come from subject's last "
"answer, or from the default specified in the related data processing "
"activity."
msgstr ""
"Indica el estado actual de la aceptación, el cual puede venir de la última "
"respuesta del interesado, o del estado por defecto especificado en la "
"actividad de tratamiento relacionada."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_last_metadata
#, fuzzy
msgid "Last Metadata"
msgstr "Últimos metadatos"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent___last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Manually"
msgstr "Manualmente"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_last_metadata
msgid "Metadata from the last acceptance or rejection by the subject"
msgstr ""
"Metadatos de la última aceptación o denegación por parte del interesado"
#. module: privacy_consent
#: code:addons/privacy_consent/models/mail_template.py:24
#, python-format
msgid ""
"Missing privacy consent link placeholders. You need at least these two "
"links:\n"
"<a href=\"%s\">Accept</a>\n"
"<a href=\"%s\">Reject</a>"
msgstr ""
"Faltan los marcadores de posición de los enlaces para el consentimiento. "
"Necesita al menos estos dos enlaces:\n"
"<a href=\"%s\">Aceptar</a>\n"
"<a href=\"%s\">Rechazar</a>"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,name:privacy_consent.mt_consent_consent_new
msgid "New Consent"
msgstr "Nuevo consentimiento"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_mail
msgid "Outgoing Mails"
msgstr "Correos electrónicos salientes"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_acceptance_changed
msgid "Privacy consent request acceptance status changed"
msgstr ""
"El estado de aceptación de la solicitud de consentimiento para el "
"tratamiento de datos ha cambiado"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,description:privacy_consent.mt_consent_consent_new
msgid "Privacy consent request created"
msgstr ""
"La solicitud de consentimiento para el tratamiento de datos ha sido creada"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,description:privacy_consent.mt_consent_state_changed
msgid "Privacy consent request state changed"
msgstr ""
"El estado de la solicitud de consentimiento para el tratamiento de datos ha "
"cambiado"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,help:privacy_consent.field_res_users_privacy_consent_count
msgid "Privacy consent requests amount"
msgstr "Cantidad de solicitudes de consentimiento para el tratamiento de datos"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_ids
msgid "Privacy consents"
msgstr "Consentimientos para el tratamiento de datos"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.cron_auto_consent_ir_actions_server
#: model:ir.cron,cron_name:privacy_consent.cron_auto_consent
#: model:ir.cron,name:privacy_consent.cron_auto_consent
msgid "Request automatic data processing consents"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:99
#, python-format
msgid "Require consent is available only for subjects in current database."
msgstr ""
"La opción de exigir consentimiento solo está disponible para interesados que "
"se encuentren en esta misma base de datos."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_server_action_id
msgid ""
"Run this action when a new consent request is created or its acceptance "
"status is updated."
msgstr ""
"Ejecutar esta acción cuando se cree una nueva solicitud de consentimiento, o "
"cuando su estado de aceptación cambie."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_server_action_id
msgid "Server action"
msgstr "Acción de servidor"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_default_consent
msgid "Should we assume the subject has accepted if we receive no response?"
msgstr ""
"¿Hay que asumir que el interesado ha aceptado si no recibimos respuesta?"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Sincerely,<br/>"
msgstr "Atentamente,<br/>"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:91
#, python-format
msgid "Specify a mail template to ask automated consent."
msgstr ""
"Especifique una plantilla de correo electrónico para solicitar "
"automáticamente el consentimiento."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_state
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "State"
msgstr "Estado"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,name:privacy_consent.mt_consent_state_changed
msgid "State Changed"
msgstr "El estado ha cambiado"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_partner_id
msgid "Subject"
msgstr "Interesado"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_partner_id
msgid "Subject asked for consent."
msgstr "Interesado a quien se le pide el consentimiento."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thank you!"
msgstr "¡Gracias!"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thanks for your response."
msgstr "Gracias por su respuesta."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "This could enqueue many consent emails, are you sure to proceed?"
msgstr ""
"Esto podría poner en la cola muchos correos electrónicos solicitando "
"consentimiento para el tratamiento de datos, ¿seguro que quiere continuar?"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.update_opt_out
msgid "Update partner's opt out"
msgstr "Sincronizar la opción del contacto para recibir o no envíos masivos"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid ""
"We asked you to authorize us to process your data in this data processing "
"activity:"
msgstr ""
"Le hemos solicitado que nos autorice para procesar sus datos personales en "
"esta actividad de tratamiento:"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "We have recorded this action on your side."
msgstr "Hemos registrado esta acción por su parte."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-danger\">rejected</b> such processing."
msgstr "Ha <b class=\"text-danger\">rechazado</b> dicho tratamiento."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-success\">accepted</b> such processing."
msgstr "Ha <b class=\"text-success\">aceptado</b> dicho tratamiento."
#~ msgid "Email composition wizard"
#~ msgstr "Asistente de redacción de correo electrónico"
#~ msgid "Partner"
#~ msgstr "Contacto"

661
privacy_consent/i18n/fr.po

@ -1,661 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_consent
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-04-22 10:47+0000\n"
"Last-Translator: Logan Gônet <logan.gonet@horanet.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: privacy_consent
#: model:mail.template,body_html:privacy_consent.template_consent
msgid ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:"
"Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-align:"
"baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;"
"border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Hello, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" We contacted you to ask you to give us "
"your explicit consent to include your data in a data processing activity "
"called\n"
" <b>${object.activity_id.display_name|"
"safe}</b>, property of\n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" The last time you answered, you\n"
" % elif object.state == \"sent\":\n"
" If you do nothing, we will assume "
"you have\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>accepted</b>\n"
" % else:\n"
" <b>rejected</b>\n"
" % endif\n"
" such data processing.\n"
" </p>\n"
" <p>\n"
" You can update your preferences below:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style="
"\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Accept\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style="
"\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Reject\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" If you need further information, please "
"respond to this email and we will attend your request as soon as possible.\n"
" </p>\n"
" <p>\n"
" Thank you!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;"
"\">\n"
" <p>\n"
" Sent by\n"
" <a href=\"/\" style=\"color:#717188;\">"
"${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
msgstr ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-"
"family:Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-"
"align:baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px "
"auto;background:white;border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Bonjour, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" Nous vous avons contacté pour vous "
"demander de nous donner votre consentement explicite à inclure vos données "
"dans une activité de traitement de données appelée\n"
" <b>${object.activity_id."
"display_name|safe}</b>, appartenant à \n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" La dernière fois vous aviez répondu, "
"vous\n"
" % elif object.state == \"sent\":\n"
" Si vous ne faite rien, nous "
"supposerons que vous avez\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>accepté</b>\n"
" % else:\n"
" <b>refusé</b>\n"
" % endif\n"
" ce traitement de données.\n"
" </p>\n"
" <p>\n"
" Vous pouvez mettre à jour vos "
"préférences ci-dessous:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style"
"=\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Accepter\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style"
"=\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Refuser\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Si vous avez besoin de plus "
"d'informations, veuillez répondre à cet e-mail et nous répondrons à votre "
"demande dans les plus brefs délais.\n"
" </p>\n"
" <p>\n"
" Merci !\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;\">"
"\n"
" <p>\n"
" Envoyé par\n"
" <a href=\"/\" style=\"color:#717188;\""
">${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_acceptance_changed
msgid "Acceptance Changed"
msgstr "Acceptation Modifiée"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance Changed by Subject"
msgstr "Acceptation Modifiée par l'intéressé"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance status updated by subject"
msgstr "Statut d'acceptation modifié par l'intéressé"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_accepted
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Accepted"
msgstr "Accepté"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_default_consent
msgid "Accepted by default"
msgstr "Accepté par défaut"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_active
msgid "Active"
msgstr "Actif"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_activity_id
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Activity"
msgstr "Traitement"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Answered"
msgstr "Répondu"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Archived"
msgstr "Archivé"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_form
msgid "Ask for consent"
msgstr "Demander le consentement"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_required
msgid "Ask subjects for consent"
msgstr "Demandé aux intéressés leur consentement"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Automatically"
msgstr "Automatiquement"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Awaiting response"
msgstr "Attente d'une réponse"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Consent"
msgstr "Consentement"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_body_html
msgid "Consent Template Default Body Html"
msgstr "Modèle de corps HTML par défaut pour un consentement"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_subject
msgid "Consent Template Default Subject"
msgstr ""
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_consent
msgid "Consent of data processing"
msgstr "Consentement au traitement des données"
#. module: privacy_consent
#: model:ir.actions.act_window,name:privacy_consent.consent_action
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_count
#: model:ir.ui.menu,name:privacy_consent.menu_privacy_consent
msgid "Consents"
msgstr "Consentements"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_res_partner
msgid "Contact"
msgstr "Contact"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_date
msgid "Created on"
msgstr "Créé le"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_activity
msgid "Data processing activities"
msgstr "Traitements des données personnelles"
#. module: privacy_consent
#: model:mail.template,subject:privacy_consent.template_consent
msgid ""
"Data processing consent request for ${object.activity_id.display_name|safe}"
msgstr ""
"Demande de consentement pour le traitement de ${object.activity_id."
"display_name|safe}"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_display_name
msgid "Display Name"
msgstr "Nom à afficher"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Draft"
msgstr "Brouillon"
#. module: privacy_consent
#: sql_constraint:privacy.consent:0
msgid "Duplicated partner in this data processing activity"
msgstr "Partenaire dupliqué dans ce traitement de donnés"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_template
msgid "Email Templates"
msgstr "Modèles d'emails"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_id
msgid "Email template"
msgstr "Modèle de courriel"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_template_id
msgid ""
"Email to be sent to subjects to ask for consent. A good template should "
"include details about the current consent request status, how to change it, "
"and where to get more information."
msgstr ""
"Courriel qui va être envoyé aux intéressés afin de leur demander leur "
"consentement. Un bon modèle doit inclure des informations le statut actuel "
"du consentement, comment le changer et où peu t'il avoir davantage "
"d'information."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_required
msgid ""
"Enable if you need to track any kind of consent from the affected subjects"
msgstr ""
"Activer si vous avez besoin de suivre tout type de consentement des "
"intéressés"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate and enqueue missing consent requests"
msgstr ""
"Générer et mettre en file d'attente les demandes de consentement manquant"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate missing draft consent requests"
msgstr "Générer des brouillons de demandes de consentement manquants"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:138
#, python-format
msgid "Generated consents"
msgstr "Consentements générés"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Group By"
msgstr "Regrouper par"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Hello,"
msgstr "Bonjour,"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>accept</b> this processing of my data"
msgstr "J' <b>accepte</b> ce traitement de mes données"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>reject</b> this processing of my data"
msgstr "Je <b>refuse</b> ce traitement de mes données"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_id
msgid "ID"
msgstr "ID"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "If it was a mistake, you can undo it here:"
msgstr "Si c'était une erreur, vous pouvez l'annule :"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_accepted
msgid ""
"Indicates current acceptance status, which can come from subject's last "
"answer, or from the default specified in the related data processing "
"activity."
msgstr ""
"Indique l'état d'acceptation actuel, qui peut provenir de la dernière "
"réponse de l'intéressé ou de la valeur par défaut spécifiée dans le "
"traitement des données associée."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_last_metadata
msgid "Last Metadata"
msgstr "Dernières méta-données"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent___last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Manually"
msgstr "Manuellement"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_last_metadata
msgid "Metadata from the last acceptance or rejection by the subject"
msgstr "Métadonnées de la dernière acceptation ou refus par l'intéressé"
#. module: privacy_consent
#: code:addons/privacy_consent/models/mail_template.py:24
#, python-format
msgid ""
"Missing privacy consent link placeholders. You need at least these two "
"links:\n"
"<a href=\"%s\">Accept</a>\n"
"<a href=\"%s\">Reject</a>"
msgstr ""
"Variable manquantes pour les liens de consentement. Vous avez besoin d'au "
"moins ces deux liens:\n"
"<a href=\"%s\">Accepter</a>\n"
"<a href=\"%s\">Refuser</a>"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,name:privacy_consent.mt_consent_consent_new
msgid "New Consent"
msgstr "Nouveau Consentement"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_mail
msgid "Outgoing Mails"
msgstr "Emails Sortants"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_acceptance_changed
msgid "Privacy consent request acceptance status changed"
msgstr "Statut d'acceptation du consentement modifié"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,description:privacy_consent.mt_consent_consent_new
msgid "Privacy consent request created"
msgstr "Demande de consentement créé"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,description:privacy_consent.mt_consent_state_changed
msgid "Privacy consent request state changed"
msgstr "État du consentement modifié"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,help:privacy_consent.field_res_users_privacy_consent_count
msgid "Privacy consent requests amount"
msgstr "Nombre de demande de consentement"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_ids
msgid "Privacy consents"
msgstr "Consentement à la protection des données"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.cron_auto_consent_ir_actions_server
#: model:ir.cron,cron_name:privacy_consent.cron_auto_consent
#: model:ir.cron,name:privacy_consent.cron_auto_consent
msgid "Request automatic data processing consents"
msgstr "Demander des autorisations de traitement automatique des données"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:99
#, python-format
msgid "Require consent is available only for subjects in current database."
msgstr ""
"L'exigence de consentement n'est disponible que pour les intéressés de la "
"base de données actuelle."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_server_action_id
msgid ""
"Run this action when a new consent request is created or its acceptance "
"status is updated."
msgstr ""
"Exécutez cette action lorsqu'une nouvelle demande de consentement est créée "
"ou que son statut d'acceptation est mis à jour."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_server_action_id
msgid "Server action"
msgstr "Action du serveur"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_default_consent
msgid "Should we assume the subject has accepted if we receive no response?"
msgstr ""
"Doit-on supposer que le sujet a accepté si nous ne recevons aucune réponse?"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Sincerely,<br/>"
msgstr "Sincèrement,<br/>"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:91
#, python-format
msgid "Specify a mail template to ask automated consent."
msgstr ""
"Spécifiez un modèle de courriel électronique pour demander un consentement "
"automatisé."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_state
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "State"
msgstr "État"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,name:privacy_consent.mt_consent_state_changed
msgid "State Changed"
msgstr "État modifié"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_partner_id
msgid "Subject"
msgstr "Intéressé"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_partner_id
msgid "Subject asked for consent."
msgstr "L'intéressé questionné sur son consentement."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thank you!"
msgstr "Merci !"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thanks for your response."
msgstr "Merci pour votre réponse."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "This could enqueue many consent emails, are you sure to proceed?"
msgstr ""
"Cela peut mettre plusieurs courriels de consentement dans la file d'attente, "
"êtes-vous sûr de vouloir continuer ?"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.update_opt_out
msgid "Update partner's opt out"
msgstr "Mettre à jour l'exclusion des partenaires"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid ""
"We asked you to authorize us to process your data in this data processing "
"activity:"
msgstr ""
"Nous vous avons demandé de nous autoriser à traiter vos données dans cette "
"activité de traitement de données:"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "We have recorded this action on your side."
msgstr "Nous avons enregistré cette action pour vous."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-danger\">rejected</b> such processing."
msgstr "Vous avez <b class=\"text-danger\">refusé</b> ce traitement."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-success\">accepted</b> such processing."
msgstr "Vous avez <b class=\"text-success\">accepté</b> ce traitement."

489
privacy_consent/i18n/privacy_consent.pot

@ -1,489 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_consent
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: privacy_consent
#: model:mail.template,body_html:privacy_consent.template_consent
msgid "<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object.activity_id.controller_id.display_name|safe}\" style=\"vertical-align:baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px 20px; font-size:16px;\">\n"
" <p>\n"
" Hello, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" We contacted you to ask you to give us your explicit consent to include your data in a data processing activity called\n"
" <b>${object.activity_id.display_name|safe}</b>, property of\n"
" <i>${object.activity_id.controller_id.display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" The last time you answered, you\n"
" % elif object.state == \"sent\":\n"
" If you do nothing, we will assume you have\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>accepted</b>\n"
" % else:\n"
" <b>rejected</b>\n"
" % endif\n"
" such data processing.\n"
" </p>\n"
" <p>\n"
" You can update your preferences below:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style=\"background-color: #449d44; padding: 12px; font-weight: 12px; text-decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Accept\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style=\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Reject\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px 20px; font-size:16px;\">\n"
" <p>\n"
" If you need further information, please respond to this email and we will attend your request as soon as possible.\n"
" </p>\n"
" <p>\n"
" Thank you!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;\">\n"
" <p>\n"
" Sent by\n"
" <a href=\"/\" style=\"color:#717188;\">${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_acceptance_changed
msgid "Acceptance Changed"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance Changed by Subject"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance status updated by subject"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_accepted
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Accepted"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_default_consent
msgid "Accepted by default"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_active
msgid "Active"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_activity_id
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Activity"
msgstr ""
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Answered"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Archived"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_form
msgid "Ask for consent"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_required
msgid "Ask subjects for consent"
msgstr ""
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Automatically"
msgstr ""
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Awaiting response"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Consent"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_body_html
msgid "Consent Template Default Body Html"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_subject
msgid "Consent Template Default Subject"
msgstr ""
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_consent
msgid "Consent of data processing"
msgstr ""
#. module: privacy_consent
#: model:ir.actions.act_window,name:privacy_consent.consent_action
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_count
#: model:ir.ui.menu,name:privacy_consent.menu_privacy_consent
msgid "Consents"
msgstr ""
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_res_partner
msgid "Contact"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_uid
msgid "Created by"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_date
msgid "Created on"
msgstr ""
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_activity
msgid "Data processing activities"
msgstr ""
#. module: privacy_consent
#: model:mail.template,subject:privacy_consent.template_consent
msgid "Data processing consent request for ${object.activity_id.display_name|safe}"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_display_name
msgid "Display Name"
msgstr ""
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Draft"
msgstr ""
#. module: privacy_consent
#: sql_constraint:privacy.consent:0
msgid "Duplicated partner in this data processing activity"
msgstr ""
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_template
msgid "Email Templates"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_id
msgid "Email template"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_template_id
msgid "Email to be sent to subjects to ask for consent. A good template should include details about the current consent request status, how to change it, and where to get more information."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_required
msgid "Enable if you need to track any kind of consent from the affected subjects"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate and enqueue missing consent requests"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate missing draft consent requests"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:138
#, python-format
msgid "Generated consents"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Group By"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Hello,"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>accept</b> this processing of my data"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>reject</b> this processing of my data"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_id
msgid "ID"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "If it was a mistake, you can undo it here:"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_accepted
msgid "Indicates current acceptance status, which can come from subject's last answer, or from the default specified in the related data processing activity."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_last_metadata
msgid "Last Metadata"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent___last_update
msgid "Last Modified on"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_uid
msgid "Last Updated by"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_date
msgid "Last Updated on"
msgstr ""
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Manually"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_last_metadata
msgid "Metadata from the last acceptance or rejection by the subject"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/mail_template.py:24
#, python-format
msgid "Missing privacy consent link placeholders. You need at least these two links:\n"
"<a href=\"%s\">Accept</a>\n"
"<a href=\"%s\">Reject</a>"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,name:privacy_consent.mt_consent_consent_new
msgid "New Consent"
msgstr ""
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_mail
msgid "Outgoing Mails"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_acceptance_changed
msgid "Privacy consent request acceptance status changed"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,description:privacy_consent.mt_consent_consent_new
msgid "Privacy consent request created"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,description:privacy_consent.mt_consent_state_changed
msgid "Privacy consent request state changed"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,help:privacy_consent.field_res_users_privacy_consent_count
msgid "Privacy consent requests amount"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_ids
msgid "Privacy consents"
msgstr ""
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.cron_auto_consent_ir_actions_server
#: model:ir.cron,cron_name:privacy_consent.cron_auto_consent
#: model:ir.cron,name:privacy_consent.cron_auto_consent
msgid "Request automatic data processing consents"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:99
#, python-format
msgid "Require consent is available only for subjects in current database."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_server_action_id
msgid "Run this action when a new consent request is created or its acceptance status is updated."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_server_action_id
msgid "Server action"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_default_consent
msgid "Should we assume the subject has accepted if we receive no response?"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Sincerely,<br/>"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:91
#, python-format
msgid "Specify a mail template to ask automated consent."
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_state
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "State"
msgstr ""
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,name:privacy_consent.mt_consent_state_changed
msgid "State Changed"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_partner_id
msgid "Subject"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_partner_id
msgid "Subject asked for consent."
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thank you!"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thanks for your response."
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "This could enqueue many consent emails, are you sure to proceed?"
msgstr ""
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.update_opt_out
msgid "Update partner's opt out"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "We asked you to authorize us to process your data in this data processing activity:"
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "We have recorded this action on your side."
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-danger\">rejected</b> such processing."
msgstr ""
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-success\">accepted</b> such processing."
msgstr ""

665
privacy_consent/i18n/pt.po

@ -1,665 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: Portuguese (data-protection-10.0)\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2018-12-15 21:58+0000\n"
"Last-Translator: alvarorib <alvaro.ribeiro@exo.pt>\n"
"Language-Team: Portuguese <https://translation.odoo-community.org/projects/"
"data-protection-10-0/data-protection-10-0-privacy_consent/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.3\n"
#. module: privacy_consent
#: model:mail.template,body_html:privacy_consent.template_consent
msgid ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:"
"Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-align:"
"baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;"
"border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Hello, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" We contacted you to ask you to give us "
"your explicit consent to include your data in a data processing activity "
"called\n"
" <b>${object.activity_id.display_name|"
"safe}</b>, property of\n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" The last time you answered, you\n"
" % elif object.state == \"sent\":\n"
" If you do nothing, we will assume "
"you have\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>accepted</b>\n"
" % else:\n"
" <b>rejected</b>\n"
" % endif\n"
" such data processing.\n"
" </p>\n"
" <p>\n"
" You can update your preferences below:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style="
"\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Accept\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style="
"\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Reject\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" If you need further information, please "
"respond to this email and we will attend your request as soon as possible.\n"
" </p>\n"
" <p>\n"
" Thank you!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;"
"\">\n"
" <p>\n"
" Sent by\n"
" <a href=\"/\" style=\"color:#717188;\">"
"${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
msgstr ""
"<?xml version=\"1.0\"?>\n"
"<div style=\"background:#F3F5F6;color:#515166;padding:25px 0px;font-family:"
"Arial,Helvetica,sans-serif;font-size:14px;\">\n"
" <table style=\"width:600px;margin:5px auto;\">\n"
" <tbody>\n"
" <tr>\n"
" <td>\n"
" <a href=\"/\">\n"
" <img src=\"/logo\" alt=\"${object."
"activity_id.controller_id.display_name|safe}\" style=\"vertical-align:"
"baseline;max-width:100px;\"/>\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;background:white;"
"border:1px solid #e1e1e1;\">\n"
" <tbody>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 0px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Olá, ${object.partner_id.name|safe}\n"
" </p>\n"
" <p>\n"
" Contactámos, para solicitar o seu "
"consentimento explícito, à inclusão dos seus dados numa atividade de "
"processamento de dados, chamada\n"
" <b>${object.activity_id.display_name|"
"safe}</b>, propriedade de\n"
" <i>${object.activity_id.controller_id."
"display_name|safe}</i>\n"
" </p>\n"
" ${object.description or \"\"}\n"
" <p>\n"
" % if object.state == \"answered\":\n"
" A última vez que nos respondeu, "
"você\n"
" % elif object.state == \"sent\":\n"
" Se nada fizer, assumimos que você\n"
" % endif\n"
"\n"
" % if object.accepted:\n"
" <b>aceitou</b>\n"
" % else:\n"
" <b>rejeitou</b>\n"
" % endif\n"
" esse processamento de dados.\n"
" </p>\n"
" <p>\n"
" Pode atualizar as suas preferências "
"abaixo:\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:right;\">\n"
" <a href=\"/privacy/consent/accept/\" style="
"\"background-color: #449d44; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Aceito\n"
" </a>\n"
" </td>\n"
" <td style=\"padding:15px 20px 0px 20px; font-"
"size:16px; text-align:left;\">\n"
" <a href=\"/privacy/consent/reject/\" style="
"\"background-color: #d9534f; padding: 12px; font-weight: 12px; text-"
"decoration: none; color: #fff; border-radius: 5px; font-size:16px;\">\n"
" Rejeito\n"
" </a>\n"
" </td>\n"
" </tr>\n"
" <tr>\n"
" <td colspan=\"2\" style=\"padding:15px 20px 15px "
"20px; font-size:16px;\">\n"
" <p>\n"
" Se necessitar de mais informação, por "
"favor responda a este email e nós trataremos de esclarecer assim que "
"possível.\n"
" </p>\n"
" <p>\n"
" Obrigado!\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" <table style=\"width:600px;margin:0px auto;text-align:center;"
"\">\n"
" <tbody>\n"
" <tr>\n"
" <td style=\"padding-top:10px;font-size: 12px;"
"\">\n"
" <p>\n"
" Enviado por\n"
" <a href=\"/\" style=\"color:#717188;\">"
"${object.activity_id.controller_id.display_name|safe}</a>.\n"
" </p>\n"
" </td>\n"
" </tr>\n"
" </tbody>\n"
" </table>\n"
" </div>\n"
" "
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_acceptance_changed
msgid "Acceptance Changed"
msgstr "Aceitação Alterada"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance Changed by Subject"
msgstr "Aceitação Alterada por Titular"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_consent_acceptance_changed
msgid "Acceptance status updated by subject"
msgstr "Estado da aceitação atualizado por titular"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_accepted
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Accepted"
msgstr "Aceite"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_default_consent
msgid "Accepted by default"
msgstr "Aceite por defeito"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_active
msgid "Active"
msgstr "Ativo"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_activity_id
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Activity"
msgstr "Atividade"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Answered"
msgstr "Respondido"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Archived"
msgstr "Arquivado"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_form
msgid "Ask for consent"
msgstr "Pedir consentimento"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_required
msgid "Ask subjects for consent"
msgstr "Solicitar consentimento aos titulares"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Automatically"
msgstr "Automaticamente"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Awaiting response"
msgstr "À espera de resposta"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Consent"
msgstr "Consentimento"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_body_html
#, fuzzy
msgid "Consent Template Default Body Html"
msgstr "Corpo predefinido HTML do modelo de consentimento"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_default_subject
#, fuzzy
msgid "Consent Template Default Subject"
msgstr "Modelo predefinido de consentimento do titular"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_consent
msgid "Consent of data processing"
msgstr "Consentimento de processamento de dados"
#. module: privacy_consent
#: model:ir.actions.act_window,name:privacy_consent.consent_action
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_count
#: model:ir.ui.menu,name:privacy_consent.menu_privacy_consent
msgid "Consents"
msgstr "Consentimentos"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_res_partner
msgid "Contact"
msgstr ""
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_uid
msgid "Created by"
msgstr "Criado por"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_create_date
msgid "Created on"
msgstr "Criado em"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_privacy_activity
msgid "Data processing activities"
msgstr "Atividades de processamento de dados"
#. module: privacy_consent
#: model:mail.template,subject:privacy_consent.template_consent
msgid ""
"Data processing consent request for ${object.activity_id.display_name|safe}"
msgstr ""
"Processamento de dados de pedidos de consentimento para ${object.activity_id."
"display_name|safe}"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_display_name
msgid "Display Name"
msgstr "Nome a Exibir"
#. module: privacy_consent
#: selection:privacy.consent,state:0
msgid "Draft"
msgstr "Rascunho"
#. module: privacy_consent
#: sql_constraint:privacy.consent:0
msgid "Duplicated partner in this data processing activity"
msgstr "Parceiro duplicado nesta atividade de processamento de dados"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_template
msgid "Email Templates"
msgstr "Modelos de E-mail"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_consent_template_id
msgid "Email template"
msgstr "Modelo de Email"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_template_id
msgid ""
"Email to be sent to subjects to ask for consent. A good template should "
"include details about the current consent request status, how to change it, "
"and where to get more information."
msgstr ""
"Email a ser enviado para os titulares a pedir o consentimento. Um bom modelo "
"deve incluir detalhes sobre o estado atual do pedido de consentimento, como "
"alterá-lo, e onde obter ais informação."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_consent_required
msgid ""
"Enable if you need to track any kind of consent from the affected subjects"
msgstr ""
"Ativar se necessita seguir qualquer espécie de consentimento dos titulares "
"afetados"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
#, fuzzy
msgid "Generate and enqueue missing consent requests"
msgstr "Gerar e enviar pedidos de consentimento em falta"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
msgid "Generate missing draft consent requests"
msgstr "Gerar pedidos de consentimento em rascunho em falta"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:138
#, python-format
msgid "Generated consents"
msgstr "Consentimentos gerados"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "Group By"
msgstr "Agrupar Por"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Hello,"
msgstr "Olá"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>accept</b> this processing of my data"
msgstr "Eu <b>aceito</b> este processamento dos meus dados"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "I <b>reject</b> this processing of my data"
msgstr "Eu <b>rejeito</b> este processamento dos meus dados"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_id
msgid "ID"
msgstr "ID"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "If it was a mistake, you can undo it here:"
msgstr "Se foi um lapso, pode revertê-lo aqui:"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_accepted
msgid ""
"Indicates current acceptance status, which can come from subject's last "
"answer, or from the default specified in the related data processing "
"activity."
msgstr ""
"Indica o estado atual da aceitação, que pode derivar da última resposta do "
"titular, ou estar predefinida nos dados relacionados contidos na atividade "
"em processamento."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_last_metadata
#, fuzzy
msgid "Last Metadata"
msgstr "Últimos Metadados"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent___last_update
msgid "Last Modified on"
msgstr "Última Modificação em"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_uid
msgid "Last Updated by"
msgstr "Última Atualização por"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_write_date
msgid "Last Updated on"
msgstr "Última Atualização em"
#. module: privacy_consent
#: selection:privacy.activity,consent_required:0
msgid "Manually"
msgstr "Manualmente"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_last_metadata
msgid "Metadata from the last acceptance or rejection by the subject"
msgstr "Metadados da última aceitação ou rejeição pelo titular"
#. module: privacy_consent
#: code:addons/privacy_consent/models/mail_template.py:24
#, python-format
msgid ""
"Missing privacy consent link placeholders. You need at least these two "
"links:\n"
"<a href=\"%s\">Accept</a>\n"
"<a href=\"%s\">Reject</a>"
msgstr ""
"Espaços reservados aos links de consentimento de privacidade em falta. "
"Necessita pelo menos destes dois links:\n"
"<a href=\"%s\">Aceito</a>\n"
"<a href=\"%s\">Rejeito</a>"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,name:privacy_consent.mt_consent_consent_new
msgid "New Consent"
msgstr "Novo Consentimento"
#. module: privacy_consent
#: model:ir.model,name:privacy_consent.model_mail_mail
msgid "Outgoing Mails"
msgstr "Mensagens a Enviar"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_acceptance_changed
msgid "Privacy consent request acceptance status changed"
msgstr "Estado de aceitação do pedido de consentimento de privacidade alterado"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_consent_new
#: model:mail.message.subtype,description:privacy_consent.mt_consent_consent_new
msgid "Privacy consent request created"
msgstr "Pedido de consentimento de privacidade criado"
#. module: privacy_consent
#: model:mail.message.subtype,description:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,description:privacy_consent.mt_consent_state_changed
msgid "Privacy consent request state changed"
msgstr "Estado do pedido de consentimento de privacidade alterado"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_res_partner_privacy_consent_count
#: model:ir.model.fields,help:privacy_consent.field_res_users_privacy_consent_count
msgid "Privacy consent requests amount"
msgstr "Número de pedidos de consentimento de privacidade"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_res_partner_privacy_consent_ids
#: model:ir.model.fields,field_description:privacy_consent.field_res_users_privacy_consent_ids
msgid "Privacy consents"
msgstr "Consentimentos de privacidade"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.cron_auto_consent_ir_actions_server
#: model:ir.cron,cron_name:privacy_consent.cron_auto_consent
#: model:ir.cron,name:privacy_consent.cron_auto_consent
msgid "Request automatic data processing consents"
msgstr ""
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:99
#, python-format
msgid "Require consent is available only for subjects in current database."
msgstr ""
"Requerer consentimento, só está disponível para titulares da base de dados "
"atual."
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_server_action_id
msgid ""
"Run this action when a new consent request is created or its acceptance "
"status is updated."
msgstr ""
"Execute esta ação quando um novo pedido de consentimento for criado ou seu "
"estado de aceitação for atualizado."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_activity_server_action_id
msgid "Server action"
msgstr "Ação do servidor"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_activity_default_consent
msgid "Should we assume the subject has accepted if we receive no response?"
msgstr ""
"Devemos assumir que o titular dos dados aceitou, se não houver resposta?"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Sincerely,<br/>"
msgstr "Cumprimentos,<br />"
#. module: privacy_consent
#: code:addons/privacy_consent/models/privacy_activity.py:91
#, python-format
msgid "Specify a mail template to ask automated consent."
msgstr ""
"Especifique um modelo de email para pedido automático de consentimento."
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_state
#: model:ir.ui.view,arch_db:privacy_consent.consent_search
msgid "State"
msgstr "Estado"
#. module: privacy_consent
#: model:mail.message.subtype,name:privacy_consent.mt_activity_state_changed
#: model:mail.message.subtype,name:privacy_consent.mt_consent_state_changed
msgid "State Changed"
msgstr "Estado Alterado"
#. module: privacy_consent
#: model:ir.model.fields,field_description:privacy_consent.field_privacy_consent_partner_id
msgid "Subject"
msgstr "Titular dos dados"
#. module: privacy_consent
#: model:ir.model.fields,help:privacy_consent.field_privacy_consent_partner_id
msgid "Subject asked for consent."
msgstr "Foi pedido consentimento ao titular."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thank you!"
msgstr "Obrigado!"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "Thanks for your response."
msgstr "Obrigado pela sua resposta."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.activity_form
#, fuzzy
msgid "This could enqueue many consent emails, are you sure to proceed?"
msgstr ""
"Atenção, esta operação pode enviar múltiplo emails de consentimento pretende "
"prosseguir?"
#. module: privacy_consent
#: model:ir.actions.server,name:privacy_consent.update_opt_out
msgid "Update partner's opt out"
msgstr "Atualizar a Auto Exclusão do parceiro"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid ""
"We asked you to authorize us to process your data in this data processing "
"activity:"
msgstr ""
"Pedimos-lhe que nos desse autorização para processarmos os seus dados nesta "
"atividade de processamento:"
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "We have recorded this action on your side."
msgstr "Registámos esta ação com seu conhecimento."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-danger\">rejected</b> such processing."
msgstr "Você <b class=\"text-danger\">rejeitou</b> este processamento."
#. module: privacy_consent
#: model:ir.ui.view,arch_db:privacy_consent.form
msgid "You have <b class=\"text-success\">accepted</b> such processing."
msgstr "Você <b class=\"text-success\">aceitou</b> este processamento."
#~ msgid "Partner"
#~ msgstr "Parceiro"
#~ msgid "Email composition wizard"
#~ msgstr "Assistente de criação de email"

5
privacy_consent/models/__init__.py

@ -1,5 +0,0 @@
from . import mail_mail
from . import mail_template
from . import privacy_activity
from . import privacy_consent
from . import res_partner

53
privacy_consent/models/mail_mail.py

@ -1,53 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import models
class MailMail(models.Model):
_inherit = "mail.mail"
def _postprocess_sent_message(self, mail_sent=True):
"""Write consent status after sending message."""
if mail_sent:
# Get all mails sent to consents
consent_mails = self.filtered(
lambda one: one.mail_message_id.model == "privacy.consent"
)
# Get related draft consents
consents = self.env["privacy.consent"].browse(
consent_mails.mapped("mail_message_id.res_id"),
self._prefetch
).filtered(lambda one: one.state == "draft")
# Set as sent
consents.write({
"state": "sent",
})
return super(MailMail, self)._postprocess_sent_message(mail_sent)
def send_get_mail_body(self, partner=None):
"""Replace privacy consent magic links.
This replacement is done here instead of directly writing it into
the ``mail.template`` to avoid writing the tokeinzed URL
in the mail thread for the ``privacy.consent`` record,
which would enable any reader of such thread to impersonate the
subject and choose in its behalf.
"""
result = super(MailMail, self).send_get_mail_body(partner=partner)
# Avoid polluting other model mails
if self.model != "privacy.consent":
return result
# Tokenize consent links
consent = self.env["privacy.consent"] \
.browse(self.mail_message_id.res_id) \
.with_prefetch(self._prefetch)
result = result.replace(
"/privacy/consent/accept/",
consent._url(True),
)
result = result.replace(
"/privacy/consent/reject/",
consent._url(False),
)
return result

32
privacy_consent/models/mail_template.py

@ -1,32 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from lxml import html
from odoo import _, api, models
from odoo.exceptions import ValidationError
class MailTemplate(models.Model):
_inherit = "mail.template"
@api.constrains("body_html", "model")
def _check_consent_links_in_body_html(self):
"""Body for ``privacy.consent`` templates needs placeholder links."""
links = [u"//a[@href='/privacy/consent/{}/']".format(action)
for action in ("accept", "reject")]
for one in self:
if one.model != "privacy.consent":
continue
doc = html.document_fromstring(one.body_html)
for link in links:
if not doc.xpath(link):
raise ValidationError(_(
"Missing privacy consent link placeholders. "
"You need at least these two links:\n"
'<a href="%s">Accept</a>\n'
'<a href="%s">Reject</a>'
) % (
"/privacy/consent/accept/",
"/privacy/consent/reject/",
))

142
privacy_consent/models/privacy_activity.py

@ -1,142 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
from odoo.tools.safe_eval import safe_eval
class PrivacyActivity(models.Model):
_inherit = 'privacy.activity'
server_action_id = fields.Many2one(
"ir.actions.server",
"Server action",
domain=[
("model_id.model", "=", "privacy.consent"),
],
help="Run this action when a new consent request is created or its "
"acceptance status is updated.",
)
consent_ids = fields.One2many(
"privacy.consent",
"activity_id",
"Consents",
)
consent_count = fields.Integer(
"Consents",
compute="_compute_consent_count",
)
consent_required = fields.Selection(
[("auto", "Automatically"), ("manual", "Manually")],
"Ask subjects for consent",
help="Enable if you need to track any kind of consent "
"from the affected subjects",
)
consent_template_id = fields.Many2one(
"mail.template",
"Email template",
default=lambda self: self._default_consent_template_id(),
domain=[
("model", "=", "privacy.consent"),
],
help="Email to be sent to subjects to ask for consent. "
"A good template should include details about the current "
"consent request status, how to change it, and where to "
"get more information.",
)
default_consent = fields.Boolean(
"Accepted by default",
help="Should we assume the subject has accepted if we receive no "
"response?",
)
# Hidden helpers help user design new templates
consent_template_default_body_html = fields.Text(
compute="_compute_consent_template_defaults",
)
consent_template_default_subject = fields.Char(
compute="_compute_consent_template_defaults",
)
@api.model
def _default_consent_template_id(self):
return self.env.ref("privacy_consent.template_consent", False)
@api.depends("consent_ids")
def _compute_consent_count(self):
groups = self.env["privacy.consent"].read_group(
[("activity_id", "in", self.ids)],
["activity_id"],
["activity_id"],
)
for group in groups:
self.browse(group["activity_id"][0], self._prefetch) \
.consent_count = group["activity_id_count"]
def _compute_consent_template_defaults(self):
"""Used in context values, to help users design new templates."""
template = self._default_consent_template_id()
if template:
self.update({
"consent_template_default_body_html": template.body_html,
"consent_template_default_subject": template.subject,
})
@api.constrains("consent_required", "consent_template_id")
def _check_auto_consent_has_template(self):
"""Require a mail template to automate consent requests."""
for one in self:
if one.consent_required == "auto" and not one.consent_template_id:
raise ValidationError(_(
"Specify a mail template to ask automated consent."
))
@api.constrains("consent_required", "subject_find")
def _check_consent_required_subject_find(self):
for one in self:
if one.consent_required and not one.subject_find:
raise ValidationError(_(
"Require consent is available only for subjects "
"in current database."
))
@api.model
def _cron_new_consents(self):
"""Ask all missing automatic consent requests."""
automatic = self.search([("consent_required", "=", "auto")])
automatic.action_new_consents()
@api.onchange("consent_required")
def _onchange_consent_required_subject_find(self):
"""Find subjects automatically if we require their consent."""
if self.consent_required:
self.subject_find = True
def action_new_consents(self):
"""Generate new consent requests."""
consents = self.env["privacy.consent"]
# Skip activitys where consent is not required
for one in self.with_context(active_test=False) \
.filtered("consent_required"):
domain = [
("id", "not in", one.mapped("consent_ids.partner_id").ids),
("email", "!=", False),
] + safe_eval(one.subject_domain)
# Create missing consent requests
for missing in self.env["res.partner"].search(domain):
consents |= consents.create({
"partner_id": missing.id,
"accepted": one.default_consent,
"activity_id": one.id,
})
# Send consent request emails for automatic activitys
consents.action_auto_ask()
# Redirect user to new consent requests generated
return {
"domain": [("id", "in", consents.ids)],
"name": _("Generated consents"),
"res_model": consents._name,
"type": "ir.actions.act_window",
"view_mode": "tree,form",
}

186
privacy_consent/models/privacy_consent.py

@ -1,186 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import hashlib
import hmac
from odoo import api, fields, models
class PrivacyConsent(models.Model):
_name = 'privacy.consent'
_description = "Consent of data processing"
_inherit = "mail.thread"
_rec_name = "partner_id"
_sql_constraints = [
("unique_partner_activity", "UNIQUE(partner_id, activity_id)",
"Duplicated partner in this data processing activity"),
]
active = fields.Boolean(
default=True,
index=True,
)
accepted = fields.Boolean(
track_visibility="onchange",
help="Indicates current acceptance status, which can come from "
"subject's last answer, or from the default specified in the "
"related data processing activity.",
)
last_metadata = fields.Text(
readonly=True,
track_visibility="onchange",
help="Metadata from the last acceptance or rejection by the subject",
)
partner_id = fields.Many2one(
"res.partner",
"Subject",
required=True,
readonly=True,
track_visibility="onchange",
help="Subject asked for consent.",
)
activity_id = fields.Many2one(
"privacy.activity",
"Activity",
readonly=True,
required=True,
track_visibility="onchange",
)
state = fields.Selection(
selection=[
("draft", "Draft"),
("sent", "Awaiting response"),
("answered", "Answered"),
],
default="draft",
readonly=True,
required=True,
track_visibility="onchange",
)
def _track_subtype(self, init_values):
"""Return specific subtypes."""
if self.env.context.get("subject_answering"):
return "privacy_consent.mt_consent_acceptance_changed"
if "activity_id" in init_values or "partner_id" in init_values:
return "privacy_consent.mt_consent_consent_new"
if "state" in init_values:
return "privacy_consent.mt_consent_state_changed"
return super(PrivacyConsent, self)._track_subtype(init_values)
def _token(self):
"""Secret token to publicly authenticate this record."""
secret = self.env["ir.config_parameter"].sudo().get_param(
"database.secret")
params = "{}-{}-{}-{}".format(
self.env.cr.dbname,
self.id,
self.partner_id.id,
self.activity_id.id,
)
return hmac.new(
secret.encode('utf-8'),
params.encode('utf-8'),
hashlib.sha512,
).hexdigest()
def _url(self, accept):
"""Tokenized URL to let subject decide consent.
:param bool accept:
Indicates if you want the acceptance URL, or the rejection one.
"""
return "/privacy/consent/{}/{}/{}?db={}".format(
"accept" if accept else "reject",
self.id,
self._token(),
self.env.cr.dbname,
)
def _send_consent_notification(self):
"""Send email notification to subject."""
for one in self.with_context(tpl_force_default_to=True,
mail_notify_user_signature=False,
mail_auto_subscribe_no_notify=True):
one.activity_id.consent_template_id.send_mail(one.id)
def _run_action(self):
"""Execute server action defined in data processing activity."""
for one in self:
# Always skip draft consents
if one.state == "draft":
continue
action = one.activity_id.server_action_id.with_context(
active_id=one.id,
active_ids=one.ids,
active_model=one._name,
)
action.run()
@api.model
def create(self, vals):
"""Run server action on create."""
result = super(PrivacyConsent,
self.with_context(mail_create_nolog=True)).create(vals)
# Sync the default acceptance status
result.sudo()._run_action()
return result
def write(self, vals):
"""Run server action on update."""
result = super(PrivacyConsent, self).write(vals)
self._run_action()
return result
def message_get_suggested_recipients(self):
result = super(PrivacyConsent, self) \
.message_get_suggested_recipients()
reason = self._fields["partner_id"].string
for one in self:
one._message_add_suggested_recipient(
result,
partner=one.partner_id,
reason=reason,
)
return result
def action_manual_ask(self):
"""Let user manually ask for consent."""
return {
"context": {
"default_composition_mode": "mass_mail",
"default_model": self._name,
"default_res_id": self.id,
"default_template_id": self.activity_id.consent_template_id.id,
"default_use_template": True,
"tpl_force_default_to": True,
},
"force_email": True,
"res_model": "mail.compose.message",
"target": "new",
"type": "ir.actions.act_window",
"view_mode": "form",
}
def action_auto_ask(self):
"""Automatically ask for consent."""
templated = self.filtered("activity_id.consent_template_id")
automated = templated.filtered(
lambda one: one.activity_id.consent_required == "auto")
automated._send_consent_notification()
def action_answer(self, answer, metadata=False):
"""Process answer.
:param bool answer:
Did the subject accept?
:param str metadata:
Metadata from last user acceptance or rejection request.
"""
self.write({
"state": "answered",
"accepted": answer,
"last_metadata": metadata,
})

31
privacy_consent/models/res_partner.py

@ -1,31 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
class ResPartner(models.Model):
_inherit = "res.partner"
privacy_consent_ids = fields.One2many(
"privacy.consent",
"partner_id",
"Privacy consents",
)
privacy_consent_count = fields.Integer(
"Consents",
compute="_compute_privacy_consent_count",
help="Privacy consent requests amount",
)
@api.depends("privacy_consent_ids")
def _compute_privacy_consent_count(self):
"""Count consent requests."""
groups = self.env["privacy.consent"].read_group(
[("partner_id", "in", self.ids)],
["partner_id"],
["partner_id"],
)
for group in groups:
self.browse(group["partner_id"][0], self._prefetch) \
.privacy_consent_count = group["partner_id_count"]

7
privacy_consent/readme/CONTRIBUTORS.rst

@ -1,7 +0,0 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Jairo Llopis
* `initOS GmbH <https://www.initos.com>`_:
* Florian Kantelberg

7
privacy_consent/readme/DESCRIPTION.rst

@ -1,7 +0,0 @@
This module allows the user to define a set of subjects (partners)
affected by any data processing activity, and establish
a process to ask them for consent to include them in that activity.
For those that need explicit consent as a lawfulness base for personal data
processing, as required by GDPR (article 6.1.a), this module provides the
needed tools to automate it.

15
privacy_consent/readme/INSTALL.rst

@ -1,15 +0,0 @@
You may want to install, along with this module, one of OCA's
``mail_tracking`` module collection, such as ``mail_tracking_mailgun``, so
you can provide more undeniable proof that some consent request was sent, and
to whom.
However, the most important proof to provide is the answer itself (more than
the question), and this addon provides enough tooling for that.
Multi-database instances
~~~~~~~~~~~~~~~~~~~~~~~~
To enable multi-database support, you must load this addon as a server-wide
addon. Example command to boot Odoo::
odoo-bin --load=web,privacy_consent

69
privacy_consent/readme/USAGE.rst

@ -1,69 +0,0 @@
New options for data processing activities:
#. Go to *Privacy > Master Data > Activities* and create one.
#. Give it a name, such as *Sending mass mailings to customers*.
#. Go to tab *Consent* and choose one option in *Ask subjects for consent*:
* *Manual* tells the activity that you will want to create and send the
consent requests manually, and only provides some helpers for you to
be able to batch-generate them.
* *Automatic* enables this module's full power: send all consent requests
to selected partners automatically, every day and under your demand.
#. When you do this, all the consent-related options appear. Configure them:
* A smart button tells you how many consents have been generated, and lets you
access them.
* Choose one *Email template* to send to subjects. This email itself is what
asks for consent, and it gets recorded, to serve as a proof that it was sent.
The module provides a default template that should be good for most usage
cases; and if you create one directly from that field, some good defaults
are provided for your comfortability.
* *Subjects filter* defines what partners will be elegible for inclusion in
this data processing activity.
* You can enable *Accepted by default* if you want to assume subjects
accepted their data processing. You should possibly consult your
lawyer to use this.
* You can choose a *Server action* (developer mode only) that will
be executed whenever a new non-draft consent request is created,
or when its acceptance status changes.
This module supplies a server action by default, called
*Update partner's opt out*, that syncs the acceptance status with the
partner's *Elegible for mass mailings* option.
#. Click on *Generate consent requests* link to create new consent requests.
* If you chose *Manual* mode, all missing consent request are created as
drafts, and nothing else is done now.
* If you chose *Automatic* mode, also those request e-mails are enqueued
and, when the mail queue is cleared, they will be set as *Sent*.
#. You will be presented with the list of just-created consent requests.
See below.
New options for consent requests:
#. Access the consent requests by either:
* Generating new consent requests from a data processing activity.
* Pressing the *Consents* smart button in a data processing activity.
* Going to *Privacy > Privacy > Consents*.
#. A consent will include the partner, the activity, the acceptance status,
and the request state.
#. You can manually ask for consent by pressing the button labeled as
*Ask for consent*.
#. All consent requests and responses are recorded in the mail thread below.

3
privacy_consent/security/ir.model.access.csv

@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
privacy_consent_read,Permission to read consents,model_privacy_consent,privacy.group_data_protection_user,1,0,0,0
privacy_consent_write,Permission to write consents,model_privacy_consent,privacy.group_data_protection_manager,1,1,1,1

BIN
privacy_consent/static/description/icon.png

Before

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

525
privacy_consent/static/description/index.html

@ -1,525 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Privacy - Consent</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="privacy-consent">
<h1 class="title">Privacy - Consent</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Production/Stable" src="https://img.shields.io/badge/maturity-Production%2FStable-green.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/privacy_consent"><img alt="OCA/data-protection" src="https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-privacy_consent"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/263/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows the user to define a set of subjects (partners)
affected by any data processing activity, and establish
a process to ask them for consent to include them in that activity.</p>
<p>For those that need explicit consent as a lawfulness base for personal data
processing, as required by GDPR (article 6.1.a), this module provides the
needed tools to automate it.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="id1">Installation</a><ul>
<li><a class="reference internal" href="#multi-database-instances" id="id2">Multi-database instances</a></li>
</ul>
</li>
<li><a class="reference internal" href="#usage" id="id3">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id7">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#id1">Installation</a></h1>
<p>You may want to install, along with this module, one of OCA’s
<tt class="docutils literal">mail_tracking</tt> module collection, such as <tt class="docutils literal">mail_tracking_mailgun</tt>, so
you can provide more undeniable proof that some consent request was sent, and
to whom.</p>
<p>However, the most important proof to provide is the answer itself (more than
the question), and this addon provides enough tooling for that.</p>
<div class="section" id="multi-database-instances">
<h2><a class="toc-backref" href="#id2">Multi-database instances</a></h2>
<p>To enable multi-database support, you must load this addon as a server-wide
addon. Example command to boot Odoo:</p>
<pre class="literal-block">
odoo-bin --load=web,privacy_consent
</pre>
</div>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id3">Usage</a></h1>
<p>New options for data processing activities:</p>
<ol class="arabic">
<li><p class="first">Go to <em>Privacy &gt; Master Data &gt; Activities</em> and create one.</p>
</li>
<li><p class="first">Give it a name, such as <em>Sending mass mailings to customers</em>.</p>
</li>
<li><p class="first">Go to tab <em>Consent</em> and choose one option in <em>Ask subjects for consent</em>:</p>
<ul class="simple">
<li><em>Manual</em> tells the activity that you will want to create and send the
consent requests manually, and only provides some helpers for you to
be able to batch-generate them.</li>
<li><em>Automatic</em> enables this module’s full power: send all consent requests
to selected partners automatically, every day and under your demand.</li>
</ul>
</li>
<li><p class="first">When you do this, all the consent-related options appear. Configure them:</p>
<ul>
<li><p class="first">A smart button tells you how many consents have been generated, and lets you
access them.</p>
</li>
<li><p class="first">Choose one <em>Email template</em> to send to subjects. This email itself is what
asks for consent, and it gets recorded, to serve as a proof that it was sent.
The module provides a default template that should be good for most usage
cases; and if you create one directly from that field, some good defaults
are provided for your comfortability.</p>
</li>
<li><p class="first"><em>Subjects filter</em> defines what partners will be elegible for inclusion in
this data processing activity.</p>
</li>
<li><p class="first">You can enable <em>Accepted by default</em> if you want to assume subjects
accepted their data processing. You should possibly consult your
lawyer to use this.</p>
</li>
<li><p class="first">You can choose a <em>Server action</em> (developer mode only) that will
be executed whenever a new non-draft consent request is created,
or when its acceptance status changes.</p>
<p>This module supplies a server action by default, called
<em>Update partner’s opt out</em>, that syncs the acceptance status with the
partner’s <em>Elegible for mass mailings</em> option.</p>
</li>
</ul>
</li>
<li><p class="first">Click on <em>Generate consent requests</em> link to create new consent requests.</p>
<ul class="simple">
<li>If you chose <em>Manual</em> mode, all missing consent request are created as
drafts, and nothing else is done now.</li>
<li>If you chose <em>Automatic</em> mode, also those request e-mails are enqueued
and, when the mail queue is cleared, they will be set as <em>Sent</em>.</li>
</ul>
</li>
<li><p class="first">You will be presented with the list of just-created consent requests.
See below.</p>
</li>
</ol>
<p>New options for consent requests:</p>
<ol class="arabic simple">
<li>Access the consent requests by either:<ul>
<li>Generating new consent requests from a data processing activity.</li>
<li>Pressing the <em>Consents</em> smart button in a data processing activity.</li>
<li>Going to <em>Privacy &gt; Privacy &gt; Consents</em>.</li>
</ul>
</li>
<li>A consent will include the partner, the activity, the acceptance status,
and the request state.</li>
<li>You can manually ask for consent by pressing the button labeled as
<em>Ask for consent</em>.</li>
<li>All consent requests and responses are recorded in the mail thread below.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/data-protection/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/data-protection/issues/new?body=module:%20privacy_consent%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id5">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id6">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
<li>initOS GmbH</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id7">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Jairo Llopis</li>
</ul>
</li>
<li><a class="reference external" href="https://www.initos.com">initOS GmbH</a>:<ul>
<li>Florian Kantelberg</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/privacy_consent">OCA/data-protection</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

63
privacy_consent/templates/form.xml

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<template id="form" name="Consent response processed">
<!-- Use web.login_layout because it gets automatically wrapped
by website layout if website is installed, and otherwise includes
all possibly needed assets -->
<t t-call="web.login_layout">
<div class="container readable">
<div class="jumbotron">
<h1>Thank you!</h1>
<p>
Hello, <b t-esc="consent.partner_id.display_name"/>
</p>
<p>
We asked you to authorize us to process your data in this data processing activity:
<b t-esc="consent.activity_id.display_name"/>
</p>
<t t-raw="consent.activity_id.description or ''"/>
<p t-if="consent.accepted">
You have <b class="text-success">accepted</b> such processing.
</p>
<p t-else="">
You have <b class="text-danger">rejected</b> such processing.
</p>
<p>
We have recorded this action on your side.
</p>
<p>
If it was a mistake, you can undo it here:
<div class="text-center">
<a
t-if="consent.accepted"
t-att-href="consent._url(False)"
class="btn btn-danger btn-lg"
>
I <b>reject</b> this processing of my data
</a>
<a
t-else=""
t-att-href="consent._url(True)"
class="btn btn-success btn-lg"
>
I <b>accept</b> this processing of my data
</a>
</div>
</p>
<p>
Thanks for your response.
</p>
<p class="text-muted">
Sincerely,<br/>
<i t-raw="consent.activity_id.controller_id.with_context(show_address=True, html_format=True).name_get()[0][1]"/>
</p>
</div>
</div>
</t>
</template>
</data>

1
privacy_consent/tests/__init__.py

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

252
privacy_consent/tests/test_consent.py

@ -1,252 +0,0 @@
# Copyright 2018 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from contextlib import contextmanager
from odoo.exceptions import ValidationError
from odoo.tests.common import HttpCase
class ActivityCase(HttpCase):
def setUp(self):
super(ActivityCase, self).setUp()
# HACK https://github.com/odoo/odoo/issues/12237
# TODO Remove hack in v12
self._oldenv = self.env
self.env = self._oldenv(self.cursor())
# HACK end
self.cron = self.env.ref("privacy_consent.cron_auto_consent")
self.cron_mail_queue = self.env.ref(
"mail.ir_cron_mail_scheduler_action")
self.update_opt_out = self.env.ref("privacy_consent.update_opt_out")
self.mt_consent_consent_new = self.env.ref(
"privacy_consent.mt_consent_consent_new")
self.mt_consent_acceptance_changed = self.env.ref(
"privacy_consent.mt_consent_acceptance_changed")
self.mt_consent_state_changed = self.env.ref(
"privacy_consent.mt_consent_state_changed")
# Some partners to ask for consent
self.partners = self.env["res.partner"]
self.partners += self.partners.create({
"name": "consent-partner-0",
"email": "partner0@example.com",
"notify_email": "none",
"opt_out": False,
})
self.partners += self.partners.create({
"name": "consent-partner-1",
"email": "partner1@example.com",
"notify_email": "always",
"opt_out": True,
})
self.partners += self.partners.create({
"name": "consent-partner-2",
"email": "partner2@example.com",
"opt_out": False,
})
# Partner without email, on purpose
self.partners += self.partners.create({
"name": "consent-partner-3",
"opt_out": True,
})
# Activity without consent
self.activity_noconsent = self.env["privacy.activity"].create({
"name": "activity_noconsent",
"description": "I'm activity 1",
})
# Activity with auto consent, for all partners
self.activity_auto = self.env["privacy.activity"].create({
"name": "activity_auto",
"description": "I'm activity auto",
"subject_find": True,
"subject_domain": repr([("id", "in", self.partners.ids)]),
"consent_required": "auto",
"default_consent": True,
"server_action_id": self.update_opt_out.id,
})
# Activity with manual consent, skipping partner 0
self.activity_manual = self.env["privacy.activity"].create({
"name": "activity_manual",
"description": "I'm activity 3",
"subject_find": True,
"subject_domain": repr([("id", "in", self.partners[1:].ids)]),
"consent_required": "manual",
"default_consent": False,
"server_action_id": self.update_opt_out.id,
})
# HACK https://github.com/odoo/odoo/issues/12237
# TODO Remove hack in v12
def tearDown(self):
self.env = self._oldenv
super(ActivityCase, self).tearDown()
# HACK https://github.com/odoo/odoo/issues/12237
# TODO Remove hack in v12
@contextmanager
def release_cr(self):
self.env.cr.release()
yield
self.env.cr.acquire()
def check_activity_auto_properly_sent(self):
"""Check emails sent by ``self.activity_auto``."""
consents = self.env["privacy.consent"].search([
("activity_id", "=", self.activity_auto.id),
])
# Check pending mails
for consent in consents:
self.assertEqual(consent.state, "draft")
messages = consent.message_ids
self.assertEqual(len(messages), 2)
# Check sent mails
self.cron_mail_queue.method_direct_trigger()
for consent in consents:
self.assertEqual(consent.state, "sent")
messages = consent.message_ids
self.assertEqual(len(messages), 3)
# 2nd message notifies creation
self.assertEqual(
messages[2].subtype_id,
self.mt_consent_consent_new,
)
# 3rd message notifies subject
# Placeholder links should be logged
self.assertTrue("/privacy/consent/accept/" in messages[1].body)
self.assertTrue("/privacy/consent/reject/" in messages[1].body)
# Tokenized links shouldn't be logged
self.assertFalse(consent._url(True) in messages[1].body)
self.assertFalse(consent._url(False) in messages[1].body)
# 4th message contains the state change
self.assertEqual(
messages[0].subtype_id,
self.mt_consent_state_changed,
)
# Partner's opt_out should be synced with default consent
self.assertFalse(consent.partner_id.opt_out)
def test_default_template(self):
"""We have a good mail template by default."""
good = self.env.ref("privacy_consent.template_consent")
self.assertEqual(
self.activity_noconsent.consent_template_id,
good,
)
self.assertEqual(
self.activity_noconsent.consent_template_default_body_html,
good.body_html,
)
self.assertEqual(
self.activity_noconsent.consent_template_default_subject,
good.subject,
)
def test_find_subject_if_consent_required(self):
"""If user wants to require consent, it needs subjects."""
# Test the onchange helper
onchange_activity1 = self.env["privacy.activity"].new(
self.activity_noconsent.copy_data()[0])
self.assertFalse(onchange_activity1.subject_find)
onchange_activity1.consent_required = "auto"
onchange_activity1._onchange_consent_required_subject_find()
self.assertTrue(onchange_activity1.subject_find)
# Test very dumb user that forces an error
with self.assertRaises(ValidationError):
self.activity_noconsent.consent_required = "manual"
def test_template_required_auto(self):
"""Automatic consent activities need a template."""
self.activity_noconsent.subject_find = True
self.activity_noconsent.consent_template_id = False
self.activity_noconsent.consent_required = "manual"
with self.assertRaises(ValidationError):
self.activity_noconsent.consent_required = "auto"
def test_generate_manually(self):
"""Manually-generated consents work as expected."""
self.partners.write({"opt_out": False})
result = self.activity_manual.action_new_consents()
self.assertEqual(result["res_model"], "privacy.consent")
consents = self.env[result["res_model"]].search(result["domain"])
self.assertEqual(consents.mapped("state"), ["draft"] * 2)
self.assertEqual(consents.mapped("partner_id.opt_out"), [False] * 2)
self.assertEqual(consents.mapped("accepted"), [False] * 2)
self.assertEqual(consents.mapped("last_metadata"), [False] * 2)
# Check sent mails
messages = consents.mapped("message_ids")
self.assertEqual(len(messages), 2)
subtypes = messages.mapped("subtype_id")
self.assertTrue(subtypes & self.mt_consent_consent_new)
self.assertFalse(subtypes & self.mt_consent_acceptance_changed)
self.assertFalse(subtypes & self.mt_consent_state_changed)
# Send one manual request
action = consents[0].action_manual_ask()
self.assertEqual(action["res_model"], "mail.compose.message")
composer = self.env[action["res_model"]] \
.with_context(active_ids=consents[0].ids,
active_model=consents._name,
**action["context"]).create({})
composer.onchange_template_id_wrapper()
composer.send_mail()
messages = consents.mapped("message_ids") - messages
self.assertEqual(len(messages), 2)
self.assertEqual(messages[0].subtype_id, self.mt_consent_state_changed)
self.assertEqual(consents.mapped("state"), ["sent", "draft"])
self.assertEqual(consents.mapped("partner_id.opt_out"), [True, False])
# Placeholder links should be logged
self.assertTrue("/privacy/consent/accept/" in messages[1].body)
self.assertTrue("/privacy/consent/reject/" in messages[1].body)
# Tokenized links shouldn't be logged
accept_url = consents[0]._url(True)
reject_url = consents[0]._url(False)
self.assertNotIn(accept_url, messages[1].body)
self.assertNotIn(reject_url, messages[1].body)
# Visit tokenized accept URL
with self.release_cr():
result = self.url_open(accept_url).text
self.assertIn("accepted", result)
self.assertIn(reject_url, result)
self.assertIn(self.activity_manual.name, result)
self.assertIn(self.activity_manual.description, result)
consents.invalidate_cache()
self.assertEqual(consents.mapped("accepted"), [True, False])
self.assertTrue(consents[0].last_metadata)
self.assertFalse(consents[0].partner_id.opt_out)
self.assertEqual(consents.mapped("state"), ["answered", "draft"])
self.assertEqual(
consents[0].message_ids[0].subtype_id,
self.mt_consent_acceptance_changed,
)
# Visit tokenized reject URL
with self.release_cr():
result = self.url_open(reject_url).text
self.assertIn("rejected", result)
self.assertIn(accept_url, result)
self.assertIn(self.activity_manual.name, result)
self.assertIn(self.activity_manual.description, result)
consents.invalidate_cache()
self.assertEqual(consents.mapped("accepted"), [False, False])
self.assertTrue(consents[0].last_metadata)
self.assertTrue(consents[0].partner_id.opt_out)
self.assertEqual(consents.mapped("state"), ["answered", "draft"])
self.assertEqual(
consents[0].message_ids[0].subtype_id,
self.mt_consent_acceptance_changed,
)
self.assertFalse(consents[1].last_metadata)
def test_generate_automatically(self):
"""Automatically-generated consents work as expected."""
result = self.activity_auto.action_new_consents()
self.assertEqual(result["res_model"], "privacy.consent")
self.check_activity_auto_properly_sent()
def test_generate_cron(self):
"""Cron-generated consents work as expected."""
self.cron.method_direct_trigger()
self.check_activity_auto_properly_sent()
def test_mail_template_without_links(self):
"""Cannot create mail template without needed links."""
with self.assertRaises(ValidationError):
self.activity_manual.consent_template_id.body_html = "No links :("

88
privacy_consent/views/privacy_activity.xml

@ -1,88 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record id="activity_form" model="ir.ui.view">
<field name="name">Add consent fields</field>
<field name="model">privacy.activity</field>
<field name="inherit_id" ref="privacy.activity_form"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button
attrs='{"invisible": [("consent_required", "=", False)]}'
class="oe_stat_button"
context='{"search_default_activity_id": active_id}'
icon="fa-handshake-o"
name="%(consent_action)d"
type="action"
>
<field
name="consent_count"
widget="statinfo"
/>
</button>
</div>
<notebook name="advanced" position="inside">
<page string="Consent" name="consent">
<group>
<label for="consent_required"/>
<div>
<field name="consent_required" class="oe_inline"/>
<button
attrs='{"invisible": [("consent_required", "!=", "manual")]}'
class="btn-link"
icon="fa-user-plus"
name="action_new_consents"
type="object"
string="Generate missing draft consent requests"
/>
<button
attrs='{"invisible": [("consent_required", "!=", "auto")]}'
class="btn-link"
icon="fa-user-plus"
name="action_new_consents"
type="object"
string="Generate and enqueue missing consent requests"
confirm="This could enqueue many consent emails, are you sure to proceed?"
/>
</div>
</group>
<group
attrs='{"invisible": [("consent_required", "=", False)]}'
>
<group>
<field name="default_consent"/>
<field
name="server_action_id"
groups="base.group_no_one"
/>
</group>
<group>
<field
name="consent_template_default_body_html"
invisible="1"
/>
<field
name="consent_template_default_subject"
invisible="1"
/>
<field
name="consent_template_id"
attrs='{"required": [("consent_required", "=", "auto")]}'
context='{
"default_model": "privacy.consent",
"default_body_html": consent_template_default_body_html,
"default_subject": consent_template_default_subject,
}'
/>
</group>
</group>
</page>
</notebook>
</field>
</record>
</data>

113
privacy_consent/views/privacy_consent.xml

@ -1,113 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record model="ir.ui.view" id="consent_form">
<field name="name">Privacy Consent Form</field>
<field name="model">privacy.consent</field>
<field name="arch" type="xml">
<form>
<header>
<button
type="object"
name="action_manual_ask"
class="oe_highlight"
string="Ask for consent"
/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button
class="oe_stat_button"
icon="fa-archive"
name="toggle_active"
type="object"
>
<field
name="active"
options='{"terminology": "archive"}'
widget="boolean_button"
/>
</button>
</div>
<group>
<field name="partner_id"/>
<field name="activity_id"/>
<field name="accepted"/>
<field name="last_metadata"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record model="ir.ui.view" id="consent_tree">
<field name="name">Privacy Consent Tree</field>
<field name="model">privacy.consent</field>
<field name="arch" type="xml">
<tree>
<field name="activity_id"/>
<field name="partner_id"/>
<field name="state"/>
<field name="accepted"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="consent_search">
<field name="name">Privacy Consent Search</field>
<field name="model">privacy.consent</field>
<field name="arch" type="xml">
<search>
<field name="activity_id"/>
<field name="partner_id"/>
<field name="state"/>
<field name="accepted"/>
<separator/>
<filter
string="Archived"
name="inactive"
domain="[('active', '=', False)]"
/>
<separator/>
<group string="Group By" name="groupby">
<filter
name="activity_id_groupby"
string="Activity"
context="{'group_by': 'activity_id'}"
/>
<filter
name="state_groupby"
string="State"
context="{'group_by': 'state'}"
/>
<filter
name="accepted_groupby"
string="Accepted"
context="{'group_by': 'accepted'}"
/>
</group>
</search>
</field>
</record>
<act_window
id="consent_action"
name="Consents"
res_model="privacy.consent"
/>
<menuitem
action="consent_action"
id="menu_privacy_consent"
parent="privacy.menu_data_protection_master_data"
/>
</data>

34
privacy_consent/views/res_partner.xml

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Tecnativa - Jairo Llopis
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<data>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">Add consent smart button</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field
name="groups_id"
eval="[(4, ref('privacy.group_data_protection_user'))]"
/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button
attrs='{"invisible": [("privacy_consent_count", "=", 0)]}'
class="oe_stat_button"
context='{"search_default_partner_id": active_id}'
icon="fa-handshake-o"
name="%(consent_action)d"
type="action"
>
<field
name="privacy_consent_count"
widget="statinfo"
/>
</button>
</div>
</field>
</record>
</data>

91
privacy_partner_report/README.rst

@ -1,91 +0,0 @@
======================
Privacy Partner Report
======================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github
:target: https://github.com/OCA/data-protection/tree/11.0/privacy_partner_report
:alt: OCA/data-protection
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-privacy_partner_report
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/263/11.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module helps a company to identify all the transactions that a specific
partner is involved in, with the possibility to export the associated data.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to:
#. Go to menu of ``Privacy > Reports > Partner Report``.
#. Select a partner, and then wait some seconds until a list of models appear.
#. Click on ``Export XLSX``.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/data-protection/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 <https://github.com/OCA/data-protection/issues/new?body=module:%20privacy_partner_report%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Eficent
Contributors
~~~~~~~~~~~~
* Miquel Raïch <miquel.raich@eficent.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-mreficent| image:: https://github.com/mreficent.png?size=40px
:target: https://github.com/mreficent
:alt: mreficent
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-mreficent|
This module is part of the `OCA/data-protection <https://github.com/OCA/data-protection/tree/11.0/privacy_partner_report>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

2
privacy_partner_report/__init__.py

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

20
privacy_partner_report/__manifest__.py

@ -1,20 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
'name': 'Privacy Partner Report',
'version': '11.0.1.0.0',
'category': 'GDPR',
'summary': 'Show the transactions that a specific partner is involved in.',
'author': "Eficent, "
"Odoo Community Association (OCA)",
'website': 'https://github.com/OCA/data-protection/',
'license': 'AGPL-3',
'depends': ['privacy', 'report_xlsx'],
'data': [
'wizard/privacy_report_partner_wizard.xml',
'views/privacy_report.xml',
'views/privacy_menu_view.xml',
],
'installable': True,
'maintainers': ['mreficent'],
}

174
privacy_partner_report/i18n/de.po

@ -1,174 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_partner_report
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-04-26 13:16+0000\n"
"Last-Translator: dw3gn3r <denise.wegner@initos.com>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5.1\n"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "<span>Select a company</span><br/>"
msgstr "<span>Wählen Sie eine Firma</span><br/>"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "<span>Select a partner</span><br/>"
msgstr "<span>Wählen Sie einen Partner</span><br/>"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_company_id
msgid "Company"
msgstr "Unternehmen"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_create_uid
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_create_date
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_name
msgid "Database Table"
msgstr "Datenbanktabelle"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_display_name
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_display_name
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx_display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Export XLSX"
msgstr "XLSX exportieren"
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:121
#, python-format
msgid "Form content is missing, this report cannot be printed."
msgstr "Formularinhalt fehlt, dieser Bericht kann nicht gedruckt werden."
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_id
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_id
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx_id
msgid "ID"
msgstr "Kennung"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data___last_update
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report___last_update
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx___last_update
msgid "Last Modified on"
msgstr "Letzte Änderung am"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_write_uid
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert von"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_write_date
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: privacy_partner_report
#: model:ir.model.fields,help:privacy_partner_report.field_privacy_partner_data_res_ids
msgid "List of Related Document IDs"
msgstr "Vorlagen"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_model_id
msgid "Models"
msgstr "Vorlagen"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_table_ids
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Models with related partner data"
msgstr "Vorlagen mit zugehörigen Partnerdaten"
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:66
#, python-format
msgid "No data for this partner."
msgstr "Keine Daten zu diesem Partner gefunden."
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:125
#, python-format
msgid "No provided partner."
msgstr "Kein unterstützter Partner."
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_count_rows
msgid "Number of lines"
msgstr "Anzahl der Zeilen"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_partner_id
msgid "Partner"
msgstr "Partner"
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/report/privacy_partner_xlsx.py:31
#, python-format
msgid "Partner Data"
msgstr "Partnerdaten"
#. module: privacy_partner_report
#: model:ir.actions.act_window,name:privacy_partner_report.action_privacy_partner_menu
#: model:ir.ui.menu,name:privacy_partner_report.menu_privacy_report_privacy_report
msgid "Partner Report"
msgstr "Partnerbericht"
#. module: privacy_partner_report
#: model:ir.actions.report,name:privacy_partner_report.report_partner_xlsx
#: model:ir.model,name:privacy_partner_report.model_privacy_partner_data
msgid "Privacy Partner Data"
msgstr "Datenschutz Partnerdaten"
#. module: privacy_partner_report
#: model:ir.model,name:privacy_partner_report.model_privacy_partner_report
msgid "Privacy Partner Report"
msgstr "Datenschutz Partnerbericht"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_res_ids
msgid "Related Document IDs"
msgstr "Zugehörige Dokumentenkennung"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Report Options"
msgstr "Berichtsoptionen"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_field_type
msgid "Type"
msgstr "Typ"
#. module: privacy_partner_report
#: model:ir.model,name:privacy_partner_report.model_report_privacy_partner_report_report_partner_xlsx
msgid "report.privacy_partner_report.report_partner_xlsx"
msgstr "oder"

174
privacy_partner_report/i18n/it.po

@ -1,174 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_partner_report
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-06-07 15:37+0000\n"
"Last-Translator: Sergio Zanchetta <primes2h@gmail.com>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.6.1\n"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "<span>Select a company</span><br/>"
msgstr "<span>Selezionare un'azienda</span><br/>"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "<span>Select a partner</span><br/>"
msgstr "<span>Selezionare un partner</span><br/>"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_company_id
msgid "Company"
msgstr "Azienda"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_create_uid
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_create_uid
msgid "Created by"
msgstr "Creato da"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_create_date
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_create_date
msgid "Created on"
msgstr "Creato il"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_name
msgid "Database Table"
msgstr "Tabella database"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_display_name
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_display_name
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx_display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Export XLSX"
msgstr "Esporta XLSX"
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:121
#, python-format
msgid "Form content is missing, this report cannot be printed."
msgstr "Modulo senza contenuto, impossibile stampare il resoconto."
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_id
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_id
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx_id
msgid "ID"
msgstr "ID"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data___last_update
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report___last_update
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx___last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_write_uid
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_write_date
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: privacy_partner_report
#: model:ir.model.fields,help:privacy_partner_report.field_privacy_partner_data_res_ids
msgid "List of Related Document IDs"
msgstr "Elenco ID dei documenti collegati"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_model_id
msgid "Models"
msgstr "Modelli"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_table_ids
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Models with related partner data"
msgstr "Modelli con dati del partner collegato"
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:66
#, python-format
msgid "No data for this partner."
msgstr "Nessun dato per questo partner."
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:125
#, python-format
msgid "No provided partner."
msgstr "Nessun partner assegnato."
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_count_rows
msgid "Number of lines"
msgstr "Numero di righe"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_partner_id
msgid "Partner"
msgstr "Partner"
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/report/privacy_partner_xlsx.py:31
#, python-format
msgid "Partner Data"
msgstr "Dati partner"
#. module: privacy_partner_report
#: model:ir.actions.act_window,name:privacy_partner_report.action_privacy_partner_menu
#: model:ir.ui.menu,name:privacy_partner_report.menu_privacy_report_privacy_report
msgid "Partner Report"
msgstr "Resoconto partner"
#. module: privacy_partner_report
#: model:ir.actions.report,name:privacy_partner_report.report_partner_xlsx
#: model:ir.model,name:privacy_partner_report.model_privacy_partner_data
msgid "Privacy Partner Data"
msgstr "Dati privacy del partner"
#. module: privacy_partner_report
#: model:ir.model,name:privacy_partner_report.model_privacy_partner_report
msgid "Privacy Partner Report"
msgstr "Resoconto privacy del partner"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_res_ids
msgid "Related Document IDs"
msgstr "ID documenti collegati"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Report Options"
msgstr "Opzioni resoconto"
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_field_type
msgid "Type"
msgstr "Tipo"
#. module: privacy_partner_report
#: model:ir.model,name:privacy_partner_report.model_report_privacy_partner_report_report_partner_xlsx
msgid "report.privacy_partner_report.report_partner_xlsx"
msgstr "report.privacy_partner_report.report_partner_xlsx"

172
privacy_partner_report/i18n/privacy_partner_report.pot

@ -1,172 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_partner_report
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "<span>Select a company</span><br/>"
msgstr ""
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "<span>Select a partner</span><br/>"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_company_id
msgid "Company"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_create_uid
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_create_uid
msgid "Created by"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_create_date
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_create_date
msgid "Created on"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_name
msgid "Database Table"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_display_name
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_display_name
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx_display_name
msgid "Display Name"
msgstr ""
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Export XLSX"
msgstr ""
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:121
#, python-format
msgid "Form content is missing, this report cannot be printed."
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_id
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_id
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx_id
msgid "ID"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data___last_update
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report___last_update
#: model:ir.model.fields,field_description:privacy_partner_report.field_report_privacy_partner_report_report_partner_xlsx___last_update
msgid "Last Modified on"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_write_uid
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_write_uid
msgid "Last Updated by"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_write_date
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_write_date
msgid "Last Updated on"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,help:privacy_partner_report.field_privacy_partner_data_res_ids
msgid "List of Related Document IDs"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_model_id
msgid "Models"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_table_ids
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Models with related partner data"
msgstr ""
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:66
#, python-format
msgid "No data for this partner."
msgstr ""
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/wizard/privacy_report_partner.py:125
#, python-format
msgid "No provided partner."
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_count_rows
msgid "Number of lines"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_report_partner_id
msgid "Partner"
msgstr ""
#. module: privacy_partner_report
#: code:addons/privacy_partner_report/report/privacy_partner_xlsx.py:31
#, python-format
msgid "Partner Data"
msgstr ""
#. module: privacy_partner_report
#: model:ir.actions.act_window,name:privacy_partner_report.action_privacy_partner_menu
#: model:ir.ui.menu,name:privacy_partner_report.menu_privacy_report_privacy_report
msgid "Partner Report"
msgstr ""
#. module: privacy_partner_report
#: model:ir.actions.report,name:privacy_partner_report.report_partner_xlsx
#: model:ir.model,name:privacy_partner_report.model_privacy_partner_data
msgid "Privacy Partner Data"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model,name:privacy_partner_report.model_privacy_partner_report
msgid "Privacy Partner Report"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_res_ids
msgid "Related Document IDs"
msgstr ""
#. module: privacy_partner_report
#: model:ir.ui.view,arch_db:privacy_partner_report.privacy_partner_report_wizard
msgid "Report Options"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model.fields,field_description:privacy_partner_report.field_privacy_partner_data_field_type
msgid "Type"
msgstr ""
#. module: privacy_partner_report
#: model:ir.model,name:privacy_partner_report.model_report_privacy_partner_report_report_partner_xlsx
msgid "report.privacy_partner_report.report_partner_xlsx"
msgstr ""

1
privacy_partner_report/readme/CONTRIBUTORS.rst

@ -1 +0,0 @@
* Miquel Raïch <miquel.raich@eficent.com>

2
privacy_partner_report/readme/DESCRIPTION.rst

@ -1,2 +0,0 @@
This module helps a company to identify all the transactions that a specific
partner is involved in, with the possibility to export the associated data.

5
privacy_partner_report/readme/USAGE.rst

@ -1,5 +0,0 @@
To use this module, you need to:
#. Go to menu of ``Privacy > Reports > Partner Report``.
#. Select a partner, and then wait some seconds until a list of models appear.
#. Click on ``Export XLSX``.

1
privacy_partner_report/report/__init__.py

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

83
privacy_partner_report/report/privacy_partner_xlsx.py

@ -1,83 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
import logging
from odoo import models
from odoo.tools.translate import _
_logger = logging.getLogger(__name__)
class ReportPartnerXlsx(models.AbstractModel):
_name = 'report.privacy_partner_report.report_partner_xlsx'
_inherit = 'report.report_xlsx.abstract'
def _search_longest_row(self, tables):
res = 0
for table in tables:
for model in tables[table]:
if len(tables[table][model]) > 0:
if len(tables[table][model][0]) > res:
res = len(tables[table][model][0])
return res
def generate_xlsx_report(self, workbook, data, objects):
for o in objects:
report_data = o.compute_data_for_report(data)
partner = report_data['form'].get('partner_id', False)
partner = self.env['res.partner'].sudo().browse(partner[0])
workbook.set_properties({
'comments': 'Created with Python and XlsxWriter from Odoo'})
sheet = workbook.add_worksheet(_('Partner Data'))
sheet.set_landscape()
sheet.fit_to_pages(1, 0)
sheet.set_zoom(75)
sheet.set_column(0, self._search_longest_row(
report_data['tables']), 25)
title_style = workbook.add_format(
{'bold': True, 'bg_color': '#FFFFCC', 'border': 2})
sheet.set_row(0, None, None, {'collapsed': 1})
sheet.write_row(1, 0, ["Partner: " + partner.display_name],
title_style)
i = 3
first_row = i+2
for table in sorted(report_data['tables'].keys()):
for model in sorted(report_data['tables'][table].keys()):
rows = len(report_data['tables'][table][model])
if rows:
style = workbook.add_format()
style.set_bold(True)
style.set_border(2)
sheet.write_row(i, 0, [model], style)
i += 1
j = 0
for column in report_data['tables'][table][model][0]:
style = workbook.add_format()
style.set_bold(True)
if j == 0:
style.set_left(1)
if j == len(report_data['tables'][
table][model][0]) - 1:
style.set_right(1)
style.set_top(1)
style.set_bottom(1)
sheet.write_row(i, j, [column], style)
j += 1
for row in report_data['tables'][table][model]:
i += 1
j = 0
for column in row:
style = workbook.add_format()
if j == 0:
style.set_left(1)
if j == len(row) - 1:
style.set_right(1)
if i == rows + first_row - 1:
style.set_bottom(1)
if row[column]:
sheet.write_row(i, j, [row[column]], style)
else:
sheet.write_row(i, j, [''], style)
j += 1
i += 2
first_row = i+2

BIN
privacy_partner_report/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 2.1 KiB

432
privacy_partner_report/static/description/index.html

@ -1,432 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Privacy Partner Report</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="privacy-partner-report">
<h1 class="title">Privacy Partner Report</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/privacy_partner_report"><img alt="OCA/data-protection" src="https://img.shields.io/badge/github-OCA%2Fdata--protection-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/data-protection-11-0/data-protection-11-0-privacy_partner_report"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/263/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module helps a company to identify all the transactions that a specific
partner is involved in, with the possibility to export the associated data.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>To use this module, you need to:</p>
<ol class="arabic simple">
<li>Go to menu of <tt class="docutils literal">Privacy &gt; Reports &gt; Partner Report</tt>.</li>
<li>Select a partner, and then wait some seconds until a list of models appear.</li>
<li>Click on <tt class="docutils literal">Export XLSX</tt>.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/data-protection/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/data-protection/issues/new?body=module:%20privacy_partner_report%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Eficent</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Miquel Raïch &lt;<a class="reference external" href="mailto:miquel.raich&#64;eficent.com">miquel.raich&#64;eficent.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external" href="https://github.com/mreficent"><img alt="mreficent" src="https://github.com/mreficent.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/data-protection/tree/11.0/privacy_partner_report">OCA/data-protection</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

14
privacy_partner_report/views/privacy_menu_view.xml

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<menuitem id="menu_privacy_report_privacy_report"
name="Partner Report"
parent="privacy.menu_data_protection_report"
groups="privacy.group_data_protection_user"
sequence="10"
action="privacy_partner_report.action_privacy_partner_menu"
/>
</odoo>

12
privacy_partner_report/views/privacy_report.xml

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<report
id="report_partner_xlsx"
model="privacy.partner.report"
string="Privacy Partner Data"
report_type="xlsx"
name="privacy_partner_report.report_partner_xlsx"
file="privacy_partner_report"
attachment_use="False"
/>
</odoo>

1
privacy_partner_report/wizard/__init__.py

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

253
privacy_partner_report/wizard/privacy_report_partner.py

@ -1,253 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from odoo import api, fields, models, _
from odoo.exceptions import UserError
import ast
class PrivacyPartnerReport(models.TransientModel):
_name = "privacy.partner.report"
_description = "Privacy Partner Report"
company_id = fields.Many2one(
comodel_name='res.company',
string='Company',
required=True,
default=lambda self: self.env.user.company_id,
)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Partner',
required=True,
)
table_ids = fields.Many2many(
comodel_name='privacy.partner.data',
string='Models with related partner data',
)
@api.onchange('partner_id')
def _onchange_partner_id(self):
if self.partner_id:
data = self._get_tables_from_partner(self.partner_id)
names = self._get_table_names(data)
tables = self.env['privacy.partner.data']
for name in sorted(names):
vals = self._get_default_table(
name=name,
data=[t for t in data if t[0] == name and not t[5]],
)
if vals:
tables |= self.env['privacy.partner.data'].create(vals)
self.table_ids = tables
else:
self.table_ids = self.env['privacy.partner.data']
return {
'domain': {
'table_ids': [
('id', 'in', self.table_ids.ids)],
},
}
@api.onchange('company_id')
def _onchange_company_id(self):
if not self.company_id:
self.company_id = self.env.user.company_id
return {
'domain': {
'partner_id': [
('company_id', 'in', [self.company_id.id, False])],
},
}
@api.multi
def button_export_xlsx(self):
self.ensure_one()
if not self.table_ids:
raise UserError(_('No data for this partner.'))
return self.check_report(xlsx_report=True)
def _build_contexts(self, data):
result = {}
result['partner_id'] = data['form']['partner_id'][0] or False
result['company_id'] = data['form']['company_id'][0] or False
result['table_ids'] = 'table_ids' in data['form'] and \
data['form']['table_ids'] or False
return result
@staticmethod
def _transform_binary(binary):
# TODO: Implement if needed
return False
def _clean_data(self, model, rows):
cleaned_rows = []
for i, row in enumerate(rows):
cleaned_rows.append({})
for key, value in row.items():
label = self.env[model]._fields[key].string or key
if self.env[model]._fields[key].store:
if 'many2one' == self.env[model]._fields[key].type:
comodel = self.env[model]._fields[key].comodel_name
if value:
record = self.env[comodel].sudo().browse(value)
cleaned_rows[i][label] = record.display_name
else:
cleaned_rows[i][label] = rows[i][key]
elif 'binary' == self.env[model]._fields[key].type:
binary = self._transform_binary(rows[i][key])
if binary:
cleaned_rows[i][label] = binary
elif '2many' not in self.env[model]._fields[key].type:
cleaned_rows[i][label] = rows[i][key]
return cleaned_rows
@api.multi
def check_report(self, xlsx_report=False):
self.ensure_one()
data = {}
data['ids'] = self.env.context.get('active_ids', [])
data['model'] = self.env.context.get('active_model', 'ir.ui.menu')
data['form'] = self.read(['partner_id', 'company_id', 'table_ids'])[0]
used_context = self._build_contexts(data)
data['form']['id'] = str(data['form']['id'])
data['form']['used_context'] = dict(
used_context, lang=self.env.context.get('lang', 'en_US'))
return self._print_report(data=data, xlsx_report=xlsx_report)
@api.multi
def compute_data_for_report(self, data):
if not data.get('form'):
raise UserError(
_("Form content is missing, this report cannot be printed."))
partner = data['form'].get('partner_id', False)
if not partner:
raise UserError(
_("No provided partner."))
partner = self.env['res.partner'].sudo().browse(partner[0])
tables = data['form'].get('table_ids', False)
if tables:
tables = self.env['privacy.partner.data'].browse(tables)
tables = self._get_rows_from_tables(tables, partner)
data.update({'tables': tables, })
return data
def _exclude_column(self, model, column):
# https://github.com/odoo/odoo/issues/24927
if model in ('mail.compose.message', 'survey.mail.compose.message'):
if column in ('needaction_partner_ids', 'starred_partner_ids'):
return True
# feel free to add more specific cases meanwhile the issue is not fixed
return False
def _get_default_table(self, name, data):
if data:
field_type = data[0][4]
res = self.env[data[0][1]]
for t in data:
res |= self.env[t[1]].sudo().browse(t[3])
if res:
values = {
'name': name,
'model_id': self.env['ir.model'].sudo().search(
[('model', '=', res._name)]).id,
'count_rows': len(res.ids),
'field_type': field_type,
'res_ids': res.ids,
}
return values
return {}
def _get_model_from_table(self, table, partner):
new_tables = {}
for model in table.model_id:
rows = self._get_rows_from_model(model, partner)
new_tables[model.display_name] = rows
return new_tables
def _get_rows_from_model(self, model, partner):
lines = self.env[model.model]
columns = [k for k, v in self.env[model.model]._fields.items()
if v.comodel_name == 'res.partner' and
v.store and not self._exclude_column(model.model, k)]
for column in columns:
lines |= self.env[model.model].sudo().search(
[(column, '=', partner.id)])
rows = lines.sudo().read(load=False)
rows = self._clean_data(model.model, rows)
return rows
def _get_rows_from_tables(self, tables, partner):
new_tables = {}
for table in tables:
data_table = self._get_model_from_table(table, partner)
new_tables[str(table.name)] = data_table
return new_tables
def _get_table_names(self, data):
names = []
for t in data:
if t[3] and not t[5] and t[0] not in names:
names.append(t[0])
return names
def _get_tables_from_partner(self, partner):
tables = [t[0] for t in [
[[self.env[m]._table, m, k, self.env[m].sudo().search(
[(k, '=', partner.id)]).ids, v.type, self.env[m]._transient]
for k, v in self.env[m]._fields.items()
if v.comodel_name == 'res.partner' and self.env[m]._auto and
v.store and not self._exclude_column(m, k)]
for m in [x for x in self.env.registry.keys()]] if t]
for i, t in enumerate(tables):
if t[4] == 'many2many':
if t[3]:
relation = self.env[t[1]]._fields[t[2]].relation
if relation:
tables[i][0] = relation
return tables
def _print_report(self, data, xlsx_report=False):
records = self.env[data['model']].sudo().browse(data.get('ids', []))
if xlsx_report:
return self.env.ref('privacy_partner_report.report_partner_xlsx').\
with_context(landscape=True).report_action(
records, data=data)
class PrivacyPartnerData(models.TransientModel):
_name = "privacy.partner.data"
_description = "Privacy Partner Data"
name = fields.Char(
string='Database Table',
)
model_id = fields.Many2one(
comodel_name='ir.model',
ondelete='cascade',
string='Models',
)
field_type = fields.Char(
string="Type", oldname='type',
)
count_rows = fields.Integer(
default=0,
string='Number of lines',
)
res_ids = fields.Char('Related Document IDs', index=True,
help='List of Related Document IDs')
@api.multi
def action_view_records(self):
self.ensure_one()
response = {
'name': self.model_id.display_name,
'type': 'ir.actions.act_window',
'res_model': self.model_id.model,
'view_mode': 'tree,form',
'domain': [('id', 'in', ast.literal_eval(self.res_ids))],
'target': 'current',
'context': {'delete': True},
}
return response

51
privacy_partner_report/wizard/privacy_report_partner_wizard.xml

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<record id="privacy_partner_report_wizard" model="ir.ui.view">
<field name="name">Partner Report</field>
<field name="model">privacy.partner.report</field>
<field name="arch" type="xml">
<form string="Report Options">
<header>
<button name="button_export_xlsx" string="Export XLSX" type="object" default_focus="1" class="oe_highlight"/>
</header>
<group groups="base.group_multi_company">
<group>
<span >Select a company</span><br/>
<field name="company_id" options="{'no_create': True}" nolabel="1" />
</group>
</group>
<group>
<group>
<span>Select a partner</span><br/>
<field name="partner_id" options="{'no_create': True}" nolabel="1" domain="[('company_id', 'in', [False, company_id])]"/>
</group>
</group>
<group string='Models with related partner data' attrs="{'invisible': [('partner_id', '=', False)]}" col="1">
<field name="table_ids" options="{'no_create': True}" editable="bottom" nolabel="1">
<tree>
<field name="model_id"/>
<field name="count_rows" text-align="right"/>
<button name="action_view_records"
type="object" icon="fa-info-circle"
attrs="{'invisible': [('count_rows', '=', '0')]}" />
</tree>
</field>
</group>
</form>
</field>
</record>
<record id="action_privacy_partner_menu" model="ir.actions.act_window">
<field name="name">Partner Report</field>
<field name="res_model">privacy.partner.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="privacy_partner_report_wizard"/>
<field name="target">current</field>
</record>
</odoo>

71
privacy_right_to_be_forgotten/README.rst

@ -0,0 +1,71 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
============
Privacy GDPR
============
This module was written to extend the functionality of CRM to support
the new article 7 "Right to be forgotten" and allow you to delete customer's
personal information from your system.
Installation
============
To install this module, you need to:
Follow the usual procedure
Usage
=====
To use this module, you need to:
Navigate to a customer's form, click More -> GDPR Cleanup. You can see the
fields that will have their data removed from the system. Adjust and click
Cleanup for the operation to continue.
Keep in mind that
#. go to ...
image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/263/8.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/data-protection/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
------------
* George Daramouskas <gdaramouskas@therp.nl>
Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list <mailto:community@mail.odoo.com>`_ or the `appropriate specialized mailinglist <https://odoo-community.org/groups>`_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues.
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.

4
privacy_right_to_be_forgotten/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Therp BV <https://therp.nl>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import wizards

20
privacy_right_to_be_forgotten/__openerp__.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Therp BV <https://therp.nl>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Privacy GDPR",
"version": "8.0.1.0.0",
"author": "Therp BV,Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "GDPR",
"summary": "Allow a user to delete personal information for a customer.",
"depends": [
'base',
],
"data": [
'views/res_partner_gdpr.xml',
'data/ir_actions_act_window.xml',
],
"installable": True,
"application": False,
}

16
privacy_right_to_be_forgotten/data/ir_actions_act_window.xml

@ -0,0 +1,16 @@
<openerp>
<data>
<act_window id="gdpr_action"
name="GDPR Cleanup"
res_model="res.partner.gdpr"
src_model="res.partner"
view_mode="form"
view_id="res_partner_gdpr_form"
target="new"
context="{'default_partner_ids': active_ids}"
multi="True"
key2="client_action_multi" />
</data>
</openerp>

87
privacy_right_to_be_forgotten/i18n/fr.po

@ -0,0 +1,87 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_right_to_be_forgotten
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
#. module: privacy_right_to_be_forgotten
#: code:addons/privacy_right_to_be_forgotten/wizards/res_partner_gdpr.py:44
#, python-format
msgid "*** GDPR removed ***"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: view:res.partner.gdpr:privacy_right_to_be_forgotten.res_partner_gdpr_form
msgid "Cleanup"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: view:res.partner.gdpr:privacy_right_to_be_forgotten.res_partner_gdpr_form
msgid "Close"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,create_uid:0
msgid "Created by"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,create_date:0
msgid "Created on"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,display_name:0
msgid "Display Name"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,fields:0
msgid "Fields"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: help:res.partner.gdpr,fields:0
msgid "Fields to delete data from."
msgstr ""
#. module: privacy_right_to_be_forgotten
#: model:ir.actions.act_window,name:privacy_right_to_be_forgotten.gdpr_action
#: view:res.partner.gdpr:privacy_right_to_be_forgotten.res_partner_gdpr_form
msgid "GDPR Cleanup"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,id:0
msgid "ID"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,__last_update:0
msgid "Last Modified on"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,partner_ids:0
msgid "Partner ids"
msgstr ""

87
privacy_right_to_be_forgotten/i18n/privacy_right_to_be_forgotten.pot

@ -0,0 +1,87 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * privacy_right_to_be_forgotten
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: privacy_right_to_be_forgotten
#: code:addons/privacy_right_to_be_forgotten/wizards/res_partner_gdpr.py:44
#, python-format
msgid "*** GDPR removed ***"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: view:res.partner.gdpr:privacy_right_to_be_forgotten.res_partner_gdpr_form
msgid "Cleanup"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: view:res.partner.gdpr:privacy_right_to_be_forgotten.res_partner_gdpr_form
msgid "Close"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,create_uid:0
msgid "Created by"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,create_date:0
msgid "Created on"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,display_name:0
msgid "Display Name"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,fields:0
msgid "Fields"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: help:res.partner.gdpr,fields:0
msgid "Fields to delete data from."
msgstr ""
#. module: privacy_right_to_be_forgotten
#: model:ir.actions.act_window,name:privacy_right_to_be_forgotten.gdpr_action
#: view:res.partner.gdpr:privacy_right_to_be_forgotten.res_partner_gdpr_form
msgid "GDPR Cleanup"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,id:0
msgid "ID"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,__last_update:0
msgid "Last Modified on"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,write_uid:0
msgid "Last Updated by"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,write_date:0
msgid "Last Updated on"
msgstr ""
#. module: privacy_right_to_be_forgotten
#: field:res.partner.gdpr,partner_ids:0
msgid "Partner ids"
msgstr ""

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save