Пример #1
0
 def get_queryset(self):
     term = self.request.GET.get('v', '')
     query = models.Term.objects.all()
     if term:
         if self.db_engine_is_sqlite():
             query = models.Term.objects.filter(value__icontains=term)
         else:
             query = models.Term.objects.annotate(
                 similarity=functions.Greatest(
                     search.TrigramSimilarity('value', term),
                     search.TrigramSimilarity('definition__value', term),
                     search.TrigramSimilarity('definition__tags', term),
                 )).filter(similarity__gt=0.1).order_by('-similarity')
     return query
Пример #2
0
 def search_commune(self, query):
     # FIXME: way too much code in common with ComuneQuerySet#search which should
     #        be factored out.
     qs = self
     terms = query.strip().split(" ")
     clauses = Q()
     for index, term in enumerate(terms):
         if text.contains_digits(term) and len(term) == 5:
             clauses = clauses | Q(
                 commune_ext__obsolete=False,
                 commune_ext__code_postaux__contains=[term],
             )
         if len(term) > 2:
             similarity_field = f"similarity_{index}"
             qs = qs.annotate(
                 **{
                     similarity_field:
                     search.TrigramSimilarity("commune_ext__nom", term)
                 })
             clauses = (clauses
                        | Q(**{f"{similarity_field}__gte": 0.6})
                        | Q(
                            commune_ext__obsolete=False,
                            commune_ext__nom__unaccent__icontains=term,
                        ))
     return qs.filter(clauses)
Пример #3
0
    def get_queryset(self):
        query = self.request.query_params.get('search', '').strip().lower()
        if not query:
            raise exceptions.ValidationError('Empty search string')

        # We have to rename each field of users and usergroups query
        # so that the selected fields will have same name and
        # can be merged together using union to a single query set.

        users = User.objects.values(
            entity_id=models.F('id'),
            entity_username=models.F('username'),
            entity_first_name=models.F('first_name'),
            entity_last_name=models.F('last_name'),

            entity_title=models.Value(None, models.CharField()),
            entity_type=models.Value('user', models.CharField()),

            similarity=models.functions.Greatest(
                search.TrigramSimilarity('username', query),
                search.TrigramSimilarity('first_name', query),
                search.TrigramSimilarity('last_name', query),
            ),
        ).filter(similarity__gt=0.2)

        user_groups = UserGroup.objects.values(
            entity_id=models.F('id'),
            entity_title=models.F('title'),

            entity_username=models.Value(None, models.CharField()),
            entity_first_name=models.Value(None, models.CharField()),
            entity_last_name=models.Value(None, models.CharField()),
            entity_type=models.Value('user_group', models.CharField()),

            similarity=search.TrigramSimilarity('title', query),
        ).filter(similarity__gt=0.2)

        project = self.request.query_params.get('project')
        if project:
            users = users.exclude(project__id=project)
            user_groups = user_groups.exclude(project__id=project)

        entities = users.union(user_groups)
        return entities.order_by('-similarity')
Пример #4
0
 def search(self, query):
     qs = self.filter(obsolete=False)
     terms = query.strip().split(" ")
     clauses = Q()
     for index, term in enumerate(terms):
         if text.contains_digits(term) and len(term) == 5:
             clauses = clauses | Q(code_postaux__contains=[term])
         if len(term) > 2:
             similarity_field = f"similarity_{index}"
             qs = qs.annotate(
                 **
                 {similarity_field: search.TrigramSimilarity("nom", term)})
             clauses = (clauses
                        | Q(nom__unaccent__icontains=term)
                        | Q(**{f"{similarity_field}__gte": 0.6}))
     return qs.filter(clauses)
Пример #5
0
def _tabular_meta_extract_geo(geodata):
    field = geodata.field
    project = field.sheet.book.project
    project_geoareas = GeoArea.objects.filter(
        admin_level__region__project=project)
    geodata_data = []

    is_code = field.get_option('geo_type', 'name') == 'code'
    admin_level = field.get_option('admin_level')
    if admin_level:
        project_geoareas = project_geoareas.filter(
            admin_level__level=admin_level)

    for row in geodata.field.sheet.data:
        similar_areas = []
        query = row.get(str(field.pk))

        if is_code:
            geoareas = project_geoareas.filter(code=query).annotate(
                similarity=models.Value(1, models.FloatField()), )
        else:
            geoareas = project_geoareas.annotate(
                similarity=search.TrigramSimilarity('title', query), ).filter(
                    similarity__gt=0.2).order_by('-similarity')

        for geoarea in geoareas:
            similar_areas.append({
                'id': geoarea.pk,
                'similarity': geoarea.similarity,
            })
        geodata_data.append({
            'similar_areas':
            similar_areas,
            'selected_id':
            geoareas.first().pk if geoareas.exists() else None,
        })
    geodata.data = geodata_data
    geodata.save()
    return True
Пример #6
0
def trigram_name_search(queryset, name_query):
    return queryset.annotate(similarity=search.TrigramSimilarity(
        'name',
        str(name_query
            or '')), ).filter(similarity__gt=0.3).order_by('-similarity')