@@ -92,12 +92,34 @@ class CodebaseTag(TaggedItemBase):
9292 content_object = ParentalKey ("library.Codebase" , related_name = "tagged_codebases" )
9393
9494
95- class ProgrammingLanguage (TaggedItemBase ):
95+ class ProgrammingLanguageTag (TaggedItemBase ):
9696 content_object = ParentalKey (
9797 "library.CodebaseRelease" , related_name = "tagged_release_languages"
9898 )
9999
100100
101+ @register_snippet
102+ class ProgrammingLanguage (models .Model ):
103+ name = models .CharField (max_length = 100 , unique = True )
104+ url = models .URLField (blank = True )
105+ is_pinned = models .BooleanField (default = False )
106+ is_user_defined = models .BooleanField (default = False )
107+
108+
109+ class ReleaseLanguageQuerySet (models .QuerySet ):
110+ def for_release (self , release ):
111+ return self .select_related ('programming_language' ).filter (release = release )
112+
113+ class ReleaseLanguage (models .Model ):
114+ programming_language = models .ForeignKey (
115+ "library.ProgrammingLanguage" , related_name = "release_languages" , on_delete = models .CASCADE
116+ )
117+ release = models .ForeignKey (
118+ "library.CodebaseRelease" , related_name = "release_languages" , on_delete = models .CASCADE
119+ )
120+ version = models .CharField (max_length = 20 )
121+
122+
101123class CodebaseReleasePlatformTag (TaggedItemBase ):
102124 content_object = ParentalKey (
103125 "library.CodebaseRelease" , related_name = "tagged_release_platforms"
@@ -989,15 +1011,15 @@ def create_release_from_source(self, source_release, release_metadata):
9891011 # cache these before removing source release id to copy it over
9901012 contributors = ReleaseContributor .objects .filter (release_id = source_release .id )
9911013 platform_tags = source_release .platform_tags .all ()
992- programming_languages = source_release .programming_languages .all ()
1014+ release_languages = source_release .release_languages .all ()
9931015 # set source_release.id to None to create a new release
9941016 # see https://docs.djangoproject.com/en/4.2/topics/db/queries/#copying-model-instances
9951017 source_release .id = None
9961018 source_release ._state .adding = True
9971019 source_release .__dict__ .update (** release_metadata )
9981020 source_release .save ()
9991021 source_release .platform_tags .add (* platform_tags )
1000- source_release .programming_languages .add (* programming_languages )
1022+ source_release .release_languages .add (* release_languages )
10011023 contributors .copy_to (source_release )
10021024 return source_release
10031025
@@ -1287,8 +1309,8 @@ class Status(models.TextChoices):
12871309 through = CodebaseReleasePlatformTag , related_name = "platform_codebase_releases"
12881310 )
12891311 platforms = models .ManyToManyField (Platform )
1290- programming_languages = ClusterTaggableManager (
1291- through = ProgrammingLanguage , related_name = "pl_codebase_releases"
1312+ programming_language_tags = ClusterTaggableManager (
1313+ through = ProgrammingLanguageTag , related_name = "pl_codebase_releases"
12921314 )
12931315 codebase = models .ForeignKey (
12941316 Codebase , related_name = "releases" , on_delete = models .PROTECT
@@ -1462,7 +1484,7 @@ def validate_metadata(self):
14621484 # naive check for metadata being present (i.e., None or false-y values)
14631485 if not self .license :
14641486 errors .append (ValidationError (_ ("Please specify a software license." )))
1465- if not self .programming_languages .exists ():
1487+ if not self .release_languages .exists ():
14661488 errors .append (
14671489 ValidationError (
14681490 _ (
@@ -2725,7 +2747,7 @@ def __init__(self, release: CodebaseRelease):
27252747 self .description = codebase .description .raw
27262748 self .release_notes = release .release_notes .raw if release .release_notes else ""
27272749 self .version = release .version_number
2728- self .programming_languages = release .programming_languages .all ()
2750+ self .release_languages = release .release_languages .all ()
27292751 self .os = release .os
27302752 self .identifier = release .permanent_url
27312753 self .url = release .permanent_url
0 commit comments