From a1090c073ba010f65717072d88f992c452cceb41 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 29 Oct 2018 09:57:28 +0100 Subject: [PATCH 1/9] Some improvements in views --- website_support/__manifest__.py | 15 +- website_support/controllers/__init__.py | 3 +- website_support/controllers/main.py | 264 ++++++++++-------- website_support/controllers/myaccount.py | 120 ++++++++ website_support/data/ir.cron.xml | 2 +- .../data/website.support.settings.xml | 10 +- .../data/website.support.ticket.priority.xml | 31 -- ...s.xml => website.support.ticket.stage.xml} | 26 +- website_support/doc/changelog.rst | 6 +- website_support/i18n/de.po | 92 +++--- website_support/i18n/es.po | 123 ++++---- website_support/models/mail_template.py | 2 +- website_support/models/res_partner.py | 6 +- .../models/website_support_department.py | 2 +- .../models/website_support_help.py | 6 +- .../models/website_support_settings.py | 70 +++-- website_support/models/website_support_sla.py | 4 +- .../models/website_support_ticket.py | 179 ++++++------ website_support/security/ir.model.access.csv | 11 +- .../security/rules_for_clients.xml | 21 ++ website_support/static/description/index.html | 2 +- website_support/views/email_templates.xml | 40 +-- website_support/views/menus.xml | 10 +- website_support/views/res_partner_views.xml | 4 +- website_support/views/res_users_views.xml | 4 +- .../website_support_help_groups_views.xml | 4 +- .../views/website_support_help_page_views.xml | 4 +- .../views/website_support_settings_views.xml | 206 +++++++++++++- .../views/website_support_sla_views.xml | 4 +- ...ebsite_support_ticket_categories_views.xml | 4 +- .../website_support_ticket_close_views.xml | 4 +- .../website_support_ticket_compose_views.xml | 4 +- ...ebsite_support_ticket_department_views.xml | 4 +- .../website_support_ticket_priority_views.xml | 36 --- .../website_support_ticket_stage_views.xml | 43 +++ .../website_support_ticket_states_views.xml | 41 --- ...bsite_support_ticket_subcategory_views.xml | 6 +- .../website_support_ticket_tag_views.xml | 4 +- .../website_support_ticket_templates.xml | 261 +++++++++++++++-- .../views/website_support_ticket_views.xml | 88 ++++-- .../models/website_support_settings.py | 16 +- .../models/website_support_ticket.py | 2 +- .../views/website_support_settings_views.xml | 4 +- 43 files changed, 1175 insertions(+), 613 deletions(-) create mode 100644 website_support/controllers/myaccount.py delete mode 100644 website_support/data/website.support.ticket.priority.xml rename website_support/data/{website.support.ticket.states.xml => website.support.ticket.stage.xml} (52%) create mode 100644 website_support/security/rules_for_clients.xml delete mode 100644 website_support/views/website_support_ticket_priority_views.xml create mode 100644 website_support/views/website_support_ticket_stage_views.xml delete mode 100644 website_support/views/website_support_ticket_states_views.xml diff --git a/website_support/__manifest__.py b/website_support/__manifest__.py index 6eb6f59a7..41a004c48 100644 --- a/website_support/__manifest__.py +++ b/website_support/__manifest__.py @@ -17,31 +17,30 @@ 'views/website_support_ticket_views.xml', 'views/website_support_ticket_categories_views.xml', 'views/website_support_ticket_subcategory_views.xml', - 'views/website_support_ticket_states_views.xml', + 'views/website_support_ticket_stage_views.xml', 'views/website_support_ticket_tag_views.xml', 'views/res_partner_views.xml', 'views/res_users_views.xml', 'views/website_support_help_groups_views.xml', 'views/website_support_help_page_views.xml', - 'views/website_support_ticket_priority_views.xml', 'views/website_support_settings_views.xml', 'views/website_support_ticket_department_views.xml', 'views/website_support_sla_views.xml', 'views/menus.xml', 'data/website_support_sequence.xml', - 'data/website.support.ticket.states.xml', + 'data/website.support.ticket.stage.xml', 'data/website.support.ticket.categories.xml', - 'data/website.menu.csv', - 'data/website.support.ticket.priority.xml', + # 'data/website.menu.csv', 'data/website.support.settings.xml', 'data/website.support.department.role.csv', 'data/website.support.ticket.approval.xml', 'data/ir.cron.xml', 'security/ir.model.access.csv', + 'security/rules_for_clients.xml', ], 'demo': [], - 'depends': ['mail','web', 'website','resource'], - 'images':[ + 'depends': ['mail', 'web', 'website', 'resource'], + 'images': [ 'static/description/3.jpg', 'static/description/1.jpg', 'static/description/2.jpg', @@ -50,4 +49,4 @@ 'static/description/6.jpg', ], 'installable': True, -} \ No newline at end of file +} diff --git a/website_support/controllers/__init__.py b/website_support/controllers/__init__.py index 6920e2020..1a5178b28 100644 --- a/website_support/controllers/__init__.py +++ b/website_support/controllers/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- -from . import main \ No newline at end of file +from . import main +from . import myaccount diff --git a/website_support/controllers/main.py b/website_support/controllers/main.py index b0fcda987..c0cab8e41 100644 --- a/website_support/controllers/main.py +++ b/website_support/controllers/main.py @@ -1,19 +1,23 @@ -# -*- coding: utf-8 -*- import werkzeug import json import base64 -from random import randint -import os import datetime import requests import logging +import odoo.http as http +from odoo.http import request +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT +from odoo.addons.portal.controllers.portal import get_records_pager +from odoo.addons.http_routing.models.ir_http import slug _logger = logging.getLogger(__name__) -import openerp.http as http -from openerp.http import request -from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT +AVAILABLE_PRIORITIES = [ + ('0', 'Normal'), + ('1', 'Low'), + ('2', 'High'), + ('3', 'Very High'), + ] -from odoo.addons.http_routing.models.ir_http import slug class SupportTicketController(http.Controller): @@ -24,9 +28,9 @@ def support_approve(self, ticket_id, **kwargs): awaiting_approval = request.env['ir.model.data'].get_object('website_support','awaiting_approval') if support_ticket.approval_id.id == awaiting_approval.id: - #Change the ticket state to approved - website_ticket_state_approval_accepted = request.env['ir.model.data'].get_object('website_support','website_ticket_state_approval_accepted') - support_ticket.state = website_ticket_state_approval_accepted.id + #Change the ticket stage to approved + website_ticket_stage_approval_accepted = request.env['ir.model.data'].get_object('website_support','website_ticket_stage_approval_accepted') + support_ticket.stage = website_ticket_stage_approval_accepted.id #Also change the approval approval_accepted = request.env['ir.model.data'].get_object('website_support','approval_accepted') @@ -47,7 +51,7 @@ def support_approve(self, ticket_id, **kwargs): send_mail.send() #Remove the message from the chatter since this would bloat the communication history by a lot - send_mail.mail_message_id.res_id = 0 + send_mail.mail_message_id.res_id = 0 return "Request Approved Successfully" else: @@ -60,9 +64,9 @@ def support_disapprove(self, ticket_id, **kwargs): awaiting_approval = request.env['ir.model.data'].get_object('website_support','awaiting_approval') if support_ticket.approval_id.id == awaiting_approval.id: - #Change the ticket state to disapproved - website_ticket_state_approval_rejected = request.env['ir.model.data'].get_object('website_support','website_ticket_state_approval_rejected') - support_ticket.state = website_ticket_state_approval_rejected.id + #Change the ticket stage to disapproved + website_ticket_stage_approval_rejected = request.env['ir.model.data'].get_object('website_support','website_ticket_stage_approval_rejected') + support_ticket.stage = website_ticket_stage_approval_rejected.id #Also change the approval approval_rejected = request.env['ir.model.data'].get_object('website_support','approval_rejected') @@ -84,7 +88,7 @@ def support_disapprove(self, ticket_id, **kwargs): #Remove the message from the chatter since this would bloat the communication history by a lot send_mail.mail_message_id.res_id = 0 - + return "Request Rejected Successfully" else: return "Ticket does not need approval" @@ -150,7 +154,7 @@ def support_subcategories_fetch(self, **kwargs): def support_ticket_survey(self, portal_key): """Display the survey""" - support_ticket = request.env['website.support.ticket'].search([('portal_access_key','=', portal_key)]) + support_ticket = request.env['website.support.ticket'].search([('access_token','=', portal_key)]) if support_ticket.support_rating: #TODO some security incase they guess the portal key of an incomplete survey @@ -167,7 +171,7 @@ def support_ticket_survey_process(self, portal_key, **kw): for field_name, field_value in kw.items(): values[field_name] = field_value - support_ticket = request.env['website.support.ticket'].search([('portal_access_key','=', portal_key)]) + support_ticket = request.env['website.support.ticket'].search([('access_token','=', portal_key)]) if support_ticket.support_rating: #TODO some security incase they guess the portal key of an incomplete survey @@ -181,7 +185,7 @@ def support_ticket_survey_process(self, portal_key, **kw): def support_account_create(self, **kw): """ Create no permission account""" - setting_allow_user_signup = request.env['ir.default'].get('website.support.settings', 'allow_user_signup') + setting_allow_user_signup = request.env['ir.default'].get('res.config.settings', 'allow_user_signup') if setting_allow_user_signup: return http.request.render('website_support.account_create', {}) @@ -192,10 +196,10 @@ def support_account_create(self, **kw): def support_account_create_process(self, **kw): """ Create no permission account""" - setting_allow_user_signup = request.env['ir.default'].get('website.support.settings', 'allow_user_signup') + setting_allow_user_signup = request.env['ir.default'].get('res.config.settings', 'allow_user_signup') if setting_allow_user_signup: - + values = {} for field_name, field_value in kw.items(): values[field_name] = field_value @@ -233,7 +237,7 @@ def support_help(self, **kw): help_groups = http.request.env['website.support.help.groups'].sudo().search(['|', ('partner_ids', '=', False ), ('partner_ids', '=', request.env.user.partner_id.id ),'|', ('group_ids', '=', False ), ('group_ids', 'in', permission_list ), ('website_published','=',True)]) - setting_allow_user_signup = request.env['ir.default'].get('website.support.settings', 'allow_user_signup') + setting_allow_user_signup = request.env['ir.default'].get('res.config.settings', 'allow_user_signup') manager = False if request.env['website.support.department.contact'].sudo().search_count([('user_id','=',request.env.user.id)]) == 1: @@ -252,7 +256,7 @@ def support_ticket_reporting(self, **kw): for extra_permission in department.partner_ids: extra_access.append(extra_permission.id) - support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False) ]) + support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False) ]) support_ticket_count = len(support_tickets) @@ -268,16 +272,16 @@ def support_submit_ticket(self, **kw): category_access = [] for category_permission in http.request.env.user.groups_id: category_access.append(category_permission.id) - + ticket_categories = http.request.env['website.support.ticket.categories'].sudo().search(['|',('access_group_ids','in', category_access), ('access_group_ids','=',False)]) - setting_google_recaptcha_active = request.env['ir.default'].get('website.support.settings', 'google_recaptcha_active') - setting_google_captcha_client_key = request.env['ir.default'].get('website.support.settings', 'google_captcha_client_key') - setting_max_ticket_attachments = request.env['ir.default'].get('website.support.settings', 'max_ticket_attachments') - setting_max_ticket_attachment_filesize = request.env['ir.default'].get('website.support.settings', 'max_ticket_attachment_filesize') - setting_allow_website_priority_set = request.env['ir.default'].get('website.support.settings', 'allow_website_priority_set') - - return http.request.render('website_support.support_submit_ticket', {'categories': ticket_categories, 'priorities': http.request.env['website.support.ticket.priority'].sudo().search([]), 'person_name': person_name, 'email': http.request.env.user.email, 'setting_max_ticket_attachments': setting_max_ticket_attachments, 'setting_max_ticket_attachment_filesize': setting_max_ticket_attachment_filesize, 'setting_google_recaptcha_active': setting_google_recaptcha_active, 'setting_google_captcha_client_key': setting_google_captcha_client_key, 'setting_allow_website_priority_set': setting_allow_website_priority_set}) + setting_google_recaptcha_active = request.env['ir.default'].get('res.config.settings', 'google_recaptcha_active') + setting_google_captcha_client_key = request.env['ir.default'].get('res.config.settings', 'google_captcha_client_key') + setting_max_ticket_attachments = request.env['ir.default'].get('res.config.settings', 'max_ticket_attachments') + setting_max_ticket_attachment_filesize = request.env['ir.default'].get('res.config.settings', 'max_ticket_attachment_filesize') + setting_allow_website_priority_set = request.env['ir.default'].get('res.config.settings', 'allow_website_priority_set') + + return http.request.render('website_support.support_submit_ticket', {'categories': ticket_categories, 'priorities': AVAILABLE_PRIORITIES, 'person_name': person_name, 'email': http.request.env.user.email, 'setting_max_ticket_attachments': setting_max_ticket_attachments, 'setting_max_ticket_attachment_filesize': setting_max_ticket_attachment_filesize, 'setting_google_recaptcha_active': setting_google_recaptcha_active, 'setting_google_captcha_client_key': setting_google_captcha_client_key, 'setting_allow_website_priority_set': setting_allow_website_priority_set}) @http.route('/support/feedback/process/', type="http", auth="public", website=True) def support_feedback(self, help_page, **kw): @@ -337,12 +341,12 @@ def support_process_ticket(self, **kwargs): if values['my_gold'] != "256": return "Bot Detected" - setting_google_recaptcha_active = request.env['ir.default'].get('website.support.settings', 'google_recaptcha_active') - setting_allow_website_priority_set = request.env['ir.default'].get('website.support.settings', 'allow_website_priority_set') - + setting_google_recaptcha_active = request.env['ir.default'].get('res.config.settings', 'google_recaptcha_active') + setting_allow_website_priority_set = request.env['ir.default'].get('res.config.settings', 'allow_website_priority_set') + if setting_google_recaptcha_active: - setting_google_captcha_secret_key = request.env['ir.default'].get('website.support.settings', 'google_captcha_secret_key') + setting_google_captcha_secret_key = request.env['ir.default'].get('res.config.settings', 'google_captcha_secret_key') #Redirect them back if they didn't answer the captcha if 'g-recaptcha-response' not in values: @@ -353,7 +357,7 @@ def support_process_ticket(self, **kwargs): if response_json.json()['success'] is not True: return werkzeug.utils.redirect("/support/ticket/submit") - + my_attachment = "" file_name = "" @@ -372,7 +376,7 @@ def support_process_ticket(self, **kwargs): partner.message_post(body="Customer " + partner.name + " has sent in a new support ticket", subject="New Support Ticket") if 'priority' in values and (setting_allow_website_priority_set == "partner" or setting_allow_website_priority_set == "everyone"): - new_ticket_id.priority_id = int(values['priority']) + new_ticket_id.priority = values['priority'] else: search_partner = request.env['res.partner'].sudo().search([('email','=', values['email'] )]) @@ -382,8 +386,8 @@ def support_process_ticket(self, **kwargs): new_ticket_id = request.env['website.support.ticket'].sudo().create({'person_name':values['person_name'], 'category':values['category'], 'sub_category_id': sub_category, 'email':values['email'], 'description':values['description'], 'subject':values['subject'], 'attachment': my_attachment, 'attachment_filename': file_name, 'channel': 'Website (Public)'}) if 'priority' in values and setting_allow_website_priority_set == "everyone": - new_ticket_id.priority_id = int(values['priority']) - + new_ticket_id.priority = int(values['priority']) + if "subcategory" in values: #Also get the data from the extra fields for extra_field in request.env['website.support.ticket.subcategory.field'].sudo().search([('wsts_id','=', int(sub_category) )]): @@ -409,54 +413,84 @@ def support_process_ticket(self, **kwargs): return werkzeug.utils.redirect("/support/ticket/thanks") - @http.route('/support/ticket/thanks', type="http", auth="public", website=True) def support_ticket_thanks(self, **kw): """Displays a thank you page after the user submits a ticket""" return http.request.render('website_support.support_thank_you', {}) - @http.route('/support/ticket/view', type="http", auth="user", website=True) - def support_ticket_view_list(self, **kw): - """Displays a list of support tickets owned by the logged in user""" - - values = {} - for field_name, field_value in kw.items(): - values[field_name] = field_value - - extra_access = [] - for extra_permission in http.request.env.user.partner_id.stp_ids: - extra_access.append(extra_permission.id) - - if 'state' in values: - support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False), ('state', '=', int(values['state'])) ]) + # @http.route('/support/ticket/view', type="http", auth="user", website=True) + # def support_ticket_view_list(self, **kw): + # """Displays a list of support tickets owned by the logged in user""" + # + # values = {} + # for field_name, field_value in kw.items(): + # values[field_name] = field_value + # + # extra_access = [] + # for extra_permission in http.request.env.user.partner_id.stp_ids: + # extra_access.append(extra_permission.id) + # + # if 'stage' in values: + # support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False), ('stage', '=', int(values['stage'])) ]) + # else: + # support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False) ]) + # + # no_approval_required = request.env['ir.model.data'].get_object('website_support','no_approval_required') + # change_requests = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False), ('approval_id','!=',no_approval_required.id) ], order="planned_time desc") + # + # ticket_stage = http.request.env['website.support.ticket.stage'].sudo().search([]) + # + # return http.request.render('website_support.support_ticket_view_list', {'support_tickets':support_tickets,'ticket_count':len(support_tickets), 'change_requests': change_requests, 'request_count': len(change_requests), 'ticket_stage': ticket_stage}) + + # @http.route('/support/ticket/view/', type="http", auth="user", website=True) + # def support_ticket_view(self, ticket): + # """View an individual support ticket""" + # + # extra_access = [] + # for extra_permission in http.request.env.user.partner_id.stp_ids: + # extra_access.append(extra_permission.id) + # + # #only let the user this ticket is assigned to view this ticket + # support_ticket = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('id','=',ticket) ])[0] + # return http.request.render('website_support.support_ticket_view', {'support_ticket':support_ticket}) + + @http.route("/support/ticket//", type='http', auth="public", website=True) + def view(self, ticket_id, pdf=None, anexo=None, token=None, message=False, **post): + # use sudo to allow accessing/viewing orders for public user + # only if he knows the private token + if token: + Ticket = request.env['website.support.ticket'].sudo().search([('id', '=', ticket_id), ('access_token', '=', token)]) else: - support_tickets = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False) ]) - - no_approval_required = request.env['ir.model.data'].get_object('website_support','no_approval_required') - change_requests = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('partner_id','!=',False), ('approval_id','!=',no_approval_required.id) ], order="planned_time desc") - - ticket_states = http.request.env['website.support.ticket.states'].sudo().search([]) - - return http.request.render('website_support.support_ticket_view_list', {'support_tickets':support_tickets,'ticket_count':len(support_tickets), 'change_requests': change_requests, 'request_count': len(change_requests), 'ticket_states': ticket_states}) - - @http.route('/support/ticket/view/', type="http", auth="user", website=True) - def support_ticket_view(self, ticket): - """View an individual support ticket""" - - extra_access = [] - for extra_permission in http.request.env.user.partner_id.stp_ids: - extra_access.append(extra_permission.id) - - #only let the user this ticket is assigned to view this ticket - support_ticket = http.request.env['website.support.ticket'].sudo().search(['|', ('partner_id','=',http.request.env.user.partner_id.id), ('partner_id', 'in', extra_access), ('id','=',ticket) ])[0] - return http.request.render('website_support.support_ticket_view', {'support_ticket':support_ticket}) - - @http.route('/support/portal/ticket/view/', type="http", auth="public", website=True) - def support_portal_ticket_view(self, portal_access_key): - """View an individual support ticket (portal access)""" - - support_ticket = http.request.env['website.support.ticket'].sudo().search([('portal_access_key','=',portal_access_key) ])[0] - return http.request.render('website_support.support_ticket_view', {'support_ticket':support_ticket, 'portal_access_key': portal_access_key}) + Ticket = request.env['website.support.ticket'].search([('id', '=', ticket_id)]) + if not Ticket: + return request.render('website.404') + # Token or not, sudo the order, since portal user has not access on + # taxes, required to compute the total_amout of SO. + ticket_sudo = Ticket.sudo() + if token: + values = { + 'ticket': ticket_sudo, + 'access_token': token + } + else: + values = { + 'ticket': ticket_sudo, + } + # if token: + # return request.render('website_support.support_ticket_view', values) + # else: + # values = { + # 'ticket': ticket_sudo, + # } + return request.render('website_support.portal_ticket_page', values) + + + # @http.route('/support/portal/ticket/view/', type="http", auth="public", website=True) + # def support_portal_ticket_view(self, access_token): + # """View an individual support ticket (portal access)""" + # + # support_ticket = http.request.env['website.support.ticket'].sudo().search([('access_token','=',access_token) ])[0] + # return http.request.render('website_support.support_ticket_view', {'support_ticket':support_ticket, 'access_token': access_token}) @http.route('/support/portal/ticket/comment', type="http", auth="public", website=True) def support_portal_ticket_comment(self, **kw): @@ -466,39 +500,39 @@ def support_portal_ticket_comment(self, **kw): for field_name, field_value in kw.items(): values[field_name] = field_value - support_ticket = http.request.env['website.support.ticket'].sudo().search([('portal_access_key','=', values['portal_access_key'] ) ])[0] + support_ticket = http.request.env['website.support.ticket'].sudo().search([('access_token','=', values['access_token'] ) ])[0] http.request.env['website.support.ticket.message'].sudo().create({'ticket_id':support_ticket.id, 'by': 'customer','content':values['comment']}) - support_ticket.state = request.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_state_customer_replied') + support_ticket.stage = request.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_stage_customer_replied') request.env['website.support.ticket'].sudo().browse(support_ticket.id).message_post(body=values['comment'], subject="Support Ticket Reply", message_type="comment") - return werkzeug.utils.redirect("/support/portal/ticket/view/" + str(support_ticket.portal_access_key) ) - - @http.route('/support/ticket/comment',type="http", auth="user") - def support_ticket_comment(self, **kw): - """Adds a comment to the support ticket""" - - values = {} - for field_name, field_value in kw.items(): - values[field_name] = field_value - - ticket = http.request.env['website.support.ticket'].sudo().search([('id','=',values['ticket_id'])]) - - #check if this user owns this ticket - if ticket.partner_id.id == http.request.env.user.partner_id.id or ticket.partner_id in http.request.env.user.partner_id.stp_ids: - - http.request.env['website.support.ticket.message'].sudo().create({'ticket_id':ticket.id, 'by': 'customer','content':values['comment']}) - - ticket.state = request.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_state_customer_replied') - - request.env['website.support.ticket'].sudo().browse(ticket.id).message_post(body=values['comment'], subject="Support Ticket Reply", message_type="comment") - - else: - return "You do not have permission to submit this commment" - - return werkzeug.utils.redirect("/support/ticket/view/" + str(ticket.id)) + return werkzeug.utils.redirect("/support/ticket/"+str(support_ticket.id)+"/"+ str(support_ticket.access_token) ) + + # @http.route('/support/ticket/comment',type="http", auth="user") + # def support_ticket_comment(self, **kw): + # """Adds a comment to the support ticket""" + # + # values = {} + # for field_name, field_value in kw.items(): + # values[field_name] = field_value + # + # ticket = http.request.env['website.support.ticket'].sudo().search([('id','=',values['ticket_id'])]) + # + # #check if this user owns this ticket + # if ticket.partner_id.id == http.request.env.user.partner_id.id or ticket.partner_id in http.request.env.user.partner_id.stp_ids: + # + # http.request.env['website.support.ticket.message'].sudo().create({'ticket_id':ticket.id, 'by': 'customer','content':values['comment']}) + # + # ticket.stage = request.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_stage_customer_replied') + # + # request.env['website.support.ticket'].sudo().browse(ticket.id).message_post(body=values['comment'], subject="Support Ticket Reply", message_type="comment") + # + # else: + # return "You do not have permission to submit this commment" + # + # return werkzeug.utils.redirect("/my/tickets/" + str(ticket.id)) @http.route('/support/ticket/close',type="http", auth="user") def support_ticket_close(self, **kw): @@ -513,8 +547,8 @@ def support_ticket_close(self, **kw): #check if this user owns this ticket if ticket.partner_id.id == http.request.env.user.partner_id.id or ticket.partner_id in http.request.env.user.partner_id.stp_ids: - customer_closed_state = request.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_state_customer_closed') - ticket.state = customer_closed_state + customer_closed_stage = request.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_stage_customer_closed') + ticket.stage = customer_closed_stage ticket.close_time = datetime.datetime.now() ticket.close_date = datetime.date.today() @@ -524,15 +558,15 @@ def support_ticket_close(self, **kw): ticket.sla_active = False - closed_state_mail_template = customer_closed_state.mail_template_id + closed_stage_mail_template = customer_closed_stage.mail_template_id - if closed_state_mail_template: - closed_state_mail_template.send_mail(ticket.id, True) + if closed_stage_mail_template: + closed_stage_mail_template.send_mail(ticket.id, True) else: return "You do not have permission to close this commment" - return werkzeug.utils.redirect("/support/ticket/view/" + str(ticket.id)) + return werkzeug.utils.redirect("/my/tickets/" + str(ticket.id)) @http.route('/support/help/auto-complete',auth="public", website=True, type='http') def support_help_autocomplete(self, **kw): @@ -550,6 +584,6 @@ def support_help_autocomplete(self, **kw): for help_page in help_pages: #return_item = {"label": help_page.name + "
" + help_page.group_id.name + "","value": help_page.url_generated} return_item = {"label": help_page.name,"value": help_page.url_generated} - my_return.append(return_item) + my_return.append(return_item) - return json.JSONEncoder().encode(my_return) \ No newline at end of file + return json.JSONEncoder().encode(my_return) diff --git a/website_support/controllers/myaccount.py b/website_support/controllers/myaccount.py new file mode 100644 index 000000000..4c279017a --- /dev/null +++ b/website_support/controllers/myaccount.py @@ -0,0 +1,120 @@ +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import http, _ +from odoo.http import request +from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager +from odoo.exceptions import AccessError +from odoo.tools import consteq + +class CustomerPortal(CustomerPortal): + + def _get_website_support_ticket_domain(self): + partner = request.env.user.partner_id + domain = [ + '|', + ('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]), + ('partner_id', '=', partner.id) + ] + return domain + + def _prepare_portal_layout_values(self): + values = super(CustomerPortal, self)._prepare_portal_layout_values() + # partner = request.env.user.partner_id + ticket_count = request.env['website.support.ticket'].search_count( + self._get_website_support_ticket_domain()) + values['ticket_count'] = ticket_count + return values + + def _website_support_ticket_check_access(self, ticket_id, access_token=None): + ticket = request.env['website.support.ticket'].browse([ticket_id]) + ticket_sudo = ticket.sudo() + try: + ticket.check_access_rights('read') + ticket.check_access_rule('read') + except AccessError: + if not access_token or not consteq(ticket_sudo.access_token, access_token): + raise + return ticket_sudo + + @http.route(['/my/tickets', '/my/tickets/page/'], type='http', auth="user", website=True) + def portal_my_tickets(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw): + values = self._prepare_portal_layout_values() + # partner = request.env.user.partner_id + WebsiteSupportTicket = request.env['website.support.ticket'] + + domain = self._get_website_support_ticket_domain() + + searchbar_sortings = { + 'date': {'label': _('Newest'), 'order': 'create_date desc'}, + 'subject': {'label': _('Subject'), 'order': 'subject'}, + 'state': {'label': _('State'), 'order': 'state'}, + 'update': {'label': _('Last State Update'), 'order': 'date_last_stage_update desc'}, + } + searchbar_filters = {'all': {'label': _('All'), 'domain': []}} + for state in request.env['website.support.ticket.stage'].search([]): + searchbar_filters.update({ + str(state.id): {'label': state.name, 'domain': [('state', '=', state.id)]} + }) + + # default sort by order + if not sortby: + sortby = 'date' + order = searchbar_sortings[sortby]['order'] + + # default filter by value + if not filterby: + filterby = 'all' + domain += searchbar_filters[filterby]['domain'] + + # count for pager + ticket_count = WebsiteSupportTicket.search_count(domain) + # pager + pager = portal_pager( + url="/my/tickets", + url_args={}, + total=ticket_count, + page=page, + step=self._items_per_page + ) + # content according to pager and archive selected + tickets = WebsiteSupportTicket.search(domain, order=order, limit=self._items_per_page, offset=pager['offset']) + values.update({ + 'date': date_begin, + 'tickets': tickets, + 'page_name': 'ticket', + 'pager': pager, + # 'archive_groups': archive_groups, + 'default_url': '/my/tickets', + 'searchbar_sortings': searchbar_sortings, + 'sortby': sortby, + 'searchbar_filters': searchbar_filters, + 'filterby': filterby, + }) + return request.render("website_support.portal_my_tickets", values) + + @http.route(['/my/tickets/'], type='http', auth="public", website=True) + def portal_my_ticket_page(self, ticket_id=None, access_token=None, **kw): + try: + ticket_sudo = self._website_support_ticket_check_access(ticket_id, access_token) + except AccessError: + return request.redirect('/my') + values = self._ticket_get_page_view_values(ticket_sudo, access_token, **kw) + return request.render("website_support.portal_ticket_page", values) + + def _ticket_get_page_view_values(self, ticket, access_token, **kwargs): + values = { + 'page_name': 'ticket', + 'ticket': ticket, + } + + if access_token: + values['no_breadcrumbs'] = True + values['access_token'] = access_token + if kwargs.get('error'): + values['error'] = kwargs['error'] + if kwargs.get('warning'): + values['warning'] = kwargs['warning'] + if kwargs.get('success'): + values['success'] = kwargs['success'] + + return values diff --git a/website_support/data/ir.cron.xml b/website_support/data/ir.cron.xml index 93b3de1db..8d13b2b6b 100644 --- a/website_support/data/ir.cron.xml +++ b/website_support/data/ir.cron.xml @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/website_support/data/website.support.settings.xml b/website_support/data/website.support.settings.xml index ef8188c82..61bfa99ee 100644 --- a/website_support/data/website.support.settings.xml +++ b/website_support/data/website.support.settings.xml @@ -4,23 +4,23 @@ + eval="('res.config.settings', 'change_user_email_template_id', ref('website_support.support_ticket_user_change') )"/> + eval="('res.config.settings', 'close_ticket_email_template_id', ref('website_support.support_ticket_closed') )"/> + eval="('res.config.settings', 'staff_reply_email_template_id', ref('website_support.support_ticket_reply_wrapper') )"/> + eval="('res.config.settings', 'max_ticket_attachments', 2 )"/> + eval="('res.config.settings', 'max_ticket_attachment_filesize', 500 )"/> \ No newline at end of file diff --git a/website_support/data/website.support.ticket.priority.xml b/website_support/data/website.support.ticket.priority.xml deleted file mode 100644 index 4a78f85c9..000000000 --- a/website_support/data/website.support.ticket.priority.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Low - #000000 - - - - Normal - #000000 - - - - Moderately - #FFFF00 - - - - High - #FFA500 - - - - Urgent - #FF0000 - - - - \ No newline at end of file diff --git a/website_support/data/website.support.ticket.states.xml b/website_support/data/website.support.ticket.stage.xml similarity index 52% rename from website_support/data/website.support.ticket.states.xml rename to website_support/data/website.support.ticket.stage.xml index 54cc1909a..e2a7d763d 100644 --- a/website_support/data/website.support.ticket.states.xml +++ b/website_support/data/website.support.ticket.stage.xml @@ -2,44 +2,48 @@ - + Open True - + Staff Replied + True - + Customer Replied True - + Awaiting Approval + True - + Approval Accepted True - + Approval Rejected True - + Customer Closed + True - + Staff Closed + True - - - \ No newline at end of file + + + diff --git a/website_support/doc/changelog.rst b/website_support/doc/changelog.rst index 5bda0fbf2..1d4f780f0 100644 --- a/website_support/doc/changelog.rst +++ b/website_support/doc/changelog.rst @@ -60,9 +60,9 @@ v1.2.13 v1.2.12 ======= -* Website filter state for tickets +* Website filter stage for tickets * Hide SLA resume and pause buttons if no SLA is assigned to the ticket -* Choose which states get classified as unattended +* Choose which stage get classified as unattended v1.2.11 ======= @@ -144,7 +144,7 @@ v1.0.9 v1.0.8 ====== * Fix subcategory change not disappearing -* States no longer readonly +* stage no longer readonly * Move Kanban view over from Odoo 10 v1.0.7 diff --git a/website_support/i18n/de.po b/website_support/i18n/de.po index 5a4809777..181377e0f 100644 --- a/website_support/i18n/de.po +++ b/website_support/i18n/de.po @@ -23,9 +23,9 @@ msgid "" "\n" " ${object.body|safe}\n" "
\n" -" % if object.ticket_id.portal_access_key :\n" +" % if object.ticket_id.access_token :\n" " View Ticket Online: here
\n" +"ticket/view/${object.ticket_id.access_token}\">here
\n" " % endif\n" " Ticket Number: ${object.ticket_id.id}
\n" " Ticket Category: ${object.ticket_id.category.name or " @@ -39,9 +39,9 @@ msgstr "" "\n" " ${object.body|safe}\n" "
\n" -" % if object.ticket_id.portal_access_key :\n" +" % if object.ticket_id.access_token :\n" " Ticket Online: here
\n" +"view/${object.ticket_id.access_token}\">here
\n" " % endif\n" " Ticket Nummer: ${object.ticket_id.id}
\n" " Ticket Kategorie: ${object.ticket_id.category.name or " @@ -58,9 +58,9 @@ msgid "" "\n" " ${object.body|safe}\n" "
\n" -" % if object.ticket_id.portal_access_key :\n" +" % if object.ticket_id.access_token :\n" " View Ticket Online: here
\n" +"ticket/view/${object.ticket_id.access_token}\">here
\n" " % endif\n" " Ticket Number: ${object.ticket_id.id}
\n" " Ticket Category: ${object.ticket_id.category.name or " @@ -74,9 +74,9 @@ msgstr "" "\n" " ${object.body|safe}\n" "
\n" -" % if object.ticket_id.portal_access_key :\n" +" % if object.ticket_id.access_token :\n" " Ticket Online: here
\n" +"view/${object.ticket_id.access_token}\">here
\n" " % endif\n" " Ticket Nummer: ${object.ticket_id.id}
\n" " Ticket Kategorie: ${object.ticket_id.category.name or " @@ -98,7 +98,7 @@ msgid "" "get back to your shortly

\n" "
\n" " View Ticket Online: here
\n" +"view/${object.access_token}\">here
\n" " Ticket Number: ${object.ticket_number or object.id}" "
\n" " Ticket Category: \n" @@ -120,7 +120,7 @@ msgstr "" "uns, wir werden uns umgehend bei Ihnen melden

\n" "
\n" " Gehe zu Ticket Online: here
\n" +"ticket/view/${object.access_token}\">here
\n" " Ticket Number: ${object.ticket_number or object.id}" "
\n" " Ticket Category: \n" @@ -398,7 +398,7 @@ msgstr "" #: model:ir.ui.view,arch_db:website_support.support_ticket_view msgid "" "
\n" -" State" +" stage" msgstr "" "
\n" " Status" @@ -668,8 +668,8 @@ msgid "Create new sub category" msgstr "Erstellen Sie eine neue Unterkategorie" #. module: website_support -#: model:ir.actions.act_window,help:website_support.website_support_ticket_states_action -msgid "Create support ticket state" +#: model:ir.actions.act_window,help:website_support.website_support_ticket_stage_action +msgid "Create support ticket stage" msgstr "Erstellen Sie einen Support-Ticket-Status" #. module: website_support @@ -694,7 +694,7 @@ msgstr "" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_create_uid -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_create_uid +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_create_uid msgid "Created by" msgstr "Erstellt von" @@ -715,7 +715,7 @@ msgstr "Erstellt von" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_create_date -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_create_date +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_create_date msgid "Created on" msgstr "Angelegt am" @@ -726,12 +726,12 @@ msgid "Customer" msgstr "Kunde" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_customer_closed +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_customer_closed msgid "Customer Closed" msgstr "Kunde Geschlossen" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_customer_replied +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_customer_replied msgid "Customer Replied" msgstr "Kunde geantwortet" @@ -778,7 +778,7 @@ msgstr "Beschreibung" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_display_name -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_display_name +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_display_name msgid "Display Name" msgstr "Anzeigename" @@ -837,7 +837,7 @@ msgid "Group" msgstr "Gruppe" #. module: website_support -#. openerp-web +#. odoo-web #: code:addons/website_support/static/src/js/website_support.editor.js:46 #: model:ir.model.fields,field_description:website_support.field_website_support_help_groups_name #, python-format @@ -880,8 +880,8 @@ msgstr "Hoch" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_compose_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_id -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_id_8681 -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_id +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_8681 +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_id msgid "ID" msgstr "ID" @@ -889,7 +889,7 @@ msgstr "ID" #. module: website_support #: model:ir.model.fields,help:website_support.field_website_support_ticket_unattended msgid "" -"In 'Open' state or 'Customer Replied' state taken into consideration name " +"In 'Open' stage or 'Customer Replied' stage taken into consideration name " "changes" msgstr "Im Status 'Offen' oder 'Kundenbeantwortet' ändert sich ev. der Name" @@ -909,7 +909,7 @@ msgstr "Im Status 'Offen' oder 'Kundenbeantwortet' ändert sich ev. der Name" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_compose___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority___last_update -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states___last_update +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory___last_update msgid "Last Modified on" msgstr "Zuletzt geändert am" @@ -929,7 +929,7 @@ msgstr "Zuletzt geändert am" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_compose_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_write_uid -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_write_uid +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_write_uid msgid "Last Updated by" @@ -950,7 +950,7 @@ msgstr "Zuletzt aktualisiert durch" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_compose_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_write_date -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_write_date +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_write_date msgid "Last Updated on" @@ -963,7 +963,7 @@ msgstr "Tief" #. module: website_support #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_compose_template_id -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_mail_template_id +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_mail_template_id msgid "Mail Template" msgstr "Mail Template" @@ -1030,7 +1030,7 @@ msgid "New Event" msgstr "Neuer Anlass" #. module: website_support -#. openerp-web +#. odoo-web #: code:addons/website_support/static/src/js/website_support.editor.js:45 #: model:ir.ui.view,arch_db:website_support.content_new_help #, python-format @@ -1038,7 +1038,7 @@ msgid "New Help Group" msgstr "Neue Hilfeseite Gruppe" #. module: website_support -#. openerp-web +#. odoo-web #: code:addons/website_support/static/src/js/website_support.editor.js:16 #: model:ir.ui.view,arch_db:website_support.content_new_help #, python-format @@ -1088,7 +1088,7 @@ msgid "Number of Pages" msgstr "Seitenzahl" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_open +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_open msgid "Open" msgstr "Offen" @@ -1135,7 +1135,7 @@ msgid "Please give us feedback on our support service" msgstr "Bitte geben Sie uns Feedback zu unserem Support-Service" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_portal_access_key +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_access_token msgid "Portal Access Key" msgstr "Portal Access Key" @@ -1145,7 +1145,7 @@ msgid "Priorities" msgstr "Prioritäten" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_id +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority msgid "Priority" msgstr "Priorität" @@ -1241,12 +1241,12 @@ msgid "Staff" msgstr "Mitarbeiter" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_staff_closed +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_staff_closed msgid "Staff Closed" msgstr "Durch Mitarbeiter geschlossen" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_staff_replied +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_staff_replied msgid "Staff Replied" msgstr "Durch Mitarbeiter beantwortet" @@ -1256,19 +1256,19 @@ msgid "Staff Reply Email Template" msgstr "Mitarbeiter Antwort Email Template" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_state +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage #: model:ir.ui.view,arch_db:website_support.support_ticket_view_list -msgid "State" +msgid "stage" msgstr "Ticket Status" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_name -msgid "State Name" +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_name +msgid "stage Name" msgstr "Status Name" #. module: website_support -#: model:ir.ui.menu,name:website_support.website_support_ticket_states_menu -msgid "States" +#: model:ir.ui.menu,name:website_support.website_support_ticket_stage_menu +msgid "stage" msgstr "Status" #. module: website_support @@ -1394,8 +1394,8 @@ msgid "Support Ticket Settings" msgstr "Support Ticket Settings" #. module: website_support -#: model:ir.actions.act_window,name:website_support.website_support_ticket_states_action -msgid "Support Ticket States" +#: model:ir.actions.act_window,name:website_support.website_support_ticket_stage_action +msgid "Support Ticket stage" msgstr "Support Ticket Statuse" #. module: website_support @@ -1652,8 +1652,8 @@ msgstr "website.support.help.page.feedback" #. module: website_support #: model:ir.model,name:website_support.model_website_support_settings -msgid "website.support.settings" -msgstr "website.support.settings" +msgid "res.config.settings" +msgstr "res.config.settings" #. module: website_support #: model:ir.model,name:website_support.model_website_support_ticket_categories @@ -1681,9 +1681,9 @@ msgid "website.support.ticket.priority" msgstr "website.support.ticket.priority" #. module: website_support -#: model:ir.model,name:website_support.model_website_support_ticket_states -msgid "website.support.ticket.states" -msgstr "website.support.ticket.states" +#: model:ir.model,name:website_support.model_website_support_ticket_stage +msgid "website.support.ticket.stage" +msgstr "website.support.ticket.stage" #. module: website_support #: model:ir.model,name:website_support.model_website_support_ticket_subcategory diff --git a/website_support/i18n/es.po b/website_support/i18n/es.po index 5a73b1aee..b8e5a3e88 100644 --- a/website_support/i18n/es.po +++ b/website_support/i18n/es.po @@ -20,8 +20,8 @@ msgstr "" msgid "\n" " ${object.body|safe}\n" "
\n" -" % if object.ticket_id.portal_access_key :\n" -" View Ticket Online: here
\n" +" % if object.ticket_id.access_token :\n" +" View Ticket Online: here
\n" " % endif\n" " Ticket Number: ${object.ticket_id.ticket_number or object.ticket_id.id}
\n" " Ticket Category: ${object.ticket_id.category.name or ''}
\n" @@ -35,8 +35,8 @@ msgid "\n" msgstr "\n" " ${object.body|safe}\n" "
\n" -" % if object.ticket_id.portal_access_key :\n" -" Ver ticket online: aquí
\n" +" % if object.ticket_id.access_token :\n" +" Ver ticket online: aquí
\n" " % endif\n" " Número de ticket: ${object.ticket_id.ticket_number or object.ticket_id.id}
\n" " Categoría del ticket: ${object.ticket_id.category.name or ''}
\n" @@ -83,7 +83,7 @@ msgid "\n" " % endif\n" "

Thank you for submitting a support ticket to us, we will get back to your shortly

\n" "
\n" -" View Ticket Online: here
\n" +" View Ticket Online: here
\n" " Ticket Number: ${object.ticket_number or object.id}
\n" " Ticket Category: \n" " % if object.category.name :\n" @@ -101,7 +101,7 @@ msgstr "\n" " % endif\n" "

Gracias por registrar un nuevo ticket de soporte, le contestaremos en breve

\n" "
\n" -" Ver ticket online: aquí
\n" +" Ver ticket online: aquí
\n" " Número de ticket: ${object.ticket_number or object.id}
\n" " Categoría del ticket: \n" " % if object.category.name :\n" @@ -406,9 +406,9 @@ msgstr "
\n" #. module: website_support #: model:ir.ui.view,arch_db:website_support.support_ticket_view msgid "
\n" -" State" +" Stage" msgstr "
\n" -" Estado" +" Etapa" #. module: website_support #: model:ir.ui.view,arch_db:website_support.support_ticket_view @@ -467,7 +467,7 @@ msgstr "Aprobación" #. module: website_support #: model:website.support.ticket.approval,name:website_support.approval_accepted -#: model:website.support.ticket.states,name:website_support.website_ticket_state_approval_accepted +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_approval_accepted msgid "Approval Accepted" msgstr "Aprobación aceptada" @@ -478,7 +478,7 @@ msgstr "Mensaje de aprobación" #. module: website_support #: model:website.support.ticket.approval,name:website_support.approval_rejected -#: model:website.support.ticket.states,name:website_support.website_ticket_state_approval_rejected +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_approval_rejected msgid "Approval Rejected" msgstr "Aprobación rechazada" @@ -510,7 +510,7 @@ msgstr "Enviar encuesta automáticamente" #. module: website_support #: model:website.support.ticket.approval,name:website_support.awaiting_approval -#: model:website.support.ticket.states,name:website_support.website_ticket_state_awaiting_approval +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_awaiting_approval msgid "Awaiting Approval" msgstr "Esperando aprobación" @@ -759,9 +759,9 @@ msgid "Create new sub category" msgstr "Crear nueva subcategoría" #. module: website_support -#: model:ir.actions.act_window,help:website_support.website_support_ticket_states_action -msgid "Create support ticket state" -msgstr "Crear estado de ticket de soporte" +#: model:ir.actions.act_window,help:website_support.website_support_ticket_stage_action +msgid "Create support ticket stage" +msgstr "Crear etapa de ticket de soporte" #. module: website_support #: model:res.groups,comment:website_support.support_group @@ -789,7 +789,7 @@ msgstr "Se ha creado una cuenta a través de la web, no tiene acceso al portal ( #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_create_uid -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_create_uid +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field_create_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag_create_uid @@ -817,7 +817,7 @@ msgstr "Creado por" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_create_date -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_create_date +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field_create_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag_create_date @@ -837,12 +837,12 @@ msgid "Customer" msgstr "Cliente" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_customer_closed +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_customer_closed msgid "Customer Closed" msgstr "Cerrado por cliente" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_customer_replied +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_customer_replied msgid "Customer Replied" msgstr "Contestado por cliente" @@ -906,7 +906,7 @@ msgstr "URL de desaprobación" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_display_name -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_display_name +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field_display_name #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag_display_name @@ -937,7 +937,7 @@ msgid "Email Templates" msgstr "Plantillas de correo electrónico" #. module: website_support -#: selection:website.support.settings,allow_website_priority_set:0 +#: selection:res.config.settings,allow_website_priority_set:0 msgid "Everyone" msgstr "Todos" @@ -993,7 +993,7 @@ msgid "Group" msgstr "Grupo" #. module: website_support -#. openerp-web +#. odoo-web #: code:addons/website_support/static/src/js/website_support.editor.js:61 #: model:ir.model.fields,field_description:website_support.field_website_support_help_groups_name #, python-format @@ -1041,8 +1041,8 @@ msgstr "Alto" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_id -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_id_7369 -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_id +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_7369 +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_id #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag_id @@ -1050,14 +1050,14 @@ msgid "ID" msgstr "ID" #. module: website_support -#: model:ir.model.fields,help:website_support.field_website_support_ticket_states_unattended -msgid "If ticked, tickets in this state will appear by default" -msgstr "Si se marca, los tickets de este estado aparecerán por defecto" +#: model:ir.model.fields,help:website_support.field_website_support_ticket_stage_unattended +msgid "If ticked, tickets in this stage will appear by default" +msgstr "Si se marca, los tickets de esta etapa aparecerán por defecto" #. module: website_support #: model:ir.model.fields,help:website_support.field_website_support_ticket_unattended -msgid "In 'Open' state or 'Customer Replied' state taken into consideration name changes" -msgstr "En estado 'Abierto' o 'Contestación del cliente' se tendrán en cuenta los cambios de nombre" +msgid "In 'Open' stage or 'Customer Replied' stage taken into consideration name changes" +msgstr "En la etapa 'Abierto' o 'Contestación del cliente' se tendrán en cuenta los cambios de nombre" #. module: website_support #: model:ir.model.fields,help:website_support.field_website_support_ticket_sla_alert_ids @@ -1091,7 +1091,7 @@ msgstr "Descripción" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority___last_update -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states___last_update +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field___last_update #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag___last_update @@ -1118,7 +1118,7 @@ msgstr "Última modificación en" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_write_uid -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_write_uid +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_write_uid #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag_write_uid @@ -1146,7 +1146,7 @@ msgstr "Última actualización por" #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_field_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_message_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_write_date -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_write_date +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_field_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_subcategory_write_date #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_tag_write_date @@ -1161,7 +1161,7 @@ msgstr "Baja" #. module: website_support #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_compose_template_id -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_mail_template_id +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_mail_template_id msgid "Mail Template" msgstr "Plantilla de correo" @@ -1226,7 +1226,7 @@ msgid "Name" msgstr "Nombre" #. module: website_support -#. openerp-web +#. odoo-web #: code:addons/website_support/static/src/js/website_support.editor.js:60 #: model:ir.ui.view,arch_db:website_support.content_new_help #, python-format @@ -1234,7 +1234,7 @@ msgid "New Help Group" msgstr "Nuevo grupo de ayuda" #. module: website_support -#. openerp-web +#. odoo-web #: code:addons/website_support/static/src/js/website_support.editor.js:28 #: model:ir.ui.view,arch_db:website_support.content_new_help #, python-format @@ -1289,7 +1289,7 @@ msgid "Number of hours before or after SLA expiry to send alert" msgstr "Número de horas para enviar alerta de SLA antes o después" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_open +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_open msgid "Open" msgstr "Abierto" @@ -1330,7 +1330,7 @@ msgid "Partner" msgstr "Empresa" #. module: website_support -#: selection:website.support.settings,allow_website_priority_set:0 +#: selection:res.config.settings,allow_website_priority_set:0 msgid "Partner Only" msgstr "Solo cliente" @@ -1366,7 +1366,7 @@ msgid "Please give us feedback on our support service" msgstr "Por favor, denos su opinión de nuestro servicio de soporte" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_portal_access_key +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_access_token msgid "Portal Access Key" msgstr "Clave de acceso al portal" @@ -1376,7 +1376,7 @@ msgid "Priorities" msgstr "Prioridades" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority_id +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_priority #: model:ir.ui.view,arch_db:website_support.support_submit_ticket msgid "Priority" msgstr "Prioridad" @@ -1534,12 +1534,12 @@ msgid "Staff" msgstr "Operarios" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_staff_closed +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_staff_closed msgid "Staff Closed" msgstr "Cerrado por los operarios" #. module: website_support -#: model:website.support.ticket.states,name:website_support.website_ticket_state_staff_replied +#: model:website.support.ticket.stage,name:website_support.website_ticket_stage_staff_replied msgid "Staff Replied" msgstr "Respondido por los operarios" @@ -1549,20 +1549,20 @@ msgid "Staff Reply Email Template" msgstr "Plantilla de correo electrónico para respuestas de operarios" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_state +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage #: model:ir.ui.view,arch_db:website_support.support_ticket_view_list -msgid "State" -msgstr "Estado" +msgid "Stage" +msgstr "Etapa" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_name -msgid "State Name" -msgstr "Nombre estado" +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_name +msgid "Name" +msgstr "Nombre" #. module: website_support -#: model:ir.ui.menu,name:website_support.website_support_ticket_states_menu -msgid "States" -msgstr "Estados" +#: model:ir.ui.menu,name:website_support.website_support_ticket_stage_menu +msgid "Stages" +msgstr "Etapas" #. module: website_support #: model:ir.model.fields,field_description:website_support.field_website_support_department_sub_category_ids @@ -1696,9 +1696,9 @@ msgid "Support Ticket Settings" msgstr "Ajuste del ticket de soporte" #. module: website_support -#: model:ir.actions.act_window,name:website_support.website_support_ticket_states_action -msgid "Support Ticket States" -msgstr "Estados del ticket de soporte" +#: model:ir.actions.act_window,name:website_support.website_support_ticket_stage_action +msgid "Support Ticket Stages" +msgstr "Etapas del ticket de soporte" #. module: website_support #: model:ir.model.fields,field_description:website_support.field_res_partner_support_ticket_string @@ -1767,9 +1767,9 @@ msgid "Thank you for you feedback about our support" msgstr "Gracias por la opinión sobre nuestro soporte" #. module: website_support -#: model:ir.model.fields,help:website_support.field_website_support_ticket_states_mail_template_id -msgid "The mail message that the customer gets when the state changes" -msgstr "El mensaje por correo electrónico que el cliente recibe cuando el estado cambia" +#: model:ir.model.fields,help:website_support.field_website_support_ticket_stage_mail_template_id +msgid "The mail message that the customer gets when the stage changes" +msgstr "El mensaje por correo electrónico que el cliente recibe cuando la etapa cambia" #. module: website_support #: model:ir.model.fields,field_description:website_support.field_website_support_sla_response_category_id @@ -1827,7 +1827,7 @@ msgid "URL" msgstr "URL" #. module: website_support -#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_states_unattended +#: model:ir.model.fields,field_description:website_support.field_website_support_ticket_stage_unattended #: model:ir.model.fields,field_description:website_support.field_website_support_ticket_unattended msgid "Unattended" msgstr "Desatendidos" @@ -1998,8 +1998,8 @@ msgstr "website.support.help.page.feedback" #. module: website_support #: model:ir.model,name:website_support.model_website_support_settings -msgid "website.support.settings" -msgstr "website.support.settings" +msgid "res.config.settings" +msgstr "res.config.settings" #. module: website_support #: model:ir.model,name:website_support.model_website_support_sla @@ -2052,9 +2052,9 @@ msgid "website.support.ticket.priority" msgstr "website.support.ticket.priority" #. module: website_support -#: model:ir.model,name:website_support.model_website_support_ticket_states -msgid "website.support.ticket.states" -msgstr "website.support.ticket.states" +#: model:ir.model,name:website_support.model_website_support_ticket_stage +msgid "website.support.ticket.stage" +msgstr "website.support.ticket.stage" #. module: website_support #: model:ir.model,name:website_support.model_website_support_ticket_subcategory @@ -2070,4 +2070,3 @@ msgstr "website.support.ticket.subcategory.field" #: model:ir.model,name:website_support.model_website_support_ticket_tag msgid "website.support.ticket.tag" msgstr "website.support.ticket.tag" - diff --git a/website_support/models/mail_template.py b/website_support/models/mail_template.py index abc4636b9..94ddc20aa 100644 --- a/website_support/models/mail_template.py +++ b/website_support/models/mail_template.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from openerp import api, fields, models +from odoo import api, fields, models class MailTemplateSupportTicket(models.Model): diff --git a/website_support/models/res_partner.py b/website_support/models/res_partner.py index ca20148de..9470a92db 100644 --- a/website_support/models/res_partner.py +++ b/website_support/models/res_partner.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from openerp import api, fields, models +from odoo import api, fields, models class ResPartnerTicket(models.Model): @@ -22,8 +22,8 @@ def _count_support_tickets(self): @api.depends('support_ticket_ids') def _count_new_support_tickets(self): """Sets the amount of new support tickets owned by this customer""" - opened_state = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_open') - self.new_support_ticket_count = self.support_ticket_ids.search_count([('partner_id','=',self.id), ('state','=',opened_state.id)]) + opened_stage = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_open') + self.new_support_ticket_count = self.support_ticket_ids.search_count([('partner_id','=',self.id), ('stage','=',opened_stage.id)]) @api.one @api.depends('support_ticket_count', 'new_support_ticket_count') diff --git a/website_support/models/website_support_department.py b/website_support/models/website_support_department.py index 25dfc6bf5..2287ea677 100644 --- a/website_support/models/website_support_department.py +++ b/website_support/models/website_support_department.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import datetime -from openerp import api, fields, models +from odoo import api, fields, models class WebsiteSupportDepartment(models.Model): diff --git a/website_support/models/website_support_help.py b/website_support/models/website_support_help.py index ffb162627..a3265033b 100644 --- a/website_support/models/website_support_help.py +++ b/website_support/models/website_support_help.py @@ -2,9 +2,9 @@ import unicodedata import re -from openerp import api, fields, models -from openerp.http import request -from openerp.tools import html_escape as escape, ustr, image_resize_and_sharpen, image_save_for_web +from odoo import api, fields, models +from odoo.http import request +from odoo.tools import html_escape as escape, ustr, image_resize_and_sharpen, image_save_for_web from odoo.addons.http_routing.models.ir_http import slug diff --git a/website_support/models/website_support_settings.py b/website_support/models/website_support_settings.py index 75b80f66d..2d7249bc7 100644 --- a/website_support/models/website_support_settings.py +++ b/website_support/models/website_support_settings.py @@ -1,15 +1,8 @@ -# -*- coding: utf-8 -*- -import logging -_logger = logging.getLogger(__name__) -import requests -from openerp.http import request -import odoo +from odoo import api, fields, models -from openerp import api, fields, models +class ResConfigSettings(models.TransientModel): -class WebsiteSupportSettings(models.Model): - - _name = "website.support.settings" + _name = "res.config.settings" _inherit = 'res.config.settings' close_ticket_email_template_id = fields.Many2one('mail.template', domain="[('model_id','=','website.support.ticket')]", string="(OBSOLETE)Close Ticket Email Template") @@ -25,37 +18,40 @@ class WebsiteSupportSettings(models.Model): google_captcha_client_key = fields.Char(string="reCAPTCHA Client Key") google_captcha_secret_key = fields.Char(string="reCAPTCHA Secret Key") allow_website_priority_set = fields.Selection([("partner","Partner Only"), ("everyone","Everyone")], string="Allow Website Priority Set", help="Cusomters can set the priority of a ticket when submitting via the website form\nPartner Only = logged in user") + sla_active = fields.Boolean(string="SLA Active") @api.multi def set_values(self): - super(WebsiteSupportSettings, self).set_values() - self.env['ir.default'].set('website.support.settings', 'auto_send_survey', self.auto_send_survey) - self.env['ir.default'].set('website.support.settings', 'allow_user_signup', self.allow_user_signup) - self.env['ir.default'].set('website.support.settings', 'change_user_email_template_id', self.change_user_email_template_id.id) - self.env['ir.default'].set('website.support.settings', 'close_ticket_email_template_id', self.close_ticket_email_template_id.id) - self.env['ir.default'].set('website.support.settings', 'email_default_category_id', self.email_default_category_id.id) - self.env['ir.default'].set('website.support.settings', 'staff_reply_email_template_id', self.staff_reply_email_template_id.id) - self.env['ir.default'].set('website.support.settings', 'max_ticket_attachments', self.max_ticket_attachments) - self.env['ir.default'].set('website.support.settings', 'max_ticket_attachment_filesize', self.max_ticket_attachment_filesize) - self.env['ir.default'].set('website.support.settings', 'business_hours_id', self.business_hours_id.id) - self.env['ir.default'].set('website.support.settings', 'google_recaptcha_active', self.google_recaptcha_active) - self.env['ir.default'].set('website.support.settings', 'google_captcha_client_key', self.google_captcha_client_key) - self.env['ir.default'].set('website.support.settings', 'google_captcha_secret_key', self.google_captcha_secret_key) - self.env['ir.default'].set('website.support.settings', 'allow_website_priority_set', self.allow_website_priority_set) - + super(ResConfigSettings, self).set_values() + self.env['ir.default'].set('res.config.settings', 'auto_send_survey', self.auto_send_survey) + self.env['ir.default'].set('res.config.settings', 'allow_user_signup', self.allow_user_signup) + self.env['ir.default'].set('res.config.settings', 'change_user_email_template_id', self.change_user_email_template_id.id) + self.env['ir.default'].set('res.config.settings', 'close_ticket_email_template_id', self.close_ticket_email_template_id.id) + self.env['ir.default'].set('res.config.settings', 'email_default_category_id', self.email_default_category_id.id) + self.env['ir.default'].set('res.config.settings', 'staff_reply_email_template_id', self.staff_reply_email_template_id.id) + self.env['ir.default'].set('res.config.settings', 'max_ticket_attachments', self.max_ticket_attachments) + self.env['ir.default'].set('res.config.settings', 'max_ticket_attachment_filesize', self.max_ticket_attachment_filesize) + self.env['ir.default'].set('res.config.settings', 'business_hours_id', self.business_hours_id.id) + self.env['ir.default'].set('res.config.settings', 'google_recaptcha_active', self.google_recaptcha_active) + self.env['ir.default'].set('res.config.settings', 'google_captcha_client_key', self.google_captcha_client_key) + self.env['ir.default'].set('res.config.settings', 'google_captcha_secret_key', self.google_captcha_secret_key) + self.env['ir.default'].set('res.config.settings', 'allow_website_priority_set', self.allow_website_priority_set) + self.env['ir.default'].set('res.config.settings', 'sla_active', self.sla_active) + @api.model def get_values(self): - res = super(WebsiteSupportSettings, self).get_values() + res = super(ResConfigSettings, self).get_values() res.update( - auto_send_survey=self.env['ir.default'].get('website.support.settings', 'auto_send_survey'), - allow_user_signup=self.env['ir.default'].get('website.support.settings', 'allow_user_signup'), - change_user_email_template_id=self.env['ir.default'].get('website.support.settings', 'change_user_email_template_id'), - close_ticket_email_template_id=self.env['ir.default'].get('website.support.settings', 'close_ticket_email_template_id'), - email_default_category_id=self.env['ir.default'].get('website.support.settings', 'email_default_category_id'), - staff_reply_email_template_id=self.env['ir.default'].get('website.support.settings', 'staff_reply_email_template_id'), - max_ticket_attachments=self.env['ir.default'].get('website.support.settings', 'max_ticket_attachments'), - max_ticket_attachment_filesize=self.env['ir.default'].get('website.support.settings', 'max_ticket_attachment_filesize'), - business_hours_id=self.env['ir.default'].get('website.support.settings', 'business_hours_id'), - allow_website_priority_set=self.env['ir.default'].get('website.support.settings', 'allow_website_priority_set') + auto_send_survey=self.env['ir.default'].get('res.config.settings', 'auto_send_survey'), + allow_user_signup=self.env['ir.default'].get('res.config.settings', 'allow_user_signup'), + change_user_email_template_id=self.env['ir.default'].get('res.config.settings', 'change_user_email_template_id'), + close_ticket_email_template_id=self.env['ir.default'].get('res.config.settings', 'close_ticket_email_template_id'), + email_default_category_id=self.env['ir.default'].get('res.config.settings', 'email_default_category_id'), + staff_reply_email_template_id=self.env['ir.default'].get('res.config.settings', 'staff_reply_email_template_id'), + max_ticket_attachments=self.env['ir.default'].get('res.config.settings', 'max_ticket_attachments'), + max_ticket_attachment_filesize=self.env['ir.default'].get('res.config.settings', 'max_ticket_attachment_filesize'), + business_hours_id=self.env['ir.default'].get('res.config.settings', 'business_hours_id'), + allow_website_priority_set=self.env['ir.default'].get('res.config.settings', 'allow_website_priority_set'), + sla_active=self.env['ir.default'].get('res.config.settings', 'sla_active') ) - return res \ No newline at end of file + return res diff --git a/website_support/models/website_support_sla.py b/website_support/models/website_support_sla.py index 50646d50e..e97bcf430 100644 --- a/website_support/models/website_support_sla.py +++ b/website_support/models/website_support_sla.py @@ -4,7 +4,7 @@ _logger = logging.getLogger(__name__) from odoo.exceptions import UserError -from openerp import api, fields, models +from odoo import api, fields, models class WebsiteSupportSLA(models.Model): @@ -41,7 +41,7 @@ def create(self, values): #Setting for business hours has to be set before they can use business hours only SLA option if values['countdown_condition'] == 'business_only': - setting_business_hours_id = self.env['ir.default'].get('website.support.settings', 'business_hours_id') + setting_business_hours_id = self.env['ir.default'].get('res.config.settings', 'business_hours_id') if setting_business_hours_id is None: raise UserError("Please set business hours in settings before using this option") diff --git a/website_support/models/website_support_ticket.py b/website_support/models/website_support_ticket.py index 54d599354..306e3c5ee 100644 --- a/website_support/models/website_support_ticket.py +++ b/website_support/models/website_support_ticket.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -from openerp import api, fields, models -from openerp import tools +from odoo import api, fields, models +from odoo import tools from random import randint import datetime +import uuid from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT from odoo import SUPERUSER_ID from dateutil import tz @@ -10,6 +11,12 @@ import logging _logger = logging.getLogger(__name__) +AVAILABLE_PRIORITIES = [ + ('0', 'Normal'), + ('1', 'Low'), + ('2', 'High'), + ('3', 'Very High'), + ] class WebsiteSupportTicket(models.Model): @@ -17,43 +24,46 @@ class WebsiteSupportTicket(models.Model): _description = "Website Support Ticket" _order = "create_date desc" _rec_name = "subject" - _inherit = ['mail.thread'] + _inherit = ['mail.thread', 'mail.activity.mixin', 'portal.mixin'] _translate = True @api.model - def _read_group_state(self, states, domain, order): - """ Read group customization in order to display all the states in the + def _read_group_stage(self, stage, domain, order): + """ Read group customization in order to display all the stage in the kanban view, even if they are empty """ - staff_replied_state = self.env['ir.model.data'].get_object('website_support', - 'website_ticket_state_staff_replied') - customer_replied_state = self.env['ir.model.data'].get_object('website_support', - 'website_ticket_state_customer_replied') + staff_replied_stage = self.env['ir.model.data'].get_object('website_support', + 'website_ticket_stage_staff_replied') + customer_replied_stage = self.env['ir.model.data'].get_object('website_support', + 'website_ticket_stage_customer_replied') customer_closed = self.env['ir.model.data'].get_object('website_support', - 'website_ticket_state_customer_closed') - staff_closed = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_staff_closed') + 'website_ticket_stage_customer_closed') + staff_closed = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_staff_closed') - exclude_states = [staff_replied_state.id, customer_replied_state.id, customer_closed.id, staff_closed.id] + exclude_stage = [staff_replied_stage.id, customer_replied_stage.id, customer_closed.id, staff_closed.id] - # state_ids = states._search([('id','not in',exclude_states)], order=order, access_rights_uid=SUPERUSER_ID) - state_ids = states._search([], order=order, access_rights_uid=SUPERUSER_ID) + # stage_ids = stage._search([('id','not in',exclude_stage)], order=order, access_rights_uid=SUPERUSER_ID) + stage_ids = stage._search([], order=order, access_rights_uid=SUPERUSER_ID) - return states.browse(state_ids) + return stage.browse(stage_ids) - def _default_state(self): - return self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_open') - - def _default_priority_id(self): - default_priority = self.env['website.support.ticket.priority'].search([('sequence','=','1')]) - return default_priority[0] + def _default_stage(self): + return self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_open') def _default_approval_id(self): return self.env['ir.model.data'].get_object('website_support', 'no_approval_required') - + def _get_default_access_token(self): + return str(uuid.uuid4()) + + color = fields.Integer(string='Color Index') + access_token = fields.Char( + 'Security Token', copy=False, + default=_get_default_access_token) + # displayed_image_id = fields.Many2one('ir.attachment', domain="[('res_model', '=', 'website.support.ticket'),('res_id', '=', id), ('mimetype', 'ilike', 'image')]", string='Cover Image') channel = fields.Char(string="Channel", default="Manual") create_user_id = fields.Many2one('res.users', "Create User") - priority_id = fields.Many2one('website.support.ticket.priority', default=_default_priority_id, string="Priority") + priority = fields.Selection(AVAILABLE_PRIORITIES, string="Priority", index=True, default=AVAILABLE_PRIORITIES[0][0]) parent_company_id = fields.Many2one(string="Parent Company", related="partner_id.company_id") partner_id = fields.Many2one('res.partner', string="Partner") user_id = fields.Many2one('res.users', string="Assigned User") @@ -64,18 +74,21 @@ def _default_approval_id(self): sub_category_id = fields.Many2one('website.support.ticket.subcategory', string="Sub Category") subject = fields.Char(string="Subject") description = fields.Text(string="Description") - state = fields.Many2one('website.support.ticket.states', group_expand='_read_group_state', default=_default_state, - string="State") + stage = fields.Many2one('website.support.ticket.stage', group_expand='_read_group_stage', default=_default_stage, + string="Stage") + date_last_stage_update = fields.Datetime( + string='Last Stage Update', + index=True, + default=fields.Datetime.now) + conversation_history = fields.One2many('website.support.ticket.message', 'ticket_id', string="Conversation History") attachment = fields.Binary(string="Attachments") attachment_filename = fields.Char(string="Attachment Filename") attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'website.support.ticket')], string="Media Attachments") unattended = fields.Boolean(string="Unattended", compute="_compute_unattend", store="True", - help="In 'Open' state or 'Customer Replied' state taken into consideration name changes") - portal_access_key = fields.Char(string="Portal Access Key") + help="In 'Open' stage or 'Customer Replied' stage taken into consideration name changes") ticket_number = fields.Char(string="Ticket Number", readonly=True) - ticket_color = fields.Char(related="priority_id.color", string="Ticket Color") company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env['res.company']._company_default_get('website.support.ticket') ) support_rating = fields.Integer(string="Support Rating") @@ -121,7 +134,7 @@ def update_sla_timer(self): if active_sla_ticket.sla_response_category_id.countdown_condition == 'business_only': # Check if the current time aligns with a timeslot in the settings, # setting has to be set for business_only or UserError occurs - setting_business_hours_id = self.env['ir.default'].get('website.support.settings', 'business_hours_id') + setting_business_hours_id = self.env['ir.default'].get('res.config.settings', 'business_hours_id') current_hour = datetime.datetime.now().hour current_minute = datetime.datetime.now().minute / 60 current_hour_float = current_hour + current_minute @@ -129,7 +142,7 @@ def update_sla_timer(self): during_work_hours = self.env['resource.calendar.attendance'].search([('calendar_id','=', setting_business_hours_id), ('dayofweek','=',day_of_week), ('hour_from','<',current_hour_float), ('hour_to','>',current_hour_float)]) # If holiday module is installed take into consideration - holiday_module = self.env['ir.module.module'].search([('name','=','hr_public_holidays'), ('state','=','installed')]) + holiday_module = self.env['ir.module.module'].search([('name','=','hr_public_holidays'), ('stage','=','installed')]) if holiday_module: holiday_today = self.env['hr.holidays.public.line'].search([('date','=',datetime.datetime.now().date())]) if holiday_today: @@ -243,7 +256,7 @@ def message_new(self, msg, custom_values=None): defaults['description'] = tools.html_sanitize(msg.get('body')) #Assign to default category - setting_email_default_category_id = self.env['ir.default'].get('website.support.settings', 'email_default_category_id') + setting_email_default_category_id = self.env['ir.default'].get('res.config.settings', 'email_default_category_id') if setting_email_default_category_id: defaults['category'] = setting_email_default_category_id @@ -261,22 +274,22 @@ def message_update(self, msg_dict, update_vals=None): #If the to email address is to the customer then it must be a staff member if msg_dict.get('to') == self.email: - change_state = self.env['ir.model.data'].get_object('website_support','website_ticket_state_staff_replied') + change_stage = self.env['ir.model.data'].get_object('website_support','website_ticket_stage_staff_replied') else: - change_state = self.env['ir.model.data'].get_object('website_support','website_ticket_state_customer_replied') + change_stage = self.env['ir.model.data'].get_object('website_support','website_ticket_stage_customer_replied') - self.state = change_state.id + self.stage = change_stage.id return super(WebsiteSupportTicket, self).message_update(msg_dict, update_vals=update_vals) @api.one - @api.depends('state') + @api.depends('stage') def _compute_unattend(self): - #BACK COMPATABLITY Use open and customer reply as default unattended states - opened_state = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_open') - customer_replied_state = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_customer_replied') + #BACK COMPATABLITY Use open and customer reply as default unattended stage + opened_stage = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_open') + customer_replied_stage = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_customer_replied') - if self.state == opened_state or self.state == customer_replied_state or self.state.unattended == True: + if self.stage == opened_stage or self.stage == customer_replied_stage or self.stage.unattended == True: self.unattended = True @api.multi @@ -313,9 +326,9 @@ def open_close_ticket_wizard(self): @api.model def _needaction_domain_get(self): - open_state = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_open') - custom_replied_state = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_customer_replied') - return ['|',('state', '=', open_state.id ), ('state', '=', custom_replied_state.id)] + open_stage = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_open') + custom_replied_stage = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_customer_replied') + return ['|',('stage', '=', open_stage.id ), ('stage', '=', custom_replied_stage.id)] @api.model def create(self, vals): @@ -324,9 +337,7 @@ def create(self, vals): new_id = super(WebsiteSupportTicket, self).create(vals) - new_id.portal_access_key = randint(1000000000,2000000000) - - ticket_open_email_template = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_open').mail_template_id + ticket_open_email_template = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_open').mail_template_id ticket_open_email_template.send_mail(new_id.id, True) #Check if this contact has a SLA assigned @@ -361,10 +372,11 @@ def create(self, vals): def write(self, values, context=None): update_rec = super(WebsiteSupportTicket, self).write(values) - - if 'state' in values: - if self.state.mail_template_id: - self.state.mail_template_id.send_mail(self.id, True) + now = fields.Datetime.now() + if 'stage' in values: + if self.stage.mail_template_id: + self.stage.mail_template_id.send_mail(self.id, True) + self.date_last_stage_update = now #Email user if category has changed if 'category' in values: @@ -372,7 +384,7 @@ def write(self, values, context=None): change_category_email.send_mail(self.id, True) if 'user_id' in values: - setting_change_user_email_template_id = self.env['ir.default'].get('website.support.settings', 'change_user_email_template_id') + setting_change_user_email_template_id = self.env['ir.default'].get('res.config.settings', 'change_user_email_template_id') if setting_change_user_email_template_id: email_template = self.env['mail.template'].browse(setting_change_user_email_template_id) @@ -390,14 +402,13 @@ def write(self, values, context=None): send_mail = self.env['mail.mail'].create(email_values) send_mail.send() - return update_rec def send_survey(self): notification_template = self.env['ir.model.data'].sudo().get_object('website_support', 'support_ticket_survey') values = notification_template.generate_email(self.id) - surevey_url = "support/survey/" + str(self.portal_access_key) + surevey_url = "support/survey/" + str(self.access_token) values['body_html'] = values['body_html'].replace("_survey_url_",surevey_url) send_mail = self.env['mail.mail'].create(values) send_mail.send(True) @@ -465,34 +476,26 @@ class WebsiteSupportTicketSubCategoryField(models.Model): name = fields.Char(string="Label", required="True") type = fields.Selection([('textbox','Textbox')], default="textbox", required="True", string="Type") -class WebsiteSupportTicketStates(models.Model): - - _name = "website.support.ticket.states" - - name = fields.Char(required=True, translate=True, string='State Name') - mail_template_id = fields.Many2one('mail.template', domain="[('model_id','=','website.support.ticket')]", string="Mail Template", help="The mail message that the customer gets when the state changes") - unattended = fields.Boolean(string="Unattended", help="If ticked, tickets in this state will appear by default") +class WebsiteSupportTicketstage(models.Model): -class WebsiteSupportTicketPriority(models.Model): + _name = "website.support.ticket.stage" - _name = "website.support.ticket.priority" - _order = "sequence asc" - - sequence = fields.Integer(string="Sequence") - name = fields.Char(required=True, translate=True, string="Priority Name") - color = fields.Char(string="Color") - - @api.model - def create(self, values): - sequence=self.env['ir.sequence'].next_by_code('website.support.ticket.priority') - values['sequence']=sequence - return super(WebsiteSupportTicketPriority, self).create(values) + name = fields.Char(required=True, translate=True, string='Name') + mail_template_id = fields.Many2one('mail.template', domain="[('model_id','=','website.support.ticket')]", string="Mail Template", help="The mail message that the customer gets when the stage changes") + unattended = fields.Boolean(string="Unattended", help="If ticked, tickets in this stage will appear by default") + fold = fields.Boolean(string='Folded in Kanban', + help='This stage is folded in the kanban view when there are no records in that stage to display.') class WebsiteSupportTicketTag(models.Model): _name = "website.support.ticket.tag" name = fields.Char(required=True, translate=True, string="Tag Name") + color = fields.Integer(string='Color Index', default=10) + + _sql_constraints = [ + ('name_uniq', 'unique (name)', "Tag name already exists !"), + ] class WebsiteSupportTicketUsers(models.Model): @@ -517,27 +520,27 @@ def close_ticket(self): diff_time = datetime.datetime.strptime(self.ticket_id.close_time, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.datetime.strptime(self.ticket_id.create_date, DEFAULT_SERVER_DATETIME_FORMAT) self.ticket_id.time_to_close = diff_time.seconds - closed_state = self.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_state_staff_closed') + closed_stage = self.env['ir.model.data'].sudo().get_object('website_support', 'website_ticket_stage_staff_closed') - #We record state change manually since it would spam the chatter if every 'Staff Replied' and 'Customer Replied' gets recorded - message = "
    \n
  • State: " + self.ticket_id.state.name + " -> " + closed_state.name + "
" + #We record stage change manually since it would spam the chatter if every 'Staff Replied' and 'Customer Replied' gets recorded + message = "
    \n
  • stage: " + self.ticket_id.stage.name + " -> " + closed_stage.name + "
" self.ticket_id.message_post(body=message, subject="Ticket Closed by Staff") self.ticket_id.close_comment = self.message self.ticket_id.closed_by_id = self.env.user.id - self.ticket_id.state = closed_state.id + self.ticket_id.stage = closed_stage.id self.ticket_id.sla_active = False #Auto send out survey - setting_auto_send_survey = self.env['ir.default'].get('website.support.settings', 'auto_send_survey') + setting_auto_send_survey = self.env['ir.default'].get('res.config.settings', 'auto_send_survey') if setting_auto_send_survey: self.ticket_id.send_survey() - closed_state_mail_template = self.env['ir.model.data'].get_object('website_support', 'website_ticket_state_staff_closed').mail_template_id + closed_stage_mail_template = self.env['ir.model.data'].get_object('website_support', 'website_ticket_stage_staff_closed').mail_template_id - if closed_state_mail_template: - closed_state_mail_template.send_mail(self.ticket_id.id, True) + if closed_stage_mail_template: + closed_stage_mail_template.send_mail(self.ticket_id.id, True) class WebsiteSupportTicketCompose(models.Model): @@ -561,11 +564,11 @@ def _onchange_template_id(self): @api.one def send_reply(self): - #Change the approval state before we send the mail + #Change the approval stage before we send the mail if self.approval: - #Change the ticket state to awaiting approval - awaiting_approval_state = self.env['ir.model.data'].get_object('website_support','website_ticket_state_awaiting_approval') - self.ticket_id.state = awaiting_approval_state.id + #Change the ticket stage to awaiting approval + awaiting_approval_stage = self.env['ir.model.data'].get_object('website_support','website_ticket_stage_awaiting_approval') + self.ticket_id.stage = awaiting_approval_stage.id #One support request per ticket... self.ticket_id.planned_time = self.planned_time @@ -575,7 +578,7 @@ def send_reply(self): #Send email values = {} - setting_staff_reply_email_template_id = self.env['ir.default'].get('website.support.settings', 'staff_reply_email_template_id') + setting_staff_reply_email_template_id = self.env['ir.default'].get('res.config.settings', 'staff_reply_email_template_id') if setting_staff_reply_email_template_id: email_wrapper = self.env['mail.template'].browse(setting_staff_reply_email_template_id) @@ -597,6 +600,6 @@ def send_reply(self): awaiting_approval = self.env['ir.model.data'].get_object('website_support','awaiting_approval') self.ticket_id.approval_id = awaiting_approval.id else: - #Change the ticket state to staff replied - staff_replied = self.env['ir.model.data'].get_object('website_support','website_ticket_state_staff_replied') - self.ticket_id.state = staff_replied.id \ No newline at end of file + #Change the ticket stage to staff replied + staff_replied = self.env['ir.model.data'].get_object('website_support','website_ticket_stage_staff_replied') + self.ticket_id.stage = staff_replied.id diff --git a/website_support/security/ir.model.access.csv b/website_support/security/ir.model.access.csv index 83be3f1d2..3bb38118e 100644 --- a/website_support/security/ir.model.access.csv +++ b/website_support/security/ir.model.access.csv @@ -1,8 +1,8 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_website_support_ticket,access website.support.ticket,model_website_support_ticket,support_staff,1,1,1,0 access_website_support_ticket_compose,access website.support.ticket.compose,model_website_support_ticket_compose,support_staff,1,1,1,0 -access_website_support_ticket_states,support staff access website.support.ticket.states,model_website_support_ticket_states,support_staff,1,0,0,0 -access_website_support_ticket_states_maanger,support manager access website.support.ticket.states,model_website_support_ticket_states,support_manager,1,1,1,1 +access_website_support_ticket_stage,support staff access website.support.ticket.stage,model_website_support_ticket_stage,support_staff,1,0,0,0 +access_website_support_ticket_stage_maanger,support manager access website.support.ticket.stage,model_website_support_ticket_stage,support_manager,1,1,1,1 access_website_support_ticket_message,access website.support.ticket.message,model_website_support_ticket_message,support_staff,1,0,1,0 access_mail_followers_support,public access.mail.followers.support,mail.model_mail_followers,base.group_public,0,0,1,0 access_website_support_ticket_categories,support staff access website.support.ticket.categories,model_website_support_ticket_categories,support_staff,1,0,0,0 @@ -15,8 +15,6 @@ access_website_support_help_page,public access website.support.help.page,model_w access_website_support_help_page_manager,support manager access website.support.help.page,model_website_support_help_page,support_manager,1,1,1,1 access_website_support_help_page_feedback,public access website.support.help.page.feedback,model_website_support_help_page_feedback,base.group_public,1,0,0,0 access_website_support_help_page_feedback_manager,support manager access website.support.help.page.feedback,model_website_support_help_page_feedback,support_manager,1,1,1,1 -access_website_support_ticket_priority,support staff access website.support.ticket.priority,model_website_support_ticket_priority,support_staff,1,0,0,0 -access_website_support_ticket_priority_manager,support manager access website.support.ticket.priority,model_website_support_ticket_priority,support_manager,1,1,1,1 access_website_support_ticket_tag,support staff access website.support.ticket.tag,model_website_support_ticket_tag,support_staff,1,0,0,0 access_website_support_ticket_tag_manager,support manager access website.support.ticket.tag,model_website_support_ticket_tag,support_manager,1,1,1,1 access_website_support_ticket_close,support staff access website.support.ticket.close,model_website_support_ticket_close,support_staff,1,1,1,1 @@ -34,4 +32,7 @@ access_website_support_sla_alert,support staff access website.support.sla.alert, access_website_support_sla_alert_maanger,support manager access website.support.sla.alert,model_website_support_sla_alert,support_manager,1,1,1,1 access_ir_rule,support manager access ir.rule,base.model_ir_rule,support_manager,1,0,0,0 access_ir_config_parameter,support manager access ir.config_parameter,base.model_ir_config_parameter,support_manager,1,0,0,0 -access_res_users,support manager access res.users,base.model_res_users,support_manager,1,0,1,0 \ No newline at end of file +access_res_users,support manager access res.users,base.model_res_users,support_manager,1,0,1,0 +access_menu_portal_website_support_ticket,website_support_myaccount.website.support.ticket,website_support.model_website_support_ticket,base.group_portal,1,1,0,0 +access_menu_portal_website_support_ticket_stage,website_support_myaccount.website.support.ticket.stage,website_support.model_website_support_ticket_stage,base.group_portal,1,1,0,0 +access_menu_portal_website_support_ticket_categories,website_support_myaccount.website.support.ticket.categories,website_support.model_website_support_ticket_categories,base.group_portal,1,1,0,0 diff --git a/website_support/security/rules_for_clients.xml b/website_support/security/rules_for_clients.xml new file mode 100644 index 000000000..a62f4f84b --- /dev/null +++ b/website_support/security/rules_for_clients.xml @@ -0,0 +1,21 @@ + + + + + + + + Portal Personal Tickets Extends + + ['|', ('partner_id','=',user.partner_id.id), ('partner_id.parent_id','=',user.partner_id.id)] + + + + + + + + + + + diff --git a/website_support/static/description/index.html b/website_support/static/description/index.html index 28adf14ac..c665527b4 100644 --- a/website_support/static/description/index.html +++ b/website_support/static/description/index.html @@ -127,7 +127,7 @@

Email Integration

Email conversations are tracked for each ticket so customers can reply directly via email without ever having to go to the website or login.
Emails are automatically sent when a ticket category is changed or the ticket is closed by staff
-When the customer replies via email the ticket state is automatically set to 'Customer Replied' allowing you to easily see at a glance which tickets need attending to
+When the customer replies via email the ticket stage is automatically set to 'Customer Replied' allowing you to easily see at a glance which tickets need attending to
Operators can reply online via Customer Support->Support Tickets

Per Operator Instructions
diff --git a/website_support/views/email_templates.xml b/website_support/views/email_templates.xml index c79a4aaef..e16e8c7fc 100644 --- a/website_support/views/email_templates.xml +++ b/website_support/views/email_templates.xml @@ -1,6 +1,6 @@ - - + + Support Ticket Survey @@ -18,7 +18,7 @@

here


Ticket Number: ${object.ticket_number or object.id}
- Ticket Category: + Ticket Category: % if object.category.name : ${object.category.name} % endif @@ -51,7 +51,7 @@ ]]> - + Support Ticket New Ticket (Category) @@ -74,7 +74,7 @@ Support Ticket User Change - ]]> + ]]> A Support Ticket has been assigned to you @@ -83,14 +83,14 @@

