Odoo18-Base/enterprise-17.0/helpdesk_fsm/controllers/portal.py
2025-01-06 10:57:38 +07:00

79 lines
3.3 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import OrderedDict
from werkzeug.exceptions import NotFound
from odoo import _
from odoo.http import request, route
from odoo.exceptions import AccessError, MissingError
from odoo.osv.expression import AND
from odoo.addons.helpdesk.controllers.portal import CustomerPortal
from odoo.addons.portal.controllers.portal import pager as portal_pager
from odoo.addons.project.controllers.portal import ProjectCustomerPortal
class ProjectHelpdeskPortal(ProjectCustomerPortal, CustomerPortal):
def _task_get_page_view_values(self, task, access_token, **kwargs):
values = super()._task_get_page_view_values(task, access_token, **kwargs)
try:
if task.helpdesk_ticket_id and self._document_check_access('helpdesk.ticket', task.helpdesk_ticket_id.id):
values['task_link_section'].append({
'access_url': task.helpdesk_ticket_id.get_portal_url(),
'title': _('Ticket'),
})
except (AccessError, MissingError):
pass
return values
def _ticket_get_page_view_values(self, ticket, access_token, **kwargs):
values = super()._ticket_get_page_view_values(ticket, access_token, **kwargs)
if ticket.fsm_task_count and request.env['project.task'].check_access_rights('read', raise_exception=False):
tasks = request.env['project.task'].search([('id', 'in', ticket.fsm_task_ids.ids)])
if tasks:
if len(tasks) == 1:
ticket_fsm_task_url = f'/my/tasks/{tasks.id}'
title = _('Task')
else:
ticket_fsm_task_url = f'/my/tickets/{ticket.id}/tasks'
title = _('Tasks')
values['ticket_link_section'].append({
'access_url': ticket_fsm_task_url,
'title': title,
'sequence': 3,
})
return values
@route([
'/my/tickets/<ticket_id>/tasks',
'/my/tickets/<ticket_id>/tasks/page/<int:page>'
], type='http', auth="user", website=True)
def portal_my_tickets_task(self, ticket_id=None, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, search=None, search_in='content', groupby=None, **kw):
ticket = request.env['helpdesk.ticket'].search([('id', '=', ticket_id)])
if not ticket.exists():
return NotFound()
searchbar_filters = self._get_my_tasks_searchbar_filters()
if not filterby:
filterby = 'all'
domain = searchbar_filters.get(filterby, searchbar_filters.get('all'))['domain']
domain = AND([[('id', 'in', ticket.fsm_task_ids.ids)], domain])
values = self._prepare_tasks_values(page, date_begin, date_end, sortby, search, search_in, groupby, domain=domain)
# pager
pager_vals = values['pager']
pager_vals['url_args'].update(filterby=filterby)
pager = portal_pager(**pager_vals)
values.update({
'grouped_tasks': values['grouped_tasks'](pager['offset']),
'pager': pager,
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
'filterby': filterby,
})
return request.render("project.portal_my_tasks", values)