Skip to content

Commit c0583bf

Browse files
Fix attribute issue
Forgot that in docassemle, you can't assume your objects will be correctly initialized, and should do it on the fly. Fixed this issue for `session_id` and `logger`, the two attributes that were added in #274. Have to handle the session ID in just the parent class (`EfspConnection`), but need to handle the logger in both the parent and child class (`ProxyConnection`). (Have to have the methods in the parent class at all because the child class because the parent class would have the same issues. This makes separating out a full python client more complicated than I realized unfortunately Reintegrating myself into the world of DA, one fix at a time).
1 parent 5cdbdd6 commit c0583bf

File tree

2 files changed

+50
-12
lines changed

2 files changed

+50
-12
lines changed

docassemble/EFSPIntegration/efm_client.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@
2020
)
2121
from docassemble.AssemblyLine.al_document import ALDocumentBundle
2222
from docassemble.AssemblyLine.al_general import ALIndividual
23-
from .py_efsp_client import ApiResponse, EfspConnection, _user_visible_resp
23+
from .py_efsp_client import (
24+
ApiResponse,
25+
LoggerWithContext,
26+
EfspConnection,
27+
_user_visible_resp,
28+
)
2429

2530
__all__ = ["ApiResponse", "ProxyConnection", "state_name_to_code"]
2631

@@ -187,6 +192,16 @@ def _call_proxy(self, req: PreparedRequest) -> ApiResponse:
187192
return _user_visible_resp(f"Url {self.base_url} is not valid: {ex}")
188193
return _user_visible_resp(resp)
189194

195+
def get_logger(self):
196+
if not hasattr(self, "logger"):
197+
# Copying what we do in `EfspConnection.get_logger` because it needs to
198+
# wrap the logger we're trying to make here.
199+
self.logger = LoggerWithContext(
200+
DALogger(logging.getLogger("docassemble")),
201+
{"session_id": self.get_session_id()},
202+
)
203+
return self.logger
204+
190205
def authenticate_user(
191206
self,
192207
tyler_email: str = None,

docassemble/EFSPIntegration/py_efsp_client.py

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ def __str__(self):
6464
else:
6565
err_str = ""
6666
msg = f"response_code: {self.response_code}, {err_str}data: {self.data}"
67-
if self.session_id:
68-
msg += f", session_id: {self.session_id}"
69-
if self.req_id:
70-
msg += f", req_id: {self.req_id}"
67+
if self.get_session_id():
68+
msg += f", session_id: {self.get_session_id()}"
69+
if self.get_req_id():
70+
msg += f", req_id: {self.get_req_id()}"
7171
return msg
7272

7373
def __repr__(self):
@@ -76,6 +76,16 @@ def __repr__(self):
7676
def is_ok(self):
7777
return self.response_code in [200, 201, 202, 203, 204, 205]
7878

79+
def get_session_id(self):
80+
if not hasattr(self, "session_id"):
81+
self.session_id = None
82+
return self.session_id
83+
84+
def get_req_id(self):
85+
if not hasattr(self, "req_id"):
86+
self.req_id = None
87+
return self.req_id
88+
7989

8090
def _user_visible_resp(resp: Union[Response, str, None]) -> ApiResponse:
8191
"""This function takes the essentials of a response and puts in into
@@ -159,12 +169,25 @@ def _send(self, to_send: Request, *, req_id: Optional[UUID] = None) -> ApiRespon
159169
if req_id is None:
160170
req_id = uuid4()
161171
to_send.headers["efsp-request-id"] = str(req_id)
162-
to_send.headers["efsp-session-id"] = self.session_id
163-
self.logger.info(
172+
to_send.headers["efsp-session-id"] = self.get_session_id()
173+
self.get_logger().info(
164174
f"Calling {to_send.method} on {to_send.url}", extra={"req-id": str(req_id)}
165175
)
166176
return self._call_proxy(self.proxy_client.prepare_request(to_send))
167177

178+
def get_session_id(self):
179+
if not hasattr(self, "session_id"):
180+
# Migration from older interviews, to start passing observability headers
181+
self.session_id = str(uuid4())
182+
return self.session_id
183+
184+
def get_logger(self):
185+
if not hasattr(self, "logger"):
186+
self.logger = LoggerWithContext(
187+
logging.getLogger(), {"session_id": self.get_session_id()}
188+
)
189+
return self.logger
190+
168191
@staticmethod
169192
def verbose_logging(turn_on: bool) -> None:
170193
if turn_on:
@@ -222,7 +245,7 @@ def authenticate_user(
222245

223246
if jurisdiction is None:
224247
jurisdiction = self.default_jurisdiction
225-
self.logger.info(
248+
self.get_logger().info(
226249
f"authenticating with jurisdiction: {jurisdiction}",
227250
extra={"req-id": str(req_id)},
228251
)
@@ -274,7 +297,7 @@ def register_user(
274297
If it's FIRM_ADMINISTRATOR or FIRM_ADMIN_NEW_MEMBER, you need a firm_name_or_id
275298
"""
276299
req_id = uuid4()
277-
self.logger.info("Attempting to register user", extra={"req-id": req_id})
300+
self.get_logger().info("Attempting to register user", extra={"req-id": req_id})
278301
registration_type = registration_type.upper()
279302
if "phone_number" in person:
280303
phone_number = person["phone_number"]
@@ -319,7 +342,7 @@ def is_valid_password(self, password: str) -> Optional[bool]:
319342
if results.data:
320343
password_regex = results.data.get("regularexpression", ".*")
321344
else:
322-
self.logger.warning(f"No password rules found: {results}")
345+
self.get_logger().warning(f"No password rules found: {results}")
323346
password_regex = ".*"
324347

325348
try:
@@ -778,12 +801,12 @@ def reserve_court_date(
778801
range_after_str = range_after.isoformat()
779802
else:
780803
range_after_str = range_after or ""
781-
self.logger.debug(f"after: {range_after}", extra={"req-id": req_id})
804+
self.get_logger().debug(f"after: {range_after}", extra={"req-id": req_id})
782805
if range_before is not None and not isinstance(range_before, str):
783806
range_before_str = range_before.isoformat()
784807
else:
785808
range_before_str = range_before or ""
786-
self.logger.debug(f"before: {range_before}", extra={"req-id": req_id})
809+
self.get_logger().debug(f"before: {range_before}", extra={"req-id": req_id})
787810
if estimated_duration is not None:
788811
estimated_duration = int(estimated_duration) * 60 * 60
789812
req = Request(

0 commit comments

Comments
 (0)