Skip to content

Commit 90824cc

Browse files
committed
fix: Fix data fetching and convert more references to language tags
1 parent 6696432 commit 90824cc

File tree

6 files changed

+137
-18
lines changed

6 files changed

+137
-18
lines changed

django/home/metrics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ def get_release_programming_language_timeseries(self, start_year):
352352
programming_language_metrics = list(
353353
CodebaseRelease.objects.public()
354354
.values(
355-
programming_language_names=F("programming_languages__name"),
355+
programming_language_names=F("release_languages__programming_language__name"),
356356
year=F("first_published_at__year"),
357357
)
358358
.annotate(count=Count("year"))

django/library/jinja2/library/codebases/releases/retrieve.jinja

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,10 @@
362362
</div>
363363
<b class='card-title'>Programming Language</b>
364364
<div class="card-text mb-3">
365-
{% for pl in release.programming_languages.all() %}
366-
{{ search_tag_href(pl, category='codebases') }}
365+
{% for pl in release.release_languages.all() %}
366+
<a href='/codebases/?programmingLanguages={{ pl.programming_language.name }}'>
367+
{{ pl.programming_language.name }}
368+
</a>
367369
{% endfor %}
368370
</div>
369371
<b class='card-title'>Software Framework</b>
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import logging
2+
3+
from django.core.management.base import BaseCommand
4+
5+
from library.models import (
6+
ProgrammingLanguageTag,
7+
ProgrammingLanguage,
8+
ReleaseLanguage,
9+
CodebaseRelease,
10+
Codebase,
11+
)
12+
13+
14+
logger = logging.getLogger(__name__)
15+
16+
programming_languages = [
17+
{"name": "ABS", "url": "https://www.abs-lang.org", "is_pinned": False},
18+
{
19+
"name": "Assembly",
20+
"url": "https://en.wikipedia.org/wiki/Assembly_language",
21+
"is_pinned": False,
22+
},
23+
{"name": "C", "url": "https://www.c-language.org", "is_pinned": False},
24+
{
25+
"name": "C#",
26+
"url": "https://dotnet.microsoft.com/en-us/languages/csharp",
27+
"is_pinned": False,
28+
},
29+
{"name": "C++", "url": "https://isocpp.org", "is_pinned": False},
30+
{"name": "Common Lisp", "url": "https://common-lisp.net", "is_pinned": False},
31+
{"name": "Dart", "url": "https://dart.dev", "is_pinned": False},
32+
{"name": "Fortran", "url": "https://fortran-lang.org", "is_pinned": False},
33+
{"name": "Go", "url": "https://golang.org", "is_pinned": False},
34+
{"name": "Groovy", "url": "https://groovy-lang.org", "is_pinned": False},
35+
{"name": "Haskell", "url": "https://www.haskell.org", "is_pinned": False},
36+
{"name": "Java", "url": "https://www.oracle.com/java/", "is_pinned": True},
37+
{
38+
"name": "JavaScript",
39+
"url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript",
40+
"is_pinned": False,
41+
},
42+
{"name": "Julia", "url": "https://julialang.org", "is_pinned": False},
43+
{"name": "Kotlin", "url": "https://kotlinlang.org", "is_pinned": False},
44+
{
45+
"name": "Logo",
46+
"url": "http://el.media.mit.edu/logo-foundation/logo/",
47+
"is_pinned": True,
48+
},
49+
{"name": "Lisp", "url": "https://lisp-lang.org", "is_pinned": False},
50+
{
51+
"name": "NetLogo",
52+
"url": "https://ccl.northwestern.edu/netlogo/",
53+
"is_pinned": True,
54+
},
55+
{
56+
"name": "Objective-C",
57+
"url": "https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html",
58+
"is_pinned": False,
59+
},
60+
{"name": "PHP", "url": "https://www.php.net", "is_pinned": False},
61+
{"name": "Perl", "url": "https://www.perl.org", "is_pinned": False},
62+
{"name": "Python", "url": "https://www.python.org", "is_pinned": True},
63+
{"name": "R", "url": "https://www.r-project.org", "is_pinned": True},
64+
{"name": "Ruby", "url": "https://www.ruby-lang.org/en", "is_pinned": False},
65+
{"name": "Rust", "url": "https://www.rust-lang.org", "is_pinned": False},
66+
{"name": "Scala", "url": "https://www.scala-lang.org", "is_pinned": False},
67+
{"name": "Shell", "url": "https://www.gnu.org/software/bash/", "is_pinned": False},
68+
{"name": "Smalltalk", "url": "https://st.cs.uni-saarland.de", "is_pinned": False},
69+
{
70+
"name": "SQL",
71+
"url": "https://www.iso.org/standard/63555.html",
72+
"is_pinned": False,
73+
},
74+
{"name": "Swift", "url": "https://swift.org", "is_pinned": False},
75+
{"name": "TypeScript", "url": "https://www.typescriptlang.org", "is_pinned": False},
76+
{
77+
"name": "Visual Basic",
78+
"url": "https://docs.microsoft.com/en-us/dotnet/visual-basic/",
79+
"is_pinned": False,
80+
},
81+
{
82+
"name": "Wolfram Language",
83+
"url": "https://www.wolfram.com/language/",
84+
"is_pinned": False,
85+
},
86+
]
87+
88+
89+
class Command(BaseCommand):
90+
help = "Convert programming language tags to use the ReleaseLanguage model."
91+
92+
def handle(self, *args, **options):
93+
ProgrammingLanguage.objects.all().delete()
94+
for lang in programming_languages:
95+
ProgrammingLanguage.objects.create(**lang)
96+
97+
ReleaseLanguage.objects.all().delete()
98+
tags = ProgrammingLanguageTag.objects.all()
99+
for tag in tags:
100+
version = ""
101+
if tag.tag.name.lower().startswith("netlogo"):
102+
version = tag.tag.name[7:].strip()
103+
104+
programming_language = ProgrammingLanguage.objects.get_or_create(
105+
name__istartswith=tag.tag.name,
106+
defaults={"name": tag.tag.name, "is_user_defined": True},
107+
)[0]
108+
ReleaseLanguage.objects.create(
109+
programming_language=programming_language,
110+
release=tag.content_object,
111+
version=version,
112+
)

django/library/models.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,6 @@ class ProgrammingLanguage(models.Model):
106106
is_user_defined = models.BooleanField(default=False)
107107

108108

109-
class ReleaseLanguageQuerySet(models.QuerySet):
110-
def for_release(self, release):
111-
return self.select_related("programming_language").filter(release=release)
112-
113-
114109
class ReleaseLanguage(models.Model):
115110
programming_language = models.ForeignKey(
116111
"library.ProgrammingLanguage",
@@ -124,6 +119,10 @@ class ReleaseLanguage(models.Model):
124119
)
125120
version = models.CharField(max_length=20)
126121

122+
@property
123+
def name(self):
124+
return self.programming_language.name
125+
127126

128127
class CodebaseReleasePlatformTag(TaggedItemBase):
129128
content_object = ParentalKey(
@@ -848,9 +847,9 @@ def all_release_frameworks(self):
848847
@property
849848
def all_release_programming_languages(self):
850849
return list(
851-
self.releases.exclude(programming_languages__isnull=True).values_list(
852-
"programming_languages__name", flat=True
853-
)
850+
self.releases.exclude(release_languages__isnull=True)
851+
.values_list("release_languages__programming_language__name", flat=True)
852+
.distinct()
854853
)
855854

856855
def download_count(self):
@@ -1173,7 +1172,12 @@ def with_platforms(self):
11731172
return self.prefetch_related("tagged_release_platforms__tag")
11741173

11751174
def with_programming_languages(self):
1176-
return self.prefetch_related("tagged_release_languages__tag")
1175+
return self.prefetch_related(
1176+
Prefetch(
1177+
"release_languages",
1178+
ReleaseLanguage.objects.prefetch_related("programming_language"),
1179+
)
1180+
)
11771181

11781182
def with_codebase(self):
11791183
return self.prefetch_related(
@@ -1371,7 +1375,7 @@ class Status(models.TextChoices):
13711375
],
13721376
),
13731377
index.RelatedFields(
1374-
"programming_languages",
1378+
"release_languages",
13751379
[
13761380
index.SearchField("name"),
13771381
],

django/library/views.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,9 @@ def filter_queryset(self, request, queryset, view):
428428
if programming_languages:
429429
# FIXME: this does not work for the same reason tags__name__in does not work, e.g.,
430430
# https://docs.wagtail.org/en/stable/topics/search/indexing.html#filtering-on-index-relatedfields
431-
# criteria.update(releases__programming_languages__name__in=programming_languages)
431+
# criteria.update(releases__release_languages__programming_language__name__in=programming_languages)
432432
codebases = Codebase.objects.public(
433-
releases__programming_languages__name__in=programming_languages
433+
releases__release_languages__programming_language__name__in=programming_languages
434434
)
435435
criteria.update(id__in=codebases.values_list("id", flat=True))
436436

@@ -1237,7 +1237,8 @@ class ProgrammingLanguageViewSet(CommonViewSetMixin, NoDeleteViewSet):
12371237
"""
12381238

12391239
queryset = ProgrammingLanguage.objects.all()
1240+
pagination_class = None
12401241
serializer_class = ProgrammingLanguageSerializer
1241-
pagination_class = SmallResultSetPagination
1242-
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
1242+
permission_classes = (IsAuthenticatedOrReadOnly,)
1243+
filter_backends = (OrderingFilter,)
12431244
ordering = ["-is_pinned", "name"]

frontend/src/components/form/ProgrammingLanguageListField.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ async function loadProgrammingLanguages() {
114114
try {
115115
isLoadingOptions.value = true;
116116
const response = await fetchProgrammingLanguages();
117-
programmingLanguageOptions.value = response.data.results;
117+
programmingLanguageOptions.value = response.data;
118118
} catch (error) {
119119
console.error("Failed to fetch programming languages:", error);
120120
} finally {

0 commit comments

Comments
 (0)