version 4.8.17 -- カレンダーで今日以降しか選べないようにした
This commit is contained in:
282
rog/views.py
282
rog/views.py
@ -1,3 +1,4 @@
|
||||
from django.core.exceptions import ValidationError as DjangoValidationError
|
||||
from .models import JpnSubPerf # このインポート文をファイルの先頭に追加
|
||||
from django.contrib.auth import get_user_model
|
||||
User = get_user_model()
|
||||
@ -45,7 +46,7 @@ from django.contrib.gis.db.models import Extent, Union
|
||||
from .serializers import TestSerialiser,NewEventSerializer,NewEvent2Serializer, TeamSerializer, NewCategorySerializer,CategorySerializer, EntrySerializer, MemberSerializer, TempUserSerializer, CustomUserSerializer,EntryMemberSerializer,MemberCreationSerializer,EntryCreationSerializer
|
||||
from .models import TestModel
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.db.models import F
|
||||
from django.db.models import Max
|
||||
from django.contrib.gis import geos
|
||||
from django.db.models import Q
|
||||
|
||||
@ -64,6 +65,10 @@ from django.utils.encoding import force_str
|
||||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
from django.contrib.gis.measure import D
|
||||
from django.contrib.gis.geos import Point
|
||||
from django.contrib.gis.db.models.functions import Distance
|
||||
|
||||
from django.utils.dateparse import parse_date
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -285,9 +290,103 @@ def LocationsInSubPerf(request):
|
||||
#
|
||||
# この関数は、主に観光関連の位置情報を特定の地理的範囲内で検索し、様々な条件でフィルタリングすることができます。ROGフラグの有無によって検索条件が変わるのが特徴的です。
|
||||
#
|
||||
|
||||
def LocationInBound(request):
|
||||
logger.debug(f"Received request parameters: {request.GET}")
|
||||
|
||||
lat = float(request.GET.get('la1'))
|
||||
lon = float(request.GET.get('ln1'))
|
||||
cat = request.GET.get('cat')
|
||||
grp = request.GET.get('grp')
|
||||
is_rog = request.GET.get('rog')
|
||||
|
||||
logger.debug(f"Parsed parameters: lat={lat}, lon={lon}, "
|
||||
f"cat={cat}, grp={grp}, is_rog={is_rog}")
|
||||
|
||||
if lat is not None and lon is not None:
|
||||
current_point = Point(lon, lat, srid=4326)
|
||||
|
||||
# 10km四方の領域を指定
|
||||
distance_from_point = 40000 # 中心から10km(半径)
|
||||
|
||||
base_query = Location.objects.filter(
|
||||
geom__distance_lte=(current_point, D(m=distance_from_point))
|
||||
).annotate(distance=Distance('geom', current_point)).order_by('distance')
|
||||
|
||||
#if cat:
|
||||
# base_query = base_query.filter(category=cat)
|
||||
|
||||
#if is_rog:
|
||||
#base_query = base_query.filter(~Q(cp=0))
|
||||
#else:
|
||||
# base_query = base_query.filter(location_name__contains='観光')
|
||||
|
||||
if grp:
|
||||
base_query = base_query.filter(group__contains=grp)
|
||||
|
||||
logger.debug(f"Final query: {base_query.query}")
|
||||
|
||||
locs = base_query
|
||||
|
||||
logger.debug(f"Number of locations found: {len(locs)}")
|
||||
|
||||
print(f"====== {len(locs)} check points is loaded.. ======")
|
||||
|
||||
if len(locs) > 200:
|
||||
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({"error": "Latitude and longitude are required"}, safe=False, status=400)
|
||||
|
||||
def LocationInBound2(request):
|
||||
logger.debug(f"Received request parameters: {request.GET}")
|
||||
|
||||
lat = float(request.GET.get('la1'))
|
||||
lon = float(request.GET.get('ln1'))
|
||||
cat = request.GET.get('cat')
|
||||
grp = request.GET.get('grp')
|
||||
is_rog = request.GET.get('rog')
|
||||
|
||||
logger.debug(f"Parsed parameters: lat={lat}, lon={lon}, "
|
||||
f"cat={cat}, grp={grp}, is_rog={is_rog}")
|
||||
|
||||
if lat is not None and lon is not None:
|
||||
if grp:
|
||||
# grpがある場合、最初に絞り込む
|
||||
base_query = Location.objects.filter(group__contains=grp)
|
||||
else:
|
||||
current_point = Point(lon, lat, srid=4326)
|
||||
# 10km四方の領域を指定
|
||||
distance_from_point = 40000 # 中心から10km(半径)
|
||||
|
||||
base_query = Location.objects.filter(
|
||||
geom__distance_lte=(current_point, D(m=distance_from_point))
|
||||
).annotate(distance=Distance('geom', current_point)).order_by('distance')
|
||||
|
||||
if grp:
|
||||
base_query = base_query.filter(group__contains=grp)
|
||||
|
||||
logger.debug(f"Final query: {base_query.query}")
|
||||
locs = base_query
|
||||
logger.debug(f"Number of locations found: {len(locs)}")
|
||||
print(f"====== {len(locs)} check points is loaded.. ======")
|
||||
|
||||
if len(locs) > 200:
|
||||
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({"error": "Latitude and longitude are required"}, safe=False, status=400)
|
||||
|
||||
|
||||
|
||||
def LocationInBound_orig(request):
|
||||
logger.debug(f"Received request parameters: {request.GET}")
|
||||
|
||||
lat1 = float(request.GET.get('la1'))
|
||||
lon1 = float(request.GET.get('ln1'))
|
||||
lat2 = float(request.GET.get('la2'))
|
||||
@ -305,6 +404,9 @@ def LocationInBound(request):
|
||||
f"lat3={lat3}, lon3={lon3}, lat4={lat4}, lon4={lon4}, "
|
||||
f"cat={cat}, grp={grp}, is_rog={is_rog}")
|
||||
|
||||
print(f"===== cat={cat}, grp={grp}, is_rog={is_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)
|
||||
logger.debug(f"Created polygon: {pl}")
|
||||
@ -329,6 +431,7 @@ def LocationInBound(request):
|
||||
logger.debug(f"Number of locations found: {len(locs)}")
|
||||
|
||||
|
||||
print(f"====== {len(locs)} check points is loaded.. ======")
|
||||
'''
|
||||
if(cat):
|
||||
if is_rog:
|
||||
@ -403,9 +506,29 @@ 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'))
|
||||
return JsonResponse(locs['geom__extent'], safe=False)
|
||||
print(user.event_code)
|
||||
logger.debug(f"ExtentForLocations called for user: {user.email}, event_code: {ec}")
|
||||
|
||||
if not ec:
|
||||
logger.warning(f"ExtentForLocations: No event_code for user {user.email}")
|
||||
return JsonResponse({"error": "No event code associated with the user"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
try:
|
||||
locs = Location.objects.filter(group__contains=ec).aggregate(Extent('geom'), Union('geom'))
|
||||
|
||||
if not locs['geom__extent']:
|
||||
logger.info(f"No locations found for event_code: {ec}")
|
||||
return JsonResponse({"error": "No locations found for the given event code"}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
logger.info(f"Successfully retrieved extent for event_code: {ec}")
|
||||
return JsonResponse(locs['geom__extent'], safe=False)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error in ExtentForLocations: {str(e)}", exc_info=True)
|
||||
return JsonResponse({"error": "An error occurred while processing your request"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||
|
||||
#locs = Location.objects.filter(group__contains=ec).aggregate(Extent('geom'), Union('geom'))
|
||||
#return JsonResponse(locs['geom__extent'], safe=False)
|
||||
|
||||
|
||||
def ExtentForSubPerf_old(request):
|
||||
@ -597,23 +720,23 @@ class UserAPI(generics.RetrieveAPIView):
|
||||
def get_object(self):
|
||||
return self.request.user
|
||||
|
||||
# @api_view(['POST',])
|
||||
# @permission_classes((IsAuthenticated,))
|
||||
# @csrf_exempt
|
||||
# class GoalImageViewSet(APIView):
|
||||
# permissions_classes = [permissions.IsAuthenticated,]
|
||||
# # parser_classes = [MultiPartParser, JSONParser]
|
||||
@api_view(['POST',])
|
||||
@permission_classes((IsAuthenticated,))
|
||||
@csrf_exempt
|
||||
class GoalImageViewSet_old(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)
|
||||
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"})
|
||||
return Response({"ok":"ok"})
|
||||
|
||||
class GoalImageViewSet(viewsets.ModelViewSet):
|
||||
queryset=GoalImages.objects.all()
|
||||
@ -1219,12 +1342,18 @@ class EntryViewSet(viewsets.ModelViewSet):
|
||||
category.refresh_from_db()
|
||||
|
||||
team = serializer.validated_data['team']
|
||||
event = serializer.validated_data['event']
|
||||
event_name = event.event_name # イベント名を取得
|
||||
|
||||
entry = serializer.save(owner=self.request.user, zekken_number=zekken_number)
|
||||
|
||||
logger.info(f"team.owner = {team.owner}, event_name = {event_name}")
|
||||
logger.info(f"team = {team}")
|
||||
|
||||
# 外部システムの更新
|
||||
success = self.register_team(
|
||||
entry.zekken_number,
|
||||
team.owner.event_code,
|
||||
event_name,
|
||||
team.team_name,
|
||||
category.category_name,
|
||||
team.owner.password
|
||||
@ -1234,6 +1363,17 @@ class EntryViewSet(viewsets.ModelViewSet):
|
||||
raise serializers.ValidationError("外部システムの更新に失敗しました。")
|
||||
logger.info("External system registered successfully")
|
||||
|
||||
def create(self, request, *args, **kwargs):
|
||||
serializer = self.get_serializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
try:
|
||||
self.perform_create(serializer)
|
||||
headers = self.get_success_headers(serializer.data)
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
|
||||
except DjangoValidationError as e:
|
||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
def register_team(self, zekken_number, event_code, team_name, category_name, password):
|
||||
api_url = f"{settings.FRONTEND_URL}/gifuroge/register_team"
|
||||
headers = {"Content-Type": "application/x-www-form-urlencoded"}
|
||||
@ -1244,6 +1384,7 @@ class EntryViewSet(viewsets.ModelViewSet):
|
||||
"class_name": category_name,
|
||||
"password": password
|
||||
}
|
||||
logger.info(f"data= {data}");
|
||||
try:
|
||||
response = requests.post(api_url, headers=headers, data=data)
|
||||
response.raise_for_status()
|
||||
@ -1253,6 +1394,33 @@ class EntryViewSet(viewsets.ModelViewSet):
|
||||
logger.error(f"Failed to register team. Error: {str(e)}")
|
||||
return False
|
||||
|
||||
def update(self, request, *args, **kwargs):
|
||||
logger.info(f"Update method called for Entry with ID: {kwargs.get('pk')}")
|
||||
logger.debug(f"Request data: {request.data}")
|
||||
|
||||
partial = kwargs.pop('partial', False)
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance, data=request.data, partial=partial)
|
||||
|
||||
try:
|
||||
serializer.is_valid(raise_exception=True)
|
||||
logger.debug(f"Serializer validated data: {serializer.validated_data}")
|
||||
except serializers.ValidationError as e:
|
||||
logger.error(f"Validation error: {e.detail}")
|
||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
try:
|
||||
self.perform_update(serializer)
|
||||
logger.info(f"Entry updated successfully: {serializer.data}")
|
||||
except Exception as e:
|
||||
logger.exception(f"Error updating Entry: {str(e)}")
|
||||
return Response({"error": "An error occurred while updating the entry."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||
|
||||
#if getattr(instance, '_prefetched_objects_cache', None):
|
||||
# instance._prefetched_objects_cache = {}
|
||||
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
# def create(self, request, *args, **kwargs):
|
||||
# serializer = self.get_serializer(data=request.data)
|
||||
@ -1435,30 +1603,34 @@ class MemberViewSet(viewsets.ModelViewSet):
|
||||
else:
|
||||
logger.info("Processing as temporary registration")
|
||||
|
||||
# 仮登録
|
||||
existing_user = CustomUser.objects.filter(email=email).first()
|
||||
if existing_user:
|
||||
logger.info(f"Existing user found: {existing_user.id}")
|
||||
|
||||
# 既存ユーザーの場合、チーム招待メールを送信
|
||||
send_team_join_email(request.user,existing_user, team)
|
||||
return Response({"message": "Invitation for your team sent to existing user."}, status=status.HTTP_200_OK)
|
||||
else:
|
||||
logger.info("Inviting new temporary user")
|
||||
|
||||
try:
|
||||
print("新規ユーザー")
|
||||
#temp_user = TempUser.objects.create(
|
||||
# email=email,
|
||||
# **user_data,
|
||||
# verification_code=str(uuid.uuid4())
|
||||
#)
|
||||
send_invitation_email(request.user,request,email, team) #仮登録済みでも確認メールを送る。
|
||||
logger.info(f"Invitation email sent to: {email}")
|
||||
return Response({"message": "Invitation email sent to the user."}, status=status.HTTP_201_CREATED)
|
||||
except Exception as e:
|
||||
logger.info(f"Error on Invitation email sent to: {email} : {e}")
|
||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||
try:
|
||||
# 仮登録
|
||||
existing_user = CustomUser.objects.filter(email=email).first()
|
||||
if existing_user:
|
||||
logger.info(f"Existing user found: {existing_user.id}")
|
||||
|
||||
# 既存ユーザーの場合、チーム招待メールを送信
|
||||
send_team_join_email(request,request.user,existing_user, team)
|
||||
return Response({"message": "Invitation for your team sent to existing user."}, status=status.HTTP_200_OK)
|
||||
else:
|
||||
logger.info("Inviting new temporary user")
|
||||
|
||||
try:
|
||||
print("新規ユーザー")
|
||||
#temp_user = TempUser.objects.create(
|
||||
# email=email,
|
||||
# **user_data,
|
||||
# verification_code=str(uuid.uuid4())
|
||||
#)
|
||||
send_invitation_email(request.user,request,email, team) #仮登録済みでも確認メールを送る。
|
||||
logger.info(f"Invitation email sent to: {email}")
|
||||
return Response({"message": "Invitation email sent to the user."}, status=status.HTTP_201_CREATED)
|
||||
except Exception as e:
|
||||
logger.info(f"Error on Invitation email sent to: {email} : {e}")
|
||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in create method: {str(e)}")
|
||||
return Response({"error": "An unexpected error occurred."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||
|
||||
|
||||
'''
|
||||
@ -1945,3 +2117,25 @@ class PasswordResetConfirmView(APIView):
|
||||
return Response({"error": "Invalid reset link"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class UserLastGoalTimeView(APIView):
|
||||
def get(self, request, user_id):
|
||||
try:
|
||||
user = CustomUser.objects.get(id=user_id)
|
||||
last_goal = GoalImages.objects.filter(
|
||||
user=user
|
||||
).aggregate(last_goal_time=Max('goaltime'))
|
||||
|
||||
if last_goal['last_goal_time']:
|
||||
return Response({
|
||||
'user_email': user.email,
|
||||
'last_goal_time': last_goal['last_goal_time']
|
||||
})
|
||||
else:
|
||||
return Response({
|
||||
'message': 'No goal records found for this user'
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
except CustomUser.DoesNotExist:
|
||||
return Response({
|
||||
'message': 'User not found'
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user