diff --git a/addons/project/project.py b/addons/project/project.py
index 5341f9332a2..633f929927d 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -436,6 +436,12 @@ class task(osv.osv):
res[task.id] = False
return res
+ def _compute_displayed_image(self, cr, uid, ids, prop, arg, context=None):
+ res = {}
+ for line in self.browse(cr, uid, ids, context=context):
+ res[line.id] = line.attachment_ids and line.attachment_ids.filtered(lambda x: x.mimetype.startswith('image'))[0] or None
+ return res
+
_columns = {
'active': fields.function(_is_template, store=True, string='Not a Template Task', type='boolean', help="This field is computed automatically and have the same behavior than the boolean 'active' field: if the task is linked to a template or unactivated project, it will be hidden unless specifically asked."),
'name': fields.char('Task Title', track_visibility='onchange', size=128, required=True, select=True),
@@ -473,6 +479,7 @@ class task(osv.osv):
'color': fields.integer('Color Index'),
'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
'attachment_ids': fields.one2many('ir.attachment', 'res_id', domain=lambda self: [('res_model', '=', self._name)], auto_join=True, string='Attachments'),
+ 'displayed_image_id': fields.function(_compute_displayed_image, relation='ir.attachment', type="many2one", string='Attachment'),
}
_defaults = {
'stage_id': _get_default_stage_id,
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 486b2431ee3..28d6634c4d5 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -319,6 +319,7 @@
+
@@ -359,6 +360,9 @@
+
+
+
diff --git a/addons/web_kanban/static/src/js/kanban_widgets.js b/addons/web_kanban/static/src/js/kanban_widgets.js
index af3f75d79f3..4920b423a4f 100644
--- a/addons/web_kanban/static/src/js/kanban_widgets.js
+++ b/addons/web_kanban/static/src/js/kanban_widgets.js
@@ -150,6 +150,10 @@ var KanbanSelection = AbstractField.extend({
},
});
+var KanbanAttachmentImage = AbstractField.extend({
+ template: 'KanbanAttachmentImage',
+});
+
/**
* Kanban widgets: ProgressBar
@@ -228,6 +232,7 @@ var fields_registry = new Registry();
fields_registry
.add('priority', KanbanPriority)
.add('kanban_state_selection', KanbanSelection)
+ .add("attachment_image", KanbanAttachmentImage)
.add('progress', KanbanProgressBar);
return {
diff --git a/addons/web_kanban/static/src/less/kanban_view.less b/addons/web_kanban/static/src/less/kanban_view.less
index a42e1d85191..c6f85fc3f7a 100644
--- a/addons/web_kanban/static/src/less/kanban_view.less
+++ b/addons/web_kanban/static/src/less/kanban_view.less
@@ -268,6 +268,13 @@
box-shadow: 0 1px 4px @gray-light;
}
+ .o_kanban_attachment_image {
+ // The image should take the whole card
+ margin: -8px;
+ > img {
+ width: 100%;
+ }
+ }
.o_progressbar {
.o-flex-display();
diff --git a/addons/web_kanban/static/src/xml/web_kanban.xml b/addons/web_kanban/static/src/xml/web_kanban.xml
index b34e2063685..ff82335f67b 100644
--- a/addons/web_kanban/static/src/xml/web_kanban.xml
+++ b/addons/web_kanban/static/src/xml/web_kanban.xml
@@ -75,4 +75,9 @@
+
+
+
![]()
+
+