63
63
get_bitbucket_username_repo ,
64
64
get_github_username_repo ,
65
65
get_gitlab_username_repo ,
66
+ get_vcs_url ,
66
67
)
67
68
from readthedocs .builds .version_slug import VersionSlugField
68
69
from readthedocs .config import LATEST_CONFIGURATION_VERSION
74
75
GITHUB_BRAND ,
75
76
GITHUB_COMMIT_URL ,
76
77
GITHUB_PULL_REQUEST_COMMIT_URL ,
77
- GITHUB_PULL_REQUEST_URL ,
78
78
GITHUB_URL ,
79
79
GITLAB_BRAND ,
80
80
GITLAB_COMMIT_URL ,
81
81
GITLAB_MERGE_REQUEST_COMMIT_URL ,
82
- GITLAB_MERGE_REQUEST_URL ,
83
82
GITLAB_URL ,
84
83
MEDIA_TYPES ,
85
84
PRIVACY_CHOICES ,
@@ -213,47 +212,22 @@ def ref(self):
213
212
214
213
@property
215
214
def vcs_url (self ):
216
- """
217
- Generate VCS (github, gitlab, bitbucket) URL for this version.
218
-
219
- Example: https://github.com/rtfd/readthedocs.org/tree/3.4.2/.
220
- External Version Example: https://github.com/rtfd/readthedocs.org/pull/99/.
221
- """
222
- if self .type == EXTERNAL :
223
- if 'github' in self .project .repo :
224
- user , repo = get_github_username_repo (self .project .repo )
225
- return GITHUB_PULL_REQUEST_URL .format (
226
- user = user ,
227
- repo = repo ,
228
- number = self .verbose_name ,
229
- )
230
- if 'gitlab' in self .project .repo :
231
- user , repo = get_gitlab_username_repo (self .project .repo )
232
- return GITLAB_MERGE_REQUEST_URL .format (
233
- user = user ,
234
- repo = repo ,
235
- number = self .verbose_name ,
236
- )
237
- # TODO: Add VCS URL for BitBucket.
238
- return ''
239
-
240
- url = ''
241
- if self .slug == STABLE :
242
- slug_url = self .ref
243
- elif self .slug == LATEST :
244
- slug_url = self .project .get_default_branch ()
245
- else :
246
- slug_url = self .slug
247
-
248
- if ('github' in self .project .repo ) or ('gitlab' in self .project .repo ):
249
- url = f'/tree/{ slug_url } /'
250
-
251
- if 'bitbucket' in self .project .repo :
252
- slug_url = self .identifier
253
- url = f'/src/{ slug_url } '
254
-
255
- # TODO: improve this replacing
256
- return self .project .repo .replace ('git://' , 'https://' ).replace ('.git' , '' ) + url
215
+ version_name = self .verbose_name
216
+ if not self .is_external :
217
+ if self .slug == STABLE :
218
+ version_name = self .ref
219
+ elif self .slug == LATEST :
220
+ version_name = self .project .get_default_branch ()
221
+ else :
222
+ version_name = self .slug
223
+ if 'bitbucket' in self .project .repo :
224
+ version_name = self .identifier
225
+
226
+ return get_vcs_url (
227
+ project = self .project ,
228
+ version_type = self .type ,
229
+ version_name = version_name ,
230
+ )
257
231
258
232
@property
259
233
def last_build (self ):
@@ -622,7 +596,7 @@ class Build(models.Model):
622
596
verbose_name = _ ('Version' ),
623
597
null = True ,
624
598
related_name = 'builds' ,
625
- on_delete = models .CASCADE ,
599
+ on_delete = models .SET_NULL ,
626
600
)
627
601
type = models .CharField (
628
602
_ ('Type' ),
@@ -661,12 +635,34 @@ class Build(models.Model):
661
635
output = models .TextField (_ ('Output' ), default = '' , blank = True )
662
636
error = models .TextField (_ ('Error' ), default = '' , blank = True )
663
637
exit_code = models .IntegerField (_ ('Exit code' ), null = True , blank = True )
638
+
639
+ # Metadata from were the build happened.
640
+ # This is also used after the version is deleted.
664
641
commit = models .CharField (
665
642
_ ('Commit' ),
666
643
max_length = 255 ,
667
644
null = True ,
668
645
blank = True ,
669
646
)
647
+ version_slug = models .CharField (
648
+ _ ('Version slug' ),
649
+ max_length = 255 ,
650
+ null = True ,
651
+ blank = True ,
652
+ )
653
+ version_name = models .CharField (
654
+ _ ('Version name' ),
655
+ max_length = 255 ,
656
+ null = True ,
657
+ blank = True ,
658
+ )
659
+ version_type = models .CharField (
660
+ _ ('Version type' ),
661
+ max_length = 32 ,
662
+ choices = VERSION_TYPES ,
663
+ null = True ,
664
+ blank = True ,
665
+ )
670
666
_config = JSONField (_ ('Configuration used in the build' ), default = dict )
671
667
672
668
length = models .IntegerField (_ ('Build Length' ), null = True , blank = True )
@@ -763,14 +759,18 @@ def save(self, *args, **kwargs): # noqa
763
759
"""
764
760
if self .pk is None or self ._config_changed :
765
761
previous = self .previous
766
- # yapf: disable
767
762
if (
768
- previous is not None and self ._config and
769
- self ._config == previous .config
763
+ previous is not None
764
+ and self ._config
765
+ and self ._config == previous .config
770
766
):
771
- # yapf: enable
772
767
previous_pk = previous ._config .get (self .CONFIG_KEY , previous .pk )
773
768
self ._config = {self .CONFIG_KEY : previous_pk }
769
+
770
+ if self .version :
771
+ self .version_name = self .version .verbose_name
772
+ self .version_slug = self .version .slug
773
+ self .version_type = self .version .type
774
774
super ().save (* args , ** kwargs )
775
775
self ._config_changed = False
776
776
@@ -802,6 +802,31 @@ def get_full_url(self):
802
802
)
803
803
return full_url
804
804
805
+ def get_version_name (self ):
806
+ if self .version :
807
+ return self .version .verbose_name
808
+ return self .version_name
809
+
810
+ def get_version_slug (self ):
811
+ if self .version :
812
+ return self .version .verbose_name
813
+ return self .version_name
814
+
815
+ def get_version_type (self ):
816
+ if self .version :
817
+ return self .version .type
818
+ return self .version_type
819
+
820
+ @property
821
+ def vcs_url (self ):
822
+ if self .version :
823
+ return self .version .vcs_url
824
+ return get_vcs_url (
825
+ project = self .project ,
826
+ version_type = self .get_version_type (),
827
+ version_name = self .get_version_name (),
828
+ )
829
+
805
830
def get_commit_url (self ):
806
831
"""Return the commit URL."""
807
832
repo_url = self .project .repo
@@ -814,7 +839,7 @@ def get_commit_url(self):
814
839
return GITHUB_PULL_REQUEST_COMMIT_URL .format (
815
840
user = user ,
816
841
repo = repo ,
817
- number = self .version . verbose_name ,
842
+ number = self .get_version_name () ,
818
843
commit = self .commit
819
844
)
820
845
if 'gitlab' in repo_url :
@@ -825,7 +850,7 @@ def get_commit_url(self):
825
850
return GITLAB_MERGE_REQUEST_COMMIT_URL .format (
826
851
user = user ,
827
852
repo = repo ,
828
- number = self .version . verbose_name ,
853
+ number = self .get_version_name () ,
829
854
commit = self .commit
830
855
)
831
856
# TODO: Add External Version Commit URL for BitBucket.
@@ -876,7 +901,10 @@ def is_stale(self):
876
901
877
902
@property
878
903
def is_external (self ):
879
- return self .version .type == EXTERNAL
904
+ type = self .version_type
905
+ if self .version :
906
+ type = self .version .type
907
+ return type == EXTERNAL
880
908
881
909
@property
882
910
def external_version_name (self ):
0 commit comments