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 @@ + +
+ +
+