@@ -94,6 +94,7 @@ class ObservationSerializer(ModelSerializer):
9494 references = NestedReferenceSerializer (many = True )
9595 evidences = NestedEvidenceSerializer (many = True )
9696 origin_source_file_url = SerializerMethodField ()
97+ origin_cloud_resource_url = SerializerMethodField ()
9798 issue_tracker_issue_url = SerializerMethodField ()
9899 duplicates = NestedObservationIdSerializer (many = True )
99100 assessment_needs_approval = SerializerMethodField ()
@@ -116,6 +117,9 @@ def get_branch_name(self, observation: Observation) -> str:
116117 def get_origin_source_file_url (self , observation : Observation ) -> Optional [str ]:
117118 return _get_origin_source_file_url (observation )
118119
120+ def get_origin_cloud_resource_url (self , observation : Observation ) -> Optional [str ]:
121+ return _get_origin_cloud_resource_url (observation )
122+
119123 def get_issue_tracker_issue_url (self , observation : Observation ) -> Optional [str ]:
120124 issue_url = None
121125
@@ -164,6 +168,7 @@ class ObservationListSerializer(ModelSerializer):
164168 origin_component_name_version = SerializerMethodField ()
165169 origin_source_file_short = SerializerMethodField ()
166170 origin_source_file_url = SerializerMethodField ()
171+ origin_cloud_resource_url = SerializerMethodField ()
167172 vulnerability_id_aliases = SerializerMethodField ()
168173 cve_found_in = SerializerMethodField ()
169174
@@ -195,6 +200,9 @@ def get_origin_source_file_short(self, observation: Observation) -> Optional[str
195200 def get_origin_source_file_url (self , observation : Observation ) -> Optional [str ]:
196201 return _get_origin_source_file_url (observation )
197202
203+ def get_origin_cloud_resource_url (self , observation : Observation ) -> Optional [str ]:
204+ return _get_origin_cloud_resource_url (observation )
205+
198206 def get_vulnerability_id_aliases (self , observation : Observation ) -> list [dict [str , str ]]:
199207 return _get_vulnerability_id_aliases (observation )
200208
@@ -225,6 +233,22 @@ def _get_origin_source_file_url(observation: Observation) -> Optional[str]:
225233 return origin_source_file_url
226234
227235
236+ def _get_origin_cloud_resource_url (observation : Observation ) -> Optional [str ]:
237+ if (
238+ observation .origin_cloud_provider .lower () == "github"
239+ and observation .origin_cloud_account_subscription_project
240+ and observation .origin_cloud_resource
241+ ):
242+ if observation .origin_cloud_resource_type .lower () == "githubrepository" :
243+ return (
244+ f"https://github.com/{ observation .origin_cloud_account_subscription_project } /"
245+ + f"{ observation .origin_cloud_resource } "
246+ )
247+ if observation .origin_cloud_resource_type .lower () == "githuborganization" :
248+ return f"https://github.com/{ observation .origin_cloud_resource } "
249+ return None
250+
251+
228252def _create_azure_devops_url (observation : Observation , origin_source_file_url : str ) -> str :
229253 origin_source_file_url += f"?path={ observation .origin_source_file } "
230254 if observation .branch :
0 commit comments