Skip to content

Commit

Permalink
[Fixes #5158] Update thesaurus management command and fix autocomplete
Browse files Browse the repository at this point in the history
  • Loading branch information
afabiani committed Oct 31, 2019
1 parent 63057b5 commit 42c3eec
Show file tree
Hide file tree
Showing 54 changed files with 247 additions and 214 deletions.
25 changes: 12 additions & 13 deletions geonode/base/autocomplete_light_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,16 +83,15 @@ def choices_for_request(self):
return super(ThesaurusKeywordLabelAutocomplete, self).choices_for_request()


if hasattr(settings, 'THESAURI'):
for thesaurus in settings.THESAURI:

tname = thesaurus['name']
ac_name = 'thesaurus_' + tname

logger.debug('Registering thesaurus autocomplete for {}: {}'.format(tname, ac_name))

register(
ThesaurusKeywordLabelAutocomplete,
name=ac_name,
choices=ThesaurusKeywordLabel.objects.filter(Q(keyword__thesaurus__identifier=tname))
)
if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
thesaurus = settings.THESAURUS
tname = thesaurus['name']
ac_name = 'thesaurus_' + tname

logger.debug('Registering thesaurus autocomplete for {}: {}'.format(tname, ac_name))

register(
ThesaurusKeywordLabelAutocomplete,
name=ac_name,
choices=ThesaurusKeywordLabel.objects.filter(Q(keyword__thesaurus__identifier=tname))
)
38 changes: 23 additions & 15 deletions geonode/base/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,30 +26,38 @@

from geonode.base.models import Thesaurus

logger = logging.getLogger("geonode.base.fields")
from .widgets import MultiThesaurusWidget

logger = logging.getLogger(__name__)


class MultiThesauriField(forms.MultiValueField):
def __init__(self, label=None, required=True, help_text=None, widget=None):
fields_list = []
for el in settings.THESAURI:

widget = MultiThesaurusWidget()

def __init__(self, *args, **kwargs):
super(MultiThesauriField, self).__init__(*args, **kwargs)
self.require_all_fields = kwargs.pop('require_all_fields', True)

if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
el = settings.THESAURUS
choices_list = []
thesaurus_name = el['name']
try:
t = Thesaurus.objects.get(identifier=thesaurus_name)
for tk in t.thesaurus.all():
tkl = tk.keyword.filter(lang='en')
choices_list.append((tkl[0].id, tkl[0].label))
fields_list.append(forms.MultipleChoiceField(choices=tuple(choices_list)))
self.fields += (forms.MultipleChoiceField(choices=tuple(choices_list)), )
except BaseException:
tb = traceback.format_exc()
logger.error(tb)

fields = tuple(fields_list)

super(MultiThesauriField, self).__init__(fields, required, widget, label)

def compress(self, data_list):
if data_list:
return '%s' % (data_list[0])
return None
logger.exception(tb)

for f in self.fields:
f.error_messages.setdefault('incomplete',
self.error_messages['incomplete'])
if self.require_all_fields:
# Set 'required' to False on the individual fields, because the
# required validation will be handled by MultiValueField, not
# by those individual fields.
f.required = False
27 changes: 18 additions & 9 deletions geonode/base/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################
from fields import MultiThesauriField
from widgets import MultiThesauriWidget

import logging
import traceback

from .fields import MultiThesauriField

from autocomplete_light.widgets import ChoiceWidget
from autocomplete_light.contrib.taggit_field import TaggitField, TaggitWidget
Expand Down Expand Up @@ -48,6 +51,8 @@
from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model

logger = logging.getLogger(__name__)


def get_tree_data():
def rectree(parent, path):
Expand Down Expand Up @@ -289,20 +294,24 @@ def clean(self):

class TKeywordForm(forms.Form):
tkeywords = MultiThesauriField(
label=_("Keywords from Thesauri"),
label=_("Keywords from Thesaurus"),
required=False,
help_text=_("List of keywords from Thesauri"),
widget=MultiThesauriWidget())
help_text=_("List of keywords from Thesaurus"))

