diff --git a/rog/urls.py b/rog/urls.py index 30694c5..a3301b0 100644 --- a/rog/urls.py +++ b/rog/urls.py @@ -24,7 +24,7 @@ urlpatterns = router.urls urlpatterns += [ path('inperf/', LocationsInPerf, name="location_perf"), path('insubperf', LocationsInSubPerf, name='location_subperf'), - path('inbound', LocationInBound.as_view(), name='location_bound'), + path('inbound', LocationInBound, name='location_bound'), path('customarea/', CustomAreaLocations, name='custom_area_location'), path('subperfinmain/', SubPerfInMainPerf, name="sub_perf"), path('allgifuareas/', GetAllGifuAreas, name="gifu_area"), diff --git a/rog/views.py b/rog/views.py index a28bf8b..51e4783 100644 --- a/rog/views.py +++ b/rog/views.py @@ -53,9 +53,7 @@ class Jpn_Main_PerfViewSet(viewsets.ModelViewSet): serializer_class=JPN_main_perfSerializer filter_fields = ["adm1_ja"] -# class Jpn_PerfViewSet(viewsets.ModelViewSet): -# queryset=JpnAdminPerf.objects.all() -# serializer_class=JPN_perfSerializer + class UserTracksViewSet(viewsets.ModelViewSet): queryset = UserTracks.objects.all() @@ -126,56 +124,51 @@ def LocationsInSubPerf(request): return JsonResponse(serializer.data, safe=False) -from rest_framework.pagination import PageNumberPagination -from rest_framework.response import Response -from rest_framework.views import APIView +def LocationInBound(request): + lat1 = float(request.GET.get('la1')) + lon1 = float(request.GET.get('ln1')) + lat2 = float(request.GET.get('la2')) + lon2 = float(request.GET.get('ln2')) + lat3 = float(request.GET.get('la3')) + lon3 = float(request.GET.get('ln3')) + lat4 = float(request.GET.get('la4')) + lon4 = float(request.GET.get('ln4')) + cat = request.GET.get('cat') + grp = request.GET.get('grp') -class StandardResultsSetPagination(PageNumberPagination): - page_size = 100 - page_size_query_param = 'page_size' - max_page_size = 1000 - -class LocationInBound(APIView): - pagination_class = StandardResultsSetPagination - - def get(self, request, format=None): - lats = [request.GET.get(f'la{i}') for i in range(1, 5)] - lons = [request.GET.get(f'ln{i}') for i in range(1, 5)] - cat = request.GET.get('cat') - grp = request.GET.get('grp') - is_rog = request.GET.get('rog') - - if all(lats) and all(lons): - pl = geos.Polygon(((lons[i], lats[i]) for i in range(4)), srid=4326) - locs = Location.objects.filter(geom__within=pl, event_name__isnull=True) - - if cat: - locs = locs.filter(category=cat) + is_rog = request.GET.get('rog') + if(lat1 != None and lon1 != None and lat2 != None and lon2 != None and lat3 != None and lon3 != None and lat4 != None and lon4 != None): + pl = geos.Polygon(((lon1, lat1), (lon2, lat2), (lon3, lat3), (lon4, lat4), (lon1, lat1)), srid=4326) + if(cat): if is_rog: - locs = locs.exclude(cp=0) - - if grp: - locs = locs.filter(group__contains=grp) - - if not is_rog: - locs = locs.filter(location_name__contains='観光') - - page = self.paginate_queryset(locs) - if page is not None: - serializer = LocationSerializer(page, many=True) - return self.get_paginated_response(serializer.data) + if grp: + locs = Location.objects.filter(~Q(cp=0), geom__within=pl, category=cat, event_name__isnull=True, group__contains=grp) + else: + locs = Location.objects.filter(~Q(cp=0), geom__within=pl, category=cat, event_name__isnull=True) else: - serializer = LocationSerializer(locs, many=True) - return Response(serializer.data) - + if grp: + locs = Location.objects.filter(geom__within=pl, category=cat, event_name__isnull=True, group__contains=grp, location_name__contains='観光') + else: + locs = Location.objects.filter(geom__within=pl, category=cat, event_name__isnull=True, location_name__contains='観光') else: - return Response({}, safe=False) - - def paginate_queryset(self, queryset): - if self.paginator is None: - return None - return self.paginator.paginate_queryset(queryset, self.request, view=self) + if is_rog: + if grp: + locs = Location.objects.filter(~Q(cp=0), geom__within=pl, event_name__isnull=True, group__contains=grp) + else: + locs = Location.objects.filter(~Q(cp=0), geom__within=pl, event_name__isnull=True) + else: + if grp: + locs = Location.objects.filter(geom__within=pl, event_name__isnull=True, group__contains=grp, location_name__contains='観光') + else: + locs = Location.objects.filter(geom__within=pl, event_name__isnull=True, location_name__contains='観光') + if len(locs) > 120: + return JsonResponse({"too_many_points": True}, safe=False, status=500) + else: + serializer = LocationSerializer(locs, many=True) + return JsonResponse(serializer.data, safe=False) + else: + return JsonResponse({}, safe=False) @@ -218,8 +211,8 @@ def ExtentForMainPerf(request): def ExtentForLocations(request): user = request.user ec = user.event_code - # Use case-insensitive matching and select related fields for better performance - locs = Location.objects.filter(group__icontains=ec).aggregate(Extent('geom'), Union('geom')) + #print(user.event_code) + locs = Location.objects.filter(group__contains=ec).aggregate(Extent('geom'), Union('geom')) return JsonResponse(locs['geom__extent'], safe=False) @@ -232,40 +225,39 @@ def ExtentForSubPerf(request): def CatView(request): - try: - lat1 = float(request.GET.get('la1')) - lon1 = float(request.GET.get('ln1')) - lat2 = float(request.GET.get('la2')) - lon2 = float(request.GET.get('ln2')) - lat3 = float(request.GET.get('la3')) - lon3 = float(request.GET.get('ln3')) - lat4 = float(request.GET.get('la4')) - lon4 = float(request.GET.get('ln4')) - except (TypeError, ValueError): - # If any of the latitudes or longitudes are not provided or cannot be converted to float, - # return a bad request response - return JsonResponse({"error": "Invalid latitude or longitude"}, status=400) + lat1 = float(request.GET.get('la1')) + lon1 = float(request.GET.get('ln1')) + lat2 = float(request.GET.get('la2')) + lon2 = float(request.GET.get('ln2')) + lat3 = float(request.GET.get('la3')) + lon3 = float(request.GET.get('ln3')) + lat4 = float(request.GET.get('la4')) + lon4 = float(request.GET.get('ln4')) - pl = geos.Polygon(((lon1, lat1), (lon2, lat2), (lon3, lat3), (lon4, lat4), (lon1, lat1)), srid=4326) - c = Location.objects.filter(geom__within=pl).values('category').distinct() + if(lat1 != None and lon1 != None and lat2 != None and lon2 != None and lat3 != None and lon3 != None and lat4 != None and lon4 != None): + pl = geos.Polygon(((lon1, lat1), (lon2, lat2), (lon3, lat3), (lon4, lat4), (lon1, lat1)), srid=4326) + #locs = Location.objects.filter(geom__within=pl) + c = Location.objects.filter(geom__within=pl).values('category').distinct() + serializer = LocationCatSerializer(c, many=True) + return JsonResponse(serializer.data, safe=False) + else: + return null + + + c = Location.objects.filter().values('category').distinct() serializer = LocationCatSerializer(c, many=True) return JsonResponse(serializer.data, safe=False) - def CatByCity(request): city = request.GET.get('city') - if not city: - return JsonResponse({"error": "No city parameter provided"}, status=400) - - try: - cilt_polygon = JpnSubPerf.objects.get(adm1_ja=city) - except JpnSubPerf.DoesNotExist: - return JsonResponse({"error": f"No city found with name: {city}"}, status=404) - - cats = Location.objects.filter(geom__within=cilt_polygon.geom).values('category').distinct() - serializer = LocationCatSerializer(cats, many=True) - return JsonResponse(serializer.data, safe=False) + if(city != None): + cilt_polygon = JpnSubPerf.objects.filter(adm1_ja=city) + cats = Location.objects.filter(geom__within=cilt_polygon[0].geom).values('category').distinct() + serializer = LocationCatSerializer(cats, many=True) + return JsonResponse(serializer.data, safe=False) + else: + return None @@ -464,26 +456,38 @@ def DeleteDestination(request): return JsonResponse({"success":0}, safe=False) -class CustomAreaLocations(APIView): - def get(self, request, format=None): - cat = request.GET.get('cat') - name = request.GET.get('name') - is_rog = request.GET.get('rog') - grp = request.GET.get('grp') +def CustomAreaLocations(request): + + cat = request.GET.get('cat') + name = request.GET.get('name') + is_rog = request.GET.get('rog') + grp = request.GET.get('grp') - locs = Location.objects.filter(event_name=name, event_name__isnull=False) - - if cat: - locs = locs.filter(category=cat) + if(cat != None): if is_rog: - locs = locs.exclude(cp=0) - if grp: - locs = locs.filter(group__contains=grp) - if not is_rog: - locs = locs.filter(location_name__contains='観光') - - serializer = LocationSerializer(locs, many=True) - return Response(serializer.data) + if grp: + locs = Location.objects.filter(~Q(cp=0), event_name__isnull=False, category=cat, event_name=name, group__contains=grp) + else: + locs = Location.objects.filter(~Q(cp=0), event_name__isnull=False, category=cat, event_name=name) + else: + if grp: + locs = Location.objects.filter(event_name__isnull=False, category=cat, event_name=name, group__contains=grp, location_name__contains='観光') + else: + locs = Location.objects.filter(event_name__isnull=False, category=cat, event_name=name, location_name__contains='観光') + else: + if is_rog: + if grp: + locs = Location.objects.filter(~Q(cp=0), event_name__isnull=False, event_name=name, group__contains=grp) + else: + locs = Location.objects.filter(~Q(cp=0), event_name__isnull=False, event_name=name) + else: + if grp: + locs = Location.objects.filter(event_name__isnull=False, event_name=name, group__contains=grp, location_name__contains='観光') + else: + locs = Location.objects.filter(event_name__isnull=False, event_name=name, location_name__contains='観光') + + serializer = LocationSerializer(locs, many=True) + return JsonResponse(serializer.data, safe=False) def CustomAreaNames(request):