summaryrefslogtreecommitdiff
path: root/addons/pad_project
diff options
context:
space:
mode:
Diffstat (limited to 'addons/pad_project')
-rw-r--r--addons/pad_project/__manifest__.py4
-rw-r--r--addons/pad_project/models/project.py35
-rw-r--r--addons/pad_project/static/src/css/pad_project.css10
-rw-r--r--addons/pad_project/views/project_portal_assets.xml8
-rw-r--r--addons/pad_project/views/project_portal_templates.xml34
-rw-r--r--addons/pad_project/views/project_views.xml6
6 files changed, 95 insertions, 2 deletions
diff --git a/addons/pad_project/__manifest__.py b/addons/pad_project/__manifest__.py
index 846b98c68ba..142784a1c91 100644
--- a/addons/pad_project/__manifest__.py
+++ b/addons/pad_project/__manifest__.py
@@ -14,7 +14,9 @@ This module adds a PAD in all project form views.
],
'data': [
'views/res_config_settings_views.xml',
- 'views/project_views.xml'
+ 'views/project_views.xml',
+ 'views/project_portal_templates.xml',
+ 'views/project_portal_assets.xml'
],
'auto_install': True,
}
diff --git a/addons/pad_project/models/project.py b/addons/pad_project/models/project.py
index 40cfbfdbf10..8c58209a200 100644
--- a/addons/pad_project/models/project.py
+++ b/addons/pad_project/models/project.py
@@ -11,6 +11,10 @@ class ProjectTask(models.Model):
description_pad = fields.Char('Pad URL', pad_content_field='description', copy=False)
use_pad = fields.Boolean(related="project_id.use_pads", string="Use collaborative pad", readonly=True)
+ pad_availability = fields.Selection(
+ related="project_id.pad_availability",
+ string="Availability of collaborative pads",
+ readonly=True)
@api.model
def create(self, vals):
@@ -20,8 +24,37 @@ class ProjectTask(models.Model):
self = self.with_context(pad_no_create=True)
return super(ProjectTask, self).create(vals)
+ def _use_portal_pad(self):
+ """
+ Indicates if the task configuration requires to provide
+ an access to a portal pad.
+ """
+ self.ensure_one()
+ return self.use_pad and self.pad_availability == 'portal'
+
+ def _get_pad_content(self):
+ """
+ Gets the content of the pad used to edit the task description
+ and returns it.
+ """
+ self.ensure_one()
+ return self.pad_get_content(self.description_pad)
+
class ProjectProject(models.Model):
_inherit = "project.project"
- use_pads = fields.Boolean("Use collaborative pads", default=True, help="Use collaborative pad for the tasks on this project.")
+ use_pads = fields.Boolean("Use collaborative pads", default=True,
+ help="Use collaborative pad for the tasks on this project.")
+
+ pad_availability = fields.Selection([
+ ('internal', 'Internal Users'),
+ ('portal', 'Portal Users')
+ ], compute='_compute_pad_availability', store=True, readonly=False,
+ string='Availability of collaborative pads', required=True, default='internal')
+
+ @api.depends('use_pads', 'privacy_visibility')
+ def _compute_pad_availability(self):
+ for project in self:
+ if project.privacy_visibility != 'portal' or not project.use_pads:
+ project.pad_availability = 'internal'
diff --git a/addons/pad_project/static/src/css/pad_project.css b/addons/pad_project/static/src/css/pad_project.css
new file mode 100644
index 00000000000..90a8b3de2cb
--- /dev/null
+++ b/addons/pad_project/static/src/css/pad_project.css
@@ -0,0 +1,10 @@
+.o_pad_project_container {
+ border: solid 1px #c4c4c4;
+ height:500px;
+ padding: 0.5rem;
+ -webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
+ -moz-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
+ -ms-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
+ -o-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
+ box-shadow: 0 5px 10px rgba(0,0,0,0.1);
+}
diff --git a/addons/pad_project/views/project_portal_assets.xml b/addons/pad_project/views/project_portal_assets.xml
new file mode 100644
index 00000000000..ef773412517
--- /dev/null
+++ b/addons/pad_project/views/project_portal_assets.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="project_portal_assets_frontend" name="project portal assets" inherit_id="web.assets_frontend">
+ <xpath expr="." position="inside">
+ <link rel="stylesheet" href="/pad_project/static/src/css/pad_project.css"/>
+ </xpath>
+ </template>
+</odoo>
diff --git a/addons/pad_project/views/project_portal_templates.xml b/addons/pad_project/views/project_portal_templates.xml
new file mode 100644
index 00000000000..6981aaf1430
--- /dev/null
+++ b/addons/pad_project/views/project_portal_templates.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="portal_my_task" inherit_id="project.portal_my_task" priority="40">
+
+ <!-- add a button to the right of the 'description' title according to the mode (edit/read) -->
+ <xpath expr="//div[@t-if='task.description']//div[hasclass('d-flex')]" position="inside">
+ <t t-if="task._use_portal_pad()">
+ <t t-if="request.params.get('edit')">
+ <a role="button" class="btn btn-primary btn-sm ml-auto" t-attf-href="/my/task/#{task.id}">Save</a>
+ </t>
+ <t t-else="">
+ <a role="button" class="btn btn-primary btn-sm ml-auto" t-attf-href="/my/task/#{task.id}?edit=1">Edit</a>
+ </t>
+ </t>
+ </xpath>
+
+ <!-- show the description (read mode) or a pad (edit mode) -->
+ <xpath expr="//div[@t-field='task.description']" position="replace">
+ <t t-if="task._use_portal_pad()">
+ <t t-if="request.params.get('edit')">
+ <div class="o_pad_project_container">
+ <iframe width="100%" height="100%" frameborder="0" t-att-src="task.description_pad + '?showChat=false&amp;userName=' + request.env.user.name"/>
+ </div>
+ </t>
+ <t t-else="">
+ <div class="py-1 px-2 bg-100 small" t-raw="task._get_pad_content()"/>
+ </t>
+ </t>
+ <t t-else="">
+ <t>$0</t>
+ </t>
+ </xpath>
+ </template>
+</odoo>
diff --git a/addons/pad_project/views/project_views.xml b/addons/pad_project/views/project_views.xml
index 50320a42831..81278874bc9 100644
--- a/addons/pad_project/views/project_views.xml
+++ b/addons/pad_project/views/project_views.xml
@@ -30,6 +30,12 @@
<div class="text-muted">
Use collaborative rich text pads on tasks
</div>
+ <div class="content-group" attrs="{'invisible': ['|', ('use_pads', '=', False), ('privacy_visibility', '!=', 'portal')]}">
+ <div class="mt16 row">
+ <label for="pad_availability" string="Available to:" class="col-3 col-lg-3 o_light_label"/>
+ <field name="pad_availability" widget="radio"/>
+ </div>
+ </div>
</div>
</div>
</xpath>