diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 17:14:58 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 17:14:58 +0700 |
| commit | 1ca3b3df3421961caec3b747a364071c80f5c7da (patch) | |
| tree | 6778a1f0f3f9b4c6e26d6d87ccde16e24da6c9d6 /sh_helpdesk/controllers | |
| parent | b57188be371d36d96caac4b8d65a40745c0e972c (diff) | |
initial commit
Diffstat (limited to 'sh_helpdesk/controllers')
| -rw-r--r-- | sh_helpdesk/controllers/__init__.py | 5 | ||||
| -rw-r--r-- | sh_helpdesk/controllers/main.py | 644 | ||||
| -rw-r--r-- | sh_helpdesk/controllers/portal.py | 484 |
3 files changed, 1133 insertions, 0 deletions
diff --git a/sh_helpdesk/controllers/__init__.py b/sh_helpdesk/controllers/__init__.py new file mode 100644 index 0000000..5648a73 --- /dev/null +++ b/sh_helpdesk/controllers/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Softhealer Technologies. + +from . import main +from . import portal diff --git a/sh_helpdesk/controllers/main.py b/sh_helpdesk/controllers/main.py new file mode 100644 index 0000000..e9a50b9 --- /dev/null +++ b/sh_helpdesk/controllers/main.py @@ -0,0 +1,644 @@ +# -*- coding: utf-8 -*- +# Part of Softhealer Technologies. + +from odoo import http +import json +from datetime import datetime +from dateutil.relativedelta import relativedelta +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT +from odoo.exceptions import AccessError, MissingError, UserError +from odoo.http import request, content_disposition +import re + +class DownloadReport(http.Controller): + + def _document_check_access(self, model_name, document_id, access_token=None): + document = request.env[model_name].browse([document_id]) + document_sudo = document.sudo().exists() + if not document_sudo: + raise MissingError(_("This document does not exist.")) + if access_token and document_sudo.report_token and access_token == document_sudo.report_token: + return document_sudo + else: + raise AccessError( + _("Sorry, you are not allowed to access this document.")) + + def _show_report(self, model, report_type, report_ref, download=False): + if report_type not in ('html', 'pdf', 'text'): + raise UserError(_("Invalid report type: %s", report_type)) + + report_sudo = request.env.ref(report_ref).sudo() + + if not isinstance(report_sudo, type(request.env['ir.actions.report'])): + raise UserError( + _("%s is not the reference of a report", report_ref)) + + method_name = '_render_qweb_%s' % (report_type) + report = getattr(report_sudo, method_name)( + [model.id], data={'report_type': report_type})[0] + reporthttpheaders = [ + ('Content-Type', 'application/pdf' if report_type == 'pdf' else 'text/html'), + ('Content-Length', len(report)), + ] + if report_type == 'pdf' and download: + filename = "%s.pdf" % ( + re.sub('\W+', '-', model._get_report_base_filename())) + reporthttpheaders.append( + ('Content-Disposition', content_disposition(filename))) + return request.make_response(report, headers=reporthttpheaders) + + @http.route(['/download/ht/<int:ticket_id>'], type='http', auth="public", website=True) + def download_ticket(self, ticket_id, report_type=None, access_token=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 '<br/><br/><center><h1><b>Oops Invalid URL! Please check URL and try again!</b></h1></center>' + report_type = 'pdf' + download = True + return self._show_report(model=ticket_sudo, report_type=report_type, report_ref='sh_helpdesk.action_report_helpdesk_ticket', download=download) + + +class HelpdeskTicketFeedbackController(http.Controller): + + @http.route('/ticket/feedback/<ticket_id>', type="http", auth="public", website=True) + def helpdesk_ticket_feedback(self, ticket_id, **kw): + return http.request.render('sh_helpdesk.helpdesk_ticket_feedback_page', {'ticket': ticket_id}) + + @http.route('/helpdesk/ticket/feedback/<ticket_id>', type="http", auth="public", website=True, csrf=False) + def helpdesk_ticket_feedback_thanks(self, ticket_id, **kw): + dic = {} + if kw.get('smiley') != '': + dic.update({ + 'priority_new': kw.get('smiley'), + }) + if kw.get('comment') != '': + dic.update({ + 'customer_comment': kw.get('comment'), + }) + ticket = request.env['helpdesk.ticket'].sudo().search( + [('id', '=', int(ticket_id))], limit=1) + if ticket: + ticket.sudo().write(dic) + return http.request.render('sh_helpdesk.ticket_feedback_thank_you', {}) + + @http.route('/get_team', type='http', auth="public") + def team_data(self): + team_obj = request.env['helpdesk.team'].sudo().search([]) + res_list = {} + for rec in team_obj: + res = {} + res.update({'name': rec.name}) + res_list.update({rec.id: res}) + return json.dumps(res_list) + + @http.route('/get_team_leader', type='http', auth="public") + def get_team_leader_data(self): + team_heads = request.env['helpdesk.team'].sudo().search([]).mapped('team_head') + res_list = {} + if team_heads: + for rec in team_heads: + res = {} + res.update({'name': rec.name}) + res_list.update({rec.id: res}) + return json.dumps(res_list) + + @http.route([ + '/get-leader-user', + ], type='http', auth="public", method="post", website=True, csrf=False) + def get_data(self, **post): + dic = {} + if int(post.get('team_leader')) != 0: + team_ids = request.env['helpdesk.team'].sudo().search( + [('team_head', '=', int(post.get('team_leader')))]) + for rec in team_ids: + res = {} + res.update({'name': rec.name}) + dic.update({rec.id: res}) + return json.dumps(dic) + + @http.route([ + '/user-group', + ], type='http', auth="public", method="post", website=True, csrf=False) + def get_user_group(self, **post): + dic = {} + support_user = request.env.user.has_group( + 'sh_helpdesk.helpdesk_group_user') + team_leader = request.env.user.has_group( + 'sh_helpdesk.helpdesk_group_team_leader') + manager = request.env.user.has_group( + 'sh_helpdesk.helpdesk_group_manager') + if support_user and not team_leader and not manager: + dic.update({ + 'user': '1' + }) + elif support_user and team_leader and not manager: + dic.update({ + 'leader': '1' + }) + elif support_user and team_leader and manager: + dic.update({ + 'manager': '1' + }) + return json.dumps(dic) + + @http.route([ + '/get-user', + ], type='http', auth="public", method="post", website=True, csrf=False) + def get_user(self, **post): + dic = {} + if int(post.get('team')) != 0: + team_id = request.env['helpdesk.team'].sudo().search( + [('id', '=', int(post.get('team')))]) + for rec in team_id.team_members: + res = {} + res.update({'name': rec.name}) + dic.update({rec.id: res}) + return json.dumps(dic) + + @http.route( + '/get-ticket-counter-data', type='http', auth="public") + def get_ticket_counter_data(self, **kw): + ticket_obj = request.env['helpdesk.ticket'].sudo().search( + [], order='id desc', limit=1) + company_id = request.env.company + ticket_data_dic = {} + ticket_data_list = [] + id_list = [] + data_dict = {} + for stage in company_id.dashboard_filter: + doman = [] + id_list = [] + if kw.get('filter_date') == 'today': + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + datetime.now().date().strftime("%Y/%m/%d 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'yesterday': + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + prev_day = (datetime.now().date() - + relativedelta(days=1)).strftime('%Y/%m/%d 00:00:00') + dt_flt1.append(prev_day) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + prev_day = (datetime.now().date() - + relativedelta(days=1)).strftime('%Y/%m/%d 23:59:59') + dt_flt2.append(prev_day) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'weekly': # current week + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append((datetime.now().date( + ) - relativedelta(weeks=1, weekday=0)).strftime("%Y/%m/%d 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'prev_week': # Previous week + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append((datetime.now().date( + ) - relativedelta(weeks=2, weekday=0)).strftime("%Y/%m/%d 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append((datetime.now().date( + ) - relativedelta(weeks=1, weekday=6)).strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'monthly': # Current Month + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date()).strftime("%Y/%m/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'prev_month': # Previous Month + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date() - relativedelta(months=1)).strftime("%Y/%m/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/01 00:00:00")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'cur_year': # Current Year + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date()).strftime("%Y/01/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'prev_year': # Previous Year + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date() - relativedelta(years=1)).strftime("%Y/01/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<') + dt_flt2.append( + datetime.now().date().strftime("%Y/01/01 00:00:00")) + doman.append(tuple(dt_flt2)) + elif kw.get('filter_date') == 'custom': + if kw.get('date_start') and kw.get('date_end'): + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>=') + dt_flt1.append(datetime.strptime( + str(kw.get('date_start')), DEFAULT_SERVER_DATE_FORMAT).strftime("%Y/%m/%d")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append(datetime.strptime( + str(kw.get('date_end')), DEFAULT_SERVER_DATE_FORMAT).strftime("%Y/%m/%d")) + doman.append(tuple(dt_flt2)) + if int(kw.get('team')) != 0: + doman.append(('team_id', '=', int(kw.get('team')))) + elif int(kw.get('team')) == 0: + if request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + team_ids = request.env['helpdesk.team'].sudo().search( + ['|', ('team_head', '=', request.env.user.id), ('team_members', 'in', [request.env.user.id])]) + doman.append(('team_id', 'in', team_ids.ids)) + elif not request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + team_ids = request.env['helpdesk.team'].sudo().search( + [('team_members', 'in', [request.env.user.id])]) + doman.append(('team_id', 'in', team_ids.ids)) + + if int(kw.get('team_leader')) != 0: + doman.append(('team_head', '=', int(kw.get('team_leader')))) + elif int(kw.get('team_leader')) == 0: + if request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + doman.append(('|')) + doman.append(('|')) + doman.append(('team_head', '=', request.env.user.id)) + doman.append(('user_id', '=', request.env.user.id)) + doman.append(('sh_user_ids', 'in', [request.env.user.id])) + if int(kw.get('user_id')) != 0: + doman.append(('|')) + doman.append(('user_id', '=', int(kw.get('user_id')))) + doman.append(('sh_user_ids', 'in', [int(kw.get('user_id'))])) + elif int(kw.get('user_id')) == 0: + if request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + doman.append(('|')) + doman.append(('|')) + doman.append(('sh_user_ids', 'in', [request.env.user.id])) + doman.append(('user_id', '=', request.env.user.id)) + doman.append(('team_head', '=', request.env.user.id)) + elif not request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + doman.append(('|')) + doman.append(('user_id', '=', request.env.user.id)) + doman.append(('sh_user_ids', 'in', [request.env.user.id])) + ticket_list = [] + doman.append(('stage_id', '=', stage.id)) + search_tickets = ticket_obj.sudo().search(doman) + if search_tickets: + for ticket in search_tickets: + create_date = datetime.strftime(ticket.create_date,"%Y-%m-%d %H:%M:%S") + write_date = datetime.strftime(ticket.write_date,"%Y-%m-%d %H:%M:%S") + ticket_dic = { + 'ticket_id': ticket.id, + 'ticket_no': ticket.name, + 'partner_id': ticket.partner_id.name, + 'create_date': create_date, + 'write_date': write_date, + 'user_id': ticket.user_id.name, + } + ticket_list.append(ticket_dic) + id_list.append(ticket.id) + search_stage = request.env['helpdesk.stages'].sudo().search([ + ('id', '=', stage.id) + ], limit=1) + if search_stage: + ticket_data_dic.update({search_stage.name: ticket_list}) + list_ids = [id_list] + data_dict.update({search_stage.name: list_ids}) + ticket_data_list.append(search_stage.name) + return request.env['ir.ui.view'].with_context()._render_template('sh_helpdesk.ticket_dashboard_count', { + 'ticket_data_dic': ticket_data_dic, + 'ticket_data_list': ticket_data_list, + 'data_dict': data_dict, + }) + + @http.route([ + '/open-ticket', + ], type='http', auth="public", method="post", website=True, csrf=False) + def open_tickets(self, **kw): + dashboard_id = request.env['ticket.dashboard'].sudo().search( + [('id', '=', 1)], limit=1) + dashboard_id.get_ticket_data(kw.get('ids')) + dic = {} + dic.update({'success': 1}) + return json.dumps(dic) + + @http.route( + '/get-ticket-table-data', type='http', auth="public") + def get_ticket_table_data(self, **kw): + ticket_obj = request.env['helpdesk.ticket'].sudo().search( + [], order='id desc', limit=1) + company_id = request.env.company + ticket_data_dic = {} + ticket_data_list = [] + for stage in company_id.dashboard_tables: + doman = [] + if kw.get('filter_date') == 'today': + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + datetime.now().date().strftime("%Y/%m/%d 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'yesterday': + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + prev_day = (datetime.now().date() - + relativedelta(days=1)).strftime('%Y/%m/%d 00:00:00') + dt_flt1.append(prev_day) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + prev_day = (datetime.now().date() - + relativedelta(days=1)).strftime('%Y/%m/%d 23:59:59') + dt_flt2.append(prev_day) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'weekly': # current week + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append((datetime.now().date( + ) - relativedelta(weeks=1, weekday=0)).strftime("%Y/%m/%d 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'prev_week': # Previous week + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append((datetime.now().date( + ) - relativedelta(weeks=2, weekday=0)).strftime("%Y/%m/%d 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append((datetime.now().date( + ) - relativedelta(weeks=1, weekday=6)).strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'monthly': # Current Month + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date()).strftime("%Y/%m/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'prev_month': # Previous Month + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date() - relativedelta(months=1)).strftime("%Y/%m/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/01 00:00:00")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'cur_year': # Current Year + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date()).strftime("%Y/01/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append( + datetime.now().date().strftime("%Y/%m/%d 23:59:59")) + doman.append(tuple(dt_flt2)) + + elif kw.get('filter_date') == 'prev_year': # Previous Year + + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>') + dt_flt1.append( + (datetime.now().date() - relativedelta(years=1)).strftime("%Y/01/01 00:00:00")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<') + dt_flt2.append( + datetime.now().date().strftime("%Y/01/01 00:00:00")) + doman.append(tuple(dt_flt2)) + elif kw.get('filter_date') == 'custom': + if kw.get('date_start') and kw.get('date_end'): + dt_flt1 = [] + dt_flt1.append('create_date') + dt_flt1.append('>=') + dt_flt1.append(datetime.strptime( + str(kw.get('date_start')), DEFAULT_SERVER_DATE_FORMAT).strftime("%Y/%m/%d")) + doman.append(tuple(dt_flt1)) + + dt_flt2 = [] + dt_flt2.append('create_date') + dt_flt2.append('<=') + dt_flt2.append(datetime.strptime( + str(kw.get('date_end')), DEFAULT_SERVER_DATE_FORMAT).strftime("%Y/%m/%d")) + doman.append(tuple(dt_flt2)) + if int(kw.get('team')) != 0: + doman.append(('team_id', '=', int(kw.get('team')))) + elif int(kw.get('team')) == 0: + if request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + team_ids = request.env['helpdesk.team'].sudo().search( + ['|', ('team_head', '=', request.env.user.id), ('team_members', 'in', [request.env.user.id])]) + doman.append(('team_id', 'in', team_ids.ids)) + elif not request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + team_ids = request.env['helpdesk.team'].sudo().search( + [('team_members', 'in', [request.env.user.id])]) + doman.append(('team_id', 'in', team_ids.ids)) + if int(kw.get('team_leader')) != 0: + doman.append(('team_head', '=', int(kw.get('team_leader')))) + elif int(kw.get('team_leader')) == 0: + if request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + doman.append(('|')) + doman.append(('|')) + doman.append(('team_head', '=', request.env.user.id)) + doman.append(('user_id', '=', request.env.user.id)) + doman.append(('sh_user_ids', 'in', [request.env.user.id])) + if int(kw.get('user_id')) != 0: + doman.append(('|')) + doman.append(('user_id', '=', int(kw.get('user_id')))) + doman.append(('sh_user_ids', 'in', [int(kw.get('user_id'))])) + elif int(kw.get('user_id')) == 0: + if request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + doman.append(('|')) + doman.append(('|')) + doman.append(('user_id', '=', request.env.user.id)) + doman.append(('sh_user_ids', 'in', [request.env.user.id])) + doman.append(('team_head', '=', request.env.user.id)) + elif not request.env.user.has_group('sh_helpdesk.helpdesk_group_team_leader') and request.env.user.has_group('sh_helpdesk.helpdesk_group_user') and not request.env.user.has_group('sh_helpdesk.helpdesk_group_manager'): + doman.append(('|')) + doman.append(('user_id', '=', request.env.user.id)) + doman.append(('sh_user_ids', 'in', [request.env.user.id])) + ticket_list = [] + doman.append(('stage_id', '=', stage.id)) + search_tickets = ticket_obj.sudo().search(doman) + if search_tickets: + for ticket in search_tickets: + create_date = datetime.strftime(ticket.create_date,"%Y-%m-%d %H:%M:%S") + write_date = datetime.strftime(ticket.write_date,"%Y-%m-%d %H:%M:%S") + ticket_dic = { + 'ticket_id': ticket.id, + 'ticket_no': ticket.name, + 'partner_name': ticket.partner_id.name_get()[0][1], + 'partner_mobile':ticket.partner_id.mobile, + 'partner_id':ticket.partner_id.id, + 'create_date': create_date, + 'write_date': write_date, + 'user_id': ticket.user_id.name, + } + ticket_list.append(ticket_dic) + search_stage = request.env['helpdesk.stages'].sudo().search([ + ('id', '=', stage.id) + ], limit=1) + if search_stage: + ticket_data_dic.update({search_stage.name: ticket_list}) + ticket_data_list.append(search_stage.name) + return request.env['ir.ui.view'].with_context()._render_template('sh_helpdesk.ticket_dashboard_tbl', { + 'ticket_data_dic': ticket_data_dic, + 'ticket_data_list': ticket_data_list, + }) + + @http.route( + '/get-mobile-no', type='http', auth="public",csrf=False) + def get_mobile_no(self, **kw): + dic={} + if kw.get('partner_id') and kw.get('partner_id')!='select_partner': + partner_id = request.env['res.partner'].sudo().browse(int(kw.get('partner_id'))) + if partner_id and partner_id.mobile: + dic.update({ + 'mobile':str(partner_id.mobile) + }) + return json.dumps(dic) + + @http.route( + '/send-by-whatsapp', type='http', auth="public",csrf=False) + def send_by_whatsapp(self, **kw): + dic = {} + if kw.get('partner_id')=='select_partner': + dic.update({ + 'msg':'Partner is Required.' + }) + elif kw.get('partner_mobile_no')=='': + dic.update({ + 'msg':'Mobile Number is Required.' + }) + elif kw.get('message')=='': + dic.update({ + 'msg':'Message is Required.' + }) + else: + dic.update({ + 'url':str("https://web.whatsapp.com/send?l=&phone="+kw.get('partner_mobile_no')+"&text=" + kw.get('message')) + }) + return json.dumps(dic)
\ No newline at end of file diff --git a/sh_helpdesk/controllers/portal.py b/sh_helpdesk/controllers/portal.py new file mode 100644 index 0000000..95900a7 --- /dev/null +++ b/sh_helpdesk/controllers/portal.py @@ -0,0 +1,484 @@ +# -*- coding: utf-8 -*- +# Part of Softhealer Technologies. + +from odoo import fields, http, _ +from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager +from odoo.http import request +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 +from odoo.addons.portal.controllers.mail import _message_post_helper +import json +import base64 +import werkzeug + + +class PortalHelpdesk(CustomerPortal): + + def _prepare_portal_layout_values(self): + values = super(PortalHelpdesk, self)._prepare_portal_layout_values() + ticket_domain = [] + 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)) + + ticket_count = request.env['helpdesk.ticket'].sudo( + ).search_count(ticket_domain) + tickets = request.env['helpdesk.ticket'].sudo().search(ticket_domain) + values['ticket_count'] = ticket_count + values['tickets'] = tickets + return values + + @http.route(['/my/tickets', '/my/tickets/page/<int:page>'], type='http', auth="user", website=True) + def portal_my_tickets(self, page=1, sortby=None, filterby=None, search=None, search_in='all', groupby='create_by', **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 = { + 'create_by': {'input': 'create_by', 'label': _('Created By')}, + 'ticket_type': {'input': 'ticket_type', 'label': _('Ticket Type')}, + 'status': {'input': 'status', 'label': _('Status')}, + 'customer': {'input': 'customer', 'label': _('Customer')}, + 'category': {'input': 'category', 'label': _('Category')}, + 'subcategory': {'input': 'subcategory', 'label': _('Sub Category')}, + 'subject': {'input': 'subject', 'label': _('Subject')}, + 'priority': {'input': 'priority', 'label': _('Priority')}, + '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 = [] + 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)) + domain = AND([domain, ticket_domain]) + + # count for pager + ticket_count = HelpdeskTicket.search_count(domain) + # pager + pager = portal_pager( + url="/my/tickets", + url_args={'sortby': sortby, 'search_in': search_in, + 'search': search, 'filterby': filterby}, + total=ticket_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 + 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'))] + # content according to pager and archive selected + values.update({ + 'tickets': tickets, + 'grouped_tickets': grouped_tickets, + 'page_name': 'ticket', + 'default_url': '/my/tickets', + 'ticket_count': ticket_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("sh_helpdesk.portal_my_tickets", values) + + @http.route(['/my/tickets/<int:ticket_id>'], type='http', auth="public", website=True) + def portal_my_ticket_detail(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_helpdesk.action_portal_report_helpdesk_ticket', download=download) + if ticket_sudo: + if request.env.company.sh_receive_email_seeing_ticket: + body = _('Ticket viewed by customer %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, + 'ticket': ticket_sudo, + 'message': message, + 'bootstrap_formatting': True, + 'partner_id': ticket_sudo.partner_id.id, + 'report_type': 'html', + } + + return request.render("sh_helpdesk.portal_ticket_page", values) + + @http.route('/portal-subcategory-data', type="http", auth="public", csrf=False) + def portal_sub_category_data(self, **kw): + dic = {} + if kw.get('category_id') and kw.get('category_id') != 'category': + sub_categ_list = [] + sub_categ_ids = request.env['helpdesk.subcategory'].sudo().search( + [('parent_category_id', '=', int(kw.get('category_id')))]) + for sub in sub_categ_ids: + sub_categ_dic = { + 'id': sub.id, + 'name': sub.name, + } + sub_categ_list.append(sub_categ_dic) + dic.update({ + 'sub_categories': sub_categ_list + }) + else: + dic.update({ + 'sub_categories': [] + }) + return json.dumps(dic) + + @http.route('/portal-partner-data', type="http", auth="public", csrf=False) + def portal_partner_data(self, **kw): + dic = {} + partner_list = [] + for partner in request.env['res.partner'].sudo().search([]): + partner_dic = { + 'id': partner.id, + 'name': partner.name, + } + partner_list.append(partner_dic) + dic.update({ + 'partners': partner_list + }) + return json.dumps(dic) + + @http.route('/portal-user-data', type="http", auth="public", csrf=False) + def portal_user_data(self, **kw): + dic = {} + if kw.get('team_id') and kw.get('team_id') != 'team': + users_list = [] + team_id = request.env['helpdesk.team'].sudo().search( + [('id', '=', int(kw.get('team_id')))]) + for member in team_id.team_members: + user_dic = { + 'id': member.id, + 'name': member.name, + } + users_list.append(user_dic) + dic.update({ + 'users': users_list + }) + else: + dic.update({ + 'users': [] + }) + return json.dumps(dic) + + @http.route('/selected-partner-data', type="http", auth="public", csrf=False) + def selected_partner_data(self, **kw): + dic = {} + if kw.get('partner_id') and kw.get('partner_id') != '': + partner = request.env['res.partner'].sudo().search( + [('id', '=', int(kw.get('partner_id')))], limit=1) + if partner: + dic.update({ + 'name': partner.name, + 'email': partner.email, + }) + return json.dumps(dic) + + @http.route('/portal-create-ticket', type='http', auth='public', csrf=False) + def portal_create_ticket(self, **kw): + + multi_users_value = request.httprequest.form.getlist('portal_assign_multi_user') + if 'users' in multi_users_value: + del multi_users_value[0] + 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')))], limit=1) + else: + partner_id = request.env['res.partner'].sudo().search( + [('email', '=', kw.get('portal_email'))], limit=1) + if not partner_id: + partner_id = request.env['res.partner'].sudo().create({ + 'name': kw.get('portal_contact_name'), + 'company_type': 'person', + 'email': kw.get('portal_email'), + }) + if partner_id: + ticket_dic = {'partner_id': partner_id.id,'mobile_no': partner_id.mobile, + 'ticket_from_portal': True} + if len(multi_users_value) > 0: + users = [] + for user in multi_users_value: + users.append(int(user)) + multi_users = request.env['res.users'].sudo().browse(users) + if multi_users: + ticket_dic.update({ + 'sh_user_ids': [(6,0,multi_users.ids)] + }) + if kw.get('portal_team') and kw.get('portal_team') != 'team': + team_id = request.env['helpdesk.team'].sudo().browse( + int(kw.get('portal_team'))) + if team_id: + ticket_dic.update({ + 'team_id': team_id.id, + 'team_head': team_id.team_head.id, + }) + if kw.get('portal_assign_user') and kw.get('portal_assign_user') != 'user': + portal_user_id = request.env['res.users'].sudo().browse( + int(kw.get('portal_assign_user'))) + if portal_user_id: + ticket_dic.update({ + 'user_id': portal_user_id.id, + }) + if not ticket_dic.get('team_id') or not ticket_dic.get('user_id'): + if login_user.sh_portal_user_access and request.env.user.has_group('base.group_portal') and login_user.sh_portal_user_access == 'user' or login_user.sh_portal_user_access == 'manager' or login_user.sh_portal_user_access == 'leader': + if request.env.company.sh_default_team_id: + ticket_dic.update({ + 'team_id': request.env.company.sh_default_team_id.id, + 'team_head': request.env.company.sh_default_team_id.team_head.id, + 'user_id': request.env.company.sh_default_user_id.id, + }) + else: + team_id = request.env['helpdesk.team'].sudo().search( + ['|', ('team_head', '=', login_user.id), ('team_members', 'in', [login_user.id])]) + if team_id: + ticket_dic.update({ + 'team_id': team_id[-1].id, + 'team_head': team_id[-1].team_head.id, + 'user_id': login_user.id, + }) + else: + ticket_dic.update({ + 'user_id': login_user.id, + }) + ticket_dic.update({'state': 'staff_replied'}) + else: + if request.env.company.sh_default_team_id: + ticket_dic.update({ + 'team_id': request.env.company.sh_default_team_id.id, + 'team_head': request.env.company.sh_default_team_id.team_head.id, + 'user_id': request.env.company.sh_default_user_id.id, + }) + else: + if not login_user.has_group('base.group_portal') and not login_user.sh_portal_user_access: + team_id = request.env['helpdesk.team'].sudo().search( + ['|', ('team_head', '=', login_user.id), ('team_members', 'in', [login_user.id])]) + if team_id: + ticket_dic.update({ + 'team_id': team_id[-1].id, + 'team_head': team_id[-1].team_head.id, + 'user_id': login_user.id, + }) + else: + ticket_dic.update({ + 'user_id': login_user.id, + }) + 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'), + }) + if kw.get('portal_category') and kw.get('portal_category') != 'category': + ticket_dic.update({ + 'category_id': int(kw.get('portal_category')), + }) + if kw.get('portal_subcategory') and kw.get('portal_subcategory') != 'sub_category': + ticket_dic.update({ + 'sub_category_id': int(kw.get('portal_subcategory')), + }) + if kw.get('portal_subject') and kw.get('portal_subject') != 'subject': + ticket_dic.update({ + 'subject_id': int(kw.get('portal_subject')), + }) + if kw.get('portal_description'): + ticket_dic.update({ + 'description': kw.get('portal_description'), + }) + if kw.get('portal_priority') and kw.get('portal_priority') != 'priority': + ticket_dic.update({ + 'priority': int(kw.get('portal_priority')), + }) + 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 werkzeug.utils.redirect("/my/tickets") |
