Exemple #1
0
        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
Exemple #2
0
        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
Exemple #3
0
 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
Exemple #4
0
 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
Exemple #5
0
        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
Exemple #6
0
    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)
Exemple #7
0
    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,
        }
Exemple #8
0
    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,
        }
Exemple #9
0
    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)
Exemple #10
0
    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)
Exemple #11
0
    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)
Exemple #12
0
    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)
Exemple #13
0
    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)
Exemple #14
0
    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)
Exemple #15
0
    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)
Exemple #16
0
    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)
Exemple #17
0
    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)
Exemple #18
0
    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)
Exemple #19
0
    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)
Exemple #21
0
    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)