Skip to content

Commit e37e65b

Browse files
committed
[Fixes #13800] Refact metadata i18n mechanism - use new gettext
1 parent f53b942 commit e37e65b

File tree

11 files changed

+38
-41
lines changed

11 files changed

+38
-41
lines changed

geonode/base/i18n.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def set(self, lang: str, data_key: str, data: dict, request_date: str):
119119
f"Cache will not be updated for lang:{lang} key:{data_key} reqdate:{request_date} latest:{latest_date}"
120120
)
121121

122-
def clear_schema_cache(self):
122+
def clear(self):
123123
logger.info("Clearing schema cache")
124124
self.lang_cache.clear()
125125

@@ -128,7 +128,12 @@ class LabelResolver:
128128
CACHE_KEY_LABELS = "labels"
129129

130130
def gettext(self, key, lang=None, fallback=True):
131+
"""
132+
Return the translated text in the label Thesaurus, falling back to the PO/MO translation.
133+
If fallback=False only search in the label Thesaurus, and may return None if not found
134+
"""
131135
lang = lang or get_language()
136+
# TODO: implement the OVR search
132137
return self.get_labels(lang).get(key, None) or (_(key) if fallback else None)
133138

134139
def get_labels(self, lang):

geonode/indexing/tests/test_invoke.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
from django.test import override_settings
2727

28+
from geonode.base.i18n import i18nCache
2829
from geonode.base.models import ResourceBase
2930
from geonode.metadata.handlers.multilang import MultiLangHandler
3031
from geonode.metadata.handlers.sparse import SparseHandler, SparseFieldRegistry
@@ -40,7 +41,7 @@
4041
class IndexingInvocationTests(GeoNodeBaseTestSupport):
4142

4243
def setUp(self):
43-
pass
44+
i18nCache.clear()
4445

4546
def tearDown(self):
4647
super().tearDown()

geonode/indexing/tests/test_tsindex.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
from django.test import override_settings
2525

26+
from geonode.base.i18n import i18nCache
2627
from geonode.indexing.manager import TSVectorIndexManager
2728
from geonode.tests.base import GeoNodeBaseTestSupport
2829

@@ -33,7 +34,7 @@
3334
class IndexingTests(GeoNodeBaseTestSupport):
3435

3536
def setUp(self):
36-
pass
37+
i18nCache.clear()
3738

3839
def tearDown(self):
3940
super().tearDown()

geonode/metadata/handlers/abstract.py

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,8 @@
2323

2424
from typing_extensions import deprecated
2525

26-
from django.utils.translation import gettext as _
27-
2826
from geonode.base.models import ResourceBase
29-
from geonode.base.i18n import OVR_SUFFIX
30-
from geonode.metadata.manager import CONTEXT_KEY_LABELS
27+
from geonode.base.i18n import OVR_SUFFIX, labelResolver
3128

3229
logger = logging.getLogger(__name__)
3330

@@ -163,37 +160,26 @@ def _set_error(errors: dict, path: list, msg: str):
163160

164161
@staticmethod
165162
def localize_message(context: dict, msg_code: str, msg_info: dict):
166-
msg_loc: str = MetadataHandler._get_tkl_labels(context, None, msg_code)
163+
msg_loc: str = labelResolver.gettext(msg_code)
167164
if msg_loc:
168165
tokens = defaultdict(lambda: "N/A", msg_info or {})
169166
return msg_loc.format_map(tokens)
170167
else:
171168
logger.warning(f"Missing i18n entry for key '{msg_code}' -- info is {msg_info}")
172169
return f"{msg_code}:{msg_info}"
173170

174-
@staticmethod
175-
def _localize_label(context, lang: str, text: str):
176-
# TODO: deprecate and use LabelResolver.gettext(...fallback=true)
177-
label = MetadataHandler._get_tkl_labels(context, lang, text)
178-
return label or _(text)
179-
180-
@staticmethod
181-
def _get_tkl_labels(context, lang: str | None, text: str):
182-
# TODO: deprecate and use LabelResolver.gettext(...fallback=false)
183-
return context.get(CONTEXT_KEY_LABELS, {}).get(text, None)
184-
185171
@staticmethod
186172
def _localize_subschema_labels(context, subschema: dict, lang: str, property_name: str = None):
187173
for annotation_name, synt in (
188174
("title", ""),
189175
("description", "__descr"),
190176
):
191-
if ovr := MetadataHandler._get_tkl_labels(context, lang, f"{property_name}{synt}{OVR_SUFFIX}"):
177+
if ovr := labelResolver.gettext(f"{property_name}{synt}{OVR_SUFFIX}", lang, fallback=False):
192178
subschema[annotation_name] = ovr
193179
elif annotation_name in subschema:
194-
subschema[annotation_name] = MetadataHandler._localize_label(context, lang, subschema[annotation_name])
180+
subschema[annotation_name] = labelResolver.gettext(subschema[annotation_name], lang)
195181
elif property_name: # arrays may not have a name
196-
label = MetadataHandler._get_tkl_labels(context, lang, f"{property_name}{synt}")
182+
label = labelResolver.gettext(f"{property_name}{synt}", lang, fallback=False)
197183
if label:
198184
subschema[annotation_name] = label
199185

