Browse Source

Aug 30 [FIX] : Bug Fixed 'odoo_website_helpdesk'

pull/277/head
AjmalCybro 2 years ago
parent
commit
b943c289c5
  1. 10
      odoo_website_helpdesk/__manifest__.py
  2. 5
      odoo_website_helpdesk/controller/ticket_group_by.py
  3. 12
      odoo_website_helpdesk/controller/ticket_search.py
  4. 2
      odoo_website_helpdesk/models/__init__.py
  5. 5
      odoo_website_helpdesk/models/categories.py
  6. 15
      odoo_website_helpdesk/models/heldesk_team.py
  7. 162
      odoo_website_helpdesk/models/helpdesk.py
  8. 2
      odoo_website_helpdesk/models/mail_compose.py
  9. 111
      odoo_website_helpdesk/models/merge_tickets.py
  10. 27
      odoo_website_helpdesk/models/res_config.py
  11. 40
      odoo_website_helpdesk/models/support_tickets.py
  12. 7
      odoo_website_helpdesk/models/task.py
  13. 7
      odoo_website_helpdesk/report/helpdesk_ticket_report_template.xml
  14. 3
      odoo_website_helpdesk/security/ir.model.access.csv
  15. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/create-new-ticket.png
  16. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/merge-action.png
  17. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/open-model.png
  18. BIN
      odoo_website_helpdesk/static/description/assets/screenshots/open-new-ticket.png
  19. 40
      odoo_website_helpdesk/static/description/index.html
  20. 1
      odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml
  21. 4
      odoo_website_helpdesk/templates/helpdesk_replay_template.xml
  22. 2
      odoo_website_helpdesk/views/categories.xml
  23. 93
      odoo_website_helpdesk/views/helpdesk.xml
  24. 39
      odoo_website_helpdesk/views/helpdesk_views.xml
  25. 58
      odoo_website_helpdesk/views/merge_tickets_views.xml
  26. 306
      odoo_website_helpdesk/views/portal.xml
  27. 3
      odoo_website_helpdesk/views/portal_search.xml
  28. 98
      odoo_website_helpdesk/views/rating_form.xml
  29. 6
      odoo_website_helpdesk/views/report.xml
  30. 4
      odoo_website_helpdesk/views/res_config_settings.xml
  31. 2
      odoo_website_helpdesk/views/team.xml
  32. 37
      odoo_website_helpdesk/views/website_form.xml

10
odoo_website_helpdesk/__manifest__.py

