@@ -145,13 +145,13 @@ def _safely_get_obj_status_for_jira(obj: Finding | Finding_Group, *, isenforced:
145145 return status or ["Inactive" ]
146146
147147
148- def is_keep_in_sync_with_jira (finding ):
148+ def is_keep_in_sync_with_jira (finding , prefetched_jira_instance : JIRA_Instance = None ):
149149 keep_in_sync_enabled = False
150150 # Check if there is a jira issue that needs to be updated
151151 jira_issue_exists = finding .has_jira_issue or (finding .finding_group and finding .finding_group .has_jira_issue )
152152 if jira_issue_exists :
153153 # Determine if any automatic sync should occur
154- jira_instance = get_jira_instance (finding )
154+ jira_instance = prefetched_jira_instance or get_jira_instance (finding )
155155 if jira_instance :
156156 keep_in_sync_enabled = jira_instance .finding_jira_sync
157157
@@ -225,8 +225,8 @@ def can_be_pushed_to_jira(obj, form=None):
225225
226226
227227# use_inheritance=True means get jira_project config from product if engagement itself has none
228- def get_jira_project (obj , * , use_inheritance = True ):
229- if not is_jira_enabled ():
228+ def get_jira_project (obj , * , use_inheritance = True , jira_enabled : bool = False ):
229+ if not jira_enabled and not ( jira_enabled := is_jira_enabled () ):
230230 return None
231231
232232 if obj is None :
@@ -242,19 +242,19 @@ def get_jira_project(obj, *, use_inheritance=True):
242242 return obj .jira_project
243243 # some old jira_issue records don't have a jira_project, so try to go via the finding instead
244244 if (hasattr (obj , "finding" ) and obj .finding ) or (hasattr (obj , "engagement" ) and obj .engagement ):
245- return get_jira_project (obj .finding , use_inheritance = use_inheritance )
245+ return get_jira_project (obj .finding , use_inheritance = use_inheritance , jira_enabled = jira_enabled )
246246 return None
247247
248248 if isinstance (obj , Finding | Stub_Finding ):
249249 finding = obj
250- return get_jira_project (finding .test )
250+ return get_jira_project (finding .test , jira_enabled = jira_enabled )
251251
252252 if isinstance (obj , Finding_Group ):
253- return get_jira_project (obj .test )
253+ return get_jira_project (obj .test , jira_enabled = jira_enabled )
254254
255255 if isinstance (obj , Test ):
256256 test = obj
257- return get_jira_project (test .engagement )
257+ return get_jira_project (test .engagement , jira_enabled = jira_enabled )
258258
259259 if isinstance (obj , Engagement ):
260260 engagement = obj
@@ -269,7 +269,7 @@ def get_jira_project(obj, *, use_inheritance=True):
269269
270270 if use_inheritance :
271271 logger .debug ("delegating to product %s for %s" , engagement .product , engagement )
272- return get_jira_project (engagement .product )
272+ return get_jira_project (engagement .product , jira_enabled = jira_enabled )
273273 logger .debug ("not delegating to product %s for %s" , engagement .product , engagement )
274274 return None
275275
@@ -286,11 +286,11 @@ def get_jira_project(obj, *, use_inheritance=True):
286286 return None
287287
288288
289- def get_jira_instance (obj ):
290- if not is_jira_enabled ():
289+ def get_jira_instance (obj , jira_enabled : bool = False ): # noqa: FBT001, FBT002
290+ if not jira_enabled and not ( jira_enabled := is_jira_enabled () ):
291291 return None
292292
293- jira_project = get_jira_project (obj )
293+ jira_project = get_jira_project (obj , jira_enabled = jira_enabled )
294294 if jira_project :
295295 logger .debug ("found jira_instance %s for %s" , jira_project .jira_instance , obj )
296296 return jira_project .jira_instance
@@ -415,17 +415,17 @@ def get_jira_finding_text(jira_instance):
415415 return None
416416
417417
418- def has_jira_issue (obj ) :
418+ def has_jira_issue (obj : Finding | Engagement | Finding_Group ) -> bool :
419419 return get_jira_issue (obj ) is not None
420420
421421
422- def get_jira_issue (obj ) :
423- if isinstance ( obj , Finding | Engagement | Finding_Group ):
424- try :
425- return obj .jira_issue
426- except JIRA_Issue . DoesNotExist :
427- return None
428- return None
422+ def get_jira_issue (obj : Finding | Engagement | Finding_Group ) -> JIRA_Issue | None :
423+ """
424+ This pattern is "cheaper" than the try/catch handling of the DoesNotExist exception
425+ that would happen if we try to access obj.jira_issue when there is none, and it also
426+ works with prefetch_related where the related object is None instead of a RelatedManager
427+ """
428+ return getattr ( obj , "jira_issue" , None )
429429
430430
431431def has_jira_configured (obj ):
0 commit comments