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
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)
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, })
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])
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()
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
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
def get_queryset(self): return filter_queryset_by_access(self.request, super().get_queryset().all())