A support ticket has been assigned to you here are the details


Ticket Number: ${object.ticket_number or object.id}
- Ticket Category: + Ticket Category: % if object.category.name : ${object.category.name} % endif
Ticket Description:
${object.description|safe} - + ]]>
@@ -98,7 +98,7 @@ Support Ticket Category Change - ]]> + ]]> ${object.email|safe} Your support ticket has been updated @@ -108,14 +108,14 @@

Your support ticket has been updated and is now in the category '${object.category.name}'


Ticket Number: ${object.ticket_number or object.id}
- Ticket Category: + Ticket Category: % if object.category.name : ${object.category.name} % endif
Ticket Description:
${object.description|safe} - + ]]>
@@ -134,14 +134,14 @@

${object.close_comment or ''}


Ticket Number: ${object.ticket_number or object.id}
- Ticket Category: + Ticket Category: % if object.category.name : ${object.category.name} % endif
Ticket Description:
${object.description|safe} - + ]]>
@@ -160,16 +160,16 @@ % endif

Thank you for submitting a support ticket to us, we will get back to your shortly


- View Ticket Online: here
+ View Ticket Online: here
Ticket Number: ${object.ticket_number or object.id}
- Ticket Category: + Ticket Category: % if object.category.name : ${object.category.name} % endif
Ticket Description:
${object.description|safe} - + ]]> @@ -178,15 +178,15 @@ Support Ticket Reply Wrapper ${object.subject} - ${user.email|safe} + ${user.email|safe} ${object.email|safe} - % if object.ticket_id.portal_access_key : - View Ticket Online: here
+ % if object.ticket_id.access_token : + View Ticket Online: here
% endif Ticket Number: ${object.ticket_id.ticket_number or object.ticket_id.id}
Ticket Category: ${object.ticket_id.category.name or ''}
@@ -241,6 +241,6 @@ ]]>
- + - \ No newline at end of file + diff --git a/website_support/views/menus.xml b/website_support/views/menus.xml index 0c286806d..7993525d1 100644 --- a/website_support/views/menus.xml +++ b/website_support/views/menus.xml @@ -1,21 +1,19 @@ - + + - + - - - - \ No newline at end of file + diff --git a/website_support/views/res_partner_views.xml b/website_support/views/res_partner_views.xml index 4f813e2ec..2040509c2 100644 --- a/website_support/views/res_partner_views.xml +++ b/website_support/views/res_partner_views.xml @@ -1,5 +1,5 @@ - + @@ -27,4 +27,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/res_users_views.xml b/website_support/views/res_users_views.xml index bf62f632b..d5cd107f6 100644 --- a/website_support/views/res_users_views.xml +++ b/website_support/views/res_users_views.xml @@ -1,5 +1,5 @@ - + @@ -18,4 +18,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_help_groups_views.xml b/website_support/views/website_support_help_groups_views.xml index d53911963..389de2c79 100644 --- a/website_support/views/website_support_help_groups_views.xml +++ b/website_support/views/website_support_help_groups_views.xml @@ -1,5 +1,5 @@ - + @@ -64,4 +64,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_help_page_views.xml b/website_support/views/website_support_help_page_views.xml index 1a5e7c182..b4a446a10 100644 --- a/website_support/views/website_support_help_page_views.xml +++ b/website_support/views/website_support_help_page_views.xml @@ -1,5 +1,5 @@ - + @@ -47,4 +47,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_settings_views.xml b/website_support/views/website_support_settings_views.xml index ce99b0c75..a15d76819 100644 --- a/website_support/views/website_support_settings_views.xml +++ b/website_support/views/website_support_settings_views.xml @@ -1,10 +1,191 @@ - - - website.support.settings form view - website.support.settings + + + res.config.settings.view.form.inherit.website.support + res.config.settings + + + + +
+