geonode/metadata/handlers/contact.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from django.contrib.auth import get_user_model
2525
from django.utils.translation import gettext as _
2626

27+
from geonode.base.i18n import labelResolver
2728
from geonode.metadata.handlers.abstract import MetadataHandler
2829
from geonode.people import Roles
2930
from geonode.resource.manager import resource_manager
@@ -66,7 +67,7 @@ def update_schema(self, jsonschema, context, lang=None):
6667
if role.is_multivalue:
6768
contact = {
6869
"type": "array",
69-
"title": self._localize_label(context, lang, role.label) + card,
70+
"title": labelResolver.gettext(role.label, lang) + card,
7071
"minItems": minitems,
7172
"items": {
7273
"type": "object",
@@ -86,7 +87,7 @@ def update_schema(self, jsonschema, context, lang=None):
8687
else:
8788
contact = {
8889
"type": "object",
89-
"title": self._localize_label(context, lang, role.label) + card,
90+
"title": labelResolver.gettext(role.label, lang) + card,
9091
"properties": {
9192
"id": {
9293
"type": "string",

geonode/metadata/handlers/sparse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from geonode.metadata.exceptions import UnsetFieldException
2727
from geonode.metadata.models import SparseField
2828

29-
from geonode.base.i18n import get_localized_tkeywords
29+
from geonode.base.i18n import get_localized_tkeywords, labelResolver
3030

3131
logger = logging.getLogger(__name__)
3232

@@ -78,7 +78,7 @@ def _recurse_localization(self, context, schema, lang, field_name=None):
7878
self._recurse_localization(context, subschema, lang, prop_name)
7979
for item in schema.get("oneOf", []):
8080
if title := item.get("title", None):
81-
item["title"] = MetadataHandler._localize_label(context, lang, title)
81+
item["title"] = labelResolver.gettext(title, lang)
8282

8383
def _recurse_thesauri_autocomplete(self, d, lang):
8484
if isinstance(d, dict):

geonode/metadata/manager.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,12 @@
2727
from geonode.indexing.manager import index_manager
2828
from geonode.metadata.handlers.abstract import MetadataHandler
2929
from geonode.metadata.exceptions import UnsetFieldException
30-
from geonode.base.i18n import I18nCache
30+
from geonode.base.i18n import i18nCache
3131
from geonode.metadata.settings import MODEL_SCHEMA
3232

3333
logger = logging.getLogger(__name__)
3434

3535
CACHE_KEY_SCHEMA = "schema"
36-
CONTEXT_KEY_LABELS = "labels"
3736

3837

3938
class MetadataManager:
@@ -48,7 +47,6 @@ class MetadataManager:
4847
def __init__(self):
4948
self.root_schema = MODEL_SCHEMA
5049
self.handlers = {}
51-
self._i18n_cache = I18nCache()
5250

5351
def add_handler(self, handler_id, handler):
5452
self.handlers[handler_id] = handler()
@@ -61,7 +59,7 @@ def post_init(self):
6159
handler.post_init()
6260

6361
def _init_schema_context(self, lang):
64-
return {CONTEXT_KEY_LABELS: self._i18n_cache.get_labels(lang)}
62+
return {}
6563

6664
def build_schema(self, lang=None):
6765
logger.debug(f"build_schema {lang}")
@@ -86,12 +84,12 @@ def build_schema(self, lang=None):
8684

8785
def get_schema(self, lang=None):
8886
lang = str(lang)
89-
thesaurus_date, schema = self._i18n_cache.get_entry(lang, CACHE_KEY_SCHEMA)
87+
thesaurus_date, schema = i18nCache.get_entry(lang, CACHE_KEY_SCHEMA)
9088
if schema is None:
9189
logger.info(f"Building schema for {lang}")
9290
schema = self.build_schema(lang)
9391
logger.debug("Schema built")
94-
self._i18n_cache.set(lang, CACHE_KEY_SCHEMA, schema, thesaurus_date)
92+
i18nCache.set(lang, CACHE_KEY_SCHEMA, schema, thesaurus_date)
9593
return schema
9694

9795
def build_schema_instance(self, resource, lang=None):

geonode/metadata/tests/test_handlers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
from geonode.people import Roles
3232

33+
from geonode.base.i18n import i18nCache
3334
from geonode.base.models import (
3435
ResourceBase,
3536
TopicCategory,
@@ -61,7 +62,6 @@
6162
from geonode.metadata.handlers.thesaurus import TKeywordsHandler
6263
from geonode.metadata.handlers.contact import ContactHandler, ROLE_NAMES_MAP
6364
from geonode.metadata.handlers.sparse import SparseHandler, sparse_field_registry
64-
from geonode.metadata.manager import CONTEXT_KEY_LABELS
6565
from geonode.metadata.models import SparseField
6666
from geonode.metadata.settings import MODEL_SCHEMA
6767
from geonode.metadata.exceptions import UnsetFieldException
@@ -74,6 +74,7 @@
7474
class HandlersTests(GeoNodeBaseTestSupport):
7575

7676
def setUp(self):
77+
i18nCache.clear()
7778
# set Json schemas
7879
self.model_schema = copy.deepcopy(MODEL_SCHEMA)
7980
self.lang = None
@@ -1376,7 +1377,7 @@ def test_tkeywords_handler_update_schema_with_thesauri(self, mock_collect_thesau
13761377
mocked_endpoint.side_effect = lambda name, kwargs: f"/mocked/url/{kwargs['thesaurusid']}"
13771378

13781379
# Call the method
1379-
updated_schema = self.tkeywords_handler.update_schema(schema, context={CONTEXT_KEY_LABELS: {}}, lang="en")
1380+
updated_schema = self.tkeywords_handler.update_schema(schema, context={}, lang="en")
13801381

13811382
# Assert tkeywords property is added
13821383
tkeywords = updated_schema["properties"].get("tkeywords")
@@ -1428,7 +1429,7 @@ def test_tkeywords_handler_update_schema_no_thesauri(self, mock_collect_thesauri
14281429
mock_collect_thesauri.return_value = {}
14291430

14301431
# Call the method
1431-
updated_schema = self.tkeywords_handler.update_schema(schema, context={CONTEXT_KEY_LABELS: {}}, lang="en")
1432+
updated_schema = self.tkeywords_handler.update_schema(schema, context={}, lang="en")
14321433

14331434
# Assert tkeywords property is hidden
14341435
tkeywords = updated_schema["properties"].get("tkeywords")
@@ -1675,7 +1676,6 @@ def test_sparse_handler_update_resource(self):
16751676
}
16761677
}
16771678
},
1678-
CONTEXT_KEY_LABELS: {},
16791679
}
16801680

16811681
# Test string field

geonode/metadata/tests/test_i18n.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
from geonode.metadata.handlers.sparse import SparseHandler, SparseFieldRegistry
2525
from geonode.metadata.manager import MetadataManager
26-
from geonode.base.i18n import I18N_THESAURUS_IDENTIFIER
2726

27+
from geonode.base.i18n import I18N_THESAURUS_IDENTIFIER, i18nCache
2828
from geonode.base.models import (
2929
ThesaurusKeyword,
3030
ThesaurusKeywordLabel,
@@ -35,6 +35,8 @@
3535
class MetadataI18NTests(GeoNodeBaseTestSupport):
3636

3737
def setUp(self):
38+
i18nCache.clear()
39+
3840
# set a single handler to speed up things
3941
self.sparse_registry = SparseFieldRegistry()
4042

geonode/metadata/tests/test_multilang.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
from django.test import override_settings
2727

28+
from geonode.base.i18n import i18nCache
2829
from geonode.base.models import ResourceBase
2930
from geonode.metadata.handlers.multilang import MultiLangHandler
3031
from geonode.metadata.handlers.sparse import SparseHandler, SparseFieldRegistry
@@ -41,7 +42,7 @@
4142
class MetadataMultilangTests(GeoNodeBaseTestSupport):
4243

4344
def setUp(self):
44-
pass
45+
i18nCache.clear()
4546

4647
def tearDown(self):
4748
super().tearDown()

0 commit comments

Comments
 (0)