|
40 | 40 | from taggit.forms import TagField
|
41 | 41 | from tinymce.widgets import TinyMCE
|
42 | 42 | from django.contrib.admin.utils import flatten
|
| 43 | +from django.utils.translation import get_language |
| 44 | + |
43 | 45 | from geonode.base.enumerations import ALL_LANGUAGES
|
44 | 46 | from geonode.base.models import (HierarchicalKeyword,
|
45 | 47 | License, Region, ResourceBase, Thesaurus,
|
46 | 48 | ThesaurusKeyword, ThesaurusKeywordLabel, ThesaurusLabel,
|
47 | 49 | TopicCategory)
|
48 | 50 | from geonode.base.widgets import TaggitSelect2Custom
|
| 51 | +from geonode.base.fields import MultiThesauriField |
49 | 52 | from geonode.documents.models import Document
|
50 | 53 | from geonode.layers.models import Dataset
|
51 |
| -from django.utils.translation import get_language |
52 |
| -from .fields import MultiThesauriField |
53 |
| -from geonode.base.utils import validate_extra_metadata |
| 54 | +from geonode.base.utils import validate_extra_metadata, remove_country_from_lanugecode |
54 | 55 |
|
55 | 56 | logger = logging.getLogger(__name__)
|
56 | 57 |
|
@@ -290,7 +291,14 @@ class Meta:
|
290 | 291 | )
|
291 | 292 |
|
292 | 293 |
|
| 294 | +THESAURUS_RESULT_LIST_SEPERATOR = ("", "-------") |
| 295 | + |
| 296 | + |
293 | 297 | class ThesaurusAvailableForm(forms.Form):
|
| 298 | + |
| 299 | + # seperator at beginning of thesaurus search result and between |
| 300 | + # results found in local language and alt label |
| 301 | + |
294 | 302 | def __init__(self, *args, **kwargs):
|
295 | 303 | super().__init__(*args, **kwargs)
|
296 | 304 | lang = get_language()
|
@@ -337,16 +345,21 @@ def _define_choicefield(self, item, required, tname, lang):
|
337 | 345 |
|
338 | 346 | @staticmethod
|
339 | 347 | def _get_thesauro_keyword_label(item, lang):
|
340 |
| - qs_local = [] |
341 |
| - qs_non_local = [("", "------")] |
342 |
| - for key in ThesaurusKeyword.objects.filter(thesaurus_id=item.id): |
343 |
| - label = ThesaurusKeywordLabel.objects.filter(keyword=key).filter(lang=lang) |
344 |
| - if label.exists(): |
345 |
| - qs_local.append((label.get().keyword.id, label.get().label)) |
346 |
| - else: |
347 |
| - qs_non_local.append((key.id, key.alt_label)) |
348 | 348 |
|
349 |
| - return qs_non_local + qs_local |
| 349 | + keyword_id_for_given_thesaurus = ThesaurusKeyword.objects.filter(thesaurus_id=item) |
| 350 | + |
| 351 | + # try find results found for given language e.g. (en-us) if no results found remove country code from language to (en) and try again |
| 352 | + qs_keyword_ids = ThesaurusKeywordLabel.objects.filter(lang=lang, keyword_id__in=keyword_id_for_given_thesaurus).values("keyword_id") |
| 353 | + if len(qs_keyword_ids) == 0: |
| 354 | + lang = remove_country_from_lanugecode(lang) |
| 355 | + qs_keyword_ids = ThesaurusKeywordLabel.objects.filter(lang=lang, keyword_id__in=keyword_id_for_given_thesaurus).values("keyword_id") |
| 356 | + |
| 357 | + not_qs_ids = ThesaurusKeywordLabel.objects.exclude(keyword_id__in=qs_keyword_ids).order_by("keyword_id").distinct("keyword_id").values("keyword_id") |
| 358 | + |
| 359 | + qs_local = list(ThesaurusKeywordLabel.objects.filter(lang=lang, keyword_id__in=keyword_id_for_given_thesaurus).values_list("keyword_id", "label")) |
| 360 | + qs_non_local = list(keyword_id_for_given_thesaurus.filter(id__in=not_qs_ids).values_list("id", "alt_label")) |
| 361 | + |
| 362 | + return [THESAURUS_RESULT_LIST_SEPERATOR] + qs_local + [THESAURUS_RESULT_LIST_SEPERATOR] + qs_non_local |
350 | 363 |
|
351 | 364 | @staticmethod
|
352 | 365 | def _get_thesauro_title_label(item, lang):
|
|
0 commit comments