Nicolas JEUDY
3 years ago
18 changed files with 610 additions and 0 deletions
-
1privacy_personal_data/__init__.py
-
27privacy_personal_data/__manifest__.py
-
3privacy_personal_data/models/__init__.py
-
59privacy_personal_data/models/privacy_activity.py
-
74privacy_personal_data/models/privacy_personal_data.py
-
10privacy_personal_data/models/res_partner.py
-
2privacy_personal_data/readme/CONFIGURATION.rst
-
1privacy_personal_data/readme/CONTRIBUTORS.rst
-
1privacy_personal_data/readme/DESCRIPTION.rst
-
6privacy_personal_data/readme/USAGE.rst
-
11privacy_personal_data/security/ir.model.access.csv
-
BINprivacy_personal_data/static/description/icon.png
-
115privacy_personal_data/static/description/icon.svg
-
45privacy_personal_data/views/privacy_activity_view.xml
-
40privacy_personal_data/views/privacy_objective_view.xml
-
91privacy_personal_data/views/privacy_personal_category_view.xml
-
105privacy_personal_data/views/privacy_personal_data_view.xml
-
19privacy_personal_data/views/res_partner_view.xml
@ -0,0 +1 @@ |
|||||
|
from . import models |
@ -0,0 +1,27 @@ |
|||||
|
# Copyright 2019 Myceliandre - Nicolas JEUDY |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
{ |
||||
|
'name': 'Private Personal Data details', |
||||
|
'version': '12.0.1.0.0', |
||||
|
'category': 'Data Protection', |
||||
|
'summary': 'Provides private data details on privacy activity ', |
||||
|
'author': "Nicolas JEUDY, " |
||||
|
"Odoo Community Association (OCA)", |
||||
|
'website': 'http://www.github.com/OCA/data-protection', |
||||
|
'license': 'AGPL-3', |
||||
|
'data': [ |
||||
|
'security/ir.model.access.csv', |
||||
|
'views/privacy_activity_view.xml', |
||||
|
'views/privacy_personal_data_view.xml', |
||||
|
'views/privacy_personal_category_view.xml', |
||||
|
'views/privacy_objective_view.xml', |
||||
|
'views/res_partner_view.xml', |
||||
|
], |
||||
|
'demo': [ |
||||
|
], |
||||
|
'depends': [ |
||||
|
'mail', 'privacy', |
||||
|
], |
||||
|
'installable': True, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
from . import privacy_personal_data |
||||
|
from . import privacy_activity |
||||
|
from . import res_partner |
@ -0,0 +1,59 @@ |
|||||
|
# Copyright 2019 Myceliandre - Nicolas JEUDY |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class PersonalDataCategory(models.Model): |
||||
|
_name = "privacy.subject.category" |
||||
|
_description = "Subjects category" |
||||
|
|
||||
|
name = fields.Char('Name', index=True, required=True, translate=True) |
||||
|
|
||||
|
|
||||
|
class PersonalDataLegal(models.Model): |
||||
|
_name = "privacy.legal" |
||||
|
_description = "Legal" |
||||
|
|
||||
|
name = fields.Char('Name', index=True, required=True, translate=True) |
||||
|
|
||||
|
|
||||
|
class PrivacyActivity(models.Model): |
||||
|
_inherit = 'privacy.activity' |
||||
|
|
||||
|
def _default_company(self): |
||||
|
return self.env['res.company']._company_default_get('privacy.activity') |
||||
|
|
||||
|
@api.multi |
||||
|
def _compute_has_sensitive(self): |
||||
|
for record in self: |
||||
|
record.has_sensitive = 'sensitive' in record.personal_data_ids.mapped('type') |
||||
|
|
||||
|
value = fields.Boolean(compute='_get_value') |
||||
|
personal_data_ids = fields.Many2many('privacy.personal.data') |
||||
|
subjects_categ_ids = fields.Many2many('privacy.subject.category') |
||||
|
has_sensitive = fields.Boolean(compute='_compute_has_sensitive') |
||||
|
legal_ids = fields.Many2many('privacy.legal') |
||||
|
controller_ids = fields.Many2many( |
||||
|
"res.partner", |
||||
|
"privacy_activity_res_partner_controler_ids", |
||||
|
string="Controllers", |
||||
|
) |
||||
|
define_objective = fields.Boolean( |
||||
|
"Define objective", |
||||
|
help="Add detailed objectif from a custom list.", |
||||
|
) |
||||
|
objective_ids = fields.Many2many('privacy.objective', string="Details") |
||||
|
company_id = fields.Many2one('res.company', 'Company', index=True, default=_default_company) |
||||
|
|
||||
|
|
||||
|
class PrivacyObjective(models.Model): |
||||
|
_name = "privacy.objective" |
||||
|
_description = "Objective database" |
||||
|
|
||||
|
name = fields.Char('Name', index=True, required=True, translate=True) |
||||
|
description = fields.Html('Description') |
||||
|
active = fields.Boolean( |
||||
|
default=True, |
||||
|
index=True, |
||||
|
) |
@ -0,0 +1,74 @@ |
|||||
|
# Copyright 2019 Myceliandre - Nicolas JEUDY |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class PersonalDataCategory(models.Model): |
||||
|
_name = "privacy.personal.category" |
||||
|
_description = "Personal Data category" |
||||
|
_parent_name = "parent_id" |
||||
|
_parent_store = True |
||||
|
_rec_name = 'complete_name' |
||||
|
_order = 'complete_name' |
||||
|
|
||||
|
name = fields.Char('Name', index=True, required=True, translate=True) |
||||
|
description = fields.Html( |
||||
|
translate=True, |
||||
|
help="Give more example, explanation of personal data" |
||||
|
) |
||||
|
complete_name = fields.Char( |
||||
|
'Complete Name', compute='_compute_complete_name', |
||||
|
store=True) |
||||
|
parent_id = fields.Many2one('privacy.personal.category', 'Parent Category', index=True, ondelete='cascade') |
||||
|
parent_path = fields.Char(index=True) |
||||
|
type = fields.Selection([ |
||||
|
('common', 'Common'), |
||||
|
('risk', 'High Risk'), |
||||
|
('sensitive', 'Sensitive')], |
||||
|
string='Type', |
||||
|
default='common', |
||||
|
required=True,) |
||||
|
child_id = fields.One2many('privacy.personal.category', 'parent_id', 'Child Categories') |
||||
|
|
||||
|
@api.depends('name', 'parent_id.complete_name') |
||||
|
def _compute_complete_name(self): |
||||
|
for category in self: |
||||
|
if category.parent_id: |
||||
|
category.complete_name = '%s / %s' % (category.parent_id.complete_name, category.name) |
||||
|
else: |
||||
|
category.complete_name = category.name |
||||
|
|
||||
|
@api.constrains('parent_id') |
||||
|
def _check_category_recursion(self): |
||||
|
if not self._check_recursion(): |
||||
|
raise ValidationError(_('You cannot create recursive categories.')) |
||||
|
return True |
||||
|
|
||||
|
@api.model |
||||
|
def name_create(self, name): |
||||
|
return self.create({'name': name}).name_get()[0] |
||||
|
|
||||
|
|
||||
|
class PersonalData(models.Model): |
||||
|
_name = "privacy.personal.data" |
||||
|
_description = "Personal Data" |
||||
|
|
||||
|
active = fields.Boolean( |
||||
|
default=True, |
||||
|
index=True, |
||||
|
) |
||||
|
name = fields.Char( |
||||
|
index=True, |
||||
|
required=True, |
||||
|
translate=True, |
||||
|
) |
||||
|
description = fields.Html( |
||||
|
translate=True, |
||||
|
help="Data list used in activity" |
||||
|
) |
||||
|
|
||||
|
categ_id = fields.Many2one('privacy.personal.category', |
||||
|
string="Category", |
||||
|
domain=[('child_id', '=', False)]) |
||||
|
type = fields.Selection(related="categ_id.type",) |
@ -0,0 +1,10 @@ |
|||||
|
# Copyright 2019 Myceliandre - Nicolas JEUDY |
||||
|
# 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" |
||||
|
|
||||
|
internal = fields.Boolean('Internal') |
@ -0,0 +1,2 @@ |
|||||
|
In the "Privacy", open the "Settings" menu to find and enable |
||||
|
the personal data details feature. |
@ -0,0 +1 @@ |
|||||
|
* Nicolas JEUDY <https://github.com/njeudy> |
@ -0,0 +1 @@ |
|||||
|
This module provides personal data details in privacy activity. |
@ -0,0 +1,6 @@ |
|||||
|
To define data processing activities: |
||||
|
|
||||
|
#. Go to *Privacy > Master Data > Activities* and create one. |
||||
|
#. Define impacted personal data details |
||||
|
|
||||
|
Consult your lawyer! |
@ -0,0 +1,11 @@ |
|||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink |
||||
|
read_all,Permission to read category,model_privacy_personal_category,privacy.group_data_protection_user,1,0,0,0 |
||||
|
write_all,Permission to write category,model_privacy_personal_category,privacy.group_data_protection_manager,1,1,1,1 |
||||
|
read,Permission to read personal data,model_privacy_personal_data,privacy.group_data_protection_user,1,0,0,0 |
||||
|
write,Permission to write personal data,model_privacy_personal_data,privacy.group_data_protection_manager,1,1,1,1 |
||||
|
read_objective,Permission to read objectives,model_privacy_objective,privacy.group_data_protection_user,1,0,0,0 |
||||
|
write_objective,Permission to write objectives,model_privacy_objective,privacy.group_data_protection_manager,1,1,1,1 |
||||
|
read_subject_category,Permission to read subject category,model_privacy_subject_category,privacy.group_data_protection_user,1,0,0,0 |
||||
|
write_subject_category,Permission to write subject category,model_privacy_subject_category,privacy.group_data_protection_manager,1,1,1,1 |
||||
|
read_legal,Permission to read legal,model_privacy_legal,privacy.group_data_protection_user,1,0,0,0 |
||||
|
write_legal,Permission to write legal,model_privacy_legal,privacy.group_data_protection_manager,1,1,1,1 |
After Width: 128 | Height: 128 | Size: 2.1 KiB |
@ -0,0 +1,115 @@ |
|||||
|
<?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> |
@ -0,0 +1,45 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<data> |
||||
|
|
||||
|
<record model="ir.ui.view" id="activity_form_inherit_personal_data"> |
||||
|
<field name="name">Privacy Activity Form Personal Data</field> |
||||
|
<field name="model">privacy.activity</field> |
||||
|
<field name="inherit_id" ref="privacy.activity_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//group[@name='subjects']" position="inside"> |
||||
|
<field name="subjects_categ_ids" widget="many2many_tags" string="Category"/> |
||||
|
<field name="legal_ids" widget="many2many_tags" string="Legal"/> |
||||
|
<label for="personal_data_ids" string="Tracked data"/> |
||||
|
<field name="personal_data_ids" nolabel="1"/> |
||||
|
|
||||
|
</xpath> |
||||
|
|
||||
|
<xpath expr="//group[@name='basic']" position="after"> |
||||
|
<group name="controller_details" colspan="4"> |
||||
|
<field name="controller_ids"/> |
||||
|
</group> |
||||
|
<group name="objective_details" colspan="4"> |
||||
|
<field name="define_objective" string="Define Objective(s)"/> |
||||
|
<field name="objective_ids" attrs='{"invisible": [("define_objective", "=", False)]}'> |
||||
|
<tree name="objective"> |
||||
|
<field name="name"/> |
||||
|
<field name="description"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</group> |
||||
|
</xpath> |
||||
|
<xpath expr="//group[@name='subjects']" position="after"> |
||||
|
<field name="has_sensitive" invisible="1"/> |
||||
|
<group colspan="4" attrs='{"invisible": [("has_sensitive", "=", False)]}'> |
||||
|
<div class="alert alert-warning" role="alert" style="margin-bottom:0px;"> |
||||
|
This activity has sensitive data. |
||||
|
</div> |
||||
|
</group> |
||||
|
</xpath> |
||||
|
<!--<xpath expr="//tree[@name='processors']/field[@name='country_id']" position="after"> |
||||
|
<field name="internal"/> |
||||
|
</xpath>--> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
</data> |
@ -0,0 +1,40 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<data> |
||||
|
<record model="ir.ui.view" id="privacy_objective_form"> |
||||
|
<field name="name">Privacy objective Form</field> |
||||
|
<field name="model">privacy.objective</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<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> |
||||
|
<field name="description" nolabel="1"/> |
||||
|
</group> |
||||
|
|
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="privacy_objective_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Privacy Objective</field> |
||||
|
<field name="res_model">privacy.objective</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Click to add a privacy objective. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
<menuitem name="Objective" groups="privacy.group_data_protection_user" parent="privacy.menu_data_protection_setting" id="menu_privacy_objective" sequence="10"/> |
||||
|
<menuitem name="Objective" sequence="10" action="privacy_objective_action" groups="privacy.group_data_protection_user" parent="menu_privacy_objective" id="menu_privacy_objective_model"/> |
||||
|
|
||||
|
</data> |
@ -0,0 +1,91 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<data> |
||||
|
|
||||
|
<record model="ir.ui.view" id="personal_category_form"> |
||||
|
<field name="name">Privacy Personal Category Form</field> |
||||
|
<field name="model">privacy.personal.category</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<header> |
||||
|
<field name="type" widget="statusbar" options="{'clickable': '1'}"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<div class="oe_title"> |
||||
|
<label for="name" class="oe_edit_only"/> |
||||
|
<h1><field name="name"/></h1> |
||||
|
</div> |
||||
|
<group name="basic"> |
||||
|
<field name="parent_id"/> |
||||
|
</group> |
||||
|
<notebook string="Details" name="advanced"> |
||||
|
<page string="Description" name="description"> |
||||
|
<group> |
||||
|
<field name="description" nolabel="1"/> |
||||
|
</group> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="personal_category_tree"> |
||||
|
<field name="name">Privacy Personal Category Tree</field> |
||||
|
<field name="model">privacy.personal.category</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree> |
||||
|
<field name="complete_name"/> |
||||
|
<field name="name" invisible="1"/> |
||||
|
<field name="type"/> |
||||
|
<field name="description"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="personal_category_search"> |
||||
|
<field name="name">Privacy Personal Category Search</field> |
||||
|
<field name="model">privacy.personal.category</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search> |
||||
|
<field name="name"/> |
||||
|
<field name="parent_id"/> |
||||
|
<field name="description"/> |
||||
|
<separator/> |
||||
|
<filter |
||||
|
string="Archived" |
||||
|
name="inactive" |
||||
|
domain="[('active', '=', False)]" |
||||
|
/> |
||||
|
<separator/> |
||||
|
<group string="Group By" name="groupby"> |
||||
|
<filter |
||||
|
name="parent_id_groupby" |
||||
|
string="Parent" |
||||
|
context="{'group_by': 'parent_id'}" |
||||
|
/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="personal_category_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Personal Data Category</field> |
||||
|
<field name="res_model">privacy.personal.category</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Click to add a personal data category. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem |
||||
|
name="Category" |
||||
|
sequence="10" |
||||
|
action="personal_category_action" |
||||
|
groups="privacy.group_data_protection_manager" |
||||
|
parent="menu_privacy_personal_data" |
||||
|
id="menu_privacy_personal_category" |
||||
|
/> |
||||
|
|
||||
|
</data> |
@ -0,0 +1,105 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<data> |
||||
|
|
||||
|
<record model="ir.ui.view" id="personal_data_form"> |
||||
|
<field name="name">Privacy Personal Data Form</field> |
||||
|
<field name="model">privacy.personal.data</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<header> |
||||
|
<field name="type" widget="statusbar" options="{'clickable': '0'}"/> |
||||
|
</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"> |
||||
|
<field name="categ_id"/> |
||||
|
</group> |
||||
|
<notebook string="Details" name="advanced"> |
||||
|
<page string="Description" name="description"> |
||||
|
<group name="Personal Data details"> |
||||
|
<field name="description" nolabel="1"/> |
||||
|
</group> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="personal_data_tree"> |
||||
|
<field name="name">Privacy Personal Data Tree</field> |
||||
|
<field name="model">privacy.personal.data</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree> |
||||
|
<field name="name"/> |
||||
|
<field name="categ_id"/> |
||||
|
<field name="type"/> |
||||
|
<field name="description"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="personal_data_search"> |
||||
|
<field name="name">Privacy Personal Data Search</field> |
||||
|
<field name="model">privacy.personal.data</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search> |
||||
|
<field name="name"/> |
||||
|
<field name="categ_id"/> |
||||
|
<field name="description"/> |
||||
|
<field name="type"/> |
||||
|
<separator/> |
||||
|
<filter |
||||
|
string="Archived" |
||||
|
name="inactive" |
||||
|
domain="[('active', '=', False)]" |
||||
|
/> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="personal_data_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Personal Data</field> |
||||
|
<field name="res_model">privacy.personal.data</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Click to add a personal data details. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem |
||||
|
name="Personal Data" |
||||
|
groups="privacy.group_data_protection_user" |
||||
|
parent="privacy.menu_data_protection_setting" |
||||
|
id="menu_privacy_personal_data" |
||||
|
sequence="10" |
||||
|
/> |
||||
|
<menuitem |
||||
|
name="Personal Data" |
||||
|
sequence="10" |
||||
|
action="personal_data_action" |
||||
|
groups="privacy.group_data_protection_user" |
||||
|
parent="menu_privacy_personal_data" |
||||
|
id="menu_privacy_personal_data_model" |
||||
|
/> |
||||
|
|
||||
|
</data> |
@ -0,0 +1,19 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<data> |
||||
|
|
||||
|
<record model="ir.ui.view" id="rgpd_form_inherit_view_partner_form"> |
||||
|
<field name="name">Privacy Res partner form</field> |
||||
|
<field name="model">res.partner</field> |
||||
|
<field name="inherit_id" ref="base.view_partner_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<page name="sales_purchases" position="after"> |
||||
|
<page string="Privacy" name="privacy"> |
||||
|
<group> |
||||
|
<field name="internal"/> |
||||
|
</group> |
||||
|
</page> |
||||
|
</page> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
</data> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue