From cbc93d0d11114b59ba073620dc2345262023f0cd Mon Sep 17 00:00:00 2001 From: laa Date: Thu, 14 Nov 2019 14:16:42 +0000 Subject: [PATCH] [IMP] project: Add a group by stage for tasks on the portal A group by stage on the portal would allow the customer to have an overview of his tasks' progress, which is especially useful in a multi-project setting. - add a "Project" column - rearrange columns in the order: Ref -> Task -> Project -> Stage - add a group by stage for Tasks on the portal - hide "Stage" column when group by stage is selected - hide "Project" column when group by project is selected - add a sort by project for Tasks on the portal - when sort by Stage sub-sort by Project - when sort by Project sub-sort by Stage - add a 'Search in Project' for Tasks on the portal - the "Group By" selector shouldn't change when going to next pages --- addons/project/controllers/portal.py | 24 +++++++++++++++---- .../views/project_portal_templates.xml | 21 ++++++++++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/addons/project/controllers/portal.py b/addons/project/controllers/portal.py index b1bcc286606..e4d36b713e2 100644 --- a/addons/project/controllers/portal.py +++ b/addons/project/controllers/portal.py @@ -99,12 +99,13 @@ class CustomerPortal(CustomerPortal): return self._get_page_view_values(task, access_token, values, 'my_tasks_history', False, **kwargs) @http.route(['/my/tasks', '/my/tasks/page/'], type='http', auth="user", website=True) - def portal_my_tasks(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby='project', **kw): + def portal_my_tasks(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby=None, **kw): values = self._prepare_portal_layout_values() searchbar_sortings = { 'date': {'label': _('Newest'), 'order': 'create_date desc'}, 'name': {'label': _('Title'), 'order': 'name'}, - 'stage': {'label': _('Stage'), 'order': 'stage_id'}, + 'stage': {'label': _('Stage'), 'order': 'stage_id, project_id'}, + 'project': {'label': _('Project'), 'order': 'project_id, stage_id'}, 'update': {'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc'}, } searchbar_filters = { @@ -115,11 +116,13 @@ class CustomerPortal(CustomerPortal): 'message': {'input': 'message', 'label': _('Search in Messages')}, 'customer': {'input': 'customer', 'label': _('Search in Customer')}, 'stage': {'input': 'stage', 'label': _('Search in Stages')}, + 'project': {'input': 'project', 'label': _('Search in Project')}, 'all': {'input': 'all', 'label': _('Search in All')}, } searchbar_groupby = { 'none': {'input': 'none', 'label': _('None')}, 'project': {'input': 'project', 'label': _('Project')}, + 'stage': {'input': 'stage', 'label': _('Stage')}, } # extends filterby criteria with project the customer has access to @@ -144,11 +147,16 @@ class CustomerPortal(CustomerPortal): if not sortby: sortby = 'date' order = searchbar_sortings[sortby]['order'] + # default filter by value if not filterby: filterby = 'all' domain = searchbar_filters[filterby]['domain'] + # default group by value + if not groupby: + groupby = 'project' + # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('project.task', domain) if date_begin and date_end: @@ -165,6 +173,8 @@ class CustomerPortal(CustomerPortal): search_domain = OR([search_domain, [('message_ids.body', 'ilike', search)]]) if search_in in ('stage', 'all'): search_domain = OR([search_domain, [('stage_id', 'ilike', search)]]) + if search_in in ('project', 'all'): + search_domain = OR([search_domain, [('project_id', 'ilike', search)]]) domain += search_domain # task count @@ -172,7 +182,7 @@ class CustomerPortal(CustomerPortal): # pager pager = portal_pager( url="/my/tasks", - url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby, 'search_in': search_in, 'search': search}, + url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby, 'groupby': groupby, 'search_in': search_in, 'search': search}, total=task_count, page=page, step=self._items_per_page @@ -180,10 +190,16 @@ class CustomerPortal(CustomerPortal): # content according to pager and archive selected if groupby == 'project': order = "project_id, %s" % order # force sort on project first to group by project in view - tasks = request.env['project.task'].search(domain, order=order, limit=self._items_per_page, offset=(page - 1) * self._items_per_page) + elif groupby == 'stage': + order = "stage_id, %s" % order # force sort on stage first to group by stage in view + + tasks = request.env['project.task'].search(domain, order=order, limit=self._items_per_page, offset=pager['offset']) request.session['my_tasks_history'] = tasks.ids[:100] + if groupby == 'project': grouped_tasks = [request.env['project.task'].concat(*g) for k, g in groupbyelem(tasks, itemgetter('project_id'))] + elif groupby == 'stage': + grouped_tasks = [request.env['project.task'].concat(*g) for k, g in groupbyelem(tasks, itemgetter('stage_id'))] else: grouped_tasks = [tasks] diff --git a/addons/project/views/project_portal_templates.xml b/addons/project/views/project_portal_templates.xml index 1b0231ccb97..305a42d61ff 100644 --- a/addons/project/views/project_portal_templates.xml +++ b/addons/project/views/project_portal_templates.xml @@ -134,25 +134,32 @@ + Ref Name - + for project: - Stage - Ref + + in stage: + + Project + Stage + + # + - - + + - - # + +