From 04eca7c29ea914415fe62763eb538e73f71e102e Mon Sep 17 00:00:00 2001 From: Johannes de Wit <77152231+johannesdewit@users.noreply.github.com> Date: Mon, 12 Feb 2024 00:10:46 +0100 Subject: [PATCH] Add ISO 639 part 3 validator for model field `lang` --- heidegger_index/migrations/0013_lemma_lang.py | 10 ++++++++-- heidegger_index/models.py | 4 ++-- heidegger_index/validators.py | 12 ++++++++++++ requirements/production.txt | 3 ++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/heidegger_index/migrations/0013_lemma_lang.py b/heidegger_index/migrations/0013_lemma_lang.py index fc05a73..71ecd41 100644 --- a/heidegger_index/migrations/0013_lemma_lang.py +++ b/heidegger_index/migrations/0013_lemma_lang.py @@ -1,9 +1,11 @@ -# Generated by Django 4.2.9 on 2024-02-09 08:50 +# Generated by Django 4.1 on 2024-02-11 23:08 from django.db import migrations, models +import heidegger_index.validators class Migration(migrations.Migration): + dependencies = [ ("heidegger_index", "0012_lemma_zeno"), ] @@ -12,6 +14,10 @@ class Migration(migrations.Migration): migrations.AddField( model_name="lemma", name="lang", - field=models.CharField(max_length=3, null=True), + field=models.CharField( + max_length=3, + null=True, + validators=[heidegger_index.validators.validate_iso639_3_lang], + ), ), ] diff --git a/heidegger_index/models.py b/heidegger_index/models.py index 0f1960d..fe6023b 100644 --- a/heidegger_index/models.py +++ b/heidegger_index/models.py @@ -13,7 +13,7 @@ slugify, contains_page_range, ) -from heidegger_index.validators import validate_gnd, validate_zeno +from heidegger_index.validators import validate_gnd, validate_zeno, validate_iso639_3_lang class Work(models.Model): @@ -80,7 +80,7 @@ class Lemma(models.Model): related = models.ManyToManyField("self", symmetrical=True) type = models.CharField(max_length=1, null=True, choices=LemmaType.list_choices()) description = models.TextField(null=True) - lang = models.CharField(max_length=3, null=True) + lang = models.CharField(max_length=3, null=True, validators=[validate_iso639_3_lang]) urn = models.URLField( MetadataType.URN.label, diff --git a/heidegger_index/validators.py b/heidegger_index/validators.py index f615760..d76224f 100644 --- a/heidegger_index/validators.py +++ b/heidegger_index/validators.py @@ -1,5 +1,7 @@ from django.core.exceptions import ValidationError from .constants import MetadataType +from iso639 import Lang +from iso639.exceptions import InvalidLanguageValue import re @@ -56,3 +58,13 @@ def validate_dk(value: int | str): def validate_zeno(value: str | int): validate_simple_regex(value, ZENO_REGEX, MetadataType.ZENO.label) + + +def validate_iso639_3_lang(value: str): + try: + lang_code = Lang(value) + except InvalidLanguageValue as e: + raise ValidationError(e.msg) + + if lang_code.pt3 != value: + raise ValidationError(f'"{value}" is not a ISO 639 part 3 language code.') \ No newline at end of file diff --git a/requirements/production.txt b/requirements/production.txt index 6544b71..a03b18e 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -20,4 +20,5 @@ aenum==3.* django-compressor==4.* django-libsass==0.* python-decouple==3.* -lxml==5.* \ No newline at end of file +lxml==5.* +iso639-lang \ No newline at end of file