Skip to content

Commit

Permalink
Resolves GeoNode#6925: fix metadata bug that prevent to save multiple…
Browse files Browse the repository at this point in the history
… key for each thesaurus
  • Loading branch information
mattiagiupponi committed Feb 4, 2021
1 parent a2078b6 commit 1794c89
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 33 deletions.
9 changes: 9 additions & 0 deletions geonode/base/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,12 @@ def label_from_instance(self, obj):
# code. The hard-coded language is currently used throughout
# geonode.
return obj.keyword.filter(lang='en').first().label


class MultiThesauriXField(forms.MultipleChoiceField):

def label_from_instance(self, obj):
# Note: Not using .get() because filter()[0] is used in original
# code. The hard-coded language is currently used throughout
# geonode.
return obj.keyword.filter(lang='en').first().label
13 changes: 8 additions & 5 deletions geonode/base/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import html
import logging
import re
from django.db.models.query import QuerySet

import six
from bootstrap3_datetime.widgets import DateTimePicker
Expand Down Expand Up @@ -333,12 +334,14 @@ def __init__(self, *args, **kwargs):
elif item.card_max == -1 and item.card_min==1:
self.fields[f'{item.id}'] = self._define_multifield(item, True, tname, lang)

def clean(self):
cleaned_data = self.data
def cleanx(self, x):
cleaned_values = []
for key, value in cleaned_data.items():
if key.startswith('tkeywords') and len(value) > 0:
cleaned_values.append(value)
for key, value in x.items():
if isinstance(value, QuerySet):
for y in value:
cleaned_values.append(y.id)
elif value:
cleaned_values.append(value.id)
return ThesaurusKeyword.objects.filter(id__in=cleaned_values)

@staticmethod
Expand Down
65 changes: 37 additions & 28 deletions geonode/layers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -900,6 +900,7 @@ def layer_metadata(
current_keywords = [keyword.name for keyword in layer.keywords.all()]
topic_category = layer.category

topic_thesaurus = layer.tkeywords.all()
# Add metadata_author or poc if missing
layer.add_missing_metadata_author_or_poc()

Expand Down Expand Up @@ -1043,41 +1044,49 @@ def layer_metadata(
prefix="category_choice_field",
initial=topic_category.id if topic_category else None)


# Create THESAURUS widgets
lang = settings.THESAURUS_DEFAULT_LANG if hasattr(settings, 'THESAURUS_DEFAULT_LANG') else 'en'
if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
warnings.warn('The settings for Thesaurus has been moved to Model, this feature will be removed in next releases', DeprecationWarning)
tkeywords_form = TKeywordForm(instance=layer)
else:
tkeywords_form = ThesaurusAvailableForm(prefix='tkeywords')

# Keywords from THESAURUS management
#layer_tkeywords = layer.tkeywords.all()
#tkeywords_list = ''
#lang = 'en' # TODO: use user's language
#if layer_tkeywords and len(layer_tkeywords) > 0:
# tkeywords_ids = layer_tkeywords.values_list('id', flat=True)
# if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
# el = settings.THESAURUS
# thesaurus_name = el['name']
# try:
# t = Thesaurus.objects.get(identifier=thesaurus_name)
# for tk in t.thesaurus.filter(pk__in=tkeywords_ids):
# tkl = tk.keyword.filter(lang=lang)
# if len(tkl) > 0:
# tkl_ids = ",".join(
# map(str, tkl.values_list('id', flat=True)))
# tkeywords_list += "," + \
# tkl_ids if len(
# tkeywords_list) > 0 else tkl_ids
# except Exception:
# tb = traceback.format_exc()
# logger.error(tb)
#tkeywords_form = TKeywordForm(instance=layer)
layer_tkeywords = layer.tkeywords.all()
tkeywords_list = ''
lang = 'en' # TODO: use user's language
if layer_tkeywords and len(layer_tkeywords) > 0:
tkeywords_ids = layer_tkeywords.values_list('id', flat=True)
if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
el = settings.THESAURUS
thesaurus_name = el['name']
try:
t = Thesaurus.objects.get(identifier=thesaurus_name)
for tk in t.thesaurus.filter(pk__in=tkeywords_ids):
tkl = tk.keyword.filter(lang=lang)
if len(tkl) > 0:
tkl_ids = ",".join(
map(str, tkl.values_list('id', flat=True)))
tkeywords_list += "," + \
tkl_ids if len(
tkeywords_list) > 0 else tkl_ids
except Exception:
tb = traceback.format_exc()
logger.error(tb)
#tkeywords_form = TKeywordForm(instance=layer)

tkeywords_form = ThesaurusAvailableForm(
prefix='tkeywords',
)
# set initial values for thesaurus form
for x in tkeywords_form.fields:
values = []
for y in topic_thesaurus:
if int(x) == y.thesaurus.id:
values.append(y.id)
tkeywords_form.fields[x].initial = values

if request.method == "POST" and layer_form.is_valid() and attribute_form.is_valid(
) and category_form.is_valid():
) and category_form.is_valid() and tkeywords_form.is_valid():
new_poc = layer_form.cleaned_data['poc']
new_author = layer_form.cleaned_data['metadata_author']

Expand Down Expand Up @@ -1176,8 +1185,8 @@ def layer_metadata(
)
layer.tkeywords.set(tkeywords_data)
elif Thesaurus.objects.all().exists():
tkeywords_data = tkeywords_form.clean()
layer.tkeywords.set(tkeywords_data)
x = tkeywords_form.cleaned_data
layer.tkeywords.set(tkeywords_form.cleanx(x))

except Exception:
tb = traceback.format_exc()
Expand Down

0 comments on commit 1794c89

Please sign in to comment.