11import re
22
3+ import structlog
34from django .shortcuts import get_object_or_404
45from django .utils .decorators import method_decorator
56from drf_spectacular .utils import extend_schema
1516from integrations .github .models import GitHubRepository
1617from organisations .models import Organisation
1718
18- from .models import FeatureExternalResource
19+ from .models import FeatureExternalResource , ResourceType
1920from .serializers import FeatureExternalResourceSerializer
2021
2122
@@ -45,7 +46,6 @@ def get_queryset(self): # type: ignore[no-untyped-def]
4546 features_pk = self .kwargs ["feature_pk" ]
4647 return FeatureExternalResource .objects .filter (feature = features_pk )
4748
48- # Override get list view to add github issue/pr name to each linked external resource
4949 def list (self , request , * args , ** kwargs ) -> Response : # type: ignore[no-untyped-def]
5050 queryset = self .get_queryset () # type: ignore[no-untyped-call]
5151 serializer = self .get_serializer (queryset , many = True )
@@ -56,7 +56,14 @@ def list(self, request, *args, **kwargs) -> Response: # type: ignore[no-untyped
5656 Feature .objects .filter (id = self .kwargs ["feature_pk" ]),
5757 ).project .organisation_id
5858
59+ # Add github issue/PR name to each linked external resource
5960 for resource in data if isinstance (data , list ) else []:
61+ if ResourceType (resource ["type" ]) not in [
62+ ResourceType .GITHUB_ISSUE ,
63+ ResourceType .GITHUB_PR ,
64+ ]:
65+ continue
66+
6067 if resource_url := resource .get ("url" ):
6168 resource ["metadata" ] = get_github_issue_pr_title_and_state (
6269 organisation_id = organisation_id , resource_url = resource_url
@@ -65,6 +72,12 @@ def list(self, request, *args, **kwargs) -> Response: # type: ignore[no-untyped
6572 return Response (data = {"results" : data })
6673
6774 def create (self , request , * args , ** kwargs ): # type: ignore[no-untyped-def]
75+ if request .data .get ("type" ) not in [
76+ ResourceType .GITHUB_ISSUE ,
77+ ResourceType .GITHUB_PR ,
78+ ]:
79+ return super ().create (request , * args , ** kwargs )
80+
6881 feature = get_object_or_404 (
6982 Feature .objects .filter (
7083 id = self .kwargs ["feature_pk" ],
@@ -122,6 +135,22 @@ def create(self, request, *args, **kwargs): # type: ignore[no-untyped-def]
122135 status = status .HTTP_400_BAD_REQUEST ,
123136 )
124137
138+ def perform_create (self , serializer : FeatureExternalResourceSerializer ) -> None : # type: ignore[override]
139+ resource = serializer .save ()
140+
141+ log_event_names : dict [ResourceType , tuple [str , str ]] = {
142+ ResourceType .GITLAB_ISSUE : ("gitlab" , "issue.linked" ),
143+ ResourceType .GITLAB_MR : ("gitlab" , "merge_request.linked" ),
144+ }
145+ if (resource_type := ResourceType (resource .type )) in log_event_names :
146+ logger_name , event_name = log_event_names [resource_type ]
147+ structlog .get_logger (logger_name ).info (
148+ event_name ,
149+ organisation__id = resource .feature .project .organisation_id ,
150+ project__id = resource .feature .project_id ,
151+ feature__id = resource .feature .id ,
152+ )
153+
125154 def perform_update (self , serializer ): # type: ignore[no-untyped-def]
126155 external_resource_id = int (self .kwargs ["pk" ])
127156 serializer .save (id = external_resource_id )
0 commit comments