-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
1 changed file
with
43 additions
and
13 deletions.
There are no files selected for viewing
56 changes: 43 additions & 13 deletions
56
web-app/django/VIM/apps/instruments/management/commands/import_languages.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,59 @@ | ||
"""This module imports possible languages for instrument names from Wikidata.""" | ||
|
||
import requests | ||
from django.core.management.base import BaseCommand | ||
from VIM.apps.instruments.models import Language | ||
|
||
|
||
class Command(BaseCommand): | ||
""" | ||
The import_languages command populates the database with languages in which instrument | ||
names can be provided in VIM. | ||
NOTE: For now, this script only imports English and French. | ||
names can be provided in VIM. It fetches the language list from Wikidata, retrieves the | ||
'wikidata_code', 'wikidata_id', 'autonym', and 'en_label', and stores them in the database. | ||
""" | ||
|
||
help = "Imports possible languages for instrument names from Wikidata." | ||
|
||
WIKIDATA_SPARQL_URL = "https://query.wikidata.org/sparql" | ||
|
||
def handle(self, *args, **options): | ||
Language.objects.create( | ||
wikidata_code="fr", | ||
wikidata_id="Q150", | ||
en_label="french", | ||
autonym="français", | ||
query = """ | ||
SELECT ?language ?languageLabel ?ISO639code ?autonym WHERE { | ||
?language wdt:P31 wd:Q34770; # Instance of a natural language | ||
wdt:P424 ?ISO639code; # ISO 639 code | ||
rdfs:label ?autonym filter (lang(?autonym) = ?ISO639code). | ||
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } | ||
} | ||
""" | ||
|
||
headers = {"Accept": "application/sparql-results+json"} | ||
response = requests.get( | ||
self.WIKIDATA_SPARQL_URL, | ||
params={"query": query}, | ||
headers=headers, | ||
timeout=50, | ||
) | ||
Language.objects.create( | ||
wikidata_code="en", | ||
wikidata_id="Q1860", | ||
en_label="english", | ||
autonym="english", | ||
data = response.json() | ||
|
||
for item in data["results"]["bindings"]: | ||
wikidata_code = item["ISO639code"]["value"] | ||
wikidata_id = item["language"]["value"].split("/")[-1] | ||
en_label = item["languageLabel"]["value"] | ||
autonym = item["autonym"]["value"] | ||
|
||
print(wikidata_code, "-", wikidata_id, "-", en_label, "-", autonym) | ||
|
||
Language.objects.update_or_create( | ||
wikidata_code=wikidata_code, | ||
defaults={ | ||
"wikidata_id": wikidata_id, | ||
"en_label": en_label, | ||
"autonym": autonym, | ||
}, | ||
) | ||
|
||
self.stdout.write( | ||
self.style.SUCCESS( | ||
f"Successfully imported {len(data['results']['bindings'])} languages." | ||
) | ||
) |