flectra/addons/helpdesk_basic/models/issue_type.py

130 lines
5.1 KiB
Python

# Part of Flectra See LICENSE file for full copyright and licensing details.
import json
from datetime import datetime, timedelta
from babel.dates import format_datetime, format_date
from flectra import api, fields, models, _
from flectra.tools import DEFAULT_SERVER_DATE_FORMAT as DF
class IssueType(models.Model):
_name = 'issue.type'
_description = 'Issue Type'
name = fields.Char(string='Name', required=True)
code = fields.Char(string='Code', required=True)
reporting_template = fields.Text(string='Reporting Template')
color = fields.Integer(string='Color Index')
stages = fields.Char(compute='_compute_stages')
kanban_dashboard_graph = fields.Text(
compute='_compute_kanban_dashboard_graph')
@api.multi
def name_get(self):
result = []
for record in self:
result.append((record.id, '%s-%s' % (record.code, record.name)))
return result
@api.multi
def _compute_stages(self):
ticket = self.env['helpdesk.ticket']
stage_ids = self.env['helpdesk.stage'].search([])
for type in self:
stages = []
for stage in stage_ids:
context = \
"{'search_default_stage_id': %d, " \
"'search_default_issue_type_id': %d}" % (stage.id, type.id)
tickets = ticket.search(
[('issue_type_id', '=', type.id),
('stage_id', '=', stage.id)])
stages.append({'key': stage.name, 'value': len(tickets.ids),
'context': context,
'ticket_ids': tickets.ids})
type.stages = json.dumps(stages)
@api.multi
def action_create_new(self):
ctx = self._context.copy()
model = 'helpdesk.ticket'
view_id = self.env.ref('helpdesk_basic.view_helpdesk_form').id
return {
'name': _('Create Ticket'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': model,
'view_id': view_id,
'context': ctx,
}
@api.multi
def _compute_kanban_dashboard_graph(self):
for record in self:
record.kanban_dashboard_graph = json.dumps(
record.get_bar_graph_datas())
@api.multi
def get_bar_graph_datas(self):
data = []
today = datetime.strptime(fields.Date.context_today(self), DF)
data.append({'label': _('Past'), 'value': 0.0, 'type': 'past'})
day_of_week = int(format_datetime(today, 'e', locale=self._context.get(
'lang') or 'en_US'))
first_day_of_week = today + timedelta(days=-day_of_week + 1)
for i in range(-1, 4):
if i == 0:
label = _('This Week')
elif i == 3:
label = _('Future')
else:
start_week = first_day_of_week + timedelta(days=i * 7)
end_week = start_week + timedelta(days=6)
if start_week.month == end_week.month:
label = \
str(start_week.day) + '-' + str(end_week.day) + ' ' + \
format_date(end_week, 'MMM',
locale=self._context.get(
'lang') or 'en_US')
else:
label = \
format_date(start_week, 'd MMM',
locale=self._context.get('lang') or 'en_US'
) + '-' + format_date(
end_week, 'd MMM',
locale=self._context.get('lang') or 'en_US')
data.append({
'label': label,
'value': 0.0,
'type': 'past' if i < 0 else 'future'})
select_sql_clause = 'SELECT count(*) FROM helpdesk_ticket AS h ' \
'WHERE issue_type_id = %(issue_type_id)s'
query_args = {'issue_type_id': self.id}
query = ''
start_date = (first_day_of_week + timedelta(days=-7))
for i in range(0, 6):
if i == 0:
query += "(" + select_sql_clause + " and start_date < '" + \
start_date.strftime(DF) + "')"
elif i == 5:
query += " UNION ALL (" + select_sql_clause + \
" and start_date >= '" + \
start_date.strftime(DF) + "')"
else:
next_date = start_date + timedelta(days=7)
query += " UNION ALL (" + select_sql_clause + \
" and start_date >= '" + start_date.strftime(DF) + \
"' and end_date < '" + next_date.strftime(DF) + \
"')"
start_date = next_date
self.env.cr.execute(query, query_args)
query_results = self.env.cr.dictfetchall()
for index in range(0, len(query_results)):
if query_results[index]:
data[index]['value'] = query_results[index].get('count')
return [{'values': data}]