Exemple #1
0
    def get_item_count(mapitemtype):
        if hasattr(mapitemtype, 'level'):
            return filter_queryset_by_access(
                request,
                mapitemtype.objects.filter(level__name=level)).count()

        if hasattr(mapitemtype, 'levels'):
            return filter_queryset_by_access(
                request,
                mapitemtype.objects.filter(levels__name=level)).count()

        return 0
Exemple #2
0
    def _list(self, request, types, level, packages):
        results = []
        for t in types:
            mapitemtype = GEOMETRY_MAPITEM_TYPES[t]
            queryset = mapitemtype.objects.all()
            if packages:
                queryset = queryset.filter(package__in=packages)
            if level:
                if hasattr(mapitemtype, 'level'):
                    queryset = queryset.filter(level=level)
                elif hasattr(mapitemtype, 'levels'):
                    queryset = queryset.filter(levels=level)
                else:
                    queryset = queryset.none()
            queryset = filter_queryset_by_access(request, queryset)
            queryset = queryset.order_by('name')

            for field_name in ('package', 'level', 'crop_to_level',
                               'elevator'):
                if hasattr(mapitemtype, field_name):
                    queryset = queryset.select_related(field_name)

            for field_name in ('levels', ):
                if hasattr(mapitemtype, field_name):
                    queryset.prefetch_related(field_name)

            if issubclass(mapitemtype, AreaLocation):
                queryset = sorted(queryset, key=AreaLocation.get_sort_key)

            if issubclass(mapitemtype, DirectedLineGeometryMapItemWithLevel):
                results.extend(obj.to_shadow_geojson() for obj in queryset)

            results.extend(obj.to_geojson() for obj in queryset)

        return Response(results)
Exemple #3
0
def list_mapitems(request, mapitem_type, level=None):
    mapitemtype = MAPITEM_TYPES.get(mapitem_type)
    if mapitemtype is None:
        raise Http404('Unknown mapitemtype.')

    has_level = hasattr(mapitemtype, 'level') or hasattr(mapitemtype, 'levels')
    if has_level and level is None:
        raise Http404('Missing level.')
    elif not has_level and level is not None:
        return redirect('editor.mapitems', mapitem_type=mapitem_type)

    queryset = mapitemtype.objects.all().order_by('name')
    if level is not None:
        if hasattr(mapitemtype, 'level'):
            queryset = queryset.filter(level__name=level)
        elif hasattr(mapitemtype, 'levels'):
            queryset = queryset.filter(levels__name=level)

    queryset = filter_queryset_by_access(request, queryset)

    if issubclass(mapitemtype, AreaLocation):
        queryset = sorted(queryset, key=AreaLocation.get_sort_key)

    return render(
        request, 'editor/mapitems.html', {
            'mapitem_type': mapitem_type,
            'title': mapitemtype._meta.verbose_name_plural,
            'has_level': level is not None,
            'has_elevator': hasattr(mapitemtype, 'elevator'),
            'has_levels': hasattr(mapitemtype, 'levels'),
            'has_altitude': hasattr(mapitemtype, 'altitude'),
            'has_intermediate': hasattr(mapitemtype, 'intermediate'),
            'level': level,
            'items': queryset,
        })
Exemple #4
0
 def list(self, request, **kwargs):
     locations = []
     locations += list(
         filter_queryset_by_access(
             request, self._filter(LocationGroup.objects.all())))
     locations += sorted(filter_arealocations_by_access(
         request, self._filter(AreaLocation.objects.all())),
                         key=AreaLocation.get_sort_key,
                         reverse=True)
     return Response(
         [location.to_location_json() for location in locations])
Exemple #5
0
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)

    if name.startswith('g:'):
        queryset = LocationGroup.objects.filter(
            Q(name=name[2:], can_search=True))
        return filter_queryset_by_access(request, queryset).first()

    return filter_arealocations_by_access(
        request, AreaLocation.objects.filter(name=name,
                                             can_search=True)).first()
Exemple #6
0
    def list(self, request, **kwargs):
        etag = hashlib.sha256(json.dumps({
            'full_access': request.c3nav_full_access,
            'access_list': request.c3nav_access_list,
            'last_update': get_last_mapdata_update().isoformat()
        }).encode()).hexdigest()

        if_none_match = request.META.get('HTTP_IF_NONE_MATCH')
        if if_none_match:
            if if_none_match == etag:
                return HttpResponseNotModified()

        locations = []
        locations += list(filter_queryset_by_access(request, self._filter(LocationGroup.objects.all())))
        locations += sorted(filter_arealocations_by_access(request, self._filter(AreaLocation.objects.all())),
                            key=AreaLocation.get_sort_key, reverse=True)

        response = Response([location.to_location_json() for location in locations])
        response['ETag'] = etag
        response['Cache-Control'] = 'no-cache'
        return response
Exemple #7
0
def search_location(request, search):
    results = []
    location = get_location(request, search)
    if location:
        results.append(location)

    words = search.split(' ')[:10]

    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])

    queryset = AreaLocation.objects.filter(can_seach=True).order_by('name')
    if isinstance(location, AreaLocation):
        queryset.exclude(name=location.name)
    results += sorted(filter_words(
        filter_arealocations_by_access(request, queryset), words),
                      key=AreaLocation.get_sort_key,
                      reverse=True)

    return results
Exemple #8
0
 def get_queryset(self):
     return filter_queryset_by_access(self.request,
                                      super().get_queryset().all())