from typing import Optional
import re
from lxml import etree
from .xml_helper import find_with_default
RE_GUID = re.compile(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")
[docs]
class OnlineSession:
"""
Object representation of the Session information that comes in on a
Q2 Online request
"""
def __init__(self, request_xml: Optional[etree.Element] = None):
"""
:param request_xml: XML node from Online request
"""
self.hq_auth_token: Optional[str] = None
self.aba: Optional[str] = None
self.workstation: Optional[str] = None
self.session_id: Optional[str] = None
self.client_address: Optional[str] = None
self.browser_is_compatible_with_uux: Optional[bool] = None
self.is_uux_not_legacy: Optional[bool] = None
self.is_csr_assist: bool = False
self.logon_audit_id: Optional[str] = None
if request_xml is not None:
self._hydrate_from_xml(request_xml)
def _hydrate_from_xml(self, request_xml):
form = request_xml.find(".//Form")
if hasattr(request_xml, "xmlDoc"):
request_attrs = request_xml.xmlDoc.getchildren()[0]
self.hq_auth_token = request_attrs.get("HqAuthToken")
self.aba = request_attrs.get("ABA")
self.logon_audit_id = request_attrs.get("LogonAuditId")
self.workstation = find_with_default(form, "Workstation")
self.session_id = find_with_default(form, "SessionId")
self.client_address = find_with_default(form, "ClientAddress")
self.browser_is_compatible_with_uux = find_with_default(
form, "BrowserIsCompatibleWithUux", data_type=bool
)
self.is_uux_not_legacy = find_with_default(
form, "IsUuxNotLegacy", data_type=bool
)
# If LoginName is a GUID, this is likely a CSR Assist session
login_name = find_with_default(form, "LoginName")
self.is_csr_assist = re.match(RE_GUID, str(login_name)) is not None