@ -22,7 +22,7 @@
{ {
'name': "Website Helpdesk Support Ticket Management", 'name': "Website Helpdesk Support Ticket Management",
'version': '16.0.3.0.0', 'version': '16.0.4.0.0',
'summary': """Helpdesk Module for community""", 'summary': """Helpdesk Module for community""",
'description': """Can create ticket from website also and can manage it from backend. 'description': """Can create ticket from website also and can manage it from backend.
Bill can be created for ticket with service cost""", Bill can be created for ticket with service cost""",
@ -34,7 +34,6 @@
'data': [ 'data': [
'security/security_groups.xml', 'security/security_groups.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'views/helpdesk.xml',
'views/team.xml', 'views/team.xml',
'views/portal_search.xml', 'views/portal_search.xml',
'views/res_config_settings.xml', 'views/res_config_settings.xml',
@ -45,6 +44,7 @@
'views/portal.xml', 'views/portal.xml',
'views/categories.xml', 'views/categories.xml',
'views/rating_form.xml', 'views/rating_form.xml',
'views/merge_tickets_views.xml',
'templates/helpdesk_replay_template.xml', 'templates/helpdesk_replay_template.xml',
'data/ticket_sequence.xml', 'data/ticket_sequence.xml',
'data/ticket_stage_data.xml', 'data/ticket_stage_data.xml',
@ -54,14 +54,14 @@
'report/helpdesk_ticket_report_template.xml', 'report/helpdesk_ticket_report_template.xml',
], ],
'assets': { 'assets': {
'web.assets_frontend': [ # 'web.assets_frontend': [
'odoo_website_helpdesk/static/src/js/ticket_details.js', # ],
],
'web.assets_backend': [ 'web.assets_backend': [
'odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml', 'odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml',
'odoo_website_helpdesk/static/src/js/helpdesk_dashboard_action.js', 'odoo_website_helpdesk/static/src/js/helpdesk_dashboard_action.js',
], ],
'web.assets_frontend': [ 'web.assets_frontend': [
'odoo_website_helpdesk/static/src/js/ticket_details.js',
'/odoo_website_helpdesk/static/src/js/portal_search.js', '/odoo_website_helpdesk/static/src/js/portal_search.js',
'/odoo_website_helpdesk/static/src/js/portal_groupby.js', '/odoo_website_helpdesk/static/src/js/portal_groupby.js',
'/odoo_website_helpdesk/static/src/js/multiple_product_choose.js', '/odoo_website_helpdesk/static/src/js/multiple_product_choose.js',

5
odoo_website_helpdesk/controller/ticket_group_by.py

@ -4,12 +4,13 @@ from odoo.http import request
class TicketGroupBy(http.Controller): class TicketGroupBy(http.Controller):
@http.route(['/ticketgroupby'], type='json', auth="public", website=True) @http.route(['/ticketgroupby'], type='json', auth="public", website=True)
def ticket_group_by(self,**kwargs): def ticket_group_by(self, **kwargs):
context = [] context = []
group_value = kwargs.get("search_value") group_value = kwargs.get("search_value")
if group_value == '0': if group_value == '0':
context = [] context = []
tickets = request.env["help.ticket"].search([]) tickets = request.env["help.ticket"].search([])
context.append(tickets)
if group_value == '1': if group_value == '1':
context = [] context = []
stage_ids = request.env['ticket.stage'].search([]) stage_ids = request.env['ticket.stage'].search([])
@ -41,4 +42,4 @@ class TicketGroupBy(http.Controller):
response = http.Response( response = http.Response(
template='odoo_website_helpdesk.ticket_group_by_table', template='odoo_website_helpdesk.ticket_group_by_table',
qcontext=values) qcontext=values)
return response.render() return response.render()

12
odoo_website_helpdesk/controller/ticket_search.py

@ -4,11 +4,15 @@ from odoo.http import request
class TicketSearch(http.Controller): class TicketSearch(http.Controller):
@http.route(['/ticketsearch'], type='json', auth="public", website=True) @http.route(['/ticketsearch'], type='json', auth="public", website=True)
def ticket_search(self,**kwargs): def ticket_search(self, **kwargs):
search_value = kwargs.get("search_value") search_value = kwargs.get("search_value")
tickets = request.env["help.ticket"].search([('name', '=', search_value)]) tickets = request.env["help.ticket"].search(
['|', ('name', 'ilike', search_value),
('subject', 'ilike', search_value)])
values = { values = {
'tickets': tickets, 'tickets': tickets,
} }
response = http.Response(template='odoo_website_helpdesk.ticket_table',qcontext=values) response = http.Response(template='odoo_website_helpdesk.ticket_table',
return response.render() qcontext=values)
return response.render()

2
odoo_website_helpdesk/models/__init__.py

@ -25,3 +25,5 @@ from . import res_config
from . import categories from . import categories
from . import heldesk_team from . import heldesk_team
from . import mail_compose from . import mail_compose
from . import merge_tickets
from . import support_tickets

5
odoo_website_helpdesk/models/categories.py

@ -23,8 +23,9 @@ from odoo import fields, models
class HelpdeskCategories(models.Model): class HelpdeskCategories(models.Model):
"""Category Model"""
_name = 'helpdesk.categories' _name = 'helpdesk.categories'
_description = 'Categories' _description = 'Categories'
name = fields.Char('Name') name = fields.Char('Name', help='Category Name')
sequence = fields.Integer('Sequence', default=0) sequence = fields.Integer('Sequence', default=0, help='Sequence')

15
odoo_website_helpdesk/models/heldesk_team.py

@ -23,24 +23,31 @@ from odoo import api, fields, models
class HelpDeskTeam(models.Model): class HelpDeskTeam(models.Model):
"""Helpdesk team"""
_name = 'help.team' _name = 'help.team'
_description = 'Helpdesk Team' _description = 'Helpdesk Team'
name = fields.Char('Name') name = fields.Char('Name', help='Helpdesk Team Name')
team_lead_id = fields.Many2one('res.users', string='Team Leader', team_lead_id = fields.Many2one('res.users', string='Team Leader',
help='Team Leader Name',
domain=lambda self: [ domain=lambda self: [
('groups_id', 'in', self.env.ref( ('groups_id', 'in', self.env.ref(
'odoo_website_helpdesk.helpdesk_team_leader').id)]) 'odoo_website_helpdesk.helpdesk_team_leader').id)])
member_ids = fields.Many2many('res.users', string='Members', member_ids = fields.Many2many('res.users', string='Members',
help='Team Members',
domain=lambda self: [ domain=lambda self: [
('groups_id', 'in', self.env.ref( ('groups_id', 'in', self.env.ref(
'odoo_website_helpdesk.helpdesk_user').id)]) 'odoo_website_helpdesk.helpdesk_user').id)])
email = fields.Char('Email') email = fields.Char('Email', help='Email')
project_id = fields.Many2one('project.project', string='Project') project_id = fields.Many2one('project.project',
create_task = fields.Boolean(string="Create Task") string='Project',
help='Projects')
create_task = fields.Boolean(string="Create Task",
help="Task created or not")
@api.onchange('team_lead_id') @api.onchange('team_lead_id')
def members_choose(self): def members_choose(self):
"""Members selection function"""
fetch_memebers = self.env['res.users'].search([]) fetch_memebers = self.env['res.users'].search([])
filterd_members = fetch_memebers.filtered( filterd_members = fetch_memebers.filtered(
lambda x: x.id != self.team_lead_id.id) lambda x: x.id != self.team_lead_id.id)

162
odoo_website_helpdesk/models/helpdesk.py

@ -44,63 +44,95 @@ RATING = [
class HelpDeskTicket(models.Model): class HelpDeskTicket(models.Model):
"""Help_ticket model"""
_name = 'help.ticket' _name = 'help.ticket'
_description = 'Helpdesk Ticket' _description = 'Helpdesk Ticket'
_inherit = ['mail.thread', 'mail.activity.mixin'] _inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char('Name', default=lambda self: self.env['ir.sequence']. name = fields.Char('Name', default=lambda self: self.env['ir.sequence'].
next_by_code('help.ticket') or _('New')) next_by_code('help.ticket') or _('New'))
customer_id = fields.Many2one('res.partner', string='Customer Name') customer_id = fields.Many2one('res.partner',
customer_name = fields.Char('Customer Name') string='Customer Name',
subject = fields.Text('Subject', required=True) help='Customer Name')
description = fields.Text('Description', required=True) customer_name = fields.Char('Customer Name', help='Customer Name')
email = fields.Char('Email') subject = fields.Text('Subject', required=True,
phone = fields.Char('Phone') help='Subject of the Ticket')
team_id = fields.Many2one('help.team', string='Helpdesk Team') description = fields.Text('Description', required=True,
product_id = fields.Many2many('product.template', string='Product') help='Description')
project_id = fields.Many2one('project.project', string='Project', email = fields.Char('Email', help='Email')
phone = fields.Char('Phone', help='Contact Number')
team_id = fields.Many2one('help.team', string='Helpdesk Team',
help='Helpdesk Team Name')
product_id = fields.Many2many('product.template',
string='Product',
help='Product Name')
project_id = fields.Many2one('project.project',
string='Project',
readonly=False, readonly=False,
related='team_id.project_id', store=True) related='team_id.project_id',
store=True,
help='Project Name')
priority = fields.Selection(PRIORITIES, default='1') priority = fields.Selection(PRIORITIES, default='1', help='Priority of the'
' Ticket')
stage_id = fields.Many2one('ticket.stage', string='Stage', stage_id = fields.Many2one('ticket.stage', string='Stage',
default=lambda self: self.env[ default=lambda self: self.env[
'ticket.stage'].search( 'ticket.stage'].search(
[('name', '=', 'Draft')], limit=1).id, [('name', '=', 'Draft')], limit=1).id,
tracking=True, tracking=True,
group_expand='_read_group_stage_ids') group_expand='_read_group_stage_ids',
help='Stages')
user_id = fields.Many2one('res.users', user_id = fields.Many2one('res.users',
default=lambda self: self.env.user, default=lambda self: self.env.user,
check_company=True, check_company=True,
index=True, tracking=True) index=True, tracking=True,
cost = fields.Float('Cost per hour') help='Login User')
cost = fields.Float('Cost per hour', help='Cost Per Unit')
service_product_id = fields.Many2one('product.product', service_product_id = fields.Many2one('product.product',
string='Service Product', string='Service Product',
help='Service Product',
domain=[ domain=[
('detailed_type', '=', 'service')]) ('detailed_type', '=', 'service')])
create_date = fields.Datetime('Creation Date') create_date = fields.Datetime('Creation Date', help='Created date')
start_date = fields.Datetime('Start Date') start_date = fields.Datetime('Start Date', help='Start Date')
end_date = fields.Datetime('End Date') end_date = fields.Datetime('End Date', help='End Date')
public_ticket = fields.Boolean(string="Public Ticket") public_ticket = fields.Boolean(string="Public Ticket", help='Public Ticket')
invoice_ids = fields.Many2many('account.move', string='Invoices') invoice_ids = fields.Many2many('account.move',
task_ids = fields.Many2many('project.task', string='Tasks') string='Invoices',
color = fields.Integer(string="Color") help='Invoicing id'
replied_date = fields.Datetime('Replied date') )
last_update_date = fields.Datetime('Last Update Date') task_ids = fields.Many2many('project.task',
ticket_type = fields.Many2one('helpdesk.types', string='Ticket Type') string='Tasks',
help='Task id')
color = fields.Integer(string="Color", help='Color')
replied_date = fields.Datetime('Replied date', help='Replied Date')
last_update_date = fields.Datetime('Last Update Date',
help='Last Update Date')
ticket_type = fields.Many2one('helpdesk.types',
string='Ticket Type', help='Ticket Type')
team_head = fields.Many2one('res.users', string='Team Leader', team_head = fields.Many2one('res.users', string='Team Leader',
compute='_compute_team_head') compute='_compute_team_head',
help='Team Leader Name')
assigned_user = fields.Many2one('res.users', assigned_user = fields.Many2one('res.users',
domain=lambda self: [ domain=lambda self: [
('groups_id', 'in', self.env.ref( ('groups_id', 'in', self.env.ref(
'odoo_website_helpdesk.helpdesk_user').id)]) 'odoo_website_helpdesk.helpdesk_user').id)],
category_id = fields.Many2one('helpdesk.categories') help='Assigned User Name')
tags = fields.Many2many('helpdesk.tag') category_id = fields.Many2one('helpdesk.categories',
assign_user = fields.Boolean(default=False) help='Category')
attachment_ids = fields.One2many('ir.attachment', 'res_id') tags = fields.Many2many('helpdesk.tag', help='Tags')
assign_user = fields.Boolean(default=False, help='Assign User')
attachment_ids = fields.One2many('ir.attachment', 'res_id',
help='Attachment Line')
merge_ticket_invisible = fields.Boolean(string='Merge Ticket',
help='Merge Ticket Invisible or '
'Not', default=False)
merge_count = fields.Integer(string='Merge Count', help='Merged Tickets '
'Count')
@api.onchange('team_id', 'team_head') @api.onchange('team_id', 'team_head')
def team_leader_domain(self): def team_leader_domain(self):
"""Changing the team leader when selecting the team"""
li = [] li = []
for rec in self.team_id.member_ids: for rec in self.team_id.member_ids:
li.append(rec.id) li.append(rec.id)
@ -108,10 +140,12 @@ class HelpDeskTicket(models.Model):
@api.depends('team_id') @api.depends('team_id')
def _compute_team_head(self): def _compute_team_head(self):
"""Compute the team head function"""
self.team_head = self.team_id.team_lead_id.id self.team_head = self.team_id.team_lead_id.id
@api.onchange('stage_id') @api.onchange('stage_id')
def mail_snd(self): def mail_snd(self):
"""Sending mail to the user function"""
rec_id = self._origin.id rec_id = self._origin.id
data = self.env['help.ticket'].search([('id', '=', rec_id)]) data = self.env['help.ticket'].search([('id', '=', rec_id)])
data.last_update_date = fields.Datetime.now() data.last_update_date = fields.Datetime.now()
@ -124,6 +158,7 @@ class HelpDeskTicket(models.Model):
mail_template.send_mail(self._origin.id, force_send=True) mail_template.send_mail(self._origin.id, force_send=True)
def assign_to_teamleader(self): def assign_to_teamleader(self):
"""Assigning team leader function"""
if self.team_id: if self.team_id:
self.team_head = self.team_id.team_lead_id.id self.team_head = self.team_id.team_lead_id.id
mail_template = self.env.ref( mail_template = self.env.ref(
@ -137,6 +172,7 @@ class HelpDeskTicket(models.Model):
raise ValidationError("Please choose a Helpdesk Team") raise ValidationError("Please choose a Helpdesk Team")
def _default_show_create_task(self): def _default_show_create_task(self):
"""Task creation"""
return self.env['ir.config_parameter'].sudo().get_param( return self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.show_create_task') 'odoo_website_helpdesk.show_create_task')
@ -148,6 +184,7 @@ class HelpDeskTicket(models.Model):
billable = fields.Boolean(string="Billable", default=False) billable = fields.Boolean(string="Billable", default=False)
def _default_show_category(self): def _default_show_category(self):
"""Show category default"""
return self.env['ir.config_parameter'].sudo().get_param( return self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.show_category') 'odoo_website_helpdesk.show_category')
@ -162,16 +199,19 @@ class HelpDeskTicket(models.Model):
('blocked', 'Blocked'), ], default='normal') ('blocked', 'Blocked'), ], default='normal')
def _compute_show_category(self): def _compute_show_category(self):
"""Compute show category"""
show_category = self._default_show_category() show_category = self._default_show_category()
for rec in self: for rec in self:
rec.show_category = show_category rec.show_category = show_category
def _compute_show_create_task(self): def _compute_show_create_task(self):
"""Compute the created task"""
show_create_task = self._default_show_create_task() show_create_task = self._default_show_create_task()
for record in self: for record in self:
record.show_create_task = show_create_task record.show_create_task = show_create_task
def auto_close_ticket(self): def auto_close_ticket(self):
"""Automatically closing the ticket"""
auto_close = self.env['ir.config_parameter'].sudo().get_param( auto_close = self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.auto_close_ticket') 'odoo_website_helpdesk.auto_close_ticket')
if auto_close: if auto_close:
@ -201,13 +241,16 @@ class HelpDeskTicket(models.Model):
@api.model_create_multi @api.model_create_multi
def create(self, vals_list): def create(self, vals_list):
"""Create function"""
return super(HelpDeskTicket, self).create(vals_list) return super(HelpDeskTicket, self).create(vals_list)
def write(self, vals): def write(self, vals):
"""Write function"""
result = super(HelpDeskTicket, self).write(vals) result = super(HelpDeskTicket, self).write(vals)
return result return result
def create_invoice(self): def create_invoice(self):
"""Create Invoice based on the ticket"""
tasks = self.env['project.task'].search( tasks = self.env['project.task'].search(
[('project_id', '=', self.project_id.id), [('project_id', '=', self.project_id.id),
('ticket_id', '=', self.id)]).filtered( ('ticket_id', '=', self.id)]).filtered(
@ -219,7 +262,7 @@ class HelpDeskTicket(models.Model):
invoice_no = self.env['ir.sequence'].next_by_code( invoice_no = self.env['ir.sequence'].next_by_code(
'ticket.invoice') 'ticket.invoice')
move = self.env['account.move'].create([ self.env['account.move'].create([
{ {
'name': invoice_no, 'name': invoice_no,
'move_type': 'out_invoice', 'move_type': 'out_invoice',
@ -247,6 +290,7 @@ class HelpDeskTicket(models.Model):
} }
def create_tasks(self): def create_tasks(self):
"""Task creation"""
task_id = self.env['project.task'].create({ task_id = self.env['project.task'].create({
'name': self.name + '-' + self.subject, 'name': self.name + '-' + self.subject,
'project_id': self.project_id.id, 'project_id': self.project_id.id,
@ -268,6 +312,7 @@ class HelpDeskTicket(models.Model):
} }
def open_tasks(self): def open_tasks(self):
"""View the Created task """
return { return {
'name': 'Tasks', 'name': 'Tasks',
'domain': [('ticket_id', '=', self.id)], 'domain': [('ticket_id', '=', self.id)],
@ -278,6 +323,7 @@ class HelpDeskTicket(models.Model):
} }
def open_invoices(self): def open_invoices(self):
"""View the Created invoice"""
return { return {
'name': 'Invoice', 'name': 'Invoice',
'domain': [('ticket_id', '=', self.id)], 'domain': [('ticket_id', '=', self.id)],
@ -287,7 +333,26 @@ class HelpDeskTicket(models.Model):
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
} }
def open_merged_tickets(self):
"""Open the merged tickets tree view"""
ticket_ids = self.env['support.tickets'].search(
[('merged_ticket', '=', self.id)])
# Get the display_name matching records from the support.tickets
helpdesk_ticket_ids = ticket_ids.mapped('display_name')
# Get the IDs of the help.ticket records matching the display names
help_ticket_records = self.env['help.ticket'].search(
[('name', 'in', helpdesk_ticket_ids)])
return {
'type': 'ir.actions.act_window',
'name': 'Helpdesk Ticket',
'view_mode': 'tree,form',
'res_model': 'help.ticket',
'domain': [('id', 'in', help_ticket_records.ids)],
'context': self.env.context,
}
def action_send_reply(self): def action_send_reply(self):
"""Action to sent reply button"""
template_id = self.env['ir.config_parameter'].sudo().get_param( template_id = self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.reply_template_id' 'odoo_website_helpdesk.reply_template_id'
) )
@ -321,24 +386,31 @@ class HelpDeskTicket(models.Model):
class StageTicket(models.Model): class StageTicket(models.Model):
"""Stage Ticket class"""
_name = 'ticket.stage' _name = 'ticket.stage'
_description = 'Ticket Stage' _description = 'Ticket Stage'
_order = 'sequence, id' _order = 'sequence, id'
_fold_name = 'fold' _fold_name = 'fold'
name = fields.Char('Name') name = fields.Char('Name', help='Name')
active = fields.Boolean(default=True) active = fields.Boolean(default=True, help='Active', string='Active')
sequence = fields.Integer(default=50) sequence = fields.Integer(default=50, help='Sequence', string='Sequence')
closing_stage = fields.Boolean('Closing Stage', default=False) closing_stage = fields.Boolean('Closing Stage', default=False,
cancel_stage = fields.Boolean('Cancel Stage', default=False) help='Closing stage')
starting_stage = fields.Boolean('Start Stage', default=False) cancel_stage = fields.Boolean('Cancel Stage', default=False,
folded = fields.Boolean('Folded in Kanban', default=False) help='Cancel stage')
starting_stage = fields.Boolean('Start Stage', default=False,
help='Starting Stage')
folded = fields.Boolean('Folded in Kanban', default=False,
help='Folded Stage')
template_id = fields.Many2one('mail.template', template_id = fields.Many2one('mail.template',
help='Templates',
domain="[('model', '=', 'help.ticket')]") domain="[('model', '=', 'help.ticket')]")
group_ids = fields.Many2many('res.groups') group_ids = fields.Many2many('res.groups', help='Group ID')
fold = fields.Boolean(string='Fold') fold = fields.Boolean(string='Fold', help='Folded')
def unlink(self): def unlink(self):
"""Unlinking Function"""
for rec in self: for rec in self:
tickets = rec.search([]) tickets = rec.search([])
sequence = tickets.mapped('sequence') sequence = tickets.mapped('sequence')
@ -354,20 +426,24 @@ class StageTicket(models.Model):
class HelpdeskTypes(models.Model): class HelpdeskTypes(models.Model):
"""Helpdesk types """
_name = 'helpdesk.types' _name = 'helpdesk.types'
_description = 'Helpdesk Types' _description = 'Helpdesk Types'
name = fields.Char(string='Type') name = fields.Char(string='Type', help='Types')
class Tasks(models.Model): class Tasks(models.Model):
"""Inheriting the task"""
_inherit = 'project.task' _inherit = 'project.task'
ticket_billed = fields.Boolean('Billed', default=False) ticket_billed = fields.Boolean('Billed', default=False,
help='Billed Tickets')
class HelpdeskTags(models.Model): class HelpdeskTags(models.Model):
"""Helpdesk tags"""
_name = 'helpdesk.tag' _name = 'helpdesk.tag'
_description = 'Helpdesk Tags' _description = 'Helpdesk Tags'
name = fields.Char(string='Tag') name = fields.Char(string='Tag', help='Tag Name')

2
odoo_website_helpdesk/models/mail_compose.py

@ -23,9 +23,11 @@ from odoo import fields, models
class MailComposeMessage(models.TransientModel): class MailComposeMessage(models.TransientModel):
"""Inheriting the Mail compose message"""
_inherit = 'mail.compose.message' _inherit = 'mail.compose.message'
def _action_send_mail(self, auto_commit=False): def _action_send_mail(self, auto_commit=False):
"""Send mail function"""
if self.model == 'help.ticket': if self.model == 'help.ticket':
ticket_id = self.env['help.ticket'].browse(self.res_id) ticket_id = self.env['help.ticket'].browse(self.res_id)
ticket_id.replied_date = fields.Date.today() ticket_id.replied_date = fields.Date.today()

111
odoo_website_helpdesk/models/merge_tickets.py

@ -0,0 +1,111 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import api, fields, models
class MergeTicket(models.Model):
"""Tickets merging class"""
_name = 'merge.tickets'
_description = 'Merging the selected tickets'
_rec_name = 'support_ticket_id'
user_id = fields.Many2one('res.partner',
string='Responsible User',
help='Responsible user name',
default=lambda self: self.env.user.partner_id.id)
support_team_id = fields.Many2one('help.team', string='Support Team',
help='Support Team Name')
customer_id = fields.Many2one('res.partner', string='Customer',
help='Customer Name'
)
support_ticket_id = fields.Many2one('help.ticket',
string='Support Ticket')
new_ticket = fields.Boolean(string='Create New Ticket ?',
help='Creating new tickets or not.',
default=False)
subject = fields.Char(string='Subject', help='Enter the New Ticket Subject')
merge_reason = fields.Char(string='Merge Reason', help='Merging Reason')
support_ticket_ids = fields.One2many('support.tickets',
'support_ticket_id',
string='Support Tickets',
helps='Merged tickets')
active = fields.Boolean(string='Disable Record', help='Disable Record',
default=True)
def default_get(self, fields_list):
defaults = super(MergeTicket, self).default_get(fields_list)
active_ids = self._context.get('active_ids', [])
selected_tickets = self.env['help.ticket'].browse(active_ids)
customer_ids = selected_tickets.mapped('customer_id')
subjects = selected_tickets.mapped('subject')
display_names = selected_tickets.mapped('display_name')
helpdesk_team = selected_tickets.mapped('team_id')
descriptions = selected_tickets.mapped('description')
if len(customer_ids): # Ensure both selected records have the same customer
defaults.update({
'customer_id': customer_ids[0].id,
'support_team_id': helpdesk_team,
'support_ticket_ids': [(0, 0, {
'subject': subject,
'display_name': display_name,
'description': description,
}) for subject, display_name, description in
zip(subjects, display_names,
descriptions)]
})
return defaults
def action_merge_ticket(self):
"""Merging the tickets or creating new tickets"""
if self.new_ticket:
description = "\n\n".join(
f"{ticket.subject}\n{'-' * len(ticket.subject)}\n{ticket.description}"
for ticket in self.support_ticket_ids
)
self.env['help.ticket'].create({
'subject': self.subject,
'description': description,
'customer_id': self.customer_id.id,
'team_id': self.support_team_id.id,
})
else:
if len(self.support_ticket_ids):
description = "\n\n".join(
f"{ticket.subject}\n{'-' * len(ticket.subject)}\n{ticket.description}"
for ticket in self.support_ticket_ids
)
# Update the existing support_ticket with the combined information
self.support_ticket_id.write({
'description': description,
'merge_ticket_invisible': True,
'merge_count': len(self.support_ticket_ids),
})
@api.onchange('support_ticket_id')
def _onchange_support_ticket_id(self):
"""Onchange function to add the support ticket id."""
self.support_ticket_ids.write({
'merged_ticket': self.support_ticket_id
})

27
odoo_website_helpdesk/models/res_config.py

@ -19,13 +19,15 @@
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# #############################################################################
from odoo import models, fields, api from odoo import api, fields, models
class Menu(models.Model): class Menu(models.Model):
"""Inheriting the website menu"""
_inherit = "website.menu" _inherit = "website.menu"
def _compute_visible(self): def _compute_visible(self):
"""Compute visible"""
super()._compute_visible() super()._compute_visible()
show_menu_header = self.env['ir.config_parameter'].sudo().get_param( show_menu_header = self.env['ir.config_parameter'].sudo().get_param(
'odoo_website_helpdesk.helpdesk_menu_show') 'odoo_website_helpdesk.helpdesk_menu_show')
@ -37,32 +39,42 @@ class Menu(models.Model):
class Helpdesk(models.TransientModel): class Helpdesk(models.TransientModel):
"""Inheriting the res config"""
_inherit = 'res.config.settings' _inherit = 'res.config.settings'
show_create_task = fields.Boolean(string="Create Tasks", show_create_task = fields.Boolean(string="Create Tasks",
config_parameter='odoo_website_helpdesk.show_create_task') config_parameter='odoo_website_helpdesk.show_create_task',
help='Create Task')
show_category = fields.Boolean(string="Category", show_category = fields.Boolean(string="Category",
config_parameter='odoo_website_helpdesk.show_category', config_parameter='odoo_website_helpdesk.show_category',
help='Category',
implied_group='odoo_website_helpdesk.group_show_category') implied_group='odoo_website_helpdesk.group_show_category')
product_website = fields.Boolean(string="Product On Website", product_website = fields.Boolean(string="Product On Website",
config_parameter='odoo_website_helpdesk.product_website') config_parameter='odoo_website_helpdesk.product_website',
help='Product on website')
auto_close_ticket = fields.Boolean(string="Auto Close Ticket", auto_close_ticket = fields.Boolean(string="Auto Close Ticket",
config_parameter='odoo_website_helpdesk.auto_close_ticket') config_parameter='odoo_website_helpdesk.auto_close_ticket',
help='Auto Close ticket')
no_of_days = fields.Integer(string="No Of Days", no_of_days = fields.Integer(string="No Of Days",
config_parameter='odoo_website_helpdesk.no_of_days') config_parameter='odoo_website_helpdesk.no_of_days',
help='No of Days')
closed_stage = fields.Many2one( closed_stage = fields.Many2one(
'ticket.stage', string='Closing stage', 'ticket.stage', string='Closing stage',
help='Closing Stage',
config_parameter='odoo_website_helpdesk.closed_stage') config_parameter='odoo_website_helpdesk.closed_stage')
reply_template_id = fields.Many2one('mail.template', reply_template_id = fields.Many2one('mail.template',
domain="[('model', '=', 'help.ticket')]", domain="[('model', '=', 'help.ticket')]",
config_parameter='odoo_website_helpdesk.reply_template_id') config_parameter='odoo_website_helpdesk.reply_template_id',
help='Reply Template')
helpdesk_menu_show = fields.Boolean('Helpdesk Menu', helpdesk_menu_show = fields.Boolean('Helpdesk Menu',
config_parameter= config_parameter=
'odoo_website_helpdesk.helpdesk_menu_show') 'odoo_website_helpdesk.helpdesk_menu_show',
help='Helpdesk menu')
@api.onchange('closed_stage') @api.onchange('closed_stage')
def closed_stage_a(self): def closed_stage_a(self):
"""Closing stage function"""
stage = self.closed_stage.id stage = self.closed_stage.id
in_stage = self.env['ticket.stage'].search([('id', '=', stage)]) in_stage = self.env['ticket.stage'].search([('id', '=', stage)])
not_in_stage = self.env['ticket.stage'].search([('id', '!=', stage)]) not_in_stage = self.env['ticket.stage'].search([('id', '!=', stage)])
@ -72,6 +84,7 @@ class Helpdesk(models.TransientModel):
@api.constrains('show_category') @api.constrains('show_category')
def show_category_subcategory(self): def show_category_subcategory(self):
"""Show category and the sub category"""
if self.show_category: if self.show_category:
group_cat = self.env.ref( group_cat = self.env.ref(
'odoo_website_helpdesk.group_show_category') 'odoo_website_helpdesk.group_show_category')

40
odoo_website_helpdesk/models/support_tickets.py

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class SupportTickets(models.Model):
"""Creating onetoMany model"""
_name = 'support.tickets'
_description = 'Support Tickets'
subject = fields.Char(string='Subject', help='Subject of the merged '
'tickets')
display_name = fields.Char(string='Display Name',
help='Display name of the merged tickets')
description = fields.Char(string='Description',
help='Description of the tickets')
support_ticket_id = fields.Many2one('merge.tickets',
string='Support Tickets',
help='Support tickets')
merged_ticket = fields.Integer(string='Merged Ticket ID',
help='Storing merged ticket id')

7
odoo_website_helpdesk/models/task.py

@ -19,16 +19,19 @@
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# #############################################################################
from odoo import models, fields from odoo import fields, models
class Task(models.Model): class Task(models.Model):
"""Inheriting the project task"""
_inherit = 'project.task' _inherit = 'project.task'
ticket_id = fields.Many2one('help.ticket', string='Ticket') ticket_id = fields.Many2one('help.ticket', string='Ticket',
help='Ticket')
class AccountMove(models.Model): class AccountMove(models.Model):
"""Inheriting the account.move model"""
_inherit = 'account.move' _inherit = 'account.move'
ticket_id = fields.Many2one('help.ticket', string='Ticket') ticket_id = fields.Many2one('help.ticket', string='Ticket')

7
odoo_website_helpdesk/report/helpdesk_ticket_report_template.xml

@ -46,7 +46,6 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<t t-set="tasks" <t t-set="tasks"
t-value="request.env['project.task'].sudo().search([('ticket_id', '=', o.id)])"/> t-value="request.env['project.task'].sudo().search([('ticket_id', '=', o.id)])"/>
@ -56,7 +55,6 @@
<strong>Tasks</strong> <strong>Tasks</strong>
</h3> </h3>
</div> </div>
<table class="table table-bordered mt32"> <table class="table table-bordered mt32">
<thead> <thead>
<tr> <tr>
@ -74,7 +72,6 @@
</th> </th>
</tr> </tr>
</thead> </thead>
<t t-foreach="tasks" t-as="task"> <t t-foreach="tasks" t-as="task">
<tbody> <tbody>
<tr class="text-center"> <tr class="text-center">
@ -100,7 +97,6 @@
</t> </t>
</t> </t>
</template> </template>
<record id="action_report_helpdesk_ticket" model="ir.actions.report"> <record id="action_report_helpdesk_ticket" model="ir.actions.report">
<field name="name">Helpdesk Ticket Report</field> <field name="name">Helpdesk Ticket Report</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -109,5 +105,4 @@
<field name="report_file">odoo_website_helpdesk.report_helpdesk_ticket</field> <field name="report_file">odoo_website_helpdesk.report_helpdesk_ticket</field>
<field name="binding_type">report</field> <field name="binding_type">report</field>
</record> </record>
</odoo>
</odoo>

3
odoo_website_helpdesk/security/ir.model.access.csv

@ -19,3 +19,6 @@ access_helpdesk_types_manager,access.helpdesk.types,model_helpdesk_types,odoo_we
access_helpdesk_categories_user,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_user,1,0,0,0 access_helpdesk_categories_user,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_user,1,0,0,0
access_helpdesk_categories_leader,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_team_leader,1,1,1,1 access_helpdesk_categories_leader,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_team_leader,1,1,1,1
access_helpdesk_categories_manager,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_manager,1,1,1,1 access_helpdesk_categories_manager,access_helpdesk_categories,model_helpdesk_categories,odoo_website_helpdesk.helpdesk_manager,1,1,1,1
merge_tickets,merge.tickets,model_merge_tickets,odoo_website_helpdesk.helpdesk_manager,1,1,1,1
support_tickets,support.tickets,model_support_tickets,odoo_website_helpdesk.helpdesk_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
19
20
21
22
23
24

BIN
odoo_website_helpdesk/static/description/assets/screenshots/create-new-ticket.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/merge-action.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/open-model.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
odoo_website_helpdesk/static/description/assets/screenshots/open-new-ticket.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

40
odoo_website_helpdesk/static/description/index.html

@ -26,15 +26,12 @@
Website Helpdesk Support Ticket Management Website Helpdesk Support Ticket Management
</h1> </h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> <p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
A Module For Managing Support Tickets A Module For Managing Support Tickets
</p> </p>
<!-- END OF APP HERO --> <!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" <img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/> style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
</div> </div>
<!-- NAVIGATION SECTION --> <!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
@ -313,7 +310,42 @@ Create Tasks for the project linked to the Ticket </span>
<img src="./assets/screenshots/Screenshot16.png" <img src="./assets/screenshots/Screenshot16.png"
class="img-thumbnail"> class="img-thumbnail">
</div> </div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Merge Tickets.
</h3>
<img src="./assets/screenshots/merge-action.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Merge Action Model.
</h3>
<img src="./assets/screenshots/open-model.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create New Ticket.
</h3>
<img src="./assets/screenshots/create-new-ticket.png"
class="img-thumbnail">
</div>
</div>
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
New Ticket.
</h3>
<img src="./assets/screenshots/open-new-ticket.png"
class="img-thumbnail">
</div>
</div> </div>
</div> </div>
<!-- END OF SCREENSHOTS SECTION --> <!-- END OF SCREENSHOTS SECTION -->

1
odoo_website_helpdesk/static/src/xml/helpdesk_dashboard.xml

@ -281,6 +281,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</section> </section>
</t> </t>
</template> </template>

4
odoo_website_helpdesk/templates/helpdesk_replay_template.xml

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<data> <data>
<!-- Helpdesk Replay mail template-->
<record id="helpdesk_replay_email_template" model="mail.template"> <record id="helpdesk_replay_email_template" model="mail.template">
<field name="name">Helpdesk Reply Email Template</field> <field name="name">Helpdesk Reply Email Template</field>
<field name="model_id" <field name="model_id"
@ -53,4 +55,4 @@
</field> </field>
</record> </record>
</data> </data>
</odoo> </odoo>

2
odoo_website_helpdesk/views/categories.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<record id="view_helpdesk_categories_tree" model="ir.ui.view"> <record id="view_helpdesk_categories_tree" model="ir.ui.view">
<field name="name">categories.tree</field> <field name="name">categories.tree</field>
@ -10,4 +11,3 @@
</field> </field>
</record> </record>
</odoo> </odoo>

93
odoo_website_helpdesk/views/helpdesk.xml

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<!-- Form view-->
<record id="view_helpdesk_form" model="ir.ui.view"> <record id="view_helpdesk_form" model="ir.ui.view">
<field name="name">help.ticket.form</field> <field name="name">help.ticket.form</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -13,7 +15,8 @@
<button name="create_invoice" string="Create Invoice" <button name="create_invoice" string="Create Invoice"
type="object" class="btn-primary" type="object" class="btn-primary"
attrs="{'invisible':[('billable','=',False)]}"/> attrs="{'invisible':[('billable','=',False)]}"/>
<field name="stage_id" widget="statusbar" options="{'clickable': '1'}"/> <field name="stage_id" widget="statusbar"
options="{'clickable': '1'}"/>
</header> </header>
<sheet> <sheet>
<div class="oe_button_box" name="button_box"> <div class="oe_button_box" name="button_box">
@ -21,6 +24,16 @@
string="Tasks" type="object" icon="fa-tasks" string="Tasks" type="object" icon="fa-tasks"
attrs="{'invisible':[('create_task','=',False)]}"> attrs="{'invisible':[('create_task','=',False)]}">
</button> </button>
<button class="oe_stat_button"
name="open_merged_tickets"
string="Merged Tickets" type="object"
icon="fa-list"
attrs="{'invisible':[('merge_ticket_invisible','=',False)]}">
<div class="o_stat_info">
<field name="merge_count" readonly="True"/>
<span class="o_stat_text">Merged Tickets</span>
</div>
</button>
<button class="oe_stat_button" name="open_invoices" <button class="oe_stat_button" name="open_invoices"
string="Invoices" type="object" icon="fa-tasks" string="Invoices" type="object" icon="fa-tasks"
@ -45,7 +58,7 @@
<field name="email"/> <field name="email"/>
<field name="phone"/> <field name="phone"/>
<field name="tags" widget="many2many_tags"/> <field name="tags" widget="many2many_tags"/>
</group> </group>
<group> <group>
<field name="show_category" invisible="1"/> <field name="show_category" invisible="1"/>
<field name="priority" widget="priority"/> <field name="priority" widget="priority"/>
@ -54,33 +67,32 @@
<field name="end_date"/> <field name="end_date"/>
<field name="product_id" widget="many2many_tags"/> <field name="product_id" widget="many2many_tags"/>
<field name="show_category" invisible="1"/> <field name="show_category" invisible="1"/>
<field name="merge_count" invisible="1"/>
<field name="merge_ticket_invisible" invisible="1"/>
</group> </group>
</group> </group>
<notebook> <notebook>
<page string="Issue Description"> <page string="Issue Description">
<field name="description" <field name="description"
placeholder="Provide the reason in detail"/> placeholder="Provide the reason in detail"/>
</page> </page>
<page string="Attachments"> <page string="Attachments">
<field name="attachment_ids"> <field name="attachment_ids">
<tree string="Attachments" no_open="1"> <tree string="Attachments" no_open="1">
<field name="name"/> <field name="name"/>
<field name="res_model"/> <field name="res_model"/>
<field name="res_field"/> <field name="res_field"/>
<field name="res_id"/> <field name="res_id"/>
<field name="type"/> <field name="type"/>
<field name="file_size"/> <field name="file_size"/>
<field name="company_id"/> <field name="company_id"/>
<field name="create_uid"/> <field name="create_uid"/>
<field name="create_date"/> <field name="create_date"/>
<field name="datas" widget="binary" <field name="datas" widget="binary"
filename="name"/> filename="name"/>
</tree> </tree>
</field> </field>
</page> </page>
<page string="Customer Rating"> <page string="Customer Rating">
<group> <group>
<field name="customer_rating" <field name="customer_rating"
@ -88,7 +100,6 @@
<field name="review"/> <field name="review"/>
</group> </group>
</page> </page>
<page string="Other Information"> <page string="Other Information">
<group> <group>
<group> <group>
@ -125,7 +136,7 @@
</form> </form>
</field> </field>
</record> </record>
<!--Tree view-->
<record id="view_helpdesk_tree" model="ir.ui.view"> <record id="view_helpdesk_tree" model="ir.ui.view">
<field name="name">help.ticket.tree</field> <field name="name">help.ticket.tree</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -152,6 +163,7 @@
</form> </form>
</field> </field>
</record> </record>
<!-- Kanban view-->
<record id="view_helpdesk_kanban" model="ir.ui.view"> <record id="view_helpdesk_kanban" model="ir.ui.view">
<field name="name">help.ticket.kanban</field> <field name="name">help.ticket.kanban</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -199,7 +211,6 @@
<field name="name"/> <field name="name"/>
</strong> </strong>
</div> </div>
</div> </div>
<div class="text-muted"> <div class="text-muted">
<field name="customer_id"/> <field name="customer_id"/>
@ -215,11 +226,14 @@
<div class="oe_kanban_bottom_left"> <div class="oe_kanban_bottom_left">
<field name="priority" <field name="priority"
widget="priority"/> widget="priority"/>
<field name="activity_ids" widget="kanban_activity"/> <field name="activity_ids"
widget="kanban_activity"/>
</div> </div>
<div class="oe_kanban_bottom_right"> <div class="oe_kanban_bottom_right">
<field name="kanban_state" widget="state_selection"/> <field name="kanban_state"
<field name="user_id" widget="many2one_avatar_user"/> widget="state_selection"/>
<field name="user_id"
widget="many2one_avatar_user"/>
</div> </div>
</div> </div>
</div> </div>
@ -230,8 +244,7 @@
</kanban> </kanban>
</field> </field>
</record> </record>
<!-- Activity view-->
<record id="helpdesk_view_activity" model="ir.ui.view"> <record id="helpdesk_view_activity" model="ir.ui.view">
<field name="name">help.ticket.activity</field> <field name="name">help.ticket.activity</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -249,7 +262,7 @@
</activity> </activity>
</field> </field>
</record> </record>
<!--Calendar view-->
<record id="help_ticket_view_calendar" model="ir.ui.view"> <record id="help_ticket_view_calendar" model="ir.ui.view">
<field name="name">help.ticket.calendar</field> <field name="name">help.ticket.calendar</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -263,8 +276,7 @@
</calendar> </calendar>
</field> </field>
</record> </record>
<!-- Stage form view-->
<record id="view_helpdesk_stage_form" model="ir.ui.view"> <record id="view_helpdesk_stage_form" model="ir.ui.view">
<field name="name">ticket.stage.form</field> <field name="name">ticket.stage.form</field>
<field name="model">ticket.stage</field> <field name="model">ticket.stage</field>
@ -289,7 +301,7 @@
</form> </form>
</field> </field>
</record> </record>
<!--Stage tree view-->
<record id="view_helpdesk_stage_tree" model="ir.ui.view"> <record id="view_helpdesk_stage_tree" model="ir.ui.view">
<field name="name">ticket.stage.tree</field> <field name="name">ticket.stage.tree</field>
<field name="model">ticket.stage</field> <field name="model">ticket.stage</field>
@ -302,7 +314,7 @@
</tree> </tree>
</field> </field>
</record> </record>
<!--Type tree view-->
<record id="view_helpdesk_types_tree" model="ir.ui.view"> <record id="view_helpdesk_types_tree" model="ir.ui.view">
<field name="name">helpdesk.types.tree</field> <field name="name">helpdesk.types.tree</field>
<field name="model">helpdesk.types</field> <field name="model">helpdesk.types</field>
@ -312,7 +324,7 @@
</tree> </tree>
</field> </field>
</record> </record>
<!--tag tree-->
<record id="view_helpdesk_tag_tree" model="ir.ui.view"> <record id="view_helpdesk_tag_tree" model="ir.ui.view">
<field name="name">helpdesk.tag.tree</field> <field name="name">helpdesk.tag.tree</field>
<field name="model">helpdesk.tag</field> <field name="model">helpdesk.tag</field>
@ -322,7 +334,7 @@
</tree> </tree>
</field> </field>
</record> </record>
<!--Pivot view-->
<record id="help_ticket_view_pivot" model="ir.ui.view"> <record id="help_ticket_view_pivot" model="ir.ui.view">
<field name="name">help.ticket.pivot</field> <field name="name">help.ticket.pivot</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -340,7 +352,7 @@
</pivot> </pivot>
</field> </field>
</record> </record>
<!--Graph view-->
<record id="help_ticket_view_graph" model="ir.ui.view"> <record id="help_ticket_view_graph" model="ir.ui.view">
<field name="name">help.ticket.graph</field> <field name="name">help.ticket.graph</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -358,7 +370,7 @@
</graph> </graph>
</field> </field>
</record> </record>
<!--Search view-->
<record id="help_ticket_search" model="ir.ui.view"> <record id="help_ticket_search" model="ir.ui.view">
<field name="name">help.ticket.search</field> <field name="name">help.ticket.search</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>
@ -368,16 +380,21 @@
<field name="subject"/> <field name="subject"/>
<filter string="my_ticket" name="My Ticket" <filter string="my_ticket" name="My Ticket"
domain="[('assigned_user', '=', uid)]"/> domain="[('assigned_user', '=', uid)]"/>
<filter string="Archived" name="filter_archived"
domain="[('active','=', False)]"/>
<filter string="UnArchived" name="filter_unarchived"
domain="[('active','=', True)]"/>
<group expand="0" string="Group By"> <group expand="0" string="Group By">
<filter name="Customer" string="Customer" <filter name="Customer" string="Customer"
context="{'group_by':'customer_id'}"/> context="{'group_by':'customer_id'}"/>
<filter name="Team" string="Team" <filter name="Team" string="Team"
context="{'group_by':'team_id'}"/> context="{'group_by':'team_id'}"/>
<filter name="Team_Head" string="Team Head" context="{'group_by':'team_head'}"/> <filter name="Team_Head" string="Team Head"
<filter name="assign" string="Assigned To" context="{'group_by':'assigned_user'}"/> context="{'group_by':'team_head'}"/>
<filter name="assign" string="Assigned To"
context="{'group_by':'assigned_user'}"/>
</group> </group>
</search> </search>
</field> </field>
</record> </record>
</odoo> </odoo>

39
odoo_website_helpdesk/views/helpdesk_views.xml

@ -5,32 +5,28 @@
<field name="name">Helpdesk Dashboard</field> <field name="name">Helpdesk Dashboard</field>
<field name="tag">helpdesk_dashboard_tag</field> <field name="tag">helpdesk_dashboard_tag</field>
</record> </record>
<record id="action_helpdesk" model="ir.actions.act_window"> <record id="action_helpdesk" model="ir.actions.act_window">
<field name="name">Helpdesk</field> <field name="name">Helpdesk</field>
<field name="res_model">help.ticket</field> <field name="res_model">help.ticket</field>
<field name="view_mode">kanban,tree,form,calendar,activity,pivot,graph</field> <field name="view_mode">kanban,tree,form,calendar,activity,pivot,graph</field>
</record> </record>
<record id="action_helpdesk_my" model="ir.actions.act_window"> <record id="action_helpdesk_my" model="ir.actions.act_window">
<field name="name">My Helpdesk</field> <field name="name">My Helpdesk</field>
<field name="res_model">help.ticket</field> <field name="res_model">help.ticket</field>
<field name="domain">[('assigned_user','=',uid), ('team_head','=', uid)]</field> <field name="domain">[('assigned_user','=',uid), ('team_head','=', uid)]
</field>
<field name="view_mode">kanban,tree,form,calendar,activity,pivot,graph</field> <field name="view_mode">kanban,tree,form,calendar,activity,pivot,graph</field>
</record> </record>
<record id="action_helpdesk_team" model="ir.actions.act_window"> <record id="action_helpdesk_team" model="ir.actions.act_window">
<field name="name">Helpdesk</field> <field name="name">Helpdesk</field>
<field name="res_model">help.team</field> <field name="res_model">help.team</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
</record> </record>
<record id="action_helpdesk_stage" model="ir.actions.act_window"> <record id="action_helpdesk_stage" model="ir.actions.act_window">
<field name="name">Stages</field> <field name="name">Stages</field>
<field name="res_model">ticket.stage</field> <field name="res_model">ticket.stage</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
</record> </record>
<record id="action_helpdesk_types" model="ir.actions.act_window"> <record id="action_helpdesk_types" model="ir.actions.act_window">
<field name="name">Types</field> <field name="name">Types</field>
<field name="res_model">helpdesk.types</field> <field name="res_model">helpdesk.types</field>
@ -41,7 +37,6 @@
</p> </p>
</field> </field>
</record> </record>
<record id="action_helpdesk_tag" model="ir.actions.act_window"> <record id="action_helpdesk_tag" model="ir.actions.act_window">
<field name="name">Tags</field> <field name="name">Tags</field>
<field name="res_model">helpdesk.tag</field> <field name="res_model">helpdesk.tag</field>
@ -52,7 +47,6 @@
</p> </p>
</field> </field>
</record> </record>
<record id="action_helpdesk_categories" model="ir.actions.act_window"> <record id="action_helpdesk_categories" model="ir.actions.act_window">
<field name="name">Categories</field> <field name="name">Categories</field>
<field name="res_model">helpdesk.categories</field> <field name="res_model">helpdesk.categories</field>
@ -72,21 +66,20 @@
<field name="res_model">help.ticket</field> <field name="res_model">help.ticket</field>
<field name="view_mode">graph,search</field> <field name="view_mode">graph,search</field>
</record> </record>
<menuitem id="menu_helpdesk" name="Helpdesk"
<menuitem id="menu_helpdesk" name="Helpdesk" action="helpdesk_dashboard_action" action="helpdesk_dashboard_action"
sequence="1"/> sequence="1"/>
<!-- <menuitem id="helpdesk_dashboard" parent="menu_helpdesk" name="Ticket Dashboard"-->
<!-- action="helpdesk_dashboard_action" sequence="1"/>-->
<menuitem id="helpdesk_management" parent="menu_helpdesk" name="Tickets" <menuitem id="helpdesk_management" parent="menu_helpdesk" name="Tickets"
action="action_helpdesk" sequence="2"/> action="action_helpdesk" sequence="2"/>
<menuitem id="helpdesk_tickets_my" parent="helpdesk_management" name="My Tickets" <menuitem id="helpdesk_tickets_my" parent="helpdesk_management"
name="My Tickets"
action="action_helpdesk_my" sequence="1"/> action="action_helpdesk_my" sequence="1"/>
<menuitem id="helpdesk_tickets" parent="helpdesk_management" name="All Tickets" <menuitem id="helpdesk_tickets" parent="helpdesk_management"
action="action_helpdesk" sequence="2" groups="odoo_website_helpdesk.helpdesk_manager"/> name="All Tickets"
action="action_helpdesk" sequence="2"
groups="odoo_website_helpdesk.helpdesk_manager"/>
<menuitem id="menu_helpdesk_team" name="Helpdesk Team" <menuitem id="menu_helpdesk_team" name="Helpdesk Team"
action="action_helpdesk_team" action="action_helpdesk_team"
@ -109,12 +102,12 @@
parent="menu_helpdesk_configuration" sequence="1"/> parent="menu_helpdesk_configuration" sequence="1"/>
<menuitem id="menu_helpdesk_team" name="Teams" <menuitem id="menu_helpdesk_team" name="Teams"
action="action_helpdesk_team" action="action_helpdesk_team"
parent="menu_helpdesk_configuration" sequence="3"/> parent="menu_helpdesk_configuration" sequence="3"/>
<menuitem id="menu_helpdesk_tag" name="Tags" <menuitem id="menu_helpdesk_tag" name="Tags"
action="action_helpdesk_tag" action="action_helpdesk_tag"
parent="menu_helpdesk_configuration" sequence="4"/> parent="menu_helpdesk_configuration" sequence="4"/>
<menuitem id="menu_helpdesk_stage" name="Stages" <menuitem id="menu_helpdesk_stage" name="Stages"
action="action_helpdesk_stage" action="action_helpdesk_stage"
@ -123,8 +116,8 @@
<menuitem id="menu_helpdesk_types" name="Types" <menuitem id="menu_helpdesk_types" name="Types"
action="action_helpdesk_types" action="action_helpdesk_types"
parent="menu_helpdesk_configuration" sequence="6"/> parent="menu_helpdesk_configuration" sequence="6"/>
<menuitem id="report_helpdesk" name="Report" parent="menu_helpdesk" sequence="3" <menuitem id="report_helpdesk" name="Report" parent="menu_helpdesk"
sequence="3"
action="action_report_helpdesk"/> action="action_report_helpdesk"/>
</data> </data>
</odoo> </odoo>

58
odoo_website_helpdesk/views/merge_tickets_views.xml

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Merge_tickets form view-->
<record id="merge_tickets_view_form" model="ir.ui.view">
<field name="name">merge.tickets.view.form</field>
<field name="model">merge.tickets</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="user_id"/>
<field name="support_team_id"/>
<field name="customer_id"/>
<field name="support_ticket_id"
attrs="{'invisible':[('new_ticket','=',True)]}"/>
</group>
<group>
<field name="new_ticket"/>
<field name="subject"
attrs="{'invisible':[('new_ticket','=',False)]}"/>
<field name="merge_reason"/>
</group>
</group>
<notebook>
<page string="Support Tickets">
<field name="support_ticket_ids"
options="{'no_create': True, 'no_create_edit':True}">
<tree editable="bottom" create="False" edit="False">
<field name="subject"/>
<field name="display_name"/>
<field name="description" invisible="1"/>
<field name="merged_ticket" invisible="1"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<footer>
<button name="action_merge_ticket" type="object" string="Save" class="btn btn-primary"/>
<button special="cancel" class="btn btn-primary"> Discard </button>
</footer>
</form>
</field>
</record>
<!-- Contextual action creation-->
<record id="action_merge_tickets" model="ir.actions.act_window">
<field name="name">Merge Tickets</field>
<field name="res_model">merge.tickets</field>
<field name="type">ir.actions.act_window</field>
<field name="context">{'active_ids': active_ids}</field>
<field name="view_mode">form</field>
<field name="binding_model_id" ref="model_help_ticket"/>
<field name="target">new</field>
<field name="view_id"
ref="odoo_website_helpdesk.merge_tickets_view_form"/>
</record>
</odoo>

306
odoo_website_helpdesk/views/portal.xml

@ -1,18 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<template id="portal_my_home_menu_tickets" <template id="portal_my_home_menu_tickets"
name="Portal layout : upcoming tickets" name="Portal layout : upcoming tickets"
inherit_id="portal.portal_breadcrumbs" priority="30"> inherit_id="portal.portal_breadcrumbs" priority="30">
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside"> <xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
<li t-if="page_name == 'ticket'"> <li t-if="page_name == 'ticket'">
<a t-if="ticket" t-attf-href="/my/tickets">/ Helpdesk Tickets</a> <a t-if="ticket" t-attf-href="/my/tickets">/ Helpdesk Tickets
</a>
<t t-else="">/ Helpdesk Tickets</t> <t t-else="">/ Helpdesk Tickets</t>
</li> </li>
<li t-if="ticket" class="breadcrumb-item active"> <li t-if="ticket" class="breadcrumb-item active">
/ <t t-esc="details['display_name']"/> /
<t t-esc="details['display_name']"/>
<!-- <span t-field="ticket.name"/>-->
</li> </li>
</xpath> </xpath>
</template> </template>
<template id="portal_my_home_helpdesk" name="Tickets" <template id="portal_my_home_helpdesk" name="Tickets"
inherit_id="portal.portal_my_home" priority="1" inherit_id="portal.portal_my_home" priority="1"
customize_show="True"> customize_show="True">
@ -24,9 +27,7 @@
</t> </t>
</xpath> </xpath>
</template> </template>
<template id="portal_my_tickets" name="My Tickets"> <template id="portal_my_tickets" name="My Tickets">
<div>
<t t-call="portal.portal_layout"> <t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/> <t t-set="breadcrumbs_searchbar" t-value="True"/>
@ -35,7 +36,6 @@
</t> </t>
<t t-call="odoo_website_helpdesk.ticket_table"/> <t t-call="odoo_website_helpdesk.ticket_table"/>
</t> </t>
</div>
</template> </template>
<template id="ticket_table"> <template id="ticket_table">
<div class="search_ticket"> <div class="search_ticket">
@ -46,7 +46,8 @@
<span class='d-none d-md-inline'>Ticket #</span> <span class='d-none d-md-inline'>Ticket #</span>
</th> </th>
<th class="text-right">Subject</th> <th class="text-right">Subject</th>
<th style="display:none;" class="text-right">Priority</th> <th style="display:none;" class="text-right">Priority
</th>
<th class="text-right">Date</th> <th class="text-right">Date</th>
<th class="text-right">Stage</th> <th class="text-right">Stage</th>
</tr> </tr>
@ -55,7 +56,8 @@
<t t-foreach="tickets" t-as="ticket"> <t t-foreach="tickets" t-as="ticket">
<tr> <tr>
<td id="my_selector"> <td id="my_selector">
<a id="popover" t-attf-href="/my/tickets/{{ticket.id}}"> <a id="popover"
t-attf-href="/my/tickets/{{ticket.id}}">
<t t-esc="ticket.name" t-value="ticket.id"/> <t t-esc="ticket.name" t-value="ticket.id"/>
</a> </a>
</td> </td>
@ -97,50 +99,54 @@
</p> </p>
</div> </div>
</template> </template>
<template id="portal_ticket_details" name="My Tickets"> <template id="portal_ticket_details" name="My Tickets">
<t t-call="portal.portal_layout"> <t t-call="portal.portal_layout">
<div class="row mt16 o_portal_sale_sidebar"> <div class="row mt16 o_portal_sale_sidebar">
<!-- Sidebar --> <!-- Sidebar -->
<t t-call="portal.portal_record_sidebar"> <t t-call="portal.portal_record_sidebar">
<t t-set="classes" t-value="'col-lg-auto d-print-none'"/> <t t-set="classes" t-value="'col-lg-auto d-print-none'"/>
<t t-set="title"> <t t-set="title">
<h4 class="mb-0"><t t-esc="details['display_name']"/></h4> <h4 class="mb-0">
<t t-esc="details['display_name']"/>
</h4>
</t> </t>
<t t-set="entries"> <t t-set="entries">
<ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column"> <ul class="list-group list-group-flush flex-wrap flex-row flex-lg-column">
<li class="list-group-item d-grid align-content-start"> <li class="list-group-item d-grid align-content-start">
<a class="btn btn-primary fa fa-download" t-attf-href="/my/tickets/download/{{details.id}}" target="_blank"> <a class="btn btn-primary fa fa-download"
t-attf-href="/my/tickets/download/{{details.id}}"
target="_blank">
Download Download
</a> </a>
</li> </li>
<li class="list-group-item d-grid align-content-start"> <li class="list-group-item d-grid align-content-start">
<div class="small mb-1"> <div class="small mb-1">
<strong class="text-muted">Your Contact</strong> <strong class="text-muted">Your Contact
</strong>
</div> </div>
<div class="row flex-nowrap"> <div class="row flex-nowrap">
<div class="col flex-grow-0 pe-2"> <div class="col flex-grow-0 pe-2">
<img class="rounded-circle mr4 float-start o_portal_contact_img" <img class="rounded-circle mr4 float-start o_portal_contact_img"
t-att-src="image_data_uri(details['customer_id'].avatar_1024)" t-att-src="image_data_uri(details['customer_id'].avatar_1024)"
alt="Contact"/> alt="Contact"/>
</div> </div>
<div class="col ps-0" style="min-width: 150px"> <div class="col ps-0"
style="min-width: 150px">
<span t-esc="details['customer_id']" <span t-esc="details['customer_id']"
t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/> t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
</div> </div>
</div> </div>
</li> </li>
</ul> </ul>
</t> </t>
</t> </t>
<!-- Page content --> <!-- Page content -->
<div id="helpdesk_content" class="col-12 col-lg justify-content-end"> <div id="helpdesk_content"
<div t-attf-class="card #{'pb-5' if report_type == 'html' else ''}" id="portal_doc_content"> class="col-12 col-lg justify-content-end">
<div t-attf-class="card #{'pb-5' if report_type == 'html' else ''}"
id="portal_doc_content">
<div t-call="odoo_website_helpdesk.helpdesk_content_preview"/> <div t-call="odoo_website_helpdesk.helpdesk_content_preview"/>
</div> </div>
<!-- chatter --> <!-- chatter -->
<div id="helpdesk_ticket_communication" class="mt-4"> <div id="helpdesk_ticket_communication" class="mt-4">
<h2>History</h2> <h2>History</h2>
@ -149,133 +155,157 @@
</t> </t>
</div> </div>
</div> </div>
</div> </div>
</t> </t>
</template> </template>
<template id="helpdesk_content_preview" name="Sales Order Portal Content"> <template id="helpdesk_content_preview" name="Sales Order Portal Content">
<div id="introduction" t-attf-class="pb-2 pt-3 #{'card-header bg-white' if report_type == 'html' else ''}" style="height:700px;"> <div id="introduction"
<div class="container"> t-attf-class="pb-2 pt-3 #{'card-header bg-white' if report_type == 'html' else ''}"
<h4 class="mb-0" style="margin-left:15px;"><b><t t-esc="details['display_name']"/></b></h4> style="height:700px;">
<hr style="width:100%"/> <div class="container">
<h4 class="mb-0" style="margin-left:15px;">
<b>
<t t-esc="details['display_name']"/>
</b>
</h4>
<hr style="width:100%"/>
</div>
<table class="table table-borderless">
<tr>
<th>Ticket Type</th>
<td>
<t t-esc="details['ticket_type'].name"/>
</td>
<th>Create Date</th>
<td>
<t t-esc="details['create_date']"/>
</td>
</tr>
<tr>
<th>Last Update Date</th>
<td>
<t t-esc="details['__last_update']"/>
</td>
<th>Person Name</th>
<td>
<t t-esc="details['customer_id'].name"/>
</td>
</tr>
<tr>
<th>Ticket Subject</th>
<td>
<t t-esc="details['subject']"/>
</td>
<th>Email</th>
<td>
<t t-esc="details['customer_id'].email"/>
</td>
</tr>
<tr>
<th>Category</th>
<td>
<t t-esc="details['category_id'].name"/>
</td>
<th>Replied Date</th>
<td>
<t t-esc="details['replied_date']"/>
</td>
</tr>
<tr>
<th>Priority</th>
<td>
<t t-esc="details['priority']"/>
</td>
<th>Consultant</th>
<td>
<t t-esc="details['assigned_user'].name"/>
</td>
</tr>
<tr>
<th>Status</th>
<td>
<t t-esc="details['stage_id'].name"/>
</td>
</tr>
<tr>
<th>Description</th>
</tr>
<tr>
<td colspan="4">
<t t-esc="details['description']"/>
</td>
</tr>
</table>
</div> </div>
<table class="table table-borderless">
<tr>
<th>Ticket Type</th>
<td><t t-esc="details['ticket_type'].name"/></td>
<th>Create Date</th>
<td><t t-esc="details['create_date']"/></td>
</tr>
<tr>
<th>Last Update Date</th>
<td><t t-esc="details['__last_update']"/></td>
<th>Person Name</th>
<td><t t-esc="details['customer_id'].name"/></td>
</tr>
<tr>
<th>Ticket Subject</th>
<td><t t-esc="details['subject']"/></td>
<th>Email</th>
<td><t t-esc="details['customer_id'].email"/></td>
</tr>
<tr>
<th>Category</th>
<td><t t-esc="details['category_id'].name"/></td>
<th>Replied Date</th>
<td><t t-esc="details['replied_date']"/></td>
</tr>
<tr>
<th>Priority</th>
<td><t t-esc="details['priority']"/></td>
<th>Consultant</th>
<td><t t-esc="details['assigned_user'].name"/></td>
</tr>
<tr>
<th>Status</th>
<td><t t-esc="details['stage_id'].name"/></td>
</tr>
<tr>
<th>Description</th>
</tr>
<tr>
<td colspan="4"><t t-esc="details['description']"/></td>
</tr>
</table>
</div>
</template> </template>
<template id="ticket_group_by_table"> <template id="ticket_group_by_table">
<t t-if="tickets" t-call="portal.portal_table"> <t t-if="tickets" t-call="portal.portal_table">
<thead> <thead>
<tr class="active"> <tr class="active">
<th> <th>
<span class="d-none d-md-inline">Ticket #</span> <span class="d-none d-md-inline">Ticket #</span>
</th>
<th class="text-right">Subject</th>
<th style="display:none;" class="text-right">Priority
</th>
<th class="text-right">Date</th>
<th class="text-right">Stage</th>
</tr>
</thead>
<tbody>
<t t-foreach="tickets" t-as="ticket">
<tr>
<th class="table-light" colspan="4">
<t t-esc="ticket['name']"/>
</th> </th>
<th class="text-right">Subject</th>
<th style="display:none;" class="text-right">Priority
</th>
<th class="text-right">Date</th>
<th class="text-right">Stage</th>
</tr> </tr>
</thead> <t t-foreach="ticket['data']" t-as="ticket">
<tbody> <t t-foreach="ticket" t-as="data">
<t t-foreach="tickets" t-as="ticket">
<tr>
<th class="table-light" colspan="4">
<t t-esc="ticket['name']"/>
</th>
</tr>
<t t-foreach="ticket['data']" t-as="ticket">
<t t-foreach="ticket" t-as="data">
<tr> <tr>
<td id="my_selector"> <td id="my_selector">
<a id="popover" href="#"> <a id="popover" href="#">
<t t-esc="data.name" <t t-esc="data.name"
t-value="data.id"/> t-value="data.id"/>
</a> </a>
</td> </td>
<td style="display:none;"> <td style="display:none;">
<span t-field="data.name"/> <span t-field="data.name"/>
</td> </td>
<td style="display:none;"> <td style="display:none;">
<span t-field="data.subject"/> <span t-field="data.subject"/>
</td> </td>
<td style="display:none;"> <td style="display:none;">
<span t-field="data.description"/> <span t-field="data.description"/>
</td> </td>
<td style="display:none;"> <td style="display:none;">
<span t-field="data.cost"/> <span t-field="data.cost"/>
</td> </td>
<td class="text-right"> <td class="text-right">
<span t-field="data.subject"/> <span t-field="data.subject"/>
</td> </td>
<td class="text-right" style="display:none;"> <td class="text-right" style="display:none;">
<span t-field="data.priority"/> <span t-field="data.priority"/>
</td> </td>
<td class="text-right"> <td class="text-right">
<span t-field="data.create_date" <span t-field="data.create_date"
t-options="{'widget': 'date'}"/> t-options="{'widget': 'date'}"/>
&amp;nbsp; &amp;nbsp;
<span class="d-none d-md-inline" <span class="d-none d-md-inline"
t-field="data.create_date" t-field="data.create_date"
t-options="{'time_only': True}"/> t-options="{'time_only': True}"/>
</td> </td>
<td class="text-right"> <td class="text-right">
<span t-field="data.stage_id.name"/> <span t-field="data.stage_id.name"/>
</td> </td>
</tr> </tr>
</t> </t>
</t>
</t> </t>
</tbody> </t>
</t> </tbody>
<p t-else="">There are currently no tickets issued for your </t>
account. <p t-else="">There are currently no tickets issued for your
</p> account.
</p>
</template> </template>
</odoo> </odoo>

3
odoo_website_helpdesk/views/portal_search.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<template id="helpdesk_website_inherit" <template id="helpdesk_website_inherit"
inherit_id="portal.portal_searchbar"> inherit_id="portal.portal_searchbar">
@ -13,4 +14,4 @@
</div> </div>
</xpath> </xpath>
</template> </template>
</odoo> </odoo>

98
odoo_website_helpdesk/views/rating_form.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<template id="rating_form" name="Ticket Rating"> <template id="rating_form" name="Ticket Rating">
<t t-call="website.layout"> <t t-call="website.layout">
@ -75,7 +76,6 @@
</input> </input>
</div> </div>
</div> </div>
<div class="o_portal_chatter_composer_body mb32"> <div class="o_portal_chatter_composer_body mb32">
<label>Your <label>Your
Review Review
@ -95,7 +95,6 @@
Your Your
Review Review
</button> </button>
</div> </div>
</div> </div>
</div> </div>
@ -105,54 +104,53 @@
</center> </center>
</t> </t>
</template> </template>
<template id="rating_thanks" name="Thanks Rating"> <template id="rating_thanks" name="Thanks Rating">
<t t-call="website.layout">
<t t-call="website.layout"> <div id="wrap" class="oe_structure oe_empty">
<div id="wrap" class="oe_structure oe_empty"> <section class="s_text_block pt40 pb40 o_colored_level "
<section class="s_text_block pt40 pb40 o_colored_level " data-snippet="s_text_block">
data-snippet="s_text_block"> <div class="container s_allow_columns">
<div class="container s_allow_columns"> <div class="row">
<div class="row"> <div class="col-lg-7 col-xl-6 mr-lg-auto">
<div class="col-lg-7 col-xl-6 mr-lg-auto"> <span class="d-block fa fa-4x fa-handshake-o mx-auto rounded-circle bg-primary"/>
<span class="d-block fa fa-4x fa-handshake-o mx-auto rounded-circle bg-primary"/> <br/>
<br/> <h1 class="text-center">Thank You!</h1>
<h1 class="text-center">Thank You!</h1> <div class="pb16 pt16 s_hr"
<div class="pb16 pt16 s_hr" data-snippet="s_hr"
data-snippet="s_hr" data-name="Separator">
data-name="Separator"> <hr class="mx-auto border-top w-50 border-dark text-center"/>
<hr class="mx-auto border-top w-50 border-dark text-center"/>
</div>
<p class="text-center">We will get back
to you shortly.
</p>
</div>
<div class="col-lg-4">
<ul class="list-unstyled mb-0 pl-2">
<li>My Company</li>
<li>
<i class="fa fa-map-marker fa-fw mr-2"/>
<span class="o_force_ltr">3575
Demo Buena Vista Avenue
</span>
</li>
<li>
<i class="fa fa-phone fa-fw mr-2"/>
<span class="o_force_ltr">+1
(650) 555-0111
</span>
</li>
<li>
<i class="fa fa-1x fa-fw fa-envelope mr-2"/>
<span>
info@yourcompany.example.com
</span>
</li>
</ul>
</div>
</div> </div>
<p class="text-center">We will get back
to you shortly.
</p>
</div> </div>
</section> <div class="col-lg-4">
<ul class="list-unstyled mb-0 pl-2">
<li>My Company</li>
<li>
<i class="fa fa-map-marker fa-fw mr-2"/>
<span class="o_force_ltr">3575
Demo Buena Vista Avenue
</span>
</li>
<li>
<i class="fa fa-phone fa-fw mr-2"/>
<span class="o_force_ltr">+1
(650) 555-0111
</span>
</li>
<li>
<i class="fa fa-1x fa-fw fa-envelope mr-2"/>
<span>
info@yourcompany.example.com
</span>
</li>
</ul>
</div>
</div>
</div> </div>
</t> </section>
</template> </div>
</odoo> </t>
</template>
</odoo>

6
odoo_website_helpdesk/views/report.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<template id="report_help_ticket"> <template id="report_help_ticket">
<t t-call="web.html_container"> <t t-call="web.html_container">
@ -46,17 +47,14 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<t t-set="tasks" <t t-set="tasks"
t-value="request.env['project.task'].search([('ticket_id', '=', o.id)])"/> t-value="request.env['project.task'].search([('ticket_id', '=', o.id)])"/>
<t t-if="tasks"> <t t-if="tasks">
<div> <div>
<h3 class="text-center"> <h3 class="text-center">
<strong>Tasks</strong> <strong>Tasks</strong>
</h3> </h3>
</div> </div>
<table class="table table-bordered mt32"> <table class="table table-bordered mt32">
<thead> <thead>
<tr> <tr>
@ -74,7 +72,6 @@
</th> </th>
</tr> </tr>
</thead> </thead>
<t t-foreach="tasks" t-as="task"> <t t-foreach="tasks" t-as="task">
<tbody> <tbody>
<tr class="text-center"> <tr class="text-center">
@ -100,7 +97,6 @@
</t> </t>
</t> </t>
</template> </template>
<record id="report_ticket" model="ir.actions.report"> <record id="report_ticket" model="ir.actions.report">
<field name="name">Support Ticket</field> <field name="name">Support Ticket</field>
<field name="model">help.ticket</field> <field name="model">help.ticket</field>

4
odoo_website_helpdesk/views/res_config_settings.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<record id="ticket_res_config_settings_view_form" model="ir.ui.view"> <record id="ticket_res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.helpdesk <field name="name">res.config.settings.view.form.inherit.helpdesk
@ -34,7 +35,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row mt16 o_settings_container"> <div class="row mt16 o_settings_container">
<div class="col-lg-6 o_setting_box"> <div class="col-lg-6 o_setting_box">
<div class="o_setting_left_pane"> <div class="o_setting_left_pane">
@ -103,4 +103,4 @@
</xpath> </xpath>
</field> </field>
</record> </record>
</odoo> </odoo>

2
odoo_website_helpdesk/views/team.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<record id="view_helpdesk_team_form" model="ir.ui.view"> <record id="view_helpdesk_team_form" model="ir.ui.view">
<field name="name">help.team.form</field> <field name="name">help.team.form</field>
@ -44,7 +45,6 @@
</form> </form>
</field> </field>
</record> </record>
<record id="view_helpdesk_team_tree" model="ir.ui.view"> <record id="view_helpdesk_team_tree" model="ir.ui.view">
<field name="name">help.team.tree</field> <field name="name">help.team.tree</field>
<field name="model">help.team</field> <field name="model">help.team</field>

37
odoo_website_helpdesk/views/website_form.xml

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<record id="website_helpdesk" model="website.menu"> <record id="website_helpdesk" model="website.menu">
<field name="name">Helpdesk</field> <field name="name">Helpdesk</field>
@ -5,7 +6,6 @@
<field name="parent_id" ref="website.main_menu"/> <field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">55</field> <field name="sequence" type="int">55</field>
</record> </record>
<record id="odoo_website_helpdesk.helpdesk_thanks" model="website.page"> <record id="odoo_website_helpdesk.helpdesk_thanks" model="website.page">
<field name="name">Thanks (Helpdesk)</field> <field name="name">Thanks (Helpdesk)</field>
<field name="type">qweb</field> <field name="type">qweb</field>
@ -78,7 +78,6 @@
</t> </t>
</field> </field>
</record> </record>
<template id="ticket_form" name="Helpdesk Ticket"> <template id="ticket_form" name="Helpdesk Ticket">
<t t-call="website.layout"> <t t-call="website.layout">
<t t-set="logged_partner" <t t-set="logged_partner"
@ -225,7 +224,6 @@
</div> </div>
<br/> <br/>
</div> </div>
<div class="form-group col-12 s_website_form_field s_website_form_custom" <div class="form-group col-12 s_website_form_field s_website_form_custom"
data-type="char" data-type="char"
data-name="Field"> data-name="Field">
@ -254,7 +252,6 @@
</div> </div>
</div><br/> </div><br/>
</div> </div>
<div class="form-group col-12 s_website_form_field s_website_form_required" <div class="form-group col-12 s_website_form_field s_website_form_required"
data-type="char" data-type="char"
data-name="Field"> data-name="Field">
@ -311,7 +308,6 @@
<br/> <br/>
</div> </div>
</t> </t>
<div class="form-group col-12 s_website_form_field s_website_form_required" <div class="form-group col-12 s_website_form_field s_website_form_required"
data-type="char" data-type="char"
data-name="Field"> data-name="Field">
@ -364,37 +360,6 @@
<div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required" <div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required"
data-type="text" data-type="text"
data-name="Field"> data-name="Field">
<!-- <div class="row s_col_no_resize s_col_no_bgcolor">-->
<!-- <label class="col-form-label col-sm-auto s_website_form_label"-->
<!-- style="width: 200px">-->
<!-- <span class="s_website_form_label_content">-->
<!-- Priority-->
<!-- </span>-->
<!-- </label>-->
<!-- <div class="col-sm">-->
<!-- <select id="priority"-->
<!-- name="priority"-->
<!-- required=""-->
<!-- class="form-control s_website_form_input">-->
<!-- <option value="0"-->
<!-- selected="selected">-->
<!-- Very-->
<!-- Low-->
<!-- </option>-->
<!-- <option value="1">-->
<!-- Low-->
<!-- </option>-->
<!-- <option value="2">-->
<!-- Normal-->
<!-- </option>-->
<!-- <option value="3">-->
<!-- High-->
<!-- </option>-->
<!-- </select>-->
<!-- </div>-->
<!-- </div>-->
<br/> <br/>
</div> </div>
<div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required" <div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required"

Loading…
Cancel
Save