from django.core.serializers import serialize from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, JpnAdminPerf, JpnSubPerf, Useractions, CustomUser 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 from knox.models import AuthToken from rest_framework import viewsets, permissions, generics from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.parsers import JSONParser, MultiPartParser from .serializers import LocationSerializer from django.http import JsonResponse from .serializers import TestSerialiser from .models import TestModel from django.shortcuts import get_object_or_404 from django.db.models import F from django.contrib.gis import geos class LocationViewSet(viewsets.ModelViewSet): queryset=Location.objects.all() serializer_class=LocationSerializer filter_fields=["prefecture", "location_name"] class Location_lineViewSet(viewsets.ModelViewSet): queryset=Location_line.objects.all() serializer_class=Location_lineSerializer class Location_polygonViewSet(viewsets.ModelViewSet): queryset=Location_polygon.objects.all() serializer_class=Location_polygonSerializer class Jpn_Main_PerfViewSet(viewsets.ModelViewSet): queryset=JpnAdminMainPerf.objects.all() serializer_class=JPN_main_perfSerializer filter_fields = ["adm1_ja"] class Jpn_PerfViewSet(viewsets.ModelViewSet): queryset=JpnAdminPerf.objects.all() serializer_class=JPN_perfSerializer def LocationsInPerf(request): perfecture = request.GET.get('perf') cat = request.GET.get('cat') perf_geom = JpnAdminMainPerf.objects.get(id=perfecture) if(cat): locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat) else: locs = Location.objects.filter(geom__within=perf_geom.geom) serializer = LocationSerializer(locs, many=True) return JsonResponse(serializer.data, safe=False) def LocationsInSubPerf(request): subperfecture = request.GET.get('subperf') cat = request.GET.get('cat') perf_geom = JpnSubPerf.objects.get(id=subperfecture) if(cat): locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat) else: locs = Location.objects.filter(geom__within=perf_geom.geom) serializer = LocationSerializer(locs, many=True) 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') 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): locs = Location.objects.filter(geom__within=pl, category=cat) else: locs = Location.objects.filter(geom__within=pl) res = Location.objects.filter(geom__within=pl) if len(res) > 50: return JsonResponse({"too_many_points": True}, safe=False, status=500) serializer = LocationSerializer(res, many=True) return JsonResponse(serializer.data, safe=False) else: return JsonResponse({}, safe=False) def SubInPerf(request): prefecture = request.GET.get('perf') perf_geom = JpnAdminMainPerf.objects.get(id=prefecture) sub = JpnAdminPerf.objects.filter(geom__within=perf_geom.geom) serializer = JPN_perfSerializer(sub, many=True) return JsonResponse(serializer.data, safe=False) def SubPerfInMainPerf(request): prefecture = request.GET.get('perf') perf_geom = JpnAdminMainPerf.objects.get(id=prefecture) sub = JpnSubPerf.objects.filter(geom__within=perf_geom.geom) #serializer = JPN_sub_perSerializer #sub = JpnAdminPerf.objects.filter(geom__within=perf_geom.geom) serializer = JPN_sub_perSerializer(sub, many=True) return JsonResponse(serializer.data, safe=False) def ExtentForMainPerf(request): perf_id = request.GET.get('perf') perf = JpnAdminMainPerf.objects.get(id=perf_id) ext = perf.geom.extent # iata = serializers.serialize("json",ext) return JsonResponse(ext, safe=False) def ExtentForSubPerf(request): sub_perf_id = request.GET.get('sub_perf') sub_perf = JpnSubPerf.objects.get(id=sub_perf_id) ext = sub_perf.geom.extent # iata = serializers.serialize("json",ext) return JsonResponse(ext, safe=False) def CatView(request): c = Location.objects.values('category').distinct() serializer = LocationCatSerializer(c, many=True) return JsonResponse(serializer.data, safe=False) class RegistrationAPI(generics.GenericAPIView): serializer_class = CreateUserSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() return Response({ "user": UserSerializer(user, context=self.get_serializer_context()).data, "token": AuthToken.objects.create(user)[1] }) class LoginAPI(generics.GenericAPIView): serializer_class = LoginUserSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data return Response({ "user": UserSerializer(user, context=self.get_serializer_context()).data, "token": AuthToken.objects.create(user)[1] }) class UserAPI(generics.RetrieveAPIView): permission_classes = [permissions.IsAuthenticated, ] serializer_class = UserSerializer def get_object(self): return self.request.user def UserActionViewset(request): user_id = request.GET.get('user_id') location_id = request.GET.get('location_id') location = Location.objects.get(location_id=location_id) user = CustomUser.objects.get(id=user_id) action = Useractions.objects.filter(location=location, user=user) serializer = UseractionsSerializer(action, many=True) return JsonResponse(serializer.data, safe=False) def UserMakeActionViewset(request): user_id = request.GET.get('user_id') location_id = request.GET.get('location_id') wanttogo = True if request.GET.get('wanttogo') == "true" else False like = True if request.GET.get('like') == "true" else False checkin = True if request.GET.get('checkin') == "true" else False location = Location.objects.get(location_id=location_id) user = CustomUser.objects.get(id=user_id) #action = Useractions.objects.filter(location__id=location_id, user__id=user_id) rec = Useractions.objects.filter(user=user, location=location) if(rec): obj = rec.update(wanttogo=wanttogo, like=like, checkin=checkin) else: obj, created = Useractions.objects.update_or_create(user=user, location=location, wanttogo=wanttogo, like=like, checkin=checkin) serializer = UseractionsSerializer(obj, many=False) return JsonResponse(serializer.data, safe=False) def UserDestinations(request): user_id = request.GET.get('user_id') user = CustomUser.objects.get(id=user_id) #action = Useractions.objects.filter(location__id=location_id, user__id=user_id) rec = Useractions.objects.filter(user=user, checkin=True).order_by('order') serializer = UserDestinationSerializer(rec, many=True) return JsonResponse(serializer.data, safe=False) def UpdateOrder(request): dir = request.GET.get('dir') user_action_id = int(request.GET.get('user_action_id')) order = int(request.GET.get('order')) aorder = int(request.GET.get('order')) oorder = int(request.GET.get('order')) if(user_action_id): #updated = Useractions.objects.filter(order__gte=order).update(order = F('order')+1) #res = Useractions.objects.filter(id=user_action_id).update(order=order) index = 0 if dir == "up": for id in Useractions.objects.all().order_by('order').values_list('id', flat=True): print(id) print("----",user_action_id) if index == order : index += 1 print("index increated .....") if user_action_id == id: Useractions.objects.filter(id=id).update(order=order) print("updated .....") continue Useractions.objects.filter(id=id).update(order=index) index += 1 else : for id in Useractions.objects.all().order_by('order').values_list('id', flat=True): print(id) print("----",user_action_id) if index == order : index -= 1 print("index increated .....") if user_action_id == id: Useractions.objects.filter(id=id).update(order=order) print("updated .....") continue Useractions.objects.filter(id=id).update(order=index) index += 1 # for id in Useractions.objects.values_list('order', flat=True): # aorder -= 1 # Useractions.objects.filter(order__lt=id).update(order=aorder) # res = Useractions.objects.filter(id=user_action_id).update(order=oorder) return JsonResponse(1, safe=False) else: return JsonResponse({}, safe=False) class TestActionViewSet(viewsets.ModelViewSet): serializer_class = TestSerialiser queryset = TestModel.objects.all()