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