team-3/src/c3nav/mapdata/search.py

53 lines
1.9 KiB
Python
Raw Normal View History

2016-12-21 20:56:28 +01:00
import re
from django.db.models import Q
from c3nav.access.apply import filter_arealocations_by_access, filter_queryset_by_access
2016-12-21 20:56:28 +01:00
from c3nav.mapdata.models import AreaLocation, LocationGroup
from c3nav.mapdata.models.locations import PointLocation
from c3nav.mapdata.utils.cache import get_levels_cached
def get_location(request, name):
match = re.match('^c:(?P<level>[a-z0-9-_]+):(?P<x>[0-9]+):(?P<y>[0-9]+)$', name)
if match:
levels = get_levels_cached()
level = levels.get(match.group('level'))
if level is None:
return None
return PointLocation(level=level, x=int(match.group('x'))/100, y=int(match.group('y'))/100, request=request)
2016-12-21 20:56:28 +01:00
if name.startswith('g:'):
queryset = LocationGroup.objects.filter(Q(name=name[2:], can_search=True))
return filter_queryset_by_access(request, queryset).first()
2016-12-21 20:56:28 +01:00
return filter_arealocations_by_access(request, AreaLocation.objects.filter(name=name, can_search=True)).first()
2016-12-21 20:56:28 +01:00
def filter_words(queryset, words):
for word in words:
queryset = queryset.filter(Q(name__icontains=word) | Q(titles__icontains=word))
return queryset
def search_location(request, search):
results = []
location = get_location(request, search)
if location:
results.append(location)
words = search.split(' ')[:10]
2016-12-24 21:51:30 +01:00
queryset = LocationGroup.objects.filter(can_seach=True).order_by('name')
if isinstance(location, LocationGroup):
queryset.exclude(name='g:' + location.name)
results += list(filter_words(filter_queryset_by_access(request, queryset), words)[:10])
2016-12-24 21:51:30 +01:00
queryset = AreaLocation.objects.filter(can_seach=True).order_by('name')
2016-12-21 20:56:28 +01:00
if isinstance(location, AreaLocation):
queryset.exclude(name=location.name)
results += sorted(filter_words(filter_arealocations_by_access(request, queryset), words),
2016-12-21 20:56:28 +01:00
key=AreaLocation.get_sort_key, reverse=True)
return results