diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-12-29 12:09:08 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-02-28 12:15:23 +0100 | 
| commit | 14b4caad1c1eb9e009d485b4428af3f708afe758 (patch) | |
| tree | 6f28b883d2ab3d8d94c0774134ce3d8d703ff277 | |
| parent | e958aa339d4c46cd8edb4624d0c28ccef0495657 (diff) | |
| download | Ishtar-14b4caad1c1eb9e009d485b4428af3f708afe758.tar.bz2 Ishtar-14b4caad1c1eb9e009d485b4428af3f708afe758.zip  | |
Unaccent search for person/orga. Tips for operation form
| -rw-r--r-- | archaeological_operations/forms.py | 48 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 10 | ||||
| -rw-r--r-- | example_project/settings.py | 1 | ||||
| -rw-r--r-- | ishtar_common/migrations/0208_unaccent.py | 17 | ||||
| -rw-r--r-- | ishtar_common/models.py | 8 | ||||
| -rw-r--r-- | ishtar_common/views.py | 16 | 
6 files changed, 67 insertions, 33 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index c4eef1fc2..98f263ab6 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -30,6 +30,7 @@ from django.core import validators  from django.db.models import Max  from django.forms.formsets import formset_factory, DELETION_FIELD_NAME, \      TOTAL_FORM_COUNT +from django.utils.functional import lazy  from django.utils.safestring import mark_safe  from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy @@ -46,7 +47,8 @@ from ishtar_common.forms_common import TownFormSet, get_town_field, TownForm  from ishtar_common.models import valid_id, valid_ids, Person, Town, \      DocumentTemplate, Organization, get_current_profile, \      person_type_pks_lazy, person_type_pk_lazy, organization_type_pks_lazy, \ -    organization_type_pk_lazy, SpatialReferenceSystem, Area +    organization_type_pk_lazy, SpatialReferenceSystem, Area, \ +    get_sra_agent_label, get_sra_agent_head_scientist_label, get_operator_label  from ishtar_common.wizards import MultiValueDict  from .widgets import ParcelWidget, SelectParcelWidget, OAWidget @@ -793,7 +795,7 @@ class OperationFormGeneral(CustomForm, ManageOldType):                                validators=[validators.MinValueValidator(1000),                                            validators.MaxValueValidator(2100)])      old_code = forms.CharField( -        label=_(u"Old code"), required=False, +        label=_("Old code"), required=False,          validators=[validators.MaxLengthValidator(200)])      scientist = forms.IntegerField(          label=_("Head scientist"), @@ -802,6 +804,7 @@ class OperationFormGeneral(CustomForm, ManageOldType):                  'autocomplete-person',                  args=[person_type_pks_lazy(['head_scientist', 'sra_agent'])]),              associated_model=Person, +            tips=lazy(get_sra_agent_head_scientist_label),              limit={                  'person_types': (person_type_pk_lazy('head_scientist'),                                   person_type_pk_lazy('sra_agent'))}, @@ -813,6 +816,7 @@ class OperationFormGeneral(CustomForm, ManageOldType):              reverse_lazy('autocomplete-organization',                           args=[organization_type_pk_lazy('operator')]),              limit={'organization_type': organization_type_pk_lazy('operator')}, +            tips=lazy(get_operator_label),              associated_model=Organization, new=True),          validators=[valid_id(Organization)], required=False)      operator_reference = forms.CharField(label=_(u"Operator reference"), @@ -824,6 +828,7 @@ class OperationFormGeneral(CustomForm, ManageOldType):                  'autocomplete-person',                  args=[person_type_pks_lazy(['sra_agent'])]),              associated_model=Person, +            tips=lazy(get_sra_agent_label),              limit={'person_types': [person_type_pk_lazy('sra_agent')]},              new=True),          validators=[valid_id(Person)], required=False) @@ -840,11 +845,11 @@ class OperationFormGeneral(CustomForm, ManageOldType):      report_processing = forms.ChoiceField(label=_(u"Report processing"),                                            choices=[], required=False)      if settings.COUNTRY == 'fr': -        cira_date = DateField(label=u"Date avis CIRA", required=False) +        cira_date = DateField(label="Date avis CTRA/CIRA", required=False)          negative_result = forms.NullBooleanField( -            required=False, label=u"Résultat considéré comme négatif") +            required=False, label="Résultat considéré comme négatif")          cira_rapporteur = forms.IntegerField( -            label=u"Rapporteur CIRA", +            label="Rapporteur CTRA/CIRA",              widget=widgets.JQueryAutoComplete(                  reverse_lazy(                      'autocomplete-person', @@ -853,41 +858,42 @@ class OperationFormGeneral(CustomForm, ManageOldType):                  limit={'person_types': [                      person_type_pk_lazy('sra_agent'),                      person_type_pk_lazy('head_scientist')]}, +                tips=lazy(get_sra_agent_head_scientist_label),                  associated_model=Person, new=True),              validators=[valid_id(Person)], required=False)      documentation_deadline = DateField( -        label=_(u"Deadline for submission of the documentation"), +        label=_("Deadline for submission of the documentation"),          required=False)      documentation_received = forms.NullBooleanField( -        required=False, label=_(u"Documentation received")) +        required=False, label=_("Documentation received"))      finds_deadline = DateField( -        label=_(u"Deadline for submission of the finds"), required=False, +        label=_("Deadline for submission of the finds"), required=False,      )      finds_received = forms.NullBooleanField( -        required=False, label=_(u"Finds received")) +        required=False, label=_("Finds received")) -    comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea, +    comment = forms.CharField(label=_("Comment"), widget=forms.Textarea,                                required=False)      scientific_documentation_comment = forms.CharField( -        label=_(u"Comment about scientific documentation"), +        label=_("Comment about scientific documentation"),          widget=forms.Textarea, required=False) -    record_quality_type = forms.ChoiceField(label=_(u"Record quality"), +    record_quality_type = forms.ChoiceField(label=_("Record quality"),                                              required=False)      virtual_operation = forms.BooleanField(required=False, -                                           label=_(u"Virtual operation")) +                                           label=_("Virtual operation")) -    HEADERS['x'] = FormHeader(_(u"Coordinates")) -    x = forms.FloatField(label=_(u"X"), required=False) -    estimated_error_x = forms.FloatField(label=_(u"Estimated error for X"), +    HEADERS['x'] = FormHeader(_("Coordinates")) +    x = forms.FloatField(label=_("X"), required=False) +    estimated_error_x = forms.FloatField(label=_("Estimated error for X"),                                           required=False) -    y = forms.FloatField(label=_(u"Y"), required=False) -    estimated_error_y = forms.FloatField(label=_(u"Estimated error for Y"), +    y = forms.FloatField(label=_("Y"), required=False) +    estimated_error_y = forms.FloatField(label=_("Estimated error for Y"),                                           required=False) -    z = forms.FloatField(label=_(u"Z"), required=False) -    estimated_error_z = forms.FloatField(label=_(u"Estimated error for Z"), +    z = forms.FloatField(label=_("Z"), required=False) +    estimated_error_z = forms.FloatField(label=_("Estimated error for Z"),                                           required=False)      spatial_reference_system = forms.ChoiceField( -        label=_(u"Spatial Reference System"), required=False, choices=[]) +        label=_("Spatial Reference System"), required=False, choices=[])      FILE_FIELDS = [          'report_delivery_date', diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 7f23399ea..8436121a4 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -786,9 +786,9 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem,          'in_charge__surname': _("In charge (surname)"),          'in_charge__name': _("In charge (name)"),          'in_charge__attached_to__name': _("In charge - Organization (name)"), -        'cira_rapporteur__surname': "Rapporteur CIRA (prénom)", -        'cira_rapporteur__name': "Rapporteur CIRA (nom)", -        'cira_rapporteur__attached_to__name': "Rapporteur CIRA - " +        'cira_rapporteur__surname': "Rapporteur CTRA/CIRA (prénom)", +        'cira_rapporteur__name': "Rapporteur CTRA/CIRA (nom)", +        'cira_rapporteur__attached_to__name': "Rapporteur CTRA/CIRA - "                                                "Organisation (nom)",          'archaeological_sites__reference':          _("Archaeological sites (reference)"), @@ -1116,10 +1116,10 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem,          null=True)  # preventive diag      cira_rapporteur = models.ForeignKey(          Person, related_name='cira_rapporteur', null=True, blank=True, -        on_delete=models.SET_NULL, verbose_name="Rapporteur CIRA") +        on_delete=models.SET_NULL, verbose_name="Rapporteur CTRA/CIRA")      negative_result = models.NullBooleanField(          "Résultat considéré comme négatif", blank=True, null=True) -    cira_date = models.DateField("Date avis CIRA", null=True, blank=True) +    cira_date = models.DateField("Date avis CTRA/CIRA", null=True, blank=True)      eas_number = models.CharField("Numéro de l'EA", max_length=20,                                    null=True, blank=True)      ## end fr diff --git a/example_project/settings.py b/example_project/settings.py index 53c436501..c5b1171bd 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -172,6 +172,7 @@ INSTALLED_APPS = [      'django.contrib.auth',      'django.contrib.admin',      'django.contrib.contenttypes', +    'django.contrib.postgres',      'django.contrib.sessions',      'django.contrib.sites',      'django.contrib.gis', diff --git a/ishtar_common/migrations/0208_unaccent.py b/ishtar_common/migrations/0208_unaccent.py new file mode 100644 index 000000000..57aa9ea9e --- /dev/null +++ b/ishtar_common/migrations/0208_unaccent.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-12-29 11:50 +from __future__ import unicode_literals + +from django.db import migrations + +from django.contrib.postgres.operations import UnaccentExtension + +class Migration(migrations.Migration): + +    dependencies = [ +        ('ishtar_common', '0207_auto_20201207_2337'), +    ] + +    operations = [ +        UnaccentExtension() +    ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index c178b187f..807bbc64f 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1862,6 +1862,14 @@ def get_publisher_label():      return _("Error: publisher type is missing") +def get_operator_label(): +    if apps.ready: +        lbl = get_general_type_label(OrganizationType, "operator") +        if lbl: +            return lbl +    return _("Error: operator type is missing") + +  class TitleType(GenderedType):      long_title = models.TextField(_("Long title"), default="", blank=True) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index e445cb44d..d5b38ebed 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -613,9 +613,9 @@ def autocomplete_ishtaruser(request):          return HttpResponseBadRequest()      query = Q()      for q in q.split(' '): -        qu = (Q(person__name__icontains=q) | -              Q(person__surname__icontains=q) | -              Q(person__raw_name__icontains=q)) +        qu = (Q(person__name__unaccent__icontains=q) | +              Q(person__surname__unaccent__icontains=q) | +              Q(person__raw_name__unaccent__icontains=q))          query = query & qu      users = models.IshtarUser.objects.filter(query).distinct()[:limit]      data = json.dumps([ @@ -643,10 +643,12 @@ def autocomplete_person(request, person_types=None, attached_to=None,          return HttpResponseBadRequest()      query = Q()      for q in q.split(' '): -        qu = (Q(name__icontains=q) | Q(surname__icontains=q) | -              Q(email__icontains=q) | Q(attached_to__name__icontains=q)) +        qu = (Q(name__unaccent__icontains=q) | +              Q(surname__unaccent__icontains=q) | +              Q(email__unaccent__icontains=q) | +              Q(attached_to__name__unaccent__icontains=q))          if permissive: -            qu = qu | Q(raw_name__icontains=q) +            qu = qu | Q(raw_name__unaccent__icontains=q)          query = query & qu      if attached_to:          query = query & Q(attached_to__pk__in=attached_to.split('_')) @@ -780,7 +782,7 @@ def autocomplete_organization(request, orga_type=None):      q = request.GET.get('term')      query = Q()      for q in q.split(' '): -        extra = Q(cached_label__icontains=q) +        extra = Q(cached_label__unaccent__icontains=q)          query = query & extra      if orga_type:          try:  | 
