|
42 | 42 | from readthedocs.vcs_support.backends import backend_cls
|
43 | 43 | from readthedocs.vcs_support.utils import Lock, NonBlockingLock
|
44 | 44 |
|
| 45 | +from .constants import ( |
| 46 | + MEDIA_TYPES, |
| 47 | + MEDIA_TYPE_PDF, |
| 48 | + MEDIA_TYPE_EPUB, |
| 49 | + MEDIA_TYPE_HTMLZIP, |
| 50 | +) |
| 51 | + |
45 | 52 |
|
46 | 53 | log = logging.getLogger(__name__)
|
47 |
| -storage = get_storage_class()() |
48 | 54 |
|
49 | 55 |
|
50 | 56 | class ProjectRelationship(models.Model):
|
@@ -463,6 +469,29 @@ def save(self, *args, **kwargs): # pylint: disable=arguments-differ
|
463 | 469 | except Exception:
|
464 | 470 | log.exception('Error creating default branches')
|
465 | 471 |
|
| 472 | + def delete(self, *args, **kwargs): # pylint: disable=arguments-differ |
| 473 | + from readthedocs.projects import tasks |
| 474 | + |
| 475 | + # Remove local FS build artifacts on the web servers |
| 476 | + broadcast( |
| 477 | + type='app', |
| 478 | + task=tasks.remove_dirs, |
| 479 | + args=[(self.doc_path,)], |
| 480 | + ) |
| 481 | + |
| 482 | + # Remove build artifacts from storage |
| 483 | + storage_paths = [] |
| 484 | + for type_ in MEDIA_TYPES: |
| 485 | + storage_paths.append( |
| 486 | + '{}/{}'.format( |
| 487 | + type_, |
| 488 | + self.slug, |
| 489 | + ) |
| 490 | + ) |
| 491 | + tasks.remove_build_storage_paths.delay(storage_paths) |
| 492 | + |
| 493 | + super().delete(*args, **kwargs) |
| 494 | + |
466 | 495 | def get_absolute_url(self):
|
467 | 496 | return reverse('projects_detail', args=[self.slug])
|
468 | 497 |
|
@@ -746,32 +775,30 @@ def has_versions(self):
|
746 | 775 | def has_aliases(self):
|
747 | 776 | return self.aliases.exists()
|
748 | 777 |
|
749 |
| - def has_pdf(self, version_slug=LATEST): |
| 778 | + def has_media(self, type_, version_slug=LATEST): |
750 | 779 | path = self.get_production_media_path(
|
751 |
| - type_='pdf', version_slug=version_slug |
752 |
| - ) |
753 |
| - storage_path = self.get_storage_path( |
754 |
| - type_='pdf', version_slug=version_slug |
| 780 | + type_=type_, version_slug=version_slug |
755 | 781 | )
|
756 |
| - return os.path.exists(path) or storage.exists(storage_path) |
| 782 | + if os.path.exists(path): |
| 783 | + return True |
| 784 | + |
| 785 | + if settings.RTD_BUILD_MEDIA_STORAGE: |
| 786 | + storage = get_storage_class(settings.RTD_BUILD_MEDIA_STORAGE)() |
| 787 | + storage_path = self.get_storage_path( |
| 788 | + type_=type_, version_slug=version_slug |
| 789 | + ) |
| 790 | + return storage.exists(storage_path) |
| 791 | + |
| 792 | + return False |
| 793 | + |
| 794 | + def has_pdf(self, version_slug=LATEST): |
| 795 | + return self.has_media(MEDIA_TYPE_PDF, version_slug=version_slug) |
757 | 796 |
|
758 | 797 | def has_epub(self, version_slug=LATEST):
|
759 |
| - path = self.get_production_media_path( |
760 |
| - type_='epub', version_slug=version_slug |
761 |
| - ) |
762 |
| - storage_path = self.get_storage_path( |
763 |
| - type_='epub', version_slug=version_slug |
764 |
| - ) |
765 |
| - return os.path.exists(path) or storage.exists(storage_path) |
| 798 | + return self.has_media(MEDIA_TYPE_EPUB, version_slug=version_slug) |
766 | 799 |
|
767 | 800 | def has_htmlzip(self, version_slug=LATEST):
|
768 |
| - path = self.get_production_media_path( |
769 |
| - type_='htmlzip', version_slug=version_slug |
770 |
| - ) |
771 |
| - storage_path = self.get_storage_path( |
772 |
| - type_='htmlzip', version_slug=version_slug |
773 |
| - ) |
774 |
| - return os.path.exists(path) or storage.exists(storage_path) |
| 801 | + return self.has_media(MEDIA_TYPE_HTMLZIP, version_slug=version_slug) |
775 | 802 |
|
776 | 803 | @property
|
777 | 804 | def sponsored(self):
|
|
0 commit comments