From 25ece8fe7b6cc6e554df530520116c68a98c0e82 Mon Sep 17 00:00:00 2001 From: "Xavier BOL (xbo)" Date: Tue, 28 Sep 2021 12:38:34 +0200 Subject: [PATCH] [IMP] project: refactor portal tasks routes Before this commit, we recently added a new route in project portal called '/my/projects/:project_id/tasks' to get the tasks related to the project. The problem is most of the code in this route is duplicated from the original route to see all tasks in portal view. That is, the route called '/my/tasks'. This commit refactors the code to have the common code in a common method and changes the result in both routes to have the `values` dictionary expected in those routes. task-2648955 Closes #82379 --- addons/project/controllers/portal.py | 207 +++++++++++---------------- 1 file changed, 83 insertions(+), 124 deletions(-) diff --git a/addons/project/controllers/portal.py b/addons/project/controllers/portal.py index 98de1ef43ae..828f3e64a56 100644 --- a/addons/project/controllers/portal.py +++ b/addons/project/controllers/portal.py @@ -30,75 +30,19 @@ class ProjectCustomerPortal(CustomerPortal): # My Project # ------------------------------------------------------------ def _project_get_page_view_values(self, project, access_token, page=1, date_begin=None, date_end=None, sortby=None, search=None, search_in='content', groupby=None, **kwargs): - # TODO: refactor this because most of this code is duplicated from portal_my_tasks method - values = self._prepare_portal_layout_values() - searchbar_sortings = self._task_get_searchbar_sortings() - - searchbar_inputs = self._task_get_searchbar_inputs() - searchbar_groupby = self._task_get_searchbar_groupby() - - # default sort by value - if not sortby: - sortby = 'date' - order = searchbar_sortings[sortby]['order'] - # default filter by value domain = [('project_id', '=', project.id)] - - # default group by value - if not groupby: - groupby = 'project' - - if date_begin and date_end: - domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] - - # search - if search and search_in: - domain += self._task_get_search_domain(search_in, search) - - Task = request.env['project.task'] - if access_token: - Task = Task.sudo() - - # task count - task_count = Task.search_count(domain) # pager url = "/my/projects/%s" % project.id - pager = portal_pager( - url=url, - url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'groupby': groupby, 'search_in': search_in, 'search': search}, - total=task_count, - page=page, - step=self._items_per_page - ) - # content according to pager and archive selected - order = self._task_get_order(order, groupby) - - tasks = Task.search(domain, order=order, limit=self._items_per_page, offset=pager['offset']) - request.session['my_project_tasks_history'] = tasks.ids[:100] - - groupby_mapping = self._task_get_groupby_mapping() - group = groupby_mapping.get(groupby) - if group: - grouped_tasks = [Task.concat(*g) for k, g in groupbyelem(tasks, itemgetter(group))] - else: - grouped_tasks = [tasks] + values = self._prepare_tasks_values(page, date_begin, date_end, sortby, search, search_in, groupby, url, domain, su=bool(access_token)) + pager = portal_pager(**values['pager']) values.update( - date=date_begin, - date_end=date_end, - grouped_tasks=grouped_tasks, + grouped_tasks=values['grouped_tasks'](pager['offset']), page_name='project', - default_url=url, pager=pager, - searchbar_sortings=searchbar_sortings, - searchbar_groupby=searchbar_groupby, - searchbar_inputs=searchbar_inputs, - search_in=search_in, - search=search, - sortby=sortby, - groupby=groupby, project=project, + task_url=f'projects/{project.id}/task', ) return self._get_page_view_values(project, access_token, values, 'my_projects_history', False, **kwargs) @@ -172,7 +116,6 @@ class ProjectCustomerPortal(CustomerPortal): return request.render("project.project_sharing_portal", values) project_sudo = project_sudo if access_token else project_sudo.with_user(request.env.user) values = self._project_get_page_view_values(project_sudo, access_token, page, date_begin, date_end, sortby, search, search_in, groupby, **kw) - values['task_url'] = 'project/%s/task' % project_id return request.render("project.portal_my_project", values) def _prepare_project_sharing_session_info(self, project, task=None): @@ -338,20 +281,88 @@ class ProjectCustomerPortal(CustomerPortal): ]) return OR(search_domain) - @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=None, **kw): + def _prepare_tasks_values(self, page, date_begin, date_end, sortby, search, search_in, groupby, url="/my/tasks", domain=None, su=False): values = self._prepare_portal_layout_values() - searchbar_sortings = self._task_get_searchbar_sortings() searchbar_sortings = dict(sorted(self._task_get_searchbar_sortings().items(), key=lambda item: item[1]["sequence"])) + searchbar_inputs = self._task_get_searchbar_inputs() + searchbar_groupby = self._task_get_searchbar_groupby() + Task = request.env['project.task'] + if su: + Task = Task.sudo() + + if not domain: + domain = [] + + # default sort by value + if not sortby: + sortby = 'date' + order = searchbar_sortings[sortby]['order'] + + # default group by value + if not groupby: + groupby = 'project' + + if date_begin and date_end: + domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] + + # search + if search and search_in: + domain += self._task_get_search_domain(search_in, search) + + # content according to pager and archive selected + order = self._task_get_order(order, groupby) + + def get_grouped_tasks(pager_offset): + tasks = Task.search(domain, order=order, limit=self._items_per_page, offset=pager_offset) + request.session['my_project_tasks_history' if url.startswith('/my/projects') else 'my_tasks_history'] = tasks.ids[:100] + + groupby_mapping = self._task_get_groupby_mapping() + group = groupby_mapping.get(groupby) + if group: + grouped_tasks = [Task.concat(*g) for k, g in groupbyelem(tasks, itemgetter(group))] + else: + grouped_tasks = [tasks] + + task_states = dict(Task._fields['kanban_state']._description_selection(request.env)) + if sortby == 'status': + if groupby == 'none' and grouped_tasks: + grouped_tasks[0] = grouped_tasks[0].sorted(lambda tasks: task_states.get(tasks.kanban_state)) + else: + grouped_tasks.sort(key=lambda tasks: task_states.get(tasks[0].kanban_state)) + return grouped_tasks + + values.update({ + 'date': date_begin, + 'date_end': date_end, + 'grouped_tasks': get_grouped_tasks, + 'page_name': 'task', + 'default_url': url, + 'task_url': 'tasks', + 'pager': { + "url": url, + "url_args": {'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'groupby': groupby, 'search_in': search_in, 'search': search}, + "total": Task.search_count(domain), + "page": page, + "step": self._items_per_page + }, + 'searchbar_sortings': searchbar_sortings, + 'searchbar_groupby': searchbar_groupby, + 'searchbar_inputs': searchbar_inputs, + 'search_in': search_in, + 'search': search, + 'sortby': sortby, + 'groupby': groupby, + }) + return values + + @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=None, **kw): searchbar_filters = { 'all': {'label': _('All'), 'domain': []}, } - searchbar_inputs = self._task_get_searchbar_inputs() - searchbar_groupby = self._task_get_searchbar_groupby() - # extends filterby criteria with project the customer has access to projects = request.env['project.project'].search([]) for project in projects: @@ -370,72 +381,20 @@ class ProjectCustomerPortal(CustomerPortal): str(proj_id): {'label': proj_name, 'domain': [('project_id', '=', proj_id)]} }) - # default sort by value - if not sortby: - sortby = 'date' - order = searchbar_sortings[sortby]['order'] - - # default filter by value if not filterby: filterby = 'all' domain = searchbar_filters.get(filterby, searchbar_filters.get('all'))['domain'] - # default group by value - if not groupby: - groupby = 'project' + values = self._prepare_tasks_values(page, date_begin, date_end, sortby, search, search_in, groupby, domain=domain) - if date_begin and date_end: - domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] - - # search - if search and search_in: - domain += self._task_get_search_domain(search_in, search) - - # task count - task_count = request.env['project.task'].search_count(domain) # pager - pager = portal_pager( - url="/my/tasks", - 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 - ) - # content according to pager and archive selected - order = self._task_get_order(order, groupby) - - 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] - - groupby_mapping = self._task_get_groupby_mapping() - group = groupby_mapping.get(groupby) - if group: - grouped_tasks = [request.env['project.task'].concat(*g) for k, g in groupbyelem(tasks, itemgetter(group))] - else: - grouped_tasks = [tasks] - - task_states = dict(request.env['project.task']._fields['kanban_state']._description_selection(request.env)) - if sortby == 'status': - if groupby == 'none' and grouped_tasks: - grouped_tasks[0] = grouped_tasks[0].sorted(lambda tasks: task_states.get(tasks.kanban_state)) - else: - grouped_tasks.sort(key=lambda tasks: task_states.get(tasks[0].kanban_state)) + pager_vals = values['pager'] + pager_vals['url_args'].update(filterby=filterby) + pager = portal_pager(**pager_vals) values.update({ - 'date': date_begin, - 'date_end': date_end, - 'grouped_tasks': grouped_tasks, - 'page_name': 'task', - 'default_url': '/my/tasks', - 'task_url': 'tasks', + 'grouped_tasks': values['grouped_tasks'](pager['offset']), 'pager': pager, - 'searchbar_sortings': searchbar_sortings, - 'searchbar_groupby': searchbar_groupby, - 'searchbar_inputs': searchbar_inputs, - 'search_in': search_in, - 'search': search, - 'sortby': sortby, - 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, })