def __init__(self, *args, **kwargs):
super(TKeywordForm, self).__init__(*args, **kwargs)
initial_arguments = kwargs.get('initial', None)
self.data = initial_arguments

def clean(self):
cleaned_data = None
if self.data:
try:
cleaned_data = [{key: self.data.getlist(key)} for key, value in self.data.items(
) if 'tkeywords-tkeywords' in key.lower() and 'autocomplete' not in key.lower()]
cleaned_data = [{key: self.data.get(key)} for key, value in self.data.items(
) if 'tkeywords' in key.lower() and 'autocomplete' not in key.lower()]
except BaseException:
pass

tb = traceback.format_exc()
logger.exception(tb)
return cleaned_data


Expand Down
48 changes: 26 additions & 22 deletions geonode/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,50 +422,54 @@ class Meta:
verbose_name_plural = 'Thesauri'


class ThesaurusKeyword(models.Model):
class ThesaurusKeywordLabel(models.Model):
"""
Loadable thesaurus containing keywords in different languages
"""

# read from the RDF file
about = models.CharField(max_length=255, null=True, blank=True)
lang = models.CharField(max_length=3)
# read from the RDF file
alt_label = models.CharField(
max_length=255,
default='',
null=True,
blank=True)
label = models.CharField(max_length=255)
# note = models.CharField(max_length=511)

thesaurus = models.ForeignKey('Thesaurus', related_name='thesaurus')
keyword = models.ForeignKey('ThesaurusKeyword', related_name='keyword')

def __unicode__(self):
return u"{0}".format(self.alt_label)
return u"{0}".format(self.label)

class Meta:
ordering = ("alt_label",)
verbose_name_plural = 'Thesaurus Keywords'
unique_together = (("thesaurus", "alt_label"),)
ordering = ("keyword", "lang")
verbose_name_plural = 'Labels'
unique_together = (("keyword", "lang"),)


class ThesaurusKeywordLabel(models.Model):
class ThesaurusKeyword(models.Model):
"""
Loadable thesaurus containing keywords in different languages
"""

# read from the RDF file
lang = models.CharField(max_length=3)
about = models.CharField(max_length=255, null=True, blank=True)
# read from the RDF file
label = models.CharField(max_length=255)
# note = models.CharField(max_length=511)
alt_label = models.CharField(
max_length=255,
default='',
null=True,
blank=True)

keyword = models.ForeignKey('ThesaurusKeyword', related_name='keyword')
thesaurus = models.ForeignKey('Thesaurus', related_name='thesaurus')

def __unicode__(self):
return u"{0}".format(self.label)
return u"{0}".format(self.alt_label)

@property
def labels(self):
return ThesaurusKeywordLabel.objects.filter(keyword=self)

class Meta:
ordering = ("keyword", "lang")
verbose_name_plural = 'Labels'
unique_together = (("keyword", "lang"),)
ordering = ("alt_label",)
verbose_name_plural = 'Thesaurus Keywords'
unique_together = (("thesaurus", "alt_label"),)


class ResourceBaseManager(PolymorphicManager):
Expand Down
18 changes: 15 additions & 3 deletions geonode/base/templates/base/_resourcebase_info_panel.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,26 @@

{% if resource.keywords.count > 0 %}
<dt>{% trans "Keywords" %}</dt>
<dd itemprop="keywords">
<dd itemprop="keywords">
{% for keyword in resource.keywords.all %}
<a itemscope itemtype="http://schema.org/Text" href="{% url "search" %}?keywords__slug__in={{ keyword.slug }}" >
<a itemscope itemtype="http://schema.org/Text" href="{% url "search" %}?keywords__slug__in={{ keyword.slug }}" >
{{ keyword.name }}
</a>
{% if not forloop.last %},{% endif %}
{% endfor %}
</dd>
{% if resource.tkeywords.count > 0 %}
{% get_current_language as LANGUAGE_CODE %}
{% for keyword in resource.tkeywords.all %}
<a itemscope itemtype="http://schema.org/Text" href="{% url "search" %}?tkeywords__id__in={{ keyword.id }}">
{% for label in keyword.labels %}
{% if label.lang == LANGUAGE_CODE %}
{{ label }}
{% endif %}
{% endfor %}
</a>
{% endfor %}
{% endif %}
</dd>
{% endif %}

