Files
rogaining_srv/rog/views.py

1113 lines
46 KiB
Python
Raw Normal View History

2024-07-25 00:57:48 +00:00
from rest_framework import serializers
from django.db import IntegrityError
from django.urls import reverse
from .utils import send_activation_email
import uuid
from rest_framework.exceptions import ValidationError as DRFValidationError
from django.db import transaction
from django.db.models import F
from rest_framework import viewsets, permissions, status
from rest_framework.decorators import action
from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from .models import Team, Member, CustomUser, NewCategory
from .serializers import TeamSerializer, MemberSerializer, CustomUserSerializer, TeamDetailSerializer,UserUpdateSerializer
from .permissions import IsTeamOwner
2022-10-06 17:42:12 +05:30
from curses.ascii import NUL
2022-03-14 10:50:11 +05:30
from django.core.serializers import serialize
2024-07-25 00:57:48 +00:00
from .models import GoalImages, Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, CustomUser, UserTracks, GoalImages, CheckinImages, NewEvent,NewEvent2, Team, Category, NewCategory,Entry, Member, TempUser,EntryMember
2022-03-14 10:50:11 +05:30
from rest_framework import viewsets
2024-07-24 00:38:32 +00:00
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, MemberWithUserSerializer
2022-04-27 15:47:37 +05:30
from knox.models import AuthToken
2022-03-16 17:46:22 +05:30
2022-10-18 14:58:20 +05:30
from rest_framework import viewsets, generics, status
2022-03-14 10:50:11 +05:30
from rest_framework.response import Response
from rest_framework.parsers import JSONParser, MultiPartParser
2022-03-23 09:21:17 +05:30
from .serializers import LocationSerializer
2022-03-30 16:17:48 +05:30
from django.http import JsonResponse
2022-10-06 17:42:12 +05:30
from rest_framework.permissions import IsAuthenticated
2022-12-27 18:01:18 +05:30
from django.contrib.gis.db.models import Extent, Union
2022-03-14 10:50:11 +05:30
2024-07-26 04:03:15 +00:00
from .serializers import TestSerialiser,NewEventSerializer,NewEvent2Serializer, TeamSerializer, NewCategorySerializer,CategorySerializer, EntrySerializer, MemberSerializer, TempUserSerializer, CustomUserSerializer,EntryMemberSerializer,MemberCreationSerializer,EntryCreationSerializer
2022-05-12 02:15:36 +05:30
from .models import TestModel
from django.shortcuts import get_object_or_404
from django.db.models import F
2022-05-16 18:36:38 +05:30
from django.contrib.gis import geos
2022-06-06 21:15:07 +05:30
from django.db.models import Q
2022-05-12 02:15:36 +05:30
2022-10-18 14:58:20 +05:30
from rest_framework import permissions
from rest_framework.views import APIView
from rest_framework.decorators import api_view
from rest_framework.decorators import api_view, permission_classes
from rest_framework.parsers import JSONParser, MultiPartParser
from django.views.decorators.csrf import csrf_exempt
2023-01-09 17:11:03 +05:30
from django.shortcuts import render
2024-07-24 00:38:32 +00:00
from .permissions import IsMemberOrTeamOwner
2022-10-18 14:58:20 +05:30
2024-07-24 00:38:32 +00:00
from django.utils.decorators import method_decorator
from django.utils.encoding import force_str
2022-03-14 10:50:11 +05:30
2024-07-25 00:57:48 +00:00
import logging
logger = logging.getLogger(__name__)
2022-03-14 10:50:11 +05:30
class LocationViewSet(viewsets.ModelViewSet):
queryset=Location.objects.all()
serializer_class=LocationSerializer
2022-03-23 09:21:17 +05:30
filter_fields=["prefecture", "location_name"]
2022-03-14 10:50:11 +05:30
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
2022-03-16 17:46:22 +05:30
class Jpn_Main_PerfViewSet(viewsets.ModelViewSet):
2022-06-08 21:40:43 +05:30
queryset=JpnAdminMainPerf.objects.filter(id=9)
2022-03-16 17:46:22 +05:30
serializer_class=JPN_main_perfSerializer
2022-03-23 09:21:17 +05:30
filter_fields = ["adm1_ja"]
2022-03-14 10:50:11 +05:30
2023-05-26 14:54:43 +05:30
2022-03-14 10:50:11 +05:30
2022-06-13 01:55:45 +05:30
class UserTracksViewSet(viewsets.ModelViewSet):
queryset = UserTracks.objects.all()
serializer_class = UserTracksSerializer
2022-03-14 10:50:11 +05:30
2022-03-30 16:17:48 +05:30
def LocationsInPerf(request):
perfecture = request.GET.get('perf')
2022-08-23 19:08:56 +05:30
is_rog = request.GET.get('rog')
2022-04-27 15:47:37 +05:30
cat = request.GET.get('cat')
2022-09-05 19:10:39 +05:30
grp = request.GET.get('grp')
2022-03-30 16:17:48 +05:30
perf_geom = JpnAdminMainPerf.objects.get(id=perfecture)
2022-04-27 15:47:37 +05:30
if(cat):
2022-08-23 19:08:56 +05:30
if is_rog:
2022-09-05 19:10:39 +05:30
if grp:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom, category=cat, group__contains=grp)
2022-09-05 19:10:39 +05:30
else:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom, category=cat)
2022-08-23 19:08:56 +05:30
else:
2022-09-05 19:10:39 +05:30
if grp:
locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat, group__contains=grp, location_name__contains='観光')
2022-09-05 19:10:39 +05:30
else:
locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat, location_name__contains='観光')
2022-04-27 15:47:37 +05:30
else:
2022-08-23 19:08:56 +05:30
if is_rog:
2022-09-05 19:10:39 +05:30
if grp:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom, group__contains=grp)
2022-09-05 19:10:39 +05:30
else:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom)
2022-08-23 19:08:56 +05:30
else:
2022-09-05 19:10:39 +05:30
if grp:
locs = Location.objects.filter(geom__within=perf_geom.geom, group__contains=grp, location_name__contains='観光')
2022-09-05 19:10:39 +05:30
else:
locs = Location.objects.filter(geom__within=perf_geom.geom, location_name__contains='観光')
2022-04-27 15:47:37 +05:30
2022-03-30 16:17:48 +05:30
serializer = LocationSerializer(locs, many=True)
return JsonResponse(serializer.data, safe=False)
2022-04-18 11:33:49 +05:30
def LocationsInSubPerf(request):
subperfecture = request.GET.get('subperf')
2022-08-23 19:08:56 +05:30
is_rog = request.GET.get('rog')
2022-04-27 15:47:37 +05:30
cat = request.GET.get('cat')
2022-09-05 19:10:39 +05:30
grp = request.GET.get('grp')
2022-04-18 11:33:49 +05:30
perf_geom = JpnSubPerf.objects.get(id=subperfecture)
2022-04-27 15:47:37 +05:30
if(cat):
2022-08-23 19:08:56 +05:30
if is_rog:
2022-09-05 19:10:39 +05:30
if grp:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom, category=cat, group__contains=grp)
2022-09-05 19:10:39 +05:30
else:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom, category=cat)
2022-08-23 19:08:56 +05:30
else:
2022-09-05 19:10:39 +05:30
if grp:
locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat, group__contains=grp, location_name__contains='観光')
2022-09-05 19:10:39 +05:30
else:
locs = Location.objects.filter(geom__within=perf_geom.geom, category=cat, location_name__contains='観光')
2022-04-27 15:47:37 +05:30
else:
2022-08-23 19:08:56 +05:30
if is_rog:
2022-09-05 19:10:39 +05:30
if grp:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom, group__contains=grp)
2022-09-05 19:10:39 +05:30
else:
2022-09-27 21:10:59 +05:30
locs = Location.objects.filter(~Q(cp=0), geom__within=perf_geom.geom)
2022-08-23 19:08:56 +05:30
else:
locs = Location.objects.filter(geom__within=perf_geom.geom, location_name__contains='観光')
2022-04-18 11:33:49 +05:30
serializer = LocationSerializer(locs, many=True)
return JsonResponse(serializer.data, safe=False)
2022-05-16 18:36:38 +05:30
2023-05-26 14:54:43 +05:30
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')
2023-05-26 13:56:26 +05:30
2023-05-26 14:54:43 +05:30
is_rog = request.GET.get('rog')
2022-05-17 19:11:52 +05:30
2023-05-26 14:54:43 +05:30
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):
2022-08-26 18:31:54 +05:30
if is_rog:
2023-05-26 14:54:43 +05:30
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)
2022-08-26 18:31:54 +05:30
else:
2023-05-26 14:54:43 +05:30
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='観光')
2022-05-17 19:21:59 +05:30
else:
2023-05-26 14:54:43 +05:30
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)
2022-05-16 18:36:38 +05:30
2022-03-30 16:17:48 +05:30
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)
2022-04-02 16:20:48 +05:30
2022-04-05 16:36:21 +05:30
def SubPerfInMainPerf(request):
2022-06-06 21:15:07 +05:30
area = request.GET.get('area')
perf_geom = GifuAreas.objects.get(id=area)
sub = JpnSubPerf.objects.filter(geom__contained=perf_geom.geom)
2022-04-27 15:47:37 +05:30
#serializer = JPN_sub_perSerializer
2022-04-05 16:36:21 +05:30
#sub = JpnAdminPerf.objects.filter(geom__within=perf_geom.geom)
serializer = JPN_sub_perSerializer(sub, many=True)
return JsonResponse(serializer.data, safe=False)
2022-06-06 21:15:07 +05:30
def GetAllGifuAreas(request):
prefecture = request.GET.get('perf')
perf_geom = JpnAdminMainPerf.objects.get(id=prefecture)
sub = GifuAreas.objects.filter(geom__contained=perf_geom.geom)
serializer = GifuAreaSerializer(sub, many=True)
return JsonResponse(serializer.data, safe=False)
2022-04-05 16:36:21 +05:30
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)
2022-12-29 19:19:43 +05:30
@api_view(['POST',])
@permission_classes((IsAuthenticated,))
@csrf_exempt
2022-12-27 18:01:18 +05:30
def ExtentForLocations(request):
2022-12-29 19:19:43 +05:30
user = request.user
2023-01-20 17:18:07 +05:30
ec = user.event_code
2023-05-26 14:54:43 +05:30
#print(user.event_code)
locs = Location.objects.filter(group__contains=ec).aggregate(Extent('geom'), Union('geom'))
2022-12-27 18:01:18 +05:30
return JsonResponse(locs['geom__extent'], safe=False)
2022-04-02 16:20:48 +05:30
def ExtentForSubPerf(request):
sub_perf_id = request.GET.get('sub_perf')
2022-04-05 16:36:21 +05:30
sub_perf = JpnSubPerf.objects.get(id=sub_perf_id)
2022-04-02 16:20:48 +05:30
ext = sub_perf.geom.extent
# iata = serializers.serialize("json",ext)
return JsonResponse(ext, safe=False)
2022-04-27 15:47:37 +05:30
def CatView(request):
2023-05-26 14:54:43 +05:30
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'))
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()
2022-04-27 15:47:37 +05:30
serializer = LocationCatSerializer(c, many=True)
return JsonResponse(serializer.data, safe=False)
2022-07-24 14:17:45 +05:30
def CatByCity(request):
city = request.GET.get('city')
2023-05-26 14:54:43 +05:30
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
2022-07-24 14:17:45 +05:30
2022-04-27 15:47:37 +05:30
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]
})
2024-01-26 11:43:29 +05:30
2022-04-27 15:47:37 +05:30
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]
})
2024-07-25 00:57:48 +00:00
class UserUpdateAPI(generics.UpdateAPIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = UserUpdateSerializer
def get_object(self):
return self.request.user
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
return Response(serializer.data)
2022-04-27 15:47:37 +05:30
class UserAPI(generics.RetrieveAPIView):
2022-10-18 14:58:20 +05:30
permission_classes = [permissions.IsAuthenticated,]
2022-04-27 15:47:37 +05:30
serializer_class = UserSerializer
def get_object(self):
2022-05-12 02:15:36 +05:30
return self.request.user
2022-10-18 14:58:20 +05:30
# @api_view(['POST',])
# @permission_classes((IsAuthenticated,))
# @csrf_exempt
2022-11-05 14:31:55 +05:30
# class GoalImageViewSet(APIView):
# permissions_classes = [permissions.IsAuthenticated,]
# # parser_classes = [MultiPartParser, JSONParser]
# def post(self, request, format=None):
# # print(request.data)
# serializer = GolaImageSerializer(data=request.data)
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data, status=status.HttP_200_OK)
# else:
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# return Response({"ok":"ok"})
2022-10-18 14:58:20 +05:30
class GoalImageViewSet(viewsets.ModelViewSet):
queryset=GoalImages.objects.all()
serializer_class=GolaImageSerializer
# parser_classes = (MultiPartParser, JSONParser)
def get_queryset(self):
queryset = GoalImages.objects.all()
# dist = self.request.GET.get('dist')
# if dist != None :
# queryset = Incident.objects.filter(entity=dist, is_approved=True)
# else:
# queryset = Incident.objects.filter(is_approved=True)
return queryset
2022-11-05 18:11:00 +05:30
class CheckinImageViewSet(viewsets.ModelViewSet):
queryset=CheckinImages.objects.all()
serializer_class=CheckinImageSerializer
# parser_classes = (MultiPartParser, JSONParser)
def get_queryset(self):
queryset = CheckinImages.objects.all()
# dist = self.request.GET.get('dist')
# if dist != None :
# queryset = Incident.objects.filter(entity=dist, is_approved=True)
# else:
# queryset = Incident.objects.filter(is_approved=True)
return queryset
2024-01-26 11:43:29 +05:30
class RetrieveUserView(generics.RetrieveAPIView):
queryset = CustomUser.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated]
def get_object(self):
return self.request.user
2022-11-05 18:11:00 +05:30
2022-05-12 02:15:36 +05:30
2022-06-08 21:40:43 +05:30
def userDetials(request):
user_id = request.GET.get('user_id')
user = CustomUser.objects.get(id=user_id)
rogUser = RogUser.objects.filter(user=user)
serializer = RogUserSerializer(rogUser, many=True)
return JsonResponse(serializer.data, safe=False)
2023-01-06 16:09:41 +05:30
@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
def DeleteAccount(request):
usr = request.user;
#print("user is" + usr)
if(usr):
#usr.delete()
usr.email = usr.email + "_res" + str(uuid.uuid4())
usr.save();
AuthToken.objects.filter(user=usr).delete()
return Response({"result":"user deleted"})
return Response({"result":"user not found"})
2022-06-08 21:40:43 +05:30
2022-05-12 02:15:36 +05:30
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)
2022-06-08 21:40:43 +05:30
rec = Useractions.objects.filter(user=user, wanttogo=True).order_by('order')
2022-05-12 02:15:36 +05:30
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)
2022-05-25 18:25:42 +05:30
def DeleteDestination(request):
dest_id = int(request.GET.get('dest_id'))
print("###### dest ")
print(dest_id)
if(dest_id != None):
Useractions.objects.filter(id=dest_id).delete()
return JsonResponse({"success":1}, safe=False)
else:
return JsonResponse({"success":0}, safe=False)
2022-06-06 21:15:07 +05:30
2023-05-26 14:54:43 +05:30
def CustomAreaLocations(request):
cat = request.GET.get('cat')
name = request.GET.get('name')
is_rog = request.GET.get('rog')
grp = request.GET.get('grp')
2023-05-26 13:56:26 +05:30
2023-05-26 14:54:43 +05:30
if(cat != None):
2022-08-23 19:08:56 +05:30
if is_rog:
2023-05-26 14:54:43 +05:30
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)
2022-06-06 21:15:07 +05:30
2022-05-12 02:15:36 +05:30
2022-06-08 21:40:43 +05:30
def CustomAreaNames(request):
locs = Location.objects.filter(event_name__isnull=False).values('event_name').distinct()
serializer = LocationEventNameSerializer(locs, many=True)
return JsonResponse(serializer.data, safe=False)
2022-05-12 02:15:36 +05:30
2024-07-25 00:57:48 +00:00
class UserActivationView(APIView):
2024-07-26 04:03:15 +00:00
def get(self, request, activation_token):
try:
temp_user = TempUser.objects.get(verification_code=activation_token)
user = CustomUser.objects.create(
email=temp_user.email,
firstname=temp_user.firstname,
lastname=temp_user.lastname,
date_of_birth=temp_user.date_of_birth,
female=temp_user.female,
is_active=True
)
# Here you might want to add the user to the team they were invited to
temp_user.delete()
return Response({"message": "アカウントが正常にアクティベートされました。"}, status=status.HTTP_200_OK)
except TempUser.DoesNotExist:
return Response({"error": "無効なアクティベーショントークンです。"}, status=status.HTTP_400_BAD_REQUEST)
'''
2024-07-25 00:57:48 +00:00
def get(self, request, activation_token):
try:
user = CustomUser.objects.get(activation_token=activation_token, is_active=False)
user.is_active = True
user.activation_token = None
user.save()
return Response({"message": "アカウントが正常にアクティベートされました。"}, status=status.HTTP_200_OK)
except CustomUser.DoesNotExist:
return Response({"error": "無効なアクティベーショントークンです。"}, status=status.HTTP_400_BAD_REQUEST)
2024-07-26 04:03:15 +00:00
'''
2024-07-25 00:57:48 +00:00
2022-10-06 17:42:12 +05:30
class ChangePasswordView(generics.UpdateAPIView):
"""
An endpoint for changing password.
"""
serializer_class = ChangePasswordSerializer
model = CustomUser
permission_classes = (IsAuthenticated,)
def get_object(self, queryset=None):
obj = self.request.user
return obj
def update(self, request, *args, **kwargs):
self.object = self.get_object()
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
# Check old password
if not self.object.check_password(serializer.data.get("old_password")):
return Response({"old_password": ["Wrong password."]}, status=status.HTTP_400_BAD_REQUEST)
# set_password also hashes the password that the user will get
self.object.set_password(serializer.data.get("new_password"))
self.object.save()
response = {
'status': 'success',
'code': status.HTTP_200_OK,
'message': 'Password updated successfully',
'data': []
}
return Response(response)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
2022-05-12 02:15:36 +05:30
class TestActionViewSet(viewsets.ModelViewSet):
serializer_class = TestSerialiser
2022-09-27 17:52:14 +05:30
queryset = TestModel.objects.all()
2023-01-09 17:11:03 +05:30
def PrivacyView(request):
return render(request, "rog/privacy.html")
2023-05-03 16:12:53 +05:30
class RegistrationView(APIView):
def post(self, request):
serializer = RegistrationSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
2024-07-24 00:38:32 +00:00
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# Akira
2024-07-25 00:57:48 +00:00
class NewEvent2ViewSet(viewsets.ModelViewSet):
queryset = NewEvent2.objects.all()
serializer_class = NewEvent2Serializer
permission_classes = [IsAuthenticated]
class NewEvent2ListView(generics.ListAPIView):
queryset = NewEvent2.objects.all()
serializer_class = NewEvent2Serializer
permission_classes = [IsAuthenticated]
2024-07-24 00:38:32 +00:00
class NewEventViewSet(viewsets.ModelViewSet):
queryset = NewEvent.objects.all()
serializer_class = NewEventSerializer
permission_classes = [IsAuthenticated]
class NewEventListView(generics.ListAPIView):
queryset = NewEvent.objects.all()
serializer_class = NewEventSerializer
permission_classes = [IsAuthenticated]
class TeamViewSet(viewsets.ModelViewSet):
serializer_class = TeamSerializer
2024-07-25 00:57:48 +00:00
permission_classes = [permissions.IsAuthenticated, IsTeamOwner]
def get_queryset(self):
return Team.objects.filter(owner=self.request.user)
2024-07-24 00:38:32 +00:00
def perform_create(self, serializer):
2024-07-25 00:57:48 +00:00
with transaction.atomic():
category = serializer.validated_data['category']
category = NewCategory.objects.select_for_update().get(id=category.id)
zekken_number = category.category_number
category.category_number = F('category_number') + 1
category.save()
category.refresh_from_db() # F() 式の結果を評価
serializer.save(owner=self.request.user, zekken_number=zekken_number)
def destroy(self, request, *args, **kwargs):
team = self.get_object()
if team.members.exists():
return Response({"error": "チームにメンバーが残っているため削除できません。"}, status=status.HTTP_400_BAD_REQUEST)
return super().destroy(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
try:
return super().update(request, *args, **kwargs)
except Exception as e:
return Response({"error": "更新に失敗しました。競合が発生した可能性があります。"}, status=status.HTTP_409_CONFLICT)
@action(detail=True, methods=['post'])
def copy(self, request, pk=None):
original_team = self.get_object()
with transaction.atomic():
category = NewCategory.objects.select_for_update().get(id=original_team.category.id)
new_zekken_number = category.category_number
category.category_number = F('category_number') + 1
category.save()
category.refresh_from_db() # F() 式の結果を評価
new_team = Team.objects.create(
zekken_number=new_zekken_number,
team_name=f"{original_team.team_name} (コピー)",
category=category,
owner=request.user
)
for member in original_team.members.all():
Member.objects.create(
team=new_team,
user=member.user
)
return Response(TeamSerializer(new_team).data, status=status.HTTP_201_CREATED)
class NewCategoryViewSet(viewsets.ModelViewSet):
queryset = NewCategory.objects.all()
serializer_class = NewCategorySerializer
permission_classes = [IsAuthenticated]
class NewCategoryListView(generics.ListAPIView):
queryset = NewCategory.objects.all()
serializer_class = NewCategorySerializer
permission_classes = [IsAuthenticated]
2024-07-24 00:38:32 +00:00
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = [IsAuthenticated]
class CategoryListView(generics.ListAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = [IsAuthenticated]
'''
def get(self, request):
categories = Category.objects.all()
data = []
for category in categories:
category_name = force_str(category.category_name)
data.append({
'category_name': category_name,
# その他のフィールド
})
return Response(data)
'''
class EntryViewSet(viewsets.ModelViewSet):
2024-07-26 04:03:15 +00:00
#queryset = Entry.objects.all()
2024-07-24 00:38:32 +00:00
serializer_class = EntrySerializer
permission_classes = [permissions.IsAuthenticated]
2024-07-25 00:57:48 +00:00
#def perform_create(self, serializer):
# team = Team.objects.get(owner=self.request.user)
# serializer.save(team=team)
def get_queryset(self):
user = self.request.user
# ユーザーが所属するチームのIDを取得
team_ids = Member.objects.filter(user=user).values_list('team_id', flat=True)
# そのチームに関連するエントリーを取得
return Entry.objects.filter(team__id__in=team_ids)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
except DRFValidationError as e:
2024-07-26 04:03:15 +00:00
return Response({'error': self.format_errors(e.detail)}, status=status.HTTP_400_BAD_REQUEST)
# except IntegrityError:
# return Response({'error': '既に登録済みです'}, status=status.HTTP_400_BAD_REQUEST)
except IntegrityError as e:
return Response({'error': f'データベースエラー: {str(e)}'}, status=status.HTTP_400_BAD_REQUEST)
2024-07-25 00:57:48 +00:00
2024-07-26 04:03:15 +00:00
except Exception as e:
return Response({'error': f"予期せぬエラーが発生しました: {str(e),'type': str(type(e))}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
2024-07-25 00:57:48 +00:00
2024-07-24 00:38:32 +00:00
def perform_create(self, serializer):
2024-07-25 00:57:48 +00:00
serializer.save(owner=self.request.user)
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
2024-07-24 00:38:32 +00:00
2024-07-25 00:57:48 +00:00
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
2024-07-24 00:38:32 +00:00
2024-07-26 04:03:15 +00:00
def get_error_message(self, exception):
if hasattr(exception, 'detail'):
if isinstance(exception.detail, dict):
return '. '.join([f"{key}: {', '.join(value)}" for key, value in exception.detail.items()])
elif isinstance(exception.detail, list):
return '. '.join(exception.detail)
return str(exception)
def format_errors(self, errors):
if isinstance(errors, list):
return '. '.join(errors)
elif isinstance(errors, dict):
return '. '.join([f"{key}: {value}" if isinstance(value, str) else f"{key}: {', '.join(value)}" for key, value in errors.items()])
else:
return str(errors)
2024-07-24 00:38:32 +00:00
class MemberViewSet(viewsets.ModelViewSet):
2024-07-26 04:03:15 +00:00
#serializer_class = MemberSerializer
2024-07-25 00:57:48 +00:00
permission_classes = [permissions.IsAuthenticated,IsTeamOwner]
2024-07-26 04:03:15 +00:00
def get_serializer_class(self):
if self.action == 'create':
return MemberCreationSerializer
return MemberSerializer
2024-07-25 00:57:48 +00:00
def get_queryset(self):
team_id = self.kwargs['team_id']
return Member.objects.filter(team_id=team_id)
2024-07-26 04:03:15 +00:00
def create(self, request, *args, **kwargs):
team = Team.objects.get(id=self.kwargs['team_id'])
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
email = serializer.validated_data.get('email', '')
user_data = {
'firstname': serializer.validated_data.get('firstname', ''),
'lastname': serializer.validated_data.get('lastname', ''),
'date_of_birth': serializer.validated_data.get('date_of_birth'),
'female': serializer.validated_data.get('female', False),
'is_active': True
}
if not email or email.startswith('dummy_'):
# 直接登録
if email:
user, created = CustomUser.objects.get_or_create(
email=email,
defaults=user_data
)
else:
# emailが空の場合、一意のダミーメールアドレスを生成
dummy_email = f"dummy_{uuid.uuid4()}@example.com"
user = CustomUser.objects.create(email=dummy_email, **user_data)
member = Member.objects.create(user=user, team=team)
return Response(MemberSerializer(member).data, status=status.HTTP_201_CREATED)
#member = serializer.save(team=team)
#return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
# 仮登録
existing_user = CustomUser.objects.filter(email=email).first()
if existing_user:
# 既存ユーザーの場合、チーム招待メールを送信
self.send_invitation_email(existing_user, team)
return Response({"message": "Invitation sent to existing user."}, status=status.HTTP_200_OK)
else:
print("新規ユーザー")
# 新規ユーザーの場合、TempUserを作成してアクティベーションメールを送信
temp_user = TempUser.objects.create(
email=email,
**user_data,
verification_code=str(uuid.uuid4())
)
self.send_activation_email(temp_user, team)
return Response({"message": "Verification email sent to the user."}, status=status.HTTP_201_CREATED)
'''
2024-07-25 00:57:48 +00:00
def create(self, request, *args, **kwargs):
team = Team.objects.get(id=self.kwargs['team_id'])
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
self.perform_create(serializer)
except DRFValidationError as e:
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
#except ValidationError as e:
# return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
except IntegrityError:
return Response({"error": "このユーザーは既にチームのメンバーです。"}, status=status.HTTP_400_BAD_REQUEST)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
2024-07-26 04:03:15 +00:00
'''
def send_activation_email(self, temp_user, team):
# アクティベーションメール送信のロジックをここに実装
# 注意: 'user-activation' URLパターンが存在しない場合は、適切なURLを生成する方法を検討する必要があります
activation_url = "dummy url" #f"{settings.FRONTEND_URL}/activate/{temp_user.verification_code}"
# ここでemailを送信するロジックを実装
print(f"Activation email would be sent to {temp_user.email} with URL: {activation_url}")
def send_invitation_email(self, user, team):
# チーム招待メール送信のロジック
#invitation_url = self.request.build_absolute_uri(
# reverse('team-invite', kwargs={'team_id': team.id, 'user_id': user.id})
#)
#subject = f"Invitation to join {team.name}"
#message = f"You have been invited to join the team {team.name}. Click here to accept: {invitation_url}"
#from_email = settings.DEFAULT_FROM_EMAIL
#recipient_list = [user.email]
#send_mail(subject, message, from_email, recipient_list)
# チーム招待メール送信のロジックをここに実装
# 注意: 'team-invitation' URLパターンが存在しない場合は、適切なURLを生成する方法を検討する必要があります
# 例えば、フロントエンドのURLを直接指定する方法など
invitation_url = "dummy url" #f"{settings.FRONTEND_URL}/team/{team.id}/invite"
# ここでemailを送信するロジックを実装
print(f"Invitation email would be sent to {user.email} with URL: {invitation_url}")
2024-07-25 00:57:48 +00:00
def perform_create(self, serializer):
team = Team.objects.get(id=self.kwargs['team_id'])
serializer.save(team=team)
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
if not instance.user.email.startswith('dummy_'):
return Response({"error": "このユーザーの情報は更新できません。"}, status=status.HTTP_400_BAD_REQUEST)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def get_object(self):
queryset = self.get_queryset()
member_id = self.kwargs['pk']
obj = get_object_or_404(queryset, id=member_id)
self.check_object_permissions(self.request, obj)
return obj
class OwnerEntriesView(generics.ListAPIView):
serializer_class = EntrySerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
user = self.request.user
return Entry.objects.filter(owner=user)
class OwnerTeamsView(generics.ListAPIView):
serializer_class = TeamSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
user = self.request.user
return Team.objects.filter(owner=user)
class OwnerMembersView(generics.ListAPIView):
2024-07-24 00:38:32 +00:00
serializer_class = MemberSerializer
permission_classes = [permissions.IsAuthenticated]
2024-07-25 00:57:48 +00:00
def get_queryset(self):
user = self.request.user
return Member.objects.filter(team__owner=user)
class MemberAddView(APIView):
def post(self, request, team_id):
logger.info(f"Received request to add member to team {team_id}")
logger.debug(f"Request data: {request.data}")
team = get_object_or_404(Team, id=team_id)
logger.info(f"Found team: {team}")
serializer = MemberSerializer(data=request.data)
if serializer.is_valid():
logger.info("Serializer is valid")
try:
member = serializer.save(team=team)
logger.info(f"Member added successfully: {member}")
return Response(serializer.data, status=status.HTTP_201_CREATED)
except Exception as e:
logger.error(f"Error saving member: {str(e)}")
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)
else:
logger.error(f"Serializer errors: {serializer.errors}")
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
2024-07-24 00:38:32 +00:00
class TempUserViewSet(viewsets.ModelViewSet):
queryset = TempUser.objects.all()
serializer_class = TempUserSerializer
permission_classes = [IsAuthenticated]
# CustomUserViewSetの修正
class CustomUserViewSet(viewsets.ModelViewSet):
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
user = self.request.user
if user.is_staff:
return CustomUser.objects.all()
return CustomUser.objects.filter(id=user.id)
class TeamMembersView(generics.ListAPIView):
serializer_class = MemberSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
team_id = self.kwargs['team_id']
return Member.objects.filter(team_id=team_id)
# ユーザーのエントリーを取得するビュー
class UserEntriesView(generics.ListAPIView):
serializer_class = EntrySerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
user = self.request.user
return Entry.objects.filter(team__owner=user)
# イベントのカテゴリーを取得するビュー
class EventCategoriesView(generics.ListAPIView):
2024-07-26 04:03:15 +00:00
serializer_class = NewCategorySerializer
2024-07-24 00:38:32 +00:00
permission_classes = [IsAuthenticated]
def get_queryset(self):
event_id = self.kwargs['event_id']
2024-07-26 04:03:15 +00:00
return NewCategory.objects.filter(entry__event_id=event_id).distinct()
2024-07-24 00:38:32 +00:00
class RegisterView(APIView):
def post(self, request):
serializer = TempUserSerializer(data=request.data)
if serializer.is_valid():
temp_user = serializer.save()
verification_code = uuid.uuid4()
temp_user.verification_code = verification_code
temp_user.save()
verification_url = request.build_absolute_uri(
reverse('verify-email', kwargs={'verification_code': verification_code})
)
send_mail(
'Verify your email',
f'Click the link to verify your email: {verification_url}',
settings.DEFAULT_FROM_EMAIL,
[temp_user.email],
fail_silently=False,
)
return Response({'message': 'Verification email sent'}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class VerifyEmailView(APIView):
def get(self, request, verification_code):
try:
temp_user = TempUser.objects.get(verification_code=verification_code)
if temp_user.is_valid():
user_data = {
'email': temp_user.email,
'is_rogaining': temp_user.is_rogaining,
'zekken_number': temp_user.zekken_number,
'event_code': temp_user.event_code,
'team_name': temp_user.team_name,
'group': temp_user.group,
'firstname': temp_user.firstname,
'lastname': temp_user.lastname,
'date_of_birth': temp_user.date_of_birth,
'female': temp_user.female,
}
# CustomUserを作成
user = CustomUser.objects.create_user(
email=user_data['email'],
password=temp_user.password,
**{k: v for k, v in user_data.items() if k != 'email'}
)
temp_user.delete()
return Response({'message': 'Email verified and user created'}, status=status.HTTP_201_CREATED)
else:
return Response({'message': 'Verification link expired'}, status=status.HTTP_400_BAD_REQUEST)
except TempUser.DoesNotExist:
return Response({'message': 'Invalid verification code'}, status=status.HTTP_400_BAD_REQUEST)
class MemberUserDetailView(generics.RetrieveAPIView):
serializer_class = MemberWithUserSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
return Member.objects.select_related('user', 'team')
class TeamMembersWithUserView(generics.ListAPIView):
serializer_class = MemberWithUserSerializer
permission_classes = [IsAuthenticated]
def get_queryset(self):
team_id = self.kwargs['team_id']
return Member.objects.filter(team_id=team_id).select_related('user', 'team')