|
30 | 30 | from readthedocs.builds.constants import LATEST
|
31 | 31 | from readthedocs.builds.models import Version
|
32 | 32 | from readthedocs.builds.views import BuildTriggerMixin
|
| 33 | +from readthedocs.core.utils.extend import SettingsOverrideObject |
33 | 34 | from readthedocs.projects.models import Project
|
34 | 35 | from readthedocs.projects.templatetags.projects_tags import sort_version_aware
|
35 | 36 | from readthedocs.proxito.views.mixins import ServeDocsMixin
|
@@ -268,7 +269,7 @@ def project_downloads(request, project_slug):
|
268 | 269 | )
|
269 | 270 |
|
270 | 271 |
|
271 |
| -class ProjectDownloadMedia(ServeDocsMixin, View): |
| 272 | +class ProjectDownloadMediaBase(ServeDocsMixin, View): |
272 | 273 |
|
273 | 274 | # Use new-style URLs (same domain as docs) or old-style URLs (dashboard URL)
|
274 | 275 | same_domain_url = False
|
@@ -299,19 +300,30 @@ def get(
|
299 | 300 | not the actual Project permissions.
|
300 | 301 | """
|
301 | 302 | if self.same_domain_url:
|
302 |
| - version = self._version_same_domain_url( |
| 303 | + # It uses the request to get the ``project``. The rest of arguments come |
| 304 | + # from the URL. |
| 305 | + final_project, lang_slug, version_slug, filename = _get_project_data_from_request( # noqa |
303 | 306 | request,
|
304 |
| - type_, |
305 |
| - lang_slug, |
306 |
| - version_slug, |
307 |
| - subproject_slug, |
| 307 | + project_slug=None, |
| 308 | + subproject_slug=subproject_slug, |
| 309 | + lang_slug=lang_slug, |
| 310 | + version_slug=version_slug, |
308 | 311 | )
|
| 312 | + |
| 313 | + if not self.allowed_user(request, final_project, version_slug): |
| 314 | + return self.get_unauthed_response(request, final_project) |
| 315 | + |
| 316 | + version = get_object_or_404( |
| 317 | + final_project.versions.public(user=request.user), |
| 318 | + slug=version_slug, |
| 319 | + ) |
| 320 | + |
309 | 321 | else:
|
310 |
| - version = self._version_dashboard_url( |
311 |
| - request, |
312 |
| - project_slug, |
313 |
| - type_, |
314 |
| - version_slug, |
| 322 | + # All the arguments come from the URL. |
| 323 | + version = get_object_or_404( |
| 324 | + Version.objects.public(user=request.user), |
| 325 | + project__slug=project_slug, |
| 326 | + slug=version_slug, |
315 | 327 | )
|
316 | 328 |
|
317 | 329 | # Send media download to analytics - sensitive data is anonymized
|
@@ -342,45 +354,9 @@ def get(
|
342 | 354 | download=True,
|
343 | 355 | )
|
344 | 356 |
|
345 |
| - def _version_same_domain_url( |
346 |
| - self, |
347 |
| - request, |
348 |
| - type_, |
349 |
| - lang_slug, |
350 |
| - version_slug, |
351 |
| - subproject_slug=None, |
352 |
| - ): |
353 |
| - """ |
354 |
| - Return the version to be served (new-style URLs). |
355 |
| -
|
356 |
| - It uses the request to get the ``project``. The rest of arguments come |
357 |
| - from the URL. |
358 |
| - """ |
359 |
| - final_project, lang_slug, version_slug, filename = _get_project_data_from_request( # noqa |
360 |
| - request, |
361 |
| - project_slug=None, |
362 |
| - subproject_slug=subproject_slug, |
363 |
| - lang_slug=lang_slug, |
364 |
| - version_slug=version_slug, |
365 |
| - ) |
366 |
| - version = get_object_or_404( |
367 |
| - final_project.versions.public(user=request.user), |
368 |
| - slug=version_slug, |
369 |
| - ) |
370 |
| - return version |
371 |
| - |
372 |
| - def _version_dashboard_url(self, request, project_slug, type_, version_slug): |
373 |
| - """ |
374 |
| - Return the version to be served (old-style URLs). |
375 | 357 |
|
376 |
| - All the arguments come from the URL. |
377 |
| - """ |
378 |
| - version = get_object_or_404( |
379 |
| - Version.objects.public(user=request.user), |
380 |
| - project__slug=project_slug, |
381 |
| - slug=version_slug, |
382 |
| - ) |
383 |
| - return version |
| 358 | +class ProjectDownloadMedia(SettingsOverrideObject): |
| 359 | + _default_class = ProjectDownloadMediaBase |
384 | 360 |
|
385 | 361 |
|
386 | 362 | def project_versions(request, project_slug):
|
|
0 commit comments