{% if resource.category %}
Expand Down
37 changes: 11 additions & 26 deletions geonode/base/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,35 +18,20 @@
#
#########################################################################

from django import forms
from django.conf import settings
from autocomplete_light.widgets import MultipleChoiceWidget

import autocomplete_light

class MultiThesaurusWidget(MultipleChoiceWidget):

class MultiThesauriWidget(forms.MultiWidget):
def __init__(self, attrs=None):
widget_list = []
for el in settings.THESAURI:
if hasattr(settings, 'THESAURUS') and settings.THESAURUS:
el = settings.THESAURUS
widget_name = el['name']
cleaned_name = el['name'].replace("-", " ").replace("_", " ").title()
widget_list.append(
autocomplete_light.widgets.MultipleChoiceWidget(
'thesaurus_' + el['name'],
attrs={'placeholder': '%s - Start typing for suggestions' % cleaned_name},
extra_context={'thesauri_title': cleaned_name}))
widgets = tuple(widget_list)

super(MultiThesauriWidget, self).__init__(widgets, attrs)

def decompress(self, value):
if value:
return [map(int, value.split(','))]
return [None, None, None]

def compress(self, data_list):
if data_list:
return '%s' % (data_list[0])
return None

def format_output(self, rendered_widgets):
return u'\n'.join(rendered_widgets)
super(MultiThesaurusWidget, self).__init__(
'thesaurus_' + widget_name,
attrs={'placeholder': '%s - Start typing for suggestions' % cleaned_name},
extra_context={'thesauri_title': cleaned_name})
else:
super(MultiThesaurusWidget, self).__init__([], attrs)
3 changes: 2 additions & 1 deletion geonode/context_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,8 @@ def resource_urls(request):
'SEARCH_FILTERS',
False
),
THESAURI_FILTERS=[t['name'] for t in settings.THESAURI if t.get('filter')],
THESAURI_FILTERS=[t['name'] for t in [settings.THESAURUS, ] if
t.get('filter')] if hasattr(settings, 'THESAURUS') else None,
MAP_CLIENT_USE_CROSS_ORIGIN_CREDENTIALS=getattr(
settings, 'MAP_CLIENT_USE_CROSS_ORIGIN_CREDENTIALS', False
),
Expand Down
3 changes: 3 additions & 0 deletions geonode/documents/templates/layouts/doc_panels.html
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,14 @@
</div>
<div class="col-lg-5">
<div class="col-lg-12">
<span><label for="{{ layer_form.date_type|id }}">{{ layer_form.keywords.label }}</label></span>
{{ document_form.keywords }}
</div>
{% if THESAURI_FILTERS %}
<div class="col-lg-12 thesauri_keywords">
{{ tkeywords_form }}
</div>
{% endif %}
<div class="col-lg-6 col-xs-12">
<span><label for="{{ document_form.date_type|id }}">{{ document_form.date_type.label }}</label></span>
<!--<p class="xxs-font-size">(Identification of when a given event occurred)</p>-->
Expand Down
3 changes: 3 additions & 0 deletions geonode/layers/templates/layouts/panels.html
Original file line number Diff line number Diff line change
Expand Up @@ -290,11 +290,14 @@
</div>
<div class="col-lg-5">
<div class="col-lg-12">
<span><label for="{{ layer_form.date_type|id }}">{{ layer_form.keywords.label }}</label></span>
{{ layer_form.keywords }}
</div>
{% if THESAURI_FILTERS %}
<div class="col-lg-12 thesauri_keywords">
{{ tkeywords_form }}
</div>
{% endif %}
<div class="col-lg-6 col-xs-12">
<span><label for="{{ layer_form.date_type|id }}">{{ layer_form.date_type.label }}</label></span>
<!--<p class="xxs-font-size">(Identification of when a given event occurred)</p>-->
Expand Down

0 comments on commit 42c3eec

Please sign in to comment.