2626from pathlib import PurePath
2727from pypi_simple .parse_stream import parse_links_stream_response
2828
29+ from pulpcore .plugin .viewsets import OperationPostponedResponse
2930from pulpcore .plugin .tasking import dispatch
31+ from pulpcore .plugin .util import get_domain
3032from pulp_python .app .models import (
3133 PythonDistribution ,
3234 PythonPackageContent ,
@@ -75,7 +77,7 @@ def get_distribution(path):
7577 "repository" , "publication" , "publication__repository_version" , "remote"
7678 )
7779 try :
78- return distro_qs .get (base_path = path )
80+ return distro_qs .get (base_path = path , pulp_domain = get_domain () )
7981 except ObjectDoesNotExist :
8082 raise Http404 (f"No PythonDistribution found for base_path { path } " )
8183
@@ -100,6 +102,14 @@ def get_drvc(self, path):
100102 content = self .get_content (repo_ver )
101103 return distro , repo_ver , content
102104
105+ def initial (self , request , * args , ** kwargs ):
106+ """Perform common initialization tasks for PyPI endpoints."""
107+ super ().initial (request , * args , ** kwargs )
108+ if settings .DOMAIN_ENABLED :
109+ self .base_content_url = urljoin (BASE_CONTENT_URL , f"{ get_domain ().name } /" )
110+ else :
111+ self .base_content_url = BASE_CONTENT_URL
112+
103113
104114class PackageUploadMixin (PyPIMixin ):
105115 """A Mixin to provide package upload support."""
@@ -137,7 +147,7 @@ def upload(self, request, path):
137147 kwargs = {"artifact_sha256" : artifact .sha256 ,
138148 "filename" : filename ,
139149 "repository_pk" : str (repo .pk )})
140- return Response ( data = { "task" : reverse ( 'tasks-detail' , args = [ result . pk ] , request = None )} )
150+ return OperationPostponedResponse ( result , request )
141151
142152 def upload_package_group (self , repo , artifact , filename , session ):
143153 """Steps 4 & 5, spawns tasks to add packages to index."""
@@ -176,7 +186,7 @@ def create_group_upload_task(self, cur_session, repository, artifact, filename,
176186 return reverse ('tasks-detail' , args = [result .pk ], request = None )
177187
178188
179- class SimpleView (ViewSet , PackageUploadMixin ):
189+ class SimpleView (PackageUploadMixin , ViewSet ):
180190 """View for the PyPI simple API."""
181191
182192 permission_classes = [IsAuthenticatedOrReadOnly ]
@@ -186,7 +196,7 @@ def list(self, request, path):
186196 """Gets the simple api html page for the index."""
187197 distro , repo_version , content = self .get_drvc (path )
188198 if self .should_redirect (distro , repo_version = repo_version ):
189- return redirect (urljoin (BASE_CONTENT_URL , f'{ path } /simple/' ))
199+ return redirect (urljoin (self . base_content_url , f'{ path } /simple/' ))
190200 names = content .order_by ('name' ).values_list ('name' , flat = True ).distinct ().iterator ()
191201 return StreamingHttpResponse (write_simple_index (names , streamed = True ))
192202
@@ -197,7 +207,7 @@ def parse_url(link):
197207 digest , _ , value = parsed .fragment .partition ('=' )
198208 stripped_url = urlunsplit (chain (parsed [:3 ], ("" , "" )))
199209 redirect = f'{ path } /{ link .text } ?redirect={ stripped_url } '
200- d_url = urljoin (BASE_CONTENT_URL , redirect )
210+ d_url = urljoin (self . base_content_url , redirect )
201211 return link .text , d_url , value if digest == 'sha256' else ''
202212
203213 url = remote .get_remote_artifact_url (f'simple/{ package } /' )
@@ -224,7 +234,7 @@ def retrieve(self, request, path, package):
224234 if not repo_ver or not content .filter (name__normalize = normalized ).exists ():
225235 return self .pull_through_package_simple (normalized , path , distro .remote )
226236 if self .should_redirect (distro , repo_version = repo_ver ):
227- return redirect (urljoin (BASE_CONTENT_URL , f'{ path } /simple/{ normalized } /' ))
237+ return redirect (urljoin (self . base_content_url , f'{ path } /simple/{ normalized } /' ))
228238 packages = (
229239 content .filter (name__normalize = normalized )
230240 .values_list ('filename' , 'sha256' , 'name' )
@@ -237,7 +247,7 @@ def retrieve(self, request, path, package):
237247 else :
238248 packages = chain ([present ], packages )
239249 name = present [2 ]
240- releases = ((f , urljoin (BASE_CONTENT_URL , f'{ path } /{ f } ' ), d ) for f , d , _ in packages )
250+ releases = ((f , urljoin (self . base_content_url , f'{ path } /{ f } ' ), d ) for f , d , _ in packages )
241251 return StreamingHttpResponse (write_simple_detail (name , releases , streamed = True ))
242252
243253 @extend_schema (request = PackageUploadSerializer ,
@@ -253,7 +263,7 @@ def create(self, request, path):
253263 return self .upload (request , path )
254264
255265
256- class MetadataView (ViewSet , PyPIMixin ):
266+ class MetadataView (PyPIMixin , ViewSet ):
257267 """View for the PyPI JSON metadata endpoint."""
258268
259269 authentication_classes = []
@@ -272,6 +282,7 @@ def retrieve(self, request, path, meta):
272282 meta_path = PurePath (meta )
273283 name = None
274284 version = None
285+ domain = None
275286 if meta_path .match ("*/*/json" ):
276287 version = meta_path .parts [1 ]
277288 name = meta_path .parts [0 ]
@@ -281,13 +292,17 @@ def retrieve(self, request, path, meta):
281292 package_content = content .filter (name__iexact = name )
282293 # TODO Change this value to the Repo's serial value when implemented
283294 headers = {PYPI_LAST_SERIAL : str (PYPI_SERIAL_CONSTANT )}
284- json_body = python_content_to_json (path , package_content , version = version )
295+ if settings .DOMAIN_ENABLED :
296+ domain = get_domain ()
297+ json_body = python_content_to_json (
298+ path , package_content , version = version , domain = domain
299+ )
285300 if json_body :
286301 return Response (data = json_body , headers = headers )
287302 return Response (status = "404" )
288303
289304
290- class PyPIView (ViewSet , PyPIMixin ):
305+ class PyPIView (PyPIMixin , ViewSet ):
291306 """View for base_url of distribution."""
292307
293308 authentication_classes = []
@@ -305,7 +320,7 @@ def retrieve(self, request, path):
305320 return Response (data = data )
306321
307322
308- class UploadView (ViewSet , PackageUploadMixin ):
323+ class UploadView (PackageUploadMixin , ViewSet ):
309324 """View for the `/legacy` upload endpoint."""
310325
311326 @extend_schema (request = PackageUploadSerializer ,
0 commit comments