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
def get_timesheets(): groupby_mapping = self._get_groupby_mapping() field = groupby_mapping.get(groupby, None) orderby = '%s, %s' % (field, order) if field else order timesheets = Timesheet_sudo.search(domain, order=orderby, limit=_items_per_page, offset=pager['offset']) if field: if groupby == 'date': raw_timesheets_group = Timesheet_sudo.read_group( domain, ["unit_amount:sum", "ids:array_agg(id)"], ["date:day"]) grouped_timesheets = [(Timesheet_sudo.browse(group["ids"]), group["unit_amount"]) for group in raw_timesheets_group] else: time_data = Timesheet_sudo.read_group( domain, [field, 'unit_amount:sum'], [field]) mapped_time = dict([(m[field][0] if m[field] else False, m['unit_amount']) for m in time_data]) grouped_timesheets = [ (Timesheet_sudo.concat(*g), mapped_time[k.id]) for k, g in groupbyelem(timesheets, itemgetter(field)) ] return timesheets, grouped_timesheets grouped_timesheets = [ (timesheets, sum(Timesheet_sudo.search(domain).mapped('unit_amount'))) ] if timesheets else [] return timesheets, grouped_timesheets
def _task_get_grouped_tasks(self, groupby, tasks): if groupby: grouped_tasks = [ request.env['project.task'].concat(*g) for k, g in groupbyelem(tasks, itemgetter(groupby)) ] else: grouped_tasks = super()._task_get_grouped_tasks(groupby, tasks) return grouped_tasks
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): res_values = super().portal_my_tasks(page=page, date_begin=date_begin, date_end=date_end, sortby=sortby, filterby=filterby, search=search, search_in=search_in, groupby=groupby, **kw) task_count = res_values.qcontext.get('task_count', 0) 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, 'groupby': groupby }, total=task_count, page=page, step=self._items_per_page) res_values.qcontext.update({'pager': pager}) if res_values.qcontext.get('searchbar_groupby', False): searchbar_groupby = OrderedDict() for dict_key in sorted(res_values.qcontext['searchbar_groupby']): searchbar_groupby.update({ dict_key: res_values.qcontext['searchbar_groupby'][dict_key] }) searchbar_groupby.update( {'stage': { 'input': 'stage', 'label': _('Stage') }}) res_values.qcontext.update( {'searchbar_groupby': searchbar_groupby}) if groupby == 'stage': tasks = res_values.qcontext['grouped_tasks'][0] grouped_tasks = [ request.env['project.task'].concat(*g) for k, g in groupbyelem(tasks, itemgetter('stage_id')) ] res_values.qcontext.update({'grouped_tasks': grouped_tasks}) res_values.qcontext.update({'groupby': 'stage'}) return res_values
def get_timesheets(): groupby_mapping = { 'project': 'project_id', 'task': 'task_id', 'employee': 'employee_id', 'date': 'date', } field = groupby_mapping.get(groupby, None) orderby = '%s, %s' % (field, order) if field else order timesheets = Timesheet_sudo.search(domain, order=orderby, limit=self._items_per_page, offset=pager['offset']) if field: if groupby == 'date': time_data = Timesheet_sudo.read_group( domain, ['date', 'unit_amount:sum'], ['date:day']) mapped_time = dict([ (datetime.strptime(m['date:day'], '%d %b %Y').date(), m['unit_amount']) for m in time_data ]) grouped_timesheets = [ (Timesheet_sudo.concat(*g), mapped_time[k]) for k, g in groupbyelem(timesheets, itemgetter('date')) ] else: time_data = time_data = Timesheet_sudo.read_group( domain, [field, 'unit_amount:sum'], [field]) mapped_time = dict([(m[field][0], m['unit_amount']) for m in time_data]) grouped_timesheets = [ (Timesheet_sudo.concat(*g), mapped_time[k.id]) for k, g in groupbyelem(timesheets, itemgetter(field)) ] return timesheets, grouped_timesheets grouped_timesheets = [ (timesheets, sum(Timesheet_sudo.search(domain).mapped('unit_amount'))) ] if timesheets else [] return timesheets, grouped_timesheets
def portal_my_tasks(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', **kw): groupby = kw.get('groupby', 'project') #TODO master fix this 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' }, 'update': { 'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc' }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>') }, 'message': { 'input': 'message', 'label': _('Search in Messages') }, 'customer': { 'input': 'customer', 'label': _('Search in Customer') }, 'stage': { 'input': 'stage', 'label': _('Search in Stages') }, 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'project': { 'input': 'project', 'label': _('Project') }, } # extends filterby criteria with project (criteria name is the project id) # Note: portal users can't view projects they don't follow partner = request.env.user.partner_id domain_projects = [ '&', ('privacy_visibility', '=', 'portal'), '|', ('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]), ('task_ids.message_partner_ids', 'child_of', [partner.commercial_partner_id.id]) ] projects = request.env['project.project'].sudo().search( domain_projects) domain = [('project_id', 'in', projects.ids)] for proj in projects: searchbar_filters.update({ 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[filterby]['domain'] # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('project.task', domain) if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR([ search_domain, [ '|', ('name', 'ilike', search), ('description', 'ilike', search) ] ]) if search_in in ('customer', 'all'): search_domain = OR( [search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): 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)]]) domain += search_domain # 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, 'search_in': search_in, 'search': search }, total=task_count, page=page, step=self._items_per_page) # 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) 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')) ] else: grouped_tasks = [tasks] values.update({ 'date': date_begin, 'date_end': date_end, 'projects': projects, 'tasks': tasks, #TODO master remove this, grouped_tasks is enough 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'archive_groups': archive_groups, 'default_url': '/my/tasks', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("project.portal_my_tasks", values)
def portal_my_tasks_prepare_values(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in="content", **kw): groupby = kw.get("groupby", "project") searchbar = self.portal_my_tasks_prepare_searchbar() # default sort by value if not sortby: sortby = "date" order = searchbar["sorting"][sortby]["order"] # default filter by value if not filterby: filterby = "all" projects = request.env["project.project"].search([ ("privacy_visibility", "=", "portal") ]) search_obj = self.portal_my_tasks_prepare_task_search( projects, searchbar, date_begin, date_end, sortby, filterby, search, search_in, **kw) # task count task_count = request.env["project.task"].search_count( search_obj["domain"]) # pager pager = portal_pager( url="/my/tasks", url_args={ "date_begin": date_begin, "date_end": date_end, "search": search, "sortby": sortby, "filterby": filterby, }, total=task_count, page=page, step=self._items_per_page, ) # 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( search_obj["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")) ] else: grouped_tasks = [tasks] return { "date": date_begin, "date_end": date_end, "projects": projects, "tasks": tasks, "grouped_tasks": grouped_tasks, "page_name": "task", "archive_groups": search_obj["archive_groups"], "default_url": "/my/tasks", "pager": pager, "searchbar_sortings": searchbar["sorting"], "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, }
def portal_my_tasks_prepare_values(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', **kw): groupby = kw.get('groupby', 'project') searchbar = self.portal_my_tasks_prepare_searchbar() # default sort by value if not sortby: sortby = 'date' order = searchbar['sorting'][sortby]['order'] # default filter by value if not filterby: filterby = 'all' projects = request.env['project.project'].search([ ('privacy_visibility', '=', 'portal') ]) search_obj = self.portal_my_tasks_prepare_task_search( projects, searchbar, date_begin, date_end, sortby, filterby, search, search_in, **kw) # task count task_count = request.env['project.task'].search_count( search_obj['domain']) # pager pager = portal_pager(url="/my/tasks", url_args={ 'date_begin': date_begin, 'date_end': date_end, 'search': search, 'sortby': sortby, 'filterby': filterby }, total=task_count, page=page, step=self._items_per_page) # 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(search_obj['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')) ] else: grouped_tasks = [tasks] return { 'date': date_begin, 'date_end': date_end, 'projects': projects, 'tasks': tasks, 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'archive_groups': search_obj['archive_groups'], 'default_url': '/my/tasks', 'pager': pager, 'searchbar_sortings': searchbar['sorting'], '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, }
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, project_id' }, 'project': { 'label': _('Project'), 'order': 'project_id, stage_id' }, 'update': { 'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc' }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': Markup(_('Search <span class="nolabel"> (in Content)</span>')) }, '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 projects = request.env['project.project'].search([]) for project in projects: searchbar_filters.update({ str(project.id): { 'label': project.name, 'domain': [('project_id', '=', project.id)] } }) # extends filterby criteria with project (criteria name is the project id) # Note: portal users can't view projects they don't follow project_groups = request.env['project.task'].read_group( [('project_id', 'not in', projects.ids)], ['project_id'], ['project_id']) for group in project_groups: proj_id = group['project_id'][0] if group['project_id'] else False proj_name = group['project_id'][1] if group['project_id'] else _( 'Others') searchbar_filters.update({ 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' if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR([ search_domain, [ '|', ('name', 'ilike', search), ('description', 'ilike', search) ] ]) if search_in in ('customer', 'all'): search_domain = OR( [search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): 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 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 if groupby == 'project': order = "project_id, %s" % order # force sort on project first to group by project in view 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] values.update({ 'date': date_begin, 'date_end': date_end, 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'default_url': '/my/tasks', '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, }) return request.render("project.portal_my_tasks", values)
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): 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'}, 'update': {'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc'}, } searchbar_filters = { 'all': {'label': _('All'), 'domain': []}, } searchbar_inputs = { 'content': {'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>')}, 'message': {'input': 'message', 'label': _('Search in Messages')}, 'customer': {'input': 'customer', 'label': _('Search in Customer')}, 'stage': {'input': 'stage', 'label': _('Search in Stages')}, 'all': {'input': 'all', 'label': _('Search in All')}, } searchbar_groupby = { 'none': {'input': 'none', 'label': _('None')}, 'project': {'input': 'project', 'label': _('Project')}, } # extends filterby criteria with project (criteria name is the project id) # Note: portal users can't view projects they don't follow projects = request.env['project.project'].sudo().search([('privacy_visibility', '=', 'portal')]) domain = [('project_id', 'in', projects.ids)] for proj in projects: searchbar_filters.update({ 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[filterby]['domain'] # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('project.task', domain) if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR([search_domain, ['|', ('name', 'ilike', search), ('description', 'ilike', search)]]) if search_in in ('customer', 'all'): search_domain = OR([search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): 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)]]) domain += search_domain # 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}, total=task_count, page=page, step=self._items_per_page ) # 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=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'))] else: grouped_tasks = [tasks] values.update({ 'date': date_begin, 'date_end': date_end, 'projects': projects, 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'archive_groups': archive_groups, 'default_url': '/my/tasks', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("project.portal_my_tasks", values)
def portal_my_team_permission(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, groupby='none', **kw): values = self._prepare_portal_layout_values() HrLeave = request.env['hr.permission'] Timeoff_sudo = request.env['hr.permission'].sudo() domain = self.get_domain_my_team_leaves(request.env.user) user = request.env.user emp = request.env['hr.employee'].search([('user_id', '=', user.id)], limit=1) # fileter By searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, 'refuse': { 'label': _('Refused'), 'domain': [('state', '=', 'refuse')] }, 'validate': { 'label': _('Approved'), 'domain': [('state', '=', 'validate')] }, } # sort By searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Name'), 'order': 'name' }, } # group By searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'timeoff': { 'input': 'timeoff', 'label': _('Time Off Type') }, } # 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[filterby]['domain'] # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('hr.permission', domain) if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # pager leave_count = HrLeave.search_count(domain) pager = request.website.pager(url="/my/team/leaves", url_args={ 'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby }, total=leave_count, page=page, step=self._items_per_page) # default groupby if groupby == 'timeoff': order = "holiday_status_id, %s" % order # content according to pager and archive selected leaves = HrLeave.search(domain, order=order, limit=self._items_per_page, offset=pager['offset']) if groupby == 'none': grouped_timeoff = [] if leaves: grouped_timeoff = [leaves] else: grouped_timeoff = [ Timeoff_sudo.concat(*g) for k, g in groupbyelem( leaves, itemgetter('holiday_status_id')) ] values.update({ 'date': date_begin, 'leaves': leaves, 'grouped_timeoff': grouped_timeoff, 'page_name': 'leave', 'archive_groups': archive_groups, 'default_url': '/my/team/permission', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'sortby': sortby, 'groupby': groupby, 'filterby': filterby, }) return request.render( "employee_portal_timeoff.my_team_portal_my_permission_details", values)
def portal_my_appointments(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='appointment_code', groupby='none', export='none', **kw): values = self._prepare_portal_layout_values() searchbar_sortings = { 'date': { 'label': _('Fecha de Realización'), 'order': 'calendar_datetime desc' }, 'appointment_code': { 'label': _('Agendamiento ID'), 'order': 'appointment_code desc' }, 'state': { 'label': _('Estado'), 'order': 'state' }, 'city_id': { 'label': _('Ciudad'), 'order': 'name' }, 'country_state_id': { 'label': _('Departamento'), 'order': 'name' }, 'process_number': { 'label': _('Número de Proceso'), 'order': 'process_number' }, } searchbar_filters = { 'all': { 'label': _('Todos'), 'domain': [] }, 'today': { 'label': _('Hoy'), 'domain': [('calendar_datetime', '<', datetime(2020, 8, 12, 23, 59, 59)), ('calendar_datetime', '>', datetime(2020, 8, 12, 0, 0, 1))] }, 'month': { 'label': _('Último Mes'), 'domain': [('calendar_datetime', '>', datetime(2020, 8, 1, 0, 0, 1)), ('calendar_datetime', '<', datetime(2020, 8, 31, 23, 59, 59))] }, 'realized': { 'label': _('Realizada'), 'domain': [('state', '=', 'realized')] }, 'open': { 'label': _('Agendado'), 'domain': [('state', '=', 'open')] }, 'unrealized': { 'label': _('No realizada'), 'domain': [('state', '=', 'unrealized')] }, 'postpone': { 'label': _('Aplazado'), 'domain': [('state', '=', 'postpone')] }, 'assist_postpone': { 'label': _('Asistida y aplazada'), 'domain': [('state', '=', 'assist_postpone')] }, 'assist_cancel': { 'label': _('Asistida y Cancelada'), 'domain': [('state', '=', 'assist_cancel')] }, 'draft': { 'label': _('Duplicado'), 'domain': [('state', '=', 'draft')] }, 'cancel': { 'label': _('Cancelado'), 'domain': [('state', '=', 'cancel')] }, } searchbar_inputs = { 'appointment_code': { 'input': 'appointment_code', 'label': _('Buscar <span class="nolabel"> (en Id Agendamiento)</span>') }, 'process_number': { 'input': 'process_number', 'label': _('Buscar por Número de Proceso') }, 'city_id': { 'input': 'city_id', 'label': _('Ciudad') }, 'create_uid': { 'input': 'create_uid', 'label': _('Creado por') }, 'judged_only_name': { 'input': 'judged_only_name', 'label': _('Despacho solicitante') }, 'applicant_id': { 'input': 'applicant_id', 'label': _('Buscar por Nombre Solicitante') }, 'declarant_text': { 'input': 'declarant_text', 'label': _('Buscar por Declarante') }, 'tag_number': { 'input': 'tag_number', 'label': _('Buscar Etiqueta') }, 'indicted_text': { 'input': 'indicted_text', 'label': _('Buscar por Procesado') }, 'applicant_email': { 'input': 'applicant_email', 'label': _('Buscar por Email del Aplicante') }, 'lifesize_meeting_ext': { 'input': 'lifesize_meeting_ext', 'label': _('Buscar por Ext reunión Lifesize') }, 'name': { 'input': 'name', 'label': _('Buscar por API Lifesize') }, 'state': { 'input': 'state', 'label': _('Buscar por Estado') }, 'all': { 'input': 'all', 'label': _('Buscar en Todos') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, #'appointment': {'input': 'appointment_code', 'label': _('Appointment')}, 'state': { 'input': 'state', 'label': _('State') }, } """appointments = request.env['calendar.appointment'].search([]) for appointment in appointments: searchbar_filters.update({ str(appointment.id): {'label': appointment.name, 'domain': [('state', '=', 'open')]} }) """ #for appointment in appointments: # searchbar_filters.update({ # str(appointment.id): {'label': appointment.name, 'domain': [('appointment_id', '=', appointment.id)]} # }) # extends filterby criteria with project (criteria name is the project id) # Note: portal users can't view projects they don't follow #appointment_groups = request.env['calendar.appointment'].read_group([('project_id', 'not in', projects.ids)], # ['project_id'], ['project_id']) """ for group in appointment_groups: proj_id = group['project_id'][0] if group['project_id'] else False proj_name = group['project_id'][1] if group['project_id'] else _('Others') searchbar_filters.update({ str(proj_id): {'label': proj_name, 'domain': [('project_id', '=', proj_id)]} }) """ # default sort by value if not sortby: sortby = 'appointment_code' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = searchbar_filters[filterby]['domain'] if not sortby: sortby = 'date' order = searchbar_sortings[sortby]['order'] # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('calendar.appointment', domain) if date_begin and date_end: date_begin = datetime.strptime(date_begin, '%Y-%m-%d %H:%M') date_begin = date_begin + timedelta(hours=5) date_end = datetime.strptime(date_end, '%Y-%m-%d %H:%M') date_end = date_end + timedelta(hours=5) domain += [('calendar_datetime', '>=', date_begin), ('calendar_datetime', '<=', date_end)] # appointments count #appointment_count = Appointment.search_count(domain) # search if search and search_in: search_domain = [] if search_in in ('appointment_code', 'all'): search_domain = OR( [search_domain, [('appointment_code', 'ilike', search)]]) if search_in in ('create_uid', 'all'): search_domain = OR( [search_domain, [('create_uid', 'ilike', search)]]) if search_in in ('city_id', 'all'): search_domain = OR( [search_domain, [('city_id', 'ilike', search)]]) if search_in in ('judged_only_name', 'all'): search_domain = OR( [search_domain, [('judged_only_name', 'ilike', search)]]) if search_in in ('process_number', 'all'): search_domain = OR( [search_domain, [('process_number', 'ilike', search)]]) if search_in in ('applicant_id', 'all'): search_domain = OR( [search_domain, [('applicant_id', 'ilike', search)]]) if search_in in ('declarant_text', 'all'): search_domain = OR( [search_domain, [('declarant_text', 'ilike', search)]]) if search_in in ('tag_number', 'all'): search_domain = OR( [search_domain, [('tag_number', 'ilike', search)]]) if search_in in ('indicted_text', 'all'): search_domain = OR( [search_domain, [('indicted_text', 'ilike', search)]]) if search_in in ('applicant_email', 'all'): search_domain = OR( [search_domain, [('applicant_email', 'ilike', search)]]) domain += search_domain if search_in in ('lifesize_meeting_ext', 'all'): search_domain = OR([ search_domain, [('lifesize_meeting_ext', 'ilike', search)] ]) domain += search_domain if search_in in ('name', 'all'): search_domain = OR( [search_domain, [('name', 'ilike', search)]]) domain += search_domain if search_in in ('state', 'all'): search_domain = OR( [search_domain, [('state', 'ilike', search)]]) domain += search_domain _logger.error(domain) # when partner is not scheduler they can only view their own partner = request.env.user.partner_id judged_id = partner.parent_id if partner.appointment_type != 'scheduler': domain += [('partner_id', '=', judged_id.id)] appointment_count = request.env['calendar.appointment'].search_count( domain) # pager pager = portal_pager(url="/my/appointments", url_args={ 'date_begin': date_begin, 'date_end': date_end, 'search': search, 'sortby': sortby, 'filterby': filterby, 'search_in': search_in }, total=appointment_count, page=page, step=self._items_per_page) if groupby == 'state': order = "state, %s" % order appointments = request.env['calendar.appointment'].sudo().search( domain, order=order, limit=self._items_per_page, offset=pager['offset']) if groupby == 'state': grouped_appointments = [ request.env['calendar.appointment'].sudo().concat(*g) for k, g in groupbyelem(appointments, itemgetter('state')) ] else: grouped_appointments = [appointments] # content according to pager and archive selected appointments = request.env['calendar.appointment'].search( domain, order=order, limit=self._items_per_page, offset=pager['offset']) request.session['my_appointments_history'] = appointments.ids[:100] # excel generation # Create a workbook and add a worksheet. #if export == 'on' and date_begin and date_end: if export == 'on': appointments_total = request.env['calendar.appointment'].sudo( ).search(domain, order=order) response = request.make_response( None, headers=[('Content-Type', 'application/vnd.ms-excel'), ('Content-Disposition', content_disposition('Reporte_Agendamientos.xlsx'))]) output = io.BytesIO() workbook = xlsxwriter.Workbook(output, { 'in_memory': True, 'default_date_format': 'yyyy/mm/dd' }) sheet = workbook.add_worksheet('Agendamientos') cell_format = workbook.add_format() head = workbook.add_format() txt = workbook.add_format() dateformat = workbook.add_format() timeformat = workbook.add_format() datetimeformat = workbook.add_format() sheet.set_column('A:A', 20) sheet.set_column('B:B', 40) sheet.set_column('C:C', 20) sheet.set_column('C:C', 20) sheet.set_column('D:D', 20, dateformat) sheet.set_column('E:E', 20) sheet.set_column('F:F', 20) sheet.set_column('G:G', 60) sheet.set_column('H:H', 20) sheet.set_column('I:I', 20) sheet.set_column('J:J', 20) sheet.set_column('K:K', 20) sheet.set_column('L:L', 50) sheet.set_column('M:M', 50) sheet.set_column('N:N', 20, dateformat) sheet.set_column('O:O', 40) sheet.set_column('P:P', 20) sheet.set_column('Q:Q', 50) sheet.set_column('R:R', 30) sheet.set_column('S:S', 20) sheet.set_column('T:T', 40) sheet.set_column('U:U', 20) sheet.set_column('V:V', 20) sheet.set_column('W:W', 20) sheet.set_column('X:X', 20) sheet.set_column('Y:Y', 40, dateformat) sheet.set_column('Z:Z', 20) sheet.set_column('AA:AA', 50) sheet.set_column('AB:AB', 20, dateformat) sheet.set_column('AC:AC', 20) sheet.set_column('AD:AD', 20, dateformat) sheet.set_column('AE:AE', 20, timeformat) sheet.set_column('AF:AF', 20) sheet.set_column('AG:AG', 20) sheet.set_column('AH:AH', 60) sheet.set_column('AI:AI', 60) sheet.set_column('AJ:AJ', 20) sheet.set_column('AK:AK', 40) sheet.set_column('AL:AL', 20) sheet.set_column('AM:AM', 40, datetimeformat) #sheet.merge_range('B2:I3', 'REPORTE DE AGENDAMIENTOS', head) sheet.write('A1', 'ID SOLICITUD', head) sheet.write('B1', 'TIPO DE SOLICITUD', head) sheet.write('C1', 'TIPO DE AUDIENCIA', head) sheet.write('D1', 'FECHA DE REALIZACIÓN', head) sheet.write('E1', 'HORA DE INICIO', head) sheet.write('F1', 'CÓDIGO DESPACHO SOLICITANTE', head) sheet.write('G1', 'DESPACHO SOLICITANTE', head) sheet.write('H1', 'CIUDAD ORIGEN', head) sheet.write('I1', 'DEPARTAMENTO ORIGEN', head) sheet.write('J1', 'DESTINOS', head) sheet.write('K1', 'MEDIO DE RECEPCIÓN', head) sheet.write('L1', 'DETALLES MEDIO DE RECEPCIÓN', head) sheet.write('M1', 'OBSERVACIONES', head) sheet.write('N1', 'FECHA DE SOLICITUD', head) sheet.write('O1', 'NOMBRE DEL SOLICITANTE', head) sheet.write('P1', 'ESTADO', head) sheet.write('Q1', 'CORREO SALIENTE', head) sheet.write('R1', 'NÚMERO DE PROCESO', head) sheet.write('S1', 'SALA', head) sheet.write('T1', 'CORREO PARTICIPANTES', head) sheet.write('U1', 'CELULAR', head) sheet.write('V1', 'CLASE DE VIDEOCONFERENCIA', head) sheet.write('W1', 'TIPO DE AUDIENCIA', head) #sheet.write('X1', 'DECLARANTE', head) #sheet.write('Y1', 'PROCESADO', head) sheet.write('X1', 'FECHA AGENDAMIENTO', head) sheet.write('Y1', 'USUARIO AGENDAMIENTO', head) sheet.write('Z1', 'FECHA CIERRE', head) sheet.write('AA1', 'USUARIO DE CIERRE', head) sheet.write('AB1', 'FECHA FINAL', head) sheet.write('AC1', 'HORA FINAL', head) sheet.write('AD1', 'DESCRIPCION', head) sheet.write('AE1', 'ETIQUETA', head) sheet.write('AF1', 'URL DE GRABACIÓN', head) sheet.write('AG1', 'DESCARGA DE GRABACIÓN', head) sheet.write('AH1', 'CREADO POR', head) sheet.write('AI1', 'NOMBRE SALA LIFESIZE', head) sheet.write('AJ1', 'URL LIFESIZE', head) sheet.write('AK1', 'FECHA Y HORA DE REALIZACIÓN', head) row = 2 for appointment in appointments_total: ########## ##TRADUCCION ESTADOS ################### if appointment.state == 'open': state_label = 'AGENDADO' if appointment.state == 'realized': state_label = 'REALIZADA' if appointment.state == 'unrealized': state_label = 'NO REALIZADA' if appointment.state == 'assist_postpone': state_label = 'ASISTIDA Y APLAZADA' if appointment.state == 'postpone': state_label = 'APLAZADA' if appointment.state == 'assist_cancel': state_label = 'ASISTIDA Y CANCELADA' if appointment.state == 'cancel': state_label = 'CANCELADO' if appointment.state == 'draft': state_label = 'DUPLICADO' ########## ##TRADUCIÓN TIPO AUDIENCIA ################### if appointment.type == 'audience': type_label = 'AUDIENCIA' if appointment.type == 'conference': type_label = 'VIDEO CONFERENCIA' if appointment.type == 'streaming': type_label = 'STREAMING' sheet.write('A' + str(row), appointment.appointment_code, cell_format) sheet.write('B' + str(row), appointment.request_type_label, cell_format) sheet.write('C' + str(row), type_label, cell_format) sheet.write('D' + str(row), str(appointment.calendar_date), cell_format) newstrtime = '{0:02.0f}:{1:02.0f}'.format( *divmod(appointment.calendar_time * 60, 60)) sheet.write('E' + str(row), newstrtime, cell_format) sheet.write('F' + str(row), appointment.judged_only_code, cell_format) sheet.write('G' + str(row), appointment.judged_only_name, cell_format) sheet.write('H' + str(row), appointment.city_id.name.upper(), cell_format) sheet.write('I' + str(row), appointment.country_state_id.name.upper(), cell_format) sheet.write('J' + str(row), appointment.destination_ids_label, cell_format) sheet.write('K' + str(row), appointment.reception_id.name, cell_format) sheet.write('L' + str(row), appointment.reception_detail.upper(), cell_format) sheet.write('M' + str(row), appointment.observations.upper(), cell_format) sheet.write('N' + str(row), str(appointment.request_date), dateformat) sheet.write('O' + str(row), appointment.applicant_id.name.upper(), cell_format) sheet.write('P' + str(row), state_label, cell_format) sheet.write('Q' + str(row), appointment.applicant_email, cell_format) sheet.write('R' + str(row), appointment.process_number, cell_format) sheet.write( 'S' + str(row), appointment.room_id_mame.upper() if appointment.room_id_mame else '', cell_format) sheet.write('T' + str(row), appointment.partner_ids_label, cell_format) sheet.write('U' + str(row), appointment.applicant_mobile, cell_format) sheet.write('V' + str(row), appointment.class_id.name.upper(), cell_format) sheet.write('W' + str(row), appointment.request_type.upper(), cell_format) #sheet.write('X'+str(row), appointment.declarant_text.upper(), cell_format) #sheet.write('Y'+str(row), appointment.indicted_text.upper(), cell_format) sheet.write('X' + str(row), str(appointment.appointment_date), cell_format) sheet.write('Y' + str(row), appointment.create_uid_login, cell_format) sheet.write( 'Z' + str(row), str(appointment.appointment_close_date) if appointment.appointment_close_date else '', cell_format) sheet.write( 'AA' + str(row), appointment.appointment_close_user_login if appointment.appointment_close_user_login else '', cell_format) sheet.write( 'AB' + str(row), str(appointment.end_date) if appointment.end_date else '', cell_format) newstrtime_end_hour = '{0:02.0f}:{1:02.0f}'.format( *divmod(appointment.end_hour * 60, 60)) sheet.write( 'AC' + str(row), str(newstrtime_end_hour) if newstrtime_end_hour else '', cell_format) sheet.write( 'AD' + str(row), appointment.state_description.upper() if appointment.state_description else '', cell_format) sheet.write('AE' + str(row), appointment.tag_number, cell_format) sheet.write( 'AF' + str(row), appointment.link_download if appointment.link_download else '', cell_format) sheet.write( 'AG' + str(row), appointment.link_download_text if appointment.link_download_text else '', cell_format) sheet.write('AH' + str(row), appointment.create_uid.login, cell_format) sheet.write('AI' + str(row), appointment.name, cell_format) sheet.write('AJ' + str(row), appointment.lifesize_url, cell_format) sheet.write( 'AK' + str(row), str(appointment.calendar_datetime - relativedelta(hours=5)), cell_format) row += 1 workbook.close() output.seek(0) response.stream.write(output.read()) output.close() #response.set_cookie('fileToken', token) return response values.update({ 'date_begin': date_begin, 'date_end': date_end, 'appointments': appointments, 'grouped_appointments': grouped_appointments, 'total': appointment_count, 'page_name': 'appointment', 'archive_groups': archive_groups, 'default_url': '/my/appointments', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'sortby': sortby, 'search': search, 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("calendar_csj.portal_my_appointments", values)
def portal_my_signatures(self, page=1, date_begin=None, date_end=None, sortby=None, search=None, search_in='all', groupby='none', filterby=None, **kw): values = self._prepare_portal_layout_values() partner_id = request.env.user.partner_id SignRequestItem = request.env['sign.request.item'].sudo() default_domain = [('partner_id', '=', partner_id.id), ('state', '!=', 'draft')] searchbar_sortings = { 'new': { 'label': _('Newest'), 'order': 'sign_request_id desc' }, 'date': { 'label': _('Signing Date'), 'order': 'signing_date desc' }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': default_domain }, 'tosign': { 'label': _('To sign'), 'domain': AND([ default_domain, [('state', '=', 'sent'), ('sign_request_id.state', '=', 'sent')] ]) }, 'completed': { 'label': _('Completed'), 'domain': AND([default_domain, [('state', '=', 'completed')]]) }, 'signed': { 'label': _('Fully Signed'), 'domain': AND([ default_domain, [('sign_request_id.state', '=', 'signed')] ]) }, } searchbar_inputs = { 'all': { 'input': 'all', 'label': _('Search <span class="nolabel"> (in Document)</span>') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'state': { 'input': 'state', 'label': _('Status') }, } # default sortby order if not sortby: sortby = 'new' sort_order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = searchbar_filters[filterby]['domain'] if date_begin and date_end: domain = AND([ domain, [('signing_date', '>', date_begin), ('signing_date', '<=', date_end)] ]) # search only the document name if search and search_in: domain = AND([domain, [('reference', 'ilike', search)]]) pager = portal_pager(url='/my/signatures', url_args={ 'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby, 'search_in': search_in, 'search': search }, total=SignRequestItem.search_count(domain), page=page, step=self._items_per_page) # content according to pager and archive selected if groupby == 'state': sort_order = 'state, %s' % sort_order # search the count to display, according to the pager data sign_requests_items = SignRequestItem.search( domain, order=sort_order, limit=self._items_per_page, offset=pager['offset']) request.session[ 'my_signatures_history'] = sign_requests_items.ids[:100] if groupby == 'state': grouped_signatures = [ SignRequestItem.concat(*g) for k, g in groupbyelem( sign_requests_items, itemgetter('state')) ] else: grouped_signatures = [sign_requests_items] values.update({ 'date': date_begin, 'grouped_signatures': grouped_signatures, 'page_name': 'signatures', 'pager': pager, 'default_url': '/my/signatures', 'searchbar_sortings': searchbar_sortings, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'groupby': groupby, 'sortby': sortby, 'filterby': filterby, }) return request.render('sign.sign_portal_my_requests', values)
def list_tasks(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby='project', partner_id=None, **kw): """ Override 'portal_my_tasks' (not calling super) in addons/project/controllers/portal.py. Needed to be done for supporting tasks for records (eg. devices) not related to logged in user. Added partner routes & partner_id param. """ values = self._prepare_portal_layout_values() partner = request.env['res.partner'].sudo().browse(partner_id) if not partner: partner = request.env.user.partner_id searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Title'), 'order': 'name' }, 'stage': { 'label': _('Stage'), 'order': 'stage_id' }, 'update': { 'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc' }, } searchbar_filters = { 'all': { 'label': _('All'), # Revamped domain to be based off passed in partner_id 'domain': [('project_id.message_partner_ids', 'child_of', partner.commercial_partner_id.id)] }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>') }, 'message': { 'input': 'message', 'label': _('Search in Messages') }, 'customer': { 'input': 'customer', 'label': _('Search in Customer') }, 'stage': { 'input': 'stage', 'label': _('Search in Stages') }, 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'project': { 'input': 'project', 'label': _('Project') }, } # extends filterby criteria with project the customer has access to projects = request.env['project.project'].search([ # Revamped domain to be based off passed in partner_id ('message_partner_ids', 'child_of', partner.commercial_partner_id.id) ]) for project in projects: searchbar_filters.update({ str(project.id): { 'label': project.name, 'domain': [('project_id', '=', project.id)] } }) # extends filterby criteria with project (criteria name is the project id) # Note: portal users can't view projects they don't follow project_groups = request.env['project.task'].read_group( [('project_id', 'not in', projects.ids)], ['project_id'], ['project_id']) for group in project_groups: proj_id = group['project_id'][0] if group['project_id'] else False proj_name = group['project_id'][1] if group['project_id'] else _( 'Others') searchbar_filters.update({ 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[filterby]['domain'] # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('project.task', domain) if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR([ search_domain, [ '|', ('name', 'ilike', search), ('description', 'ilike', search) ] ]) if search_in in ('customer', 'all'): search_domain = OR( [search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): 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)]]) domain += search_domain # 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, 'search_in': search_in, 'search': search }, total=task_count, page=page, step=self._items_per_page) # 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) 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')) ] else: grouped_tasks = [tasks] values.update({ 'date': date_begin, 'date_end': date_end, 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'archive_groups': archive_groups, 'default_url': '/my/tasks', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, 'partner': partner, # pass partner so when going from other companies records it shows the right company. }) return request.render("project.portal_my_tasks", values)
def portal_my_timesheets(self, page=1, sortby=None, filterby=None, search=None, search_in='all', groupby='project', **kw): Timesheet_sudo = request.env['account.analytic.line'].sudo() values = self._prepare_portal_layout_values() domain = request.env['account.analytic.line']._timesheet_get_portal_domain() searchbar_sortings = { 'date': {'label': _('Newest'), 'order': 'date desc'}, 'name': {'label': _('Name'), 'order': 'name'}, } searchbar_inputs = { 'all': {'input': 'all', 'label': _('Search in All')}, } searchbar_groupby = { 'none': {'input': 'none', 'label': _('None')}, 'project': {'input': 'project', 'label': _('Project')}, } today = fields.Date.today() quarter_start, quarter_end = date_utils.get_quarter(today) last_week = today + relativedelta(weeks=-1) last_month = today + relativedelta(months=-1) last_year = today + relativedelta(years=-1) searchbar_filters = { 'all': {'label': _('All'), 'domain': []}, 'today': {'label': _('Today'), 'domain': [("date", "=", today)]}, 'week': {'label': _('This week'), 'domain': [('date', '>=', date_utils.start_of(today, "week")), ('date', '<=', date_utils.end_of(today, 'week'))]}, 'month': {'label': _('This month'), 'domain': [('date', '>=', date_utils.start_of(today, 'month')), ('date', '<=', date_utils.end_of(today, 'month'))]}, 'year': {'label': _('This year'), 'domain': [('date', '>=', date_utils.start_of(today, 'year')), ('date', '<=', date_utils.end_of(today, 'year'))]}, 'quarter': {'label': _('This Quarter'), 'domain': [('date', '>=', quarter_start), ('date', '<=', quarter_end)]}, 'last_week': {'label': _('Last week'), 'domain': [('date', '>=', date_utils.start_of(last_week, "week")), ('date', '<=', date_utils.end_of(last_week, 'week'))]}, 'last_month': {'label': _('Last month'), 'domain': [('date', '>=', date_utils.start_of(last_month, 'month')), ('date', '<=', date_utils.end_of(last_month, 'month'))]}, 'last_year': {'label': _('Last year'), 'domain': [('date', '>=', date_utils.start_of(last_year, 'year')), ('date', '<=', date_utils.end_of(last_year, 'year'))]}, } # default sort by value if not sortby: sortby = 'date' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = AND([domain, searchbar_filters[filterby]['domain']]) if search and search_in: domain = AND([domain, [('name', 'ilike', search)]]) timesheet_count = Timesheet_sudo.search_count(domain) # pager pager = portal_pager( url="/my/timesheets", url_args={'sortby': sortby, 'search_in': search_in, 'search': search, 'filterby': filterby}, total=timesheet_count, page=page, step=self._items_per_page ) if groupby == 'project': order = "project_id, %s" % order timesheets = Timesheet_sudo.search(domain, order=order, limit=self._items_per_page, offset=pager['offset']) if groupby == 'project': grouped_timesheets = [Timesheet_sudo.concat(*g) for k, g in groupbyelem(timesheets, itemgetter('project_id'))] else: grouped_timesheets = [timesheets] values.update({ 'timesheets': timesheets, 'grouped_timesheets': grouped_timesheets, 'page_name': 'timesheet', 'default_url': '/my/timesheets', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_inputs': searchbar_inputs, 'searchbar_groupby': searchbar_groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("hr_timesheet.portal_my_timesheets", values)
def my_helpdesk_tickets(self, page=1, date_begin=None, date_end=None, sortby=None, filterby='all', search=None, groupby='none', search_in='content', **kw): values = self._prepare_portal_layout_values() searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Subject'), 'order': 'name' }, 'stage': { 'label': _('Stage'), 'order': 'stage_id' }, 'reference': { 'label': _('Reference'), 'order': 'id' }, 'update': { 'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc' }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, 'assigned': { 'label': _('Assigned'), 'domain': [('user_id', '!=', False)] }, 'unassigned': { 'label': _('Unassigned'), 'domain': [('user_id', '=', False)] }, 'open': { 'label': _('Open'), 'domain': [('close_date', '=', False)] }, 'closed': { 'label': _('Closed'), 'domain': [('close_date', '!=', False)] }, 'last_message_sup': { 'label': _('Last message is from support') }, 'last_message_cust': { 'label': _('Last message is from customer') }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>') }, 'message': { 'input': 'message', 'label': _('Search in Messages') }, 'customer': { 'input': 'customer', 'label': _('Search in Customer') }, 'id': { 'input': 'id', 'label': _('Search in Reference') }, 'status': { 'input': 'status', 'label': _('Search in Stage') }, 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'stage': { 'input': 'stage_id', 'label': _('Stage') }, } # default sort by value if not sortby: sortby = 'date' order = searchbar_sortings[sortby]['order'] if filterby in ['last_message_sup', 'last_message_cust']: discussion_subtype_id = request.env.ref('mail.mt_comment').id messages = request.env['mail.message'].search_read( [('model', '=', 'helpdesk.ticket'), ('subtype_id', '=', discussion_subtype_id)], fields=['res_id', 'author_id'], order='date desc') last_author_dict = {} for message in messages: if message['res_id'] not in last_author_dict: last_author_dict[ message['res_id']] = message['author_id'][0] ticket_author_list = request.env['helpdesk.ticket'].search_read( fields=['id', 'partner_id']) ticket_author_dict = dict([ (ticket_author['id'], ticket_author['partner_id'][0] if ticket_author['partner_id'] else False) for ticket_author in ticket_author_list ]) last_message_cust = [] last_message_sup = [] for ticket_id in last_author_dict.keys(): if last_author_dict[ticket_id] == ticket_author_dict[ ticket_id]: last_message_cust.append(ticket_id) else: last_message_sup.append(ticket_id) if filterby == 'last_message_cust': domain = [('id', 'in', last_message_cust)] else: domain = [('id', 'in', last_message_sup)] else: domain = searchbar_filters[filterby]['domain'] if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('id', 'all'): search_domain = OR([search_domain, [('id', 'ilike', search)]]) if search_in in ('content', 'all'): search_domain = OR([ search_domain, [ '|', ('name', 'ilike', search), ('description', 'ilike', search) ] ]) if search_in in ('customer', 'all'): search_domain = OR( [search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): discussion_subtype_id = request.env.ref('mail.mt_comment').id search_domain = OR([ search_domain, [('message_ids.body', 'ilike', search), ('message_ids.subtype_id', '=', discussion_subtype_id)] ]) if search_in in ('status', 'all'): search_domain = OR( [search_domain, [('stage_id', 'ilike', search)]]) domain += search_domain # pager tickets_count = len(request.env['helpdesk.ticket'].search(domain)) pager = portal_pager(url="/my/tickets", url_args={ 'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'search_in': search_in, 'search': search }, total=tickets_count, page=page, step=self._items_per_page) tickets = request.env['helpdesk.ticket'].search( domain, order=order, limit=self._items_per_page, offset=pager['offset']) request.session['my_tickets_history'] = tickets.ids[:100] if groupby == 'stage': grouped_tickets = [ request.env['helpdesk.ticket'].concat(*g) for k, g in groupbyelem(tickets, itemgetter('stage_id')) ] else: grouped_tickets = [tickets] values.update({ 'date': date_begin, 'grouped_tickets': grouped_tickets, 'page_name': 'ticket', 'default_url': '/my/tickets', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_filters': searchbar_filters, 'searchbar_inputs': searchbar_inputs, 'searchbar_groupby': searchbar_groupby, 'sortby': sortby, 'groupby': groupby, 'search_in': search_in, 'search': search, 'filterby': filterby, }) return request.render("helpdesk.portal_helpdesk_ticket", values)
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() elif not request.env.user._is_public(): domain = AND([ domain, request.env['ir.rule']._compute_domain(Task._name, 'read') ]) Task = Task.sudo() # task count task_count = Task.search_count(domain) # pager url = "/my/project/%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.update( date=date_begin, date_end=date_end, grouped_tasks=grouped_tasks, 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, ) return self._get_page_view_values(project, access_token, values, 'my_projects_history', False, **kwargs)
def portal_my_brd_list(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby='section', **kw): values = self._prepare_portal_layout_values() searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Title'), 'order': 'name' }, 'ref': { 'label': _('Reference'), 'order': 'sequence' }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>') }, 'message': { 'input': 'message', 'label': _('Search in Messages') }, 'stakeholder': { 'input': 'stakeholder', 'label': _('Search in Stakeholder') }, 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'business_requirement': { 'input': 'br', 'label': _('Business Requirement') }, 'section': { 'input': 'section', 'label': _('Section') }, } # extends filterby criteria with br the customer has access to business_requirements = request.env['business.requirement'].search( self._prepare_br_base_domain()) domain = self._prepare_brd_base_domain(business_requirements) for br in business_requirements: searchbar_filters.update({ str(br.id): { 'label': br.name, 'domain': [('business_requirement_id', '=', br.id)] } }) # default sort by value if not sortby: sortby = 'ref' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain += searchbar_filters[filterby]['domain'] # archive groups - Default Group By 'sequence' archive_groups = self._get_archive_groups( 'business.requirement.deliverable', domain) if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR( [search_domain, [('name', 'ilike', search)]]) if search_in in ('stakeholder', 'all'): search_domain = OR([ search_domain, [('business_requirement_id.partner_id', 'ilike', search)] ]) if search_in in ('message', 'all'): search_domain = OR( [search_domain, [('message_ids.body', 'ilike', search)]]) domain += search_domain BRDObj = request.env['business.requirement.deliverable'] # brd count brd_count = BRDObj.search_count(domain) # pager pager = portal_pager(url="/my/brd", url_args={ 'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby, 'search_in': search_in, 'search': search }, total=brd_count, page=page, step=self._items_per_page) # content according to pager and archive selected if groupby == 'business_requirement': # Force sort on br first to group by br in view order = "business_requirement_id, %s" % order elif groupby == 'section': order = "section_id, %s" % order brd_recs = BRDObj.search(domain, order=order, limit=self._items_per_page, offset=(page - 1) * self._items_per_page) request.session['my_brd_history'] = brd_recs.ids[:100] if groupby == 'business_requirement': grouped_brd = [ BRDObj.concat(*g) for k, g in groupbyelem( brd_recs, itemgetter('business_requirement_id')) ] elif groupby == 'section': grouped_brd = [ BRDObj.concat(*g) for k, g in groupbyelem(brd_recs, itemgetter('section_id')) ] else: grouped_brd = [brd_recs] values.update({ 'date': date_begin, 'date_end': date_end, 'grouped_brd': grouped_brd, 'page_name': 'business_requirement_deliverable', 'archive_groups': archive_groups, 'default_url': '/my/brd', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render( "business_requirement_deliverable.portal_my_brd_list", values)
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 = self._task_get_searchbar_sortings() searchbar_sortings = dict( sorted(self._task_get_searchbar_sortings().items(), key=lambda item: item[1]["sequence"])) 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: searchbar_filters.update({ str(project.id): { 'label': project.name, 'domain': [('project_id', '=', project.id)] } }) # extends filterby criteria with project (criteria name is the project id) # Note: portal users can't view projects they don't follow project_groups = request.env['project.task'].read_group( [('project_id', 'not in', projects.ids)], ['project_id'], ['project_id']) for group in project_groups: proj_id = group['project_id'][0] if group['project_id'] else False proj_name = group['project_id'][1] if group['project_id'] else _( 'Others') searchbar_filters.update({ 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' 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) TaskSudo = request.env['project.task'].sudo() domain = AND([ domain, request.env['ir.rule']._compute_domain(TaskSudo._name, 'read') ]) # task count task_count = TaskSudo.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 = TaskSudo.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)) values.update({ 'date': date_begin, 'date_end': date_end, 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'default_url': '/my/tasks', 'task_url': 'task', '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, }) return request.render("project.portal_my_tasks", values)
def my_helpdesk_tickets(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby='stage', **kw): values = self._prepare_portal_layout_values() user = request.env.user domain = [ '|', ('user_id', '=', user.id), ('partner_id', 'child_of', user.partner_id.commercial_partner_id.id) ] searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Subject'), 'order': 'name' }, 'stage': { 'label': _('Priority'), 'order': 'stage_id desc, %s' % request.env['helpdesk.ticket']._order }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, 'open': { 'label': _('Open'), 'domain': [('stage_id.is_close', '=', False)] }, 'closed': { 'label': _(' Resolved'), 'domain': [('stage_id.is_close', '=', True)], 'order': 'close_date' }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>') }, 'message': { 'input': 'message', 'label': _('Search in Messages') }, 'customer': { 'input': 'customer', 'label': _('Search in Customer') }, 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'stage': { 'input': 'stage', 'label': _('Stage') }, } # default sort by value if not sortby: sortby = 'stage' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'open' domain += searchbar_filters[filterby]['domain'] # archive groups - Default Group By 'create_date' archive_groups = self._get_archive_groups('helpdesk.ticket', domain) if date_begin and date_end: domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR([ search_domain, [ '|', ('name', 'ilike', search), ('description', 'ilike', search) ] ]) if search_in in ('customer', 'all'): search_domain = OR( [search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): search_domain = OR( [search_domain, [('message_ids.body', 'ilike', search)]]) domain += search_domain # pager tickets_count = request.env['helpdesk.ticket'].search_count(domain) pager = portal_pager( url="/my/tickets", # url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby}, url_args={ 'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby, 'search_in': search_in, 'search': search }, total=tickets_count, page=page, step=self._items_per_page) # group by if groupby == 'stage': order = "stage_id desc, %s" % order # force sort on stage first to group by stage in view tickets = request.env['helpdesk.ticket'].search( domain, order=order, limit=self._items_per_page, offset=pager['offset']) request.session['my_tickets_history'] = tickets.ids[:100] if groupby == 'stage': grouped_tickets = [ request.env['helpdesk.ticket'].concat(*g) for k, g in groupbyelem(tickets, itemgetter('stage_id')) ] else: grouped_tickets = [tickets] values.update({ 'date': date_begin, # el tickets es medio al pedo, solo para un t-if al principio que # podria reemplazarse por grouped_tickets 'tickets': tickets, 'grouped_tickets': grouped_tickets, 'page_name': 'ticket', 'default_url': '/my/tickets', 'pager': pager, 'archive_groups': archive_groups, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'sortby': sortby, 'groupby': groupby, 'search_in': search_in, 'search': search, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("helpdesk.portal_helpdesk_ticket", values)
def portal_my_tmi_tasks(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby='project', **kw): values = { 'project_count': request.env['project.project'].sudo().search_count([]), 'task_count': request.env['project.task'].sudo().search_count([]) } searchbar_sortings = { 'date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Title'), 'order': 'name' }, 'stage': { 'label': _('Stage'), 'order': 'stage_id' }, 'update': { 'label': _('Last Stage Update'), 'order': 'date_last_stage_update desc' }, } searchbar_filters = { 'all': { 'label': _('All'), 'domain': [] }, } searchbar_inputs = { 'content': { 'input': 'content', 'label': _('Search <span class="nolabel"> (in Content)</span>') }, 'message': { 'input': 'message', 'label': _('Search in Messages') }, 'customer': { 'input': 'customer', 'label': _('Search in Customer') }, 'stage': { 'input': 'stage', 'label': _('Search in Stages') }, 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'none': { 'input': 'none', 'label': _('None') }, 'project': { 'input': 'project', 'label': _('Project') }, } # extends filterby criteria with project the customer has access to projects = request.env['project.project'].sudo().search([]) for project in projects: searchbar_filters.update({ str(project.id): { 'label': project.name, 'domain': [('project_id', '=', project.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[filterby]['domain'] # search if search and search_in: search_domain = [] if search_in in ('content', 'all'): search_domain = OR([ search_domain, [ '|', ('name', 'ilike', search), ('description', 'ilike', search) ] ]) if search_in in ('customer', 'all'): search_domain = OR( [search_domain, [('partner_id', 'ilike', search)]]) if search_in in ('message', 'all'): 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)]]) domain += search_domain # task count task_count = request.env['project.task'].sudo().search_count(domain) # 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 }, total=task_count, page=page, step=self._items_per_page) # 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'].sudo().search( domain, order=order, limit=self._items_per_page, offset=(page - 1) * self._items_per_page) request.session['my_tasks_history'] = tasks.ids[:100] if groupby == 'project': grouped_tasks = [ request.env['project.task'].sudo().concat(*g) for k, g in groupbyelem(tasks, itemgetter('project_id')) ] else: grouped_tasks = [tasks] values.update({ 'date': date_begin, 'date_end': date_end, 'grouped_tasks': grouped_tasks, 'page_name': 'task', 'default_url': '/my/tasks', 'pager': pager, 'searchbar_sortings': searchbar_sortings, 'searchbar_groupby': searchbar_groupby, 'searchbar_inputs': searchbar_inputs, 'search_in': search_in, 'sortby': sortby, 'groupby': groupby, 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), 'filterby': filterby, }) return request.render("crm_tbm_advanced.portal_my_tasks", values)