# -*- coding: utf-8 -*- from odoo import fields, http, _ from odoo.http import request from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager from odoo.tools import date_utils, groupby as groupbyelem from odoo.osv.expression import AND from dateutil.relativedelta import relativedelta from operator import itemgetter from collections import OrderedDict from odoo.exceptions import AccessError, MissingError, UserError from odoo.addons.portal.controllers.mail import _message_post_helper from datetime import datetime, date, timedelta import json import base64 import werkzeug import logging _logger = logging.getLogger(__name__) from odoo.addons.sh_all_in_one_helpdesk.controllers.portal import PortalHelpdesk FORMAT = '%d/%m/%Y' class PortalCustomerMaintenence(CustomerPortal): def _prepare_home_portal_values(self): return {} def prepare_maintenance(self): domain = [('team_id.id','=',request.env.ref('helpdesk_maintenance.maintenance').id)] return domain def prepare_maintenance_emergency(self): domain = self.prepare_maintenance() domain.append(('maintenance_type_id.id','=',request.env.ref('helpdesk_maintenance.emergency').id)) return domain def _prepare_portal_layout_values(self): values = super(PortalHelpdesk, self)._prepare_portal_layout_values() stage_close = request.env.ref('sh_all_in_one_helpdesk.close_stage').id stage_done = request.env.ref('sh_all_in_one_helpdesk.done_stage').id stage_cancel = request.env.ref('sh_all_in_one_helpdesk.cancel_stage').id ticket_domain = [('stage_id.id','not in',[stage_close,stage_done,stage_cancel])] if request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'user': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'leader': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) ticket_domain.append(('team_head', '=', request.env.user.id)) elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'manager': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('user_id', '=', False)) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('sh_user_ids', '=', False)) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) ticket_domain.append(('team_head', '=', request.env.user.id)) ticket_domain.append(('team_head', '=', False)) else: ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('partner_id', '=', request.env.user.partner_id.id)) new_domain_sup = AND([self.prepare_maintenance(), ticket_domain]) maintenance_count = len(request.env['helpdesk.ticket'].sudo().search(new_domain_sup)) tickets = request.env['helpdesk.ticket'].sudo().search(ticket_domain) values['tickets'] = tickets values['maintenance_count'] = maintenance_count return values @http.route('/my/mantenimiento',type='http',auth="user",website=True) def prepare_portal_maintenance(self,**kw): values = self._prepare_home_portal_values() return request.render("helpdesk_maintenance.portal_my_maintenance",{}) @http.route(['/my/mantenimientos', '/my/mantenimientos/page/<int:page>'],type='http',auth="user",website=True) def portal_my_maintenance(self,ctr='show',page=1,sortby=None,filterby=None,search=None,search_in='all',groupby='status',**kw): values = self._prepare_portal_layout_values() HelpdeskTicket = request.env['helpdesk.ticket'].sudo() searchbar_sortings = { 'create_date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Name'), 'order': 'name' }, } searchbar_inputs = { 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'status': { 'input': 'status', 'label': _('Status') }, 'maintenance_type': { 'input': 'maintenance_type', 'label': _('Tipo de mantenimiento') }, 'severity_type': { 'input': 'severity_type', 'label': _('Gravedad') }, 'state': { 'input': 'state', 'label': _('Reply Status') }, } 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': [("create_date", "=", today)] }, 'week': { 'label': _('This week'), 'domain': [('create_date', '>=', date_utils.start_of(today, "week")), ('create_date', '<=', date_utils.end_of(today, 'week'))] }, 'month': { 'label': _('This month'), 'domain': [('create_date', '>=', date_utils.start_of(today, 'month')), ('create_date', '<=', date_utils.end_of(today, 'month'))] }, 'year': { 'label': _('This year'), 'domain': [('create_date', '>=', date_utils.start_of(today, 'year')), ('create_date', '<=', date_utils.end_of(today, 'year'))] }, 'quarter': { 'label': _('This Quarter'), 'domain': [('create_date', '>=', quarter_start), ('create_date', '<=', quarter_end)] }, 'last_week': { 'label': _('Last week'), 'domain': [('create_date', '>=', date_utils.start_of(last_week, "week")), ('create_date', '<=', date_utils.end_of(last_week, 'week'))] }, 'last_month': { 'label': _('Last month'), 'domain': [('create_date', '>=', date_utils.start_of(last_month, 'month')), ('create_date', '<=', date_utils.end_of(last_month, 'month'))] }, 'last_year': { 'label': _('Last year'), 'domain': [('create_date', '>=', date_utils.start_of(last_year, 'year')), ('create_date', '<=', date_utils.end_of(last_year, 'year'))] }, } # default sort by value if not sortby: sortby = 'create_date' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = AND([searchbar_filters[filterby]['domain']]) if search and search_in: domain = AND([domain, [('name', 'ilike', search)]]) ticket_domain = self.prepare_maintenance() if request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'user': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'leader': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) ticket_domain.append(('team_head', '=', request.env.user.id)) elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'manager': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('sh_user_ids', '=', False)) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('user_id', '=', False)) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) ticket_domain.append(('team_head', '=', request.env.user.id)) ticket_domain.append(('team_head', '=', False)) else: ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) stage_close = request.env.ref('sh_all_in_one_helpdesk.close_stage').id stage_done = request.env.ref('sh_all_in_one_helpdesk.done_stage').id stage_cancel = request.env.ref('sh_all_in_one_helpdesk.cancel_stage').id ticket_domain.append(('stage_id.id','not in',[stage_close,stage_done,stage_cancel])) domain = AND([domain, ticket_domain]) maintenance_count = len(HelpdeskTicket.search(domain).filtered(lambda h: h.team_id.id == request.env.ref('helpdesk_maintenance.maintenance').id)) # pager pager = portal_pager(url="/my/mantenimientos",url_args={'sortby': sortby,'search_in': search_in,'search': search,'filterby': filterby},total=maintenance_count,page=page,step=self._items_per_page) if groupby == 'status': order = "stage_id, %s" % order elif groupby == 'state': order = 'state,%s' % order elif groupby == 'maintenance_type': order = "maintenance_type_id, %s" % order elif groupby == 'severity_type': order = "severity_type, %s" % order tickets = HelpdeskTicket.search(domain,order=order,limit=self._items_per_page,offset=pager['offset']) request.session['my_tickets_history'] = tickets.ids[:100] if groupby == 'status': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('stage_id')) ] elif groupby == 'state': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('state')) ] elif groupby == 'maintenance_type': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('maintenance_type_id')) ] elif groupby == 'severity_type': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('severity_type')) ] # content according to pager and archive selected values.update({ 'created': ctr, 'tickets':tickets, 'grouped_tickets':grouped_tickets, 'page_name':'maintenance', 'default_url':'/my/mantenimientos', 'maintenance_count':maintenance_count, '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("helpdesk_maintenance.portal_my_maitenance",values) @http.route('/portal-create-ticket-maintenance', type='http', auth='public', csrf=False) def portal_create_ticket_maintenance(self, **kw): try: login_user = request.env.user if login_user and login_user.login != 'public': partner_id = False if kw.get('partner_id') and kw.get('partner_id') != '': partner_id = request.env['res.partner'].sudo().search( [('id', '=', int(kw.get('partner_id')))]).filtered(lambda user: len(user.user_ids) > 0 ) else: partner_id = request.env['res.partner'].sudo().search( [('email', '=', kw.get('portal_email'))]).filtered(lambda user: len(user.user_ids) > 0 ) if partner_id and len(partner_id) > 1: partner_id = request.env.user.partner_id if not partner_id: return json.dumps({"resp":"Error","message":"Colaborador no encontrado, favor de verificar que haya agregado uno"}) if partner_id: unvalued_tickets = len( request.env['helpdesk.ticket'].sudo().search([ ('stage_id','=',request.env.ref('sh_all_in_one_helpdesk.done_stage').id), ('priority_new','=',False)]) ) if unvalued_tickets >= 3: return json.dumps({"resp":"Error","message":"Tienes demasiados tickets sin evaluar, favor de evaluarlos"}) ticket_dic = { 'partner_id': partner_id.id, 'ticket_from_portal': True } if kw.get('portal_phone'): partner_id.update({'phone': kw.get('portal_phone')}) ticket_dic.update({ 'mobile_no':kw.get('portal_phone') }) if kw.get('portal_contact_name'): ticket_dic.update({ 'person_name': kw.get('portal_contact_name'), }) if kw.get('portal_email'): ticket_dic.update({ 'email': kw.get('portal_email'), }) team_id = request.env['helpdesk.team'].sudo().browse(request.env.ref('helpdesk_maintenance.maintenance').id) if team_id: ticket_dic.update({ 'team_id': team_id.id, 'team_head': team_id.team_head.id, }) if kw.get('portal_description'): ticket_dic.update({ 'description': kw.get('portal_description'), }) if kw.get('portal_main_type'): ticket_dic.update({ 'maintenance_type_id': kw.get('portal_main_type') }) if kw.get('portal_severity'): ticket_dic.update({ 'severity_type': str(kw.get('portal_severity')), }) if kw.get('portal_date_fail'): ticket_dic.update({ 'date_fail': datetime.strptime(kw.get('portal_date_fail'),"%d-%m-%Y").date(), }) if kw.get('portal_fail_type'): ticket_dic.update({ 'fail_type': kw.get('portal_fail_type'), }) ticket_id = request.env['helpdesk.ticket'].sudo().create(ticket_dic) if 'portal_file' in request.params: attached_files = request.httprequest.files.getlist('portal_file') attachment_ids = [] for attachment in attached_files: result = base64.b64encode(attachment.read()) attachment_id = request.env['ir.attachment'].sudo( ).create({ 'name': attachment.filename, 'res_model': 'helpdesk.ticket', 'res_id': ticket_id.id, 'display_name': attachment.filename, 'datas': result, }) attachment_ids.append(attachment_id.id) ticket_id.attachment_ids = [(6, 0, attachment_ids)] return request.redirect("/my/mantenimientos?ctr=False") except Exception as e: _logger.exception('Something went wrong %s',str(e)) @http.route(['/my/manteniminetos/<int:ticket_id>'],type='http',auth="public",website=True) def portal_my_ticket_detail_maintenance(self,ticket_id,access_token=None,report_type=None,message=False,download=False,**kw): try: ticket_sudo = self._document_check_access('helpdesk.ticket', ticket_id, access_token=access_token) except (AccessError, MissingError): return request.redirect('/my') if report_type in ('html', 'pdf', 'text'): return self._show_report(model=ticket_sudo,report_type=report_type,report_ref='sh_all_in_one_helpdesk.action_portal_report_helpdesk_ticket',download=download) if ticket_sudo: if request.env.company.sh_receive_email_seeing_ticket: body = _('Ticket visto por el cliente %s',ticket_sudo.partner_id.name) _message_post_helper( "helpdesk.ticket", ticket_sudo.id, body, token=ticket_sudo.access_token, message_type="notification", subtype_xmlid="mail.mt_note", partner_ids=ticket_sudo.user_id.sudo().partner_id.ids, ) values = { 'token': access_token, 'maintenance': ticket_sudo, 'message': message, 'bootstrap_formatting': True, 'partner_id': ticket_sudo.partner_id.id, 'report_type': 'html', } if ticket_sudo.maintenance_type_id.id == request.env.ref('helpdesk_maintenance.emergency').id and ticket_sudo.severity_type == '3': values = { 'token': access_token, 'm_emergency': ticket_sudo, 'message': message, 'bootstrap_formatting': True, 'partner_id': ticket_sudo.partner_id.id, 'report_type': 'html', } return request.render("helpdesk_maintenance.portal_ticket_page_maintenance_emergency",values) return request.render("helpdesk_maintenance.portal_ticket_page_maintenance",values) #apartado de emergencia @http.route(['/my/mantenimientos/emergencias', '/my/mantenimientos/emergencias/page/<int:page>'],type='http',auth="user",website=True) def portal_my_maintenance_emergency(self,ctr='show',page=1,sortby=None,filterby=None,search=None,search_in='all',groupby='status',**kw): values = self._prepare_portal_layout_values() HelpdeskTicket = request.env['helpdesk.ticket'].sudo() searchbar_sortings = { 'create_date': { 'label': _('Newest'), 'order': 'create_date desc' }, 'name': { 'label': _('Name'), 'order': 'name' }, } searchbar_inputs = { 'all': { 'input': 'all', 'label': _('Search in All') }, } searchbar_groupby = { 'status': { 'input': 'status', 'label': _('Status') }, 'maintenance_type': { 'input': 'maintenance_type', 'label': _('Tipo de mantenimiento') }, 'severity_type': { 'input': 'severity_type', 'label': _('Gravedad') }, } 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': [("create_date", "=", today)] }, 'week': { 'label': _('This week'), 'domain': [('create_date', '>=', date_utils.start_of(today, "week")), ('create_date', '<=', date_utils.end_of(today, 'week'))] }, 'month': { 'label': _('This month'), 'domain': [('create_date', '>=', date_utils.start_of(today, 'month')), ('create_date', '<=', date_utils.end_of(today, 'month'))] }, 'year': { 'label': _('This year'), 'domain': [('create_date', '>=', date_utils.start_of(today, 'year')), ('create_date', '<=', date_utils.end_of(today, 'year'))] }, 'quarter': { 'label': _('This Quarter'), 'domain': [('create_date', '>=', quarter_start), ('create_date', '<=', quarter_end)] }, 'last_week': { 'label': _('Last week'), 'domain': [('create_date', '>=', date_utils.start_of(last_week, "week")), ('create_date', '<=', date_utils.end_of(last_week, 'week'))] }, 'last_month': { 'label': _('Last month'), 'domain': [('create_date', '>=', date_utils.start_of(last_month, 'month')), ('create_date', '<=', date_utils.end_of(last_month, 'month'))] }, 'last_year': { 'label': _('Last year'), 'domain': [('create_date', '>=', date_utils.start_of(last_year, 'year')), ('create_date', '<=', date_utils.end_of(last_year, 'year'))] }, } # default sort by value if not sortby: sortby = 'create_date' order = searchbar_sortings[sortby]['order'] # default filter by value if not filterby: filterby = 'all' domain = AND([searchbar_filters[filterby]['domain']]) if search and search_in: domain = AND([domain, [('name', 'ilike', search)]]) ticket_domain = self.prepare_maintenance_emergency() if request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'user': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'leader': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) ticket_domain.append(('team_head', '=', request.env.user.id)) elif request.env.user.sh_portal_user_access and request.env.user.sh_portal_user_access == 'manager': ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append(('sh_user_ids', '=', False)) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('user_id', '=', False)) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) ticket_domain.append(('team_head', '=', request.env.user.id)) ticket_domain.append(('team_head', '=', False)) else: ticket_domain.append(('|')) ticket_domain.append(('|')) ticket_domain.append(('user_id', '=', request.env.user.id)) ticket_domain.append(('sh_user_ids', 'in', [request.env.user.id])) ticket_domain.append( ('partner_id', '=', request.env.user.partner_id.id)) stage_close = request.env.ref('sh_all_in_one_helpdesk.close_stage').id stage_done = request.env.ref('sh_all_in_one_helpdesk.done_stage').id stage_cancel = request.env.ref('sh_all_in_one_helpdesk.cancel_stage').id ticket_domain.append(('stage_id.id','not in',[stage_close,stage_done,stage_cancel])) domain = AND([domain, ticket_domain]) maintenance_count = len(HelpdeskTicket.search(domain).filtered(lambda h: h.team_id.id == request.env.ref('helpdesk_maintenance.maintenance').id and h.maintenance_type_id.id == request.env.ref('helpdesk_maintenance.emergency').id)) # pager pager = portal_pager(url="/my/mantenimientos/emergencias",url_args={'sortby': sortby,'search_in': search_in,'search': search,'filterby': filterby},total=maintenance_count,page=page,step=self._items_per_page) if groupby == 'create_by': order = "create_uid, %s" % order elif groupby == 'ticket_type': order = "ticket_type, %s" % order elif groupby == 'status': order = "stage_id, %s" % order elif groupby == 'customer': order = "partner_id, %s" % order elif groupby == 'category': order = "category_id, %s" % order elif groupby == 'subcategory': order = "sub_category_id, %s" % order elif groupby == 'subject': order = "subject_id, %s" % order elif groupby == 'priority': order = "priority, %s" % order elif groupby == 'state': order = 'state,%s' % order elif groupby == 'maintenance_type': order = "maintenance_type_id, %s" % order elif groupby == 'severity_type': order = "severity_type, %s" % order tickets = HelpdeskTicket.search(domain,order=order,limit=self._items_per_page,offset=pager['offset']) request.session['my_tickets_history'] = tickets.ids[:100] if groupby == 'create_by': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('create_uid')) ] elif groupby == 'ticket_type': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('ticket_type')) ] elif groupby == 'status': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('stage_id')) ] elif groupby == 'customer': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('partner_id')) ] elif groupby == 'category': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('category_id')) ] elif groupby == 'subcategory': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('sub_category_id')) ] elif groupby == 'subject': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('subject_id')) ] elif groupby == 'priority': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('priority')) ] elif groupby == 'state': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('state')) ] elif groupby == 'maintenance_type': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('maintenance_type_id')) ] elif groupby == 'severity_type': grouped_tickets = [ HelpdeskTicket.concat(*g) for k, g in groupbyelem(tickets, itemgetter('severity_type')) ] # content according to pager and archive selected values.update({ 'created': ctr, 'tickets':tickets, 'grouped_tickets':grouped_tickets, 'page_name':'m_emergency', 'default_url':'/my/mantenimientos/emergencias', 'maintenance_count':maintenance_count, '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("helpdesk_maintenance.portal_my_maitenance_emergency",values) @http.route('/portal-create-ticket-maintenance-emergency', type='http', auth='public', csrf=False) def portal_create_ticket_maintenance_emergency(self, **kw): try: login_user = request.env.user if login_user and login_user.login != 'public': partner_id = False if kw.get('partner_id') and kw.get('partner_id') != '': partner_id = request.env['res.partner'].sudo().search( [('id', '=', int(kw.get('partner_id')))]).filtered(lambda user: len(user.user_ids) > 0 ) else: partner_id = request.env['res.partner'].sudo().search( [('email', '=', kw.get('portal_email'))]).filtered(lambda user: len(user.user_ids) > 0 ) if partner_id and len(partner_id) > 1: partner_id = request.env.user.partner_id if not partner_id: return json.dumps({"resp":"Error","message":"Colaborador no encontrado, favor de verificar que haya agregado uno"}) if partner_id: ticket_dic = { 'partner_id': partner_id.id, 'ticket_from_portal': True } if kw.get('portal_phone'): partner_id.update({'phone': kw.get('portal_phone')}) ticket_dic.update({ 'mobile_no':kw.get('portal_phone') }) if kw.get('portal_contact_name'): ticket_dic.update({ 'person_name': kw.get('portal_contact_name'), }) if kw.get('portal_email'): ticket_dic.update({ 'email': kw.get('portal_email'), }) team_id = request.env['helpdesk.team'].sudo().browse(request.env.ref('helpdesk_maintenance.maintenance').id) if team_id: ticket_dic.update({ 'team_id': team_id.id, 'team_head': team_id.team_head.id, }) if kw.get('portal_description'): ticket_dic.update({ 'description': kw.get('portal_description'), }) ticket_dic.update({ 'maintenance_type_id': request.env.ref('helpdesk_maintenance.emergency').id, 'severity_type':'3', }) if kw.get('portal_date_fail'): ticket_dic.update({ 'date_fail': datetime.strptime(kw.get('portal_date_fail'),"%d-%m-%Y").date(), }) if kw.get('portal_fail_type'): ticket_dic.update({ 'fail_type': kw.get('portal_fail_type'), }) ticket_id = request.env['helpdesk.ticket'].sudo().create(ticket_dic) if 'portal_file' in request.params: attached_files = request.httprequest.files.getlist('portal_file') attachment_ids = [] for attachment in attached_files: result = base64.b64encode(attachment.read()) attachment_id = request.env['ir.attachment'].sudo( ).create({ 'name': attachment.filename, 'res_model': 'helpdesk.ticket', 'res_id': ticket_id.id, 'display_name': attachment.filename, 'datas': result, }) attachment_ids.append(attachment_id.id) ticket_id.attachment_ids = [(6, 0, attachment_ids)] return request.redirect("/my/mantenimientos?ctr=False") except Exception as e: _logger.exception('Something went wrong %s',str(e))