optimised models and views

This commit is contained in:
Mohamed Nouffer
2023-05-26 13:56:26 +05:30
parent 3afaa09c68
commit 8dbe673f9e
8 changed files with 224 additions and 156 deletions

View File

@ -1,8 +1,8 @@
from curses.ascii import NUL
from django.core.serializers import serialize
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages
from rest_framework import viewsets
from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, JPN_perfSerializer, JPN_sub_perSerializer, LocationCatSerializer, CreateUserSerializer, UserSerializer, LoginUserSerializer, UseractionsSerializer, UserDestinationSerializer, GifuAreaSerializer, LocationEventNameSerializer, RogUserSerializer, UserTracksSerializer, ChangePasswordSerializer, GolaImageSerializer, CheckinImageSerializer, RegistrationSerializer
from .serializers import LocationSerializer, Location_lineSerializer, Location_polygonSerializer, JPN_main_perfSerializer, LocationCatSerializer, CreateUserSerializer, UserSerializer, LoginUserSerializer, UseractionsSerializer, UserDestinationSerializer, GifuAreaSerializer, LocationEventNameSerializer, RogUserSerializer, UserTracksSerializer, ChangePasswordSerializer, GolaImageSerializer, CheckinImageSerializer, RegistrationSerializer
from knox.models import AuthToken
from rest_framework import viewsets, generics, status
@ -53,9 +53,9 @@ 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 Jpn_PerfViewSet(viewsets.ModelViewSet):
# queryset=JpnAdminPerf.objects.all()
# serializer_class=JPN_perfSerializer
class UserTracksViewSet(viewsets.ModelViewSet):
queryset = UserTracks.objects.all()
@ -126,51 +126,56 @@ def LocationsInSubPerf(request):
return JsonResponse(serializer.data, safe=False)
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')
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from rest_framework.views import APIView
is_rog = request.GET.get('rog')
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)
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:
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)
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)
else:
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='観光')
serializer = LocationSerializer(locs, many=True)
return Response(serializer.data)
else:
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)
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)
@ -213,8 +218,8 @@ def ExtentForMainPerf(request):
def ExtentForLocations(request):
user = request.user
ec = user.event_code
#print(user.event_code)
locs = Location.objects.filter(group__contains=ec).aggregate(Extent('geom'), Union('geom'))
# Use case-insensitive matching and select related fields for better performance
locs = Location.objects.filter(group__icontains=ec).aggregate(Extent('geom'), Union('geom'))
return JsonResponse(locs['geom__extent'], safe=False)
@ -227,39 +232,40 @@ def ExtentForSubPerf(request):
def CatView(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'))
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)
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()
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()
serializer = LocationCatSerializer(c, many=True)
return JsonResponse(serializer.data, safe=False)
def CatByCity(request):
city = request.GET.get('city')
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
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)
@ -458,38 +464,26 @@ def DeleteDestination(request):
return JsonResponse({"success":0}, safe=False)
def CustomAreaLocations(request):
cat = request.GET.get('cat')
name = request.GET.get('name')
is_rog = request.GET.get('rog')
grp = request.GET.get('grp')
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')
if(cat != None):
locs = Location.objects.filter(event_name=name, event_name__isnull=False)
if cat:
locs = locs.filter(category=cat)
if is_rog:
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)
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)
def CustomAreaNames(request):