26
26
from pathlib import PurePath
27
27
from pypi_simple .parse_stream import parse_links_stream_response
28
28
29
+ from pulpcore .plugin .viewsets import OperationPostponedResponse
29
30
from pulpcore .plugin .tasking import dispatch
31
+ from pulpcore .plugin .util import get_domain
30
32
from pulp_python .app .models import (
31
33
PythonDistribution ,
32
34
PythonPackageContent ,
@@ -75,7 +77,7 @@ def get_distribution(path):
75
77
"repository" , "publication" , "publication__repository_version" , "remote"
76
78
)
77
79
try :
78
- return distro_qs .get (base_path = path )
80
+ return distro_qs .get (base_path = path , pulp_domain = get_domain () )
79
81
except ObjectDoesNotExist :
80
82
raise Http404 (f"No PythonDistribution found for base_path { path } " )
81
83
@@ -100,6 +102,14 @@ def get_drvc(self, path):
100
102
content = self .get_content (repo_ver )
101
103
return distro , repo_ver , content
102
104
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
+
103
113
104
114
class PackageUploadMixin (PyPIMixin ):
105
115
"""A Mixin to provide package upload support."""
@@ -137,7 +147,7 @@ def upload(self, request, path):
137
147
kwargs = {"artifact_sha256" : artifact .sha256 ,
138
148
"filename" : filename ,
139
149
"repository_pk" : str (repo .pk )})
140
- return Response ( data = { "task" : reverse ( 'tasks-detail' , args = [ result . pk ] , request = None )} )
150
+ return OperationPostponedResponse ( result , request )
141
151
142
152
def upload_package_group (self , repo , artifact , filename , session ):
143
153
"""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,
176
186
return reverse ('tasks-detail' , args = [result .pk ], request = None )
177
187
178
188
179
- class SimpleView (ViewSet , PackageUploadMixin ):
189
+ class SimpleView (PackageUploadMixin , ViewSet ):
180
190
"""View for the PyPI simple API."""
181
191
182
192
permission_classes = [IsAuthenticatedOrReadOnly ]
@@ -186,7 +196,7 @@ def list(self, request, path):
186
196
"""Gets the simple api html page for the index."""
187
197
distro , repo_version , content = self .get_drvc (path )
188
198
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/' ))
190
200
names = content .order_by ('name' ).values_list ('name' , flat = True ).distinct ().iterator ()
191
201
return StreamingHttpResponse (write_simple_index (names , streamed = True ))
192
202
@@ -197,7 +207,7 @@ def parse_url(link):
197
207
digest , _ , value = parsed .fragment .partition ('=' )
198
208
stripped_url = urlunsplit (chain (parsed [:3 ], ("" , "" )))
199
209
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 )
201
211
return link .text , d_url , value if digest == 'sha256' else ''
202
212
203
213
url = remote .get_remote_artifact_url (f'simple/{ package } /' )
@@ -224,7 +234,7 @@ def retrieve(self, request, path, package):
224
234
if not repo_ver or not content .filter (name__normalize = normalized ).exists ():
225
235
return self .pull_through_package_simple (normalized , path , distro .remote )
226
236
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 } /' ))
228
238
packages = (
229
239
content .filter (name__normalize = normalized )
230
240
.values_list ('filename' , 'sha256' , 'name' )
@@ -237,7 +247,7 @@ def retrieve(self, request, path, package):
237
247
else :
238
248
packages = chain ([present ], packages )
239
249
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 )
241
251
return StreamingHttpResponse (write_simple_detail (name , releases , streamed = True ))
242
252
243
253
@extend_schema (request = PackageUploadSerializer ,
@@ -253,7 +263,7 @@ def create(self, request, path):
253
263
return self .upload (request , path )
254
264
255
265
256
- class MetadataView (ViewSet , PyPIMixin ):
266
+ class MetadataView (PyPIMixin , ViewSet ):
257
267
"""View for the PyPI JSON metadata endpoint."""
258
268
259
269
authentication_classes = []
@@ -272,6 +282,7 @@ def retrieve(self, request, path, meta):
272
282
meta_path = PurePath (meta )
273
283
name = None
274
284
version = None
285
+ domain = None
275
286
if meta_path .match ("*/*/json" ):
276
287
version = meta_path .parts [1 ]
277
288
name = meta_path .parts [0 ]
@@ -281,13 +292,17 @@ def retrieve(self, request, path, meta):
281
292
package_content = content .filter (name__iexact = name )
282
293
# TODO Change this value to the Repo's serial value when implemented
283
294
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
+ )
285
300
if json_body :
286
301
return Response (data = json_body , headers = headers )
287
302
return Response (status = "404" )
288
303
289
304
290
- class PyPIView (ViewSet , PyPIMixin ):
305
+ class PyPIView (PyPIMixin , ViewSet ):
291
306
"""View for base_url of distribution."""
292
307
293
308
authentication_classes = []
@@ -305,7 +320,7 @@ def retrieve(self, request, path):
305
320
return Response (data = data )
306
321
307
322
308
- class UploadView (ViewSet , PackageUploadMixin ):
323
+ class UploadView (PackageUploadMixin , ViewSet ):
309
324
"""View for the `/legacy` upload endpoint."""
310
325
311
326
@extend_schema (request = PackageUploadSerializer ,
0 commit comments