Website support

+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+

Ticket Attachment

+
+
+
+
+
+
+
+
+
+
+
+
+

Email

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +

SLA

+
+
+
+ +
+
+
+
+ +
+

Survey

+
+
+
+ +
+
+
+
+
+ +

Google reCAPTCHA

+
+
+
+ +
+
+
+
+ + + +
+ +
+ + + + - Support Ticket Settings - website.support.settings - form - inline - + Settings + ir.actions.act_window + res.config.settings + form + inline + {'module' : 'website_support'} + - \ No newline at end of file + diff --git a/website_support/views/website_support_sla_views.xml b/website_support/views/website_support_sla_views.xml index 80d6a9f09..04a26745e 100644 --- a/website_support/views/website_support_sla_views.xml +++ b/website_support/views/website_support_sla_views.xml @@ -1,5 +1,5 @@ - + @@ -49,4 +49,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_categories_views.xml b/website_support/views/website_support_ticket_categories_views.xml index ef5a1cccf..9e08ae1ab 100644 --- a/website_support/views/website_support_ticket_categories_views.xml +++ b/website_support/views/website_support_ticket_categories_views.xml @@ -1,5 +1,5 @@ - + @@ -45,4 +45,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_close_views.xml b/website_support/views/website_support_ticket_close_views.xml index 37d27fec4..39e452136 100644 --- a/website_support/views/website_support_ticket_close_views.xml +++ b/website_support/views/website_support_ticket_close_views.xml @@ -1,5 +1,5 @@ - + @@ -20,4 +20,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_compose_views.xml b/website_support/views/website_support_ticket_compose_views.xml index 2fd2bac26..c1c900c71 100644 --- a/website_support/views/website_support_ticket_compose_views.xml +++ b/website_support/views/website_support_ticket_compose_views.xml @@ -1,5 +1,5 @@ - + @@ -36,4 +36,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_department_views.xml b/website_support/views/website_support_ticket_department_views.xml index 65c61a051..e202b100f 100644 --- a/website_support/views/website_support_ticket_department_views.xml +++ b/website_support/views/website_support_ticket_department_views.xml @@ -1,5 +1,5 @@ - + @@ -54,4 +54,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_priority_views.xml b/website_support/views/website_support_ticket_priority_views.xml deleted file mode 100644 index 09a43eed9..000000000 --- a/website_support/views/website_support_ticket_priority_views.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - website.support.ticket.priority.tree.view - website.support.ticket.priority - - - - - - - - - - - Support Ticket Priorities - website.support.ticket.priority - tree - -

- No Support Tickets priorities found -

-
-
- - - website.support.ticket.priority sequence - website.support.ticket.priority - - - - -
-
\ No newline at end of file diff --git a/website_support/views/website_support_ticket_stage_views.xml b/website_support/views/website_support_ticket_stage_views.xml new file mode 100644 index 000000000..1ad98f32a --- /dev/null +++ b/website_support/views/website_support_ticket_stage_views.xml @@ -0,0 +1,43 @@ + + + + + + + website.support.ticket.stage.tree.view + website.support.ticket.stage + + + + + + + + + + + + Support Ticket Stages + website.support.ticket.stage + form + tree + +

Create support ticket stage

+
+
+ +
+
diff --git a/website_support/views/website_support_ticket_states_views.xml b/website_support/views/website_support_ticket_states_views.xml deleted file mode 100644 index 321522903..000000000 --- a/website_support/views/website_support_ticket_states_views.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - website.support.ticket.states.form.view - website.support.ticket.states - -
- - - - - -
-
-
- - - website.support.ticket.states.tree.view - website.support.ticket.states - - - - - - - - - - - Support Ticket States - website.support.ticket.states - form - tree,form - -

Create support ticket state

-
-
- -
-
\ No newline at end of file diff --git a/website_support/views/website_support_ticket_subcategory_views.xml b/website_support/views/website_support_ticket_subcategory_views.xml index 50092cdeb..ec2644a41 100644 --- a/website_support/views/website_support_ticket_subcategory_views.xml +++ b/website_support/views/website_support_ticket_subcategory_views.xml @@ -1,5 +1,5 @@ - + @@ -26,7 +26,7 @@ website.support.ticket.subcategory - + @@ -51,4 +51,4 @@ - \ No newline at end of file + diff --git a/website_support/views/website_support_ticket_tag_views.xml b/website_support/views/website_support_ticket_tag_views.xml index c2a4eb190..55399b355 100644 --- a/website_support/views/website_support_ticket_tag_views.xml +++ b/website_support/views/website_support_ticket_tag_views.xml @@ -1,5 +1,5 @@ - + @@ -24,4 +24,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/website_support/views/website_support_ticket_templates.xml b/website_support/views/website_support_ticket_templates.xml index 9ace9d327..783a6f8ee 100644 --- a/website_support/views/website_support_ticket_templates.xml +++ b/website_support/views/website_support_ticket_templates.xml @@ -19,6 +19,21 @@ +