Adjusted response formatting and added add_note()
* Test-Station name *should* be included in all posts * Ticket ID and name included in all posts * Optional osTicket note included in all posts
This commit is contained in:
parent
e438d3aec7
commit
a81e6f80e6
1 changed files with 54 additions and 29 deletions
|
|
@ -8,16 +8,8 @@ import time
|
||||||
|
|
||||||
import mysql.connector as mariadb
|
import mysql.connector as mariadb
|
||||||
|
|
||||||
|
from wk import std
|
||||||
from wk.cfg.osticket import SQL, STAFF, TEST_STATIONS
|
from wk.cfg.osticket import SQL, STAFF, TEST_STATIONS
|
||||||
from wk.std import (
|
|
||||||
ask,
|
|
||||||
input_text,
|
|
||||||
print_colored,
|
|
||||||
print_error,
|
|
||||||
print_standard,
|
|
||||||
print_warning,
|
|
||||||
sleep,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# STATIC_VARIABLES
|
# STATIC_VARIABLES
|
||||||
|
|
@ -47,6 +39,7 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
self.db_cursor = None
|
self.db_cursor = None
|
||||||
self.disabled = False
|
self.disabled = False
|
||||||
self.errors = False
|
self.errors = False
|
||||||
|
self.note = None
|
||||||
self.ticket_id = None
|
self.ticket_id = None
|
||||||
self.ticket_name = None
|
self.ticket_name = None
|
||||||
|
|
||||||
|
|
@ -72,7 +65,7 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
self.db_cursor = self.db_connection.cursor()
|
self.db_cursor = self.db_connection.cursor()
|
||||||
except mariadb.errors.InterfaceError:
|
except mariadb.errors.InterfaceError:
|
||||||
# Network issue? try again
|
# Network issue? try again
|
||||||
sleep(2)
|
std.sleep(2)
|
||||||
except mariadb.errors.Error:
|
except mariadb.errors.Error:
|
||||||
# Bad creds or other SQL error, bail
|
# Bad creds or other SQL error, bail
|
||||||
break
|
break
|
||||||
|
|
@ -116,7 +109,7 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
for s in self.db_cursor:
|
for s in self.db_cursor:
|
||||||
flag_value = s[0]
|
flag_value = s[0]
|
||||||
except mariadb.errors.Error as err_msg:
|
except mariadb.errors.Error as err_msg:
|
||||||
print_error(err_msg)
|
std.print_error(err_msg)
|
||||||
self.errors = True
|
self.errors = True
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
|
|
@ -140,7 +133,7 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
field_data = result[0]
|
field_data = result[0]
|
||||||
except mariadb.errors.Error as err_msg:
|
except mariadb.errors.Error as err_msg:
|
||||||
# Show error and return None
|
# Show error and return None
|
||||||
print_error(err_msg)
|
std.print_error(err_msg)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
return field_data
|
return field_data
|
||||||
|
|
@ -161,7 +154,7 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
try:
|
try:
|
||||||
self.db_cursor.execute(sql_cmd)
|
self.db_cursor.execute(sql_cmd)
|
||||||
except mariadb.errors.Error as err_msg:
|
except mariadb.errors.Error as err_msg:
|
||||||
print_error(err_msg)
|
std.print_error(err_msg)
|
||||||
self.errors = True
|
self.errors = True
|
||||||
|
|
||||||
def _verify_ticket_id(self):
|
def _verify_ticket_id(self):
|
||||||
|
|
@ -170,8 +163,31 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
LOG.error('Ticket ID not set')
|
LOG.error('Ticket ID not set')
|
||||||
raise RuntimeError('Ticket ID not set')
|
raise RuntimeError('Ticket ID not set')
|
||||||
|
|
||||||
|
def add_note(self):
|
||||||
|
"""Add note to be included in osTicket replies."""
|
||||||
|
lines = []
|
||||||
|
|
||||||
|
# Instructions
|
||||||
|
std.print_standard('Please enter the additional information for this ticket')
|
||||||
|
std.print_info(' (End note with an empty line)')
|
||||||
|
std.print_standard(' ')
|
||||||
|
|
||||||
|
# Get note
|
||||||
|
while True:
|
||||||
|
text = std.input_text('> ')
|
||||||
|
if not text:
|
||||||
|
break
|
||||||
|
lines.append(text.strip())
|
||||||
|
|
||||||
|
# Save note
|
||||||
|
self.note = lines.pop(0)
|
||||||
|
for line in lines:
|
||||||
|
self.note += f'\n...{line}'
|
||||||
|
|
||||||
def post_response(self, response, color='Normal'):
|
def post_response(self, response, color='Normal'):
|
||||||
"""Post a reply to a ticket in osTicket."""
|
"""Post a reply to a ticket in osTicket."""
|
||||||
|
lines = []
|
||||||
|
test_station = get_test_station_name()
|
||||||
self._connect()
|
self._connect()
|
||||||
self._verify_ticket_id()
|
self._verify_ticket_id()
|
||||||
|
|
||||||
|
|
@ -180,7 +196,14 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
return
|
return
|
||||||
|
|
||||||
# Format response
|
# Format response
|
||||||
response = str(response).replace("`", "'").replace("'", "\\'")
|
if test_station:
|
||||||
|
lines.append(f'[Test-Station: {test_station}]')
|
||||||
|
lines.append(f'[Report for ticket #{self.ticket_id} {self.ticket_name}]')
|
||||||
|
if self.note:
|
||||||
|
lines.append(f'[Note] {self.note}\n')
|
||||||
|
lines.append(str(response))
|
||||||
|
response = '\n'.join(lines)
|
||||||
|
response = response.replace("`", "'").replace("'", "\\'")
|
||||||
|
|
||||||
# Build SQL cmd
|
# Build SQL cmd
|
||||||
sql_cmd = (
|
sql_cmd = (
|
||||||
|
|
@ -207,16 +230,16 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
|
|
||||||
def select_ticket(self):
|
def select_ticket(self):
|
||||||
"""Set ticket number and name from osTicket DB."""
|
"""Set ticket number and name from osTicket DB."""
|
||||||
print_standard('Connecting to osTicket...')
|
std.print_standard('Connecting to osTicket...')
|
||||||
|
|
||||||
# Connect
|
# Connect
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
self._connect(silent=False)
|
self._connect(silent=False)
|
||||||
except (mariadb.errors.Error, RuntimeError):
|
except (mariadb.errors.Error, RuntimeError):
|
||||||
print_warning('Failed to connect to osTicket')
|
std.print_warning('Failed to connect to osTicket')
|
||||||
if not ask('Try again?'):
|
if not std.ask('Try again?'):
|
||||||
print_standard('Integration disabled for this session')
|
std.print_standard('Integration disabled for this session')
|
||||||
self.disabled = True
|
self.disabled = True
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
|
@ -225,14 +248,16 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
|
|
||||||
# Main loop
|
# Main loop
|
||||||
while self.ticket_id is None:
|
while self.ticket_id is None:
|
||||||
print_standard(' ')
|
std.print_standard(' ')
|
||||||
_id = input_text('Enter ticket number (or leave blank to disable): ')
|
_id = std.input_text('Enter ticket number (or leave blank to disable): ')
|
||||||
_id = _id.strip()
|
_id = _id.strip()
|
||||||
|
|
||||||
# Nothing entered
|
# Nothing entered
|
||||||
if not _id and ask('Disable osTicket integration for this session?'):
|
if not _id:
|
||||||
self.disabled = True
|
print(' ')
|
||||||
break
|
if std.ask('Disable osTicket integration for this session?'):
|
||||||
|
self.disabled = True
|
||||||
|
break
|
||||||
|
|
||||||
# Invalid ID entered
|
# Invalid ID entered
|
||||||
if not _id.isnumeric():
|
if not _id.isnumeric():
|
||||||
|
|
@ -243,20 +268,20 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
|
|
||||||
# Invalid ticket selected
|
# Invalid ticket selected
|
||||||
if _name is None:
|
if _name is None:
|
||||||
print_error(f'Ticket #{_id} not found')
|
std.print_error(f'Ticket #{_id} not found')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Valid ticket selected, lookup subject
|
# Valid ticket selected, lookup subject
|
||||||
_subject = self._get_ticket_field(_id, 'subject')
|
_subject = self._get_ticket_field(_id, 'subject')
|
||||||
|
|
||||||
# Verify selection
|
# Verify selection
|
||||||
print_colored(
|
std.print_colored(
|
||||||
['You have selected ticket', f'#{_id}', _name],
|
['You have selected ticket', f'#{_id}', _name],
|
||||||
[None, 'BLUE', None],
|
[None, 'BLUE', None],
|
||||||
)
|
)
|
||||||
print_colored(f' {_subject}', 'CYAN')
|
std.print_colored(f' {_subject}', 'CYAN')
|
||||||
print_standard(' ')
|
std.print_standard(' ')
|
||||||
if ask('Is this correct?'):
|
if std.ask('Is this correct?'):
|
||||||
self.ticket_id = _id
|
self.ticket_id = _id
|
||||||
self.ticket_name = _name
|
self.ticket_name = _name
|
||||||
|
|
||||||
|
|
@ -308,7 +333,7 @@ class osTicket(): # pylint: disable=invalid-name
|
||||||
|
|
||||||
# Bail if flag checkbox set as FAILED
|
# Bail if flag checkbox set as FAILED
|
||||||
if self._get_flag(real_flag_name) == str(FLAG_CODES['Fail']):
|
if self._get_flag(real_flag_name) == str(FLAG_CODES['Fail']):
|
||||||
print_warning(
|
std.print_warning(
|
||||||
f'Not replacing osTicket {flag_name} checkbox FAILED value',
|
f'Not replacing osTicket {flag_name} checkbox FAILED value',
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue