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:
2Shirt 2020-01-10 17:52:56 -07:00
parent e438d3aec7
commit a81e6f80e6
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C

View file

@ -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