From b8d70299653479ec2683bc0569eb54e6d5414a81 Mon Sep 17 00:00:00 2001 From: hayano Date: Mon, 21 Oct 2024 12:48:42 +0000 Subject: [PATCH] =?UTF-8?q?=E3=82=A4=E3=83=99=E3=83=B3=E3=83=88=E3=81=ABpu?= =?UTF-8?q?blic=E3=82=84=E5=AF=BE=E5=BF=9C=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=81=AA=E3=81=A9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rog/models.py | 20 +++++++++++++++----- rog/serializers.py | 20 +++++++++++++------- rog/urls.py | 4 +++- rog/views.py | 31 ++++++++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/rog/models.py b/rog/models.py index 980f308..d12d5d5 100644 --- a/rog/models.py +++ b/rog/models.py @@ -289,13 +289,21 @@ class NewEvent2(models.Model): end_datetime = models.DateTimeField() deadlineDateTime = models.DateTimeField(null=True, blank=True) + #// Added @2024-10-21 + public = models.BooleanField(default=False) + hour_3 = models.BooleanField(default=False) + hour_5 = models.BooleanField(default=True) + class_general = models.BooleanField(default=True) + class_family = models.BooleanField(default=True) + class_solo_male = models.BooleanField(default=True) + class_solo_female = models.BooleanField(default=True) def __str__(self): return f"{self.event_name} - From:{self.start_datetime} To:{self.end_datetime}" def save(self, *args, **kwargs): if not self.deadlineDateTime: - self.deadlineDateTime = self.end_datetime - timedelta(days=7) + self.deadlineDateTime = self.end_datetime #- timedelta(days=7) super().save(*args, **kwargs) class NewEvent(models.Model): @@ -386,22 +394,24 @@ class Entry(models.Model): owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE,blank=True, null=True) # Akira 2024-7-24 zekken_number = models.IntegerField(default=0) is_active = models.BooleanField(default=True) # 新しく追加 + hasParticipated = models.BooleanField(default=False) # 新しく追加 + hasGoaled = models.BooleanField(default=False) # 新しく追加 class Meta: unique_together = ('zekken_number', 'event', 'date') def __str__(self): - return f"{self.team.zekken_number} - {self.team_name} - {self.event.event_name} - {self.date}" + return f"{self.zekken_number} - {self.team.team_name} - {self.event.event_name} - {self.date}" def clean(self): super().clean() if self.event and self.category and self.date: start = self.event.start_datetime - end = self.event.end_datetime - self.category.duration - if not (start <= self.date <= end): + end = self.event.end_datetime #- self.category.duration + if not (start.date() <= self.date.date() <= end.date()): raise ValidationError({ - 'date': f'日時は{start}から{end}の間である必要があります。' + 'date': f'日時{self.date}は{start.date()}から{end.date()}の間である必要があります。' }) # メンバーの年齢と性別をチェック diff --git a/rog/serializers.py b/rog/serializers.py index fb96b62..8d5ae3e 100644 --- a/rog/serializers.py +++ b/rog/serializers.py @@ -344,7 +344,7 @@ class NewCategorySerializer(serializers.ModelSerializer): class NewEvent2Serializer(serializers.ModelSerializer): class Meta: model = NewEvent2 - fields = ['id','event_name', 'start_datetime', 'end_datetime'] + fields = ['id','event_name', 'start_datetime', 'end_datetime', 'deadlineDateTime', 'public', 'hour_3', 'hour_5', 'class_general','class_family','class_solo_male','class_solo_female'] class NewEventSerializer(serializers.ModelSerializer): class Meta: @@ -448,7 +448,7 @@ class EntrySerializer(serializers.ModelSerializer): class Meta: model = Entry - fields = ['id','team', 'event', 'category', 'date','zekken_number','owner'] + fields = ['id','team', 'event', 'category', 'date','zekken_number','owner','is_active', 'hasParticipated', 'hasGoaled'] read_only_fields = ['id','owner'] def validate_date(self, value): @@ -494,18 +494,24 @@ class EntrySerializer(serializers.ModelSerializer): elif isinstance(entry_date, str): entry_date = datetime.strptime(entry_date, "%Y-%m-%d").date() - logger.debug(f"==== entry_date : {entry_date} ====") + logger.debug("test-0") + logger.debug(f"==== start:{event.start_datetime.date()} <= entry_date : {entry_date} <= end:{event.end_datetime.date()} ?? ====") if entry_date < event.start_datetime.date() or entry_date > event.end_datetime.date(): raise serializers.ValidationError(f"日付は{event.start_datetime.date()}から{event.end_datetime.date()}の間である必要があります。") + logger.debug("test-1") - owner = self.context['request'].user - zekken_number = data.get('zekken_number') + try: + logger.debug(f"Parsed data: team={team}, event={event}, category={category}, ") - logger.debug(f"Parsed data: team={team}, event={event}, category={category}, " - f"entry_date={entry_date}, owner={owner}, zekken_number={zekken_number}") + owner = self.context['request'].user + zekken_number = data.get('zekken_number') + logger.debug(f"entry_date={entry_date}, owner={owner}, zekken_number={zekken_number}") + + except Exception: + raise serializers.ValidationError(f"何らかのエラーが発生しました") # Check if team, event, and category exist if not Team.objects.filter(id=team.id).exists(): diff --git a/rog/urls.py b/rog/urls.py index e75a6ef..2e7862d 100644 --- a/rog/urls.py +++ b/rog/urls.py @@ -1,7 +1,7 @@ from sys import prefix from rest_framework import urlpatterns from rest_framework.routers import DefaultRouter -from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, LocationsInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder, LocationInBound, DeleteDestination, CustomAreaLocations, GetAllGifuAreas, CustomAreaNames, userDetials, UserTracksViewSet, CatByCity, ChangePasswordView, GoalImageViewSet, CheckinImageViewSet, ExtentForLocations, DeleteAccount, PrivacyView, RegistrationView, TeamViewSet,MemberViewSet,EntryViewSet,RegisterView, VerifyEmailView, NewEventListView,NewEvent2ListView,NewCategoryListView,CategoryListView, MemberUserDetailView, TeamMembersWithUserView,MemberAddView,UserActivationView,RegistrationView,TempUserRegistrationView,ResendInvitationEmailView,update_user_info,update_user_detail,ActivateMemberView, ActivateNewMemberView, PasswordResetRequestView, PasswordResetConfirmView, NewCategoryViewSet,LocationInBound2,UserLastGoalTimeView,TeamEntriesView +from .views import LocationViewSet, Location_lineViewSet, Location_polygonViewSet, Jpn_Main_PerfViewSet, LocationsInPerf, ExtentForSubPerf, SubPerfInMainPerf, ExtentForMainPerf, LocationsInSubPerf, CatView, RegistrationAPI, LoginAPI, UserAPI, UserActionViewset, UserMakeActionViewset, UserDestinations, UpdateOrder, LocationInBound, DeleteDestination, CustomAreaLocations, GetAllGifuAreas, CustomAreaNames, userDetials, UserTracksViewSet, CatByCity, ChangePasswordView, GoalImageViewSet, CheckinImageViewSet, ExtentForLocations, DeleteAccount, PrivacyView, RegistrationView, TeamViewSet,MemberViewSet,EntryViewSet,RegisterView, VerifyEmailView, NewEventListView,NewEvent2ListView,NewCategoryListView,CategoryListView, MemberUserDetailView, TeamMembersWithUserView,MemberAddView,UserActivationView,RegistrationView,TempUserRegistrationView,ResendInvitationEmailView,update_user_info,update_user_detail,ActivateMemberView, ActivateNewMemberView, PasswordResetRequestView, PasswordResetConfirmView, NewCategoryViewSet,LocationInBound2,UserLastGoalTimeView,TeamEntriesView,update_entry_status from django.urls import path, include from knox import views as knox_views @@ -108,4 +108,6 @@ urlpatterns += [ #path('admin/newevent2/csv-upload/', NewEvent2Admin.as_view({'get': 'csv_upload_view', 'post': 'csv_upload_view'}), name='rog_newevent2_csv-upload'), #path('admin/', admin.site.urls), + path('entries//update-status/', update_entry_status, name='update-entry-status'), + ] diff --git a/rog/views.py b/rog/views.py index 32d5c0b..0b74c0d 100644 --- a/rog/views.py +++ b/rog/views.py @@ -87,6 +87,31 @@ from django.core.exceptions import ValidationError logger = logging.getLogger(__name__) +@api_view(['PATCH']) +@permission_classes([IsAuthenticated]) +def update_entry_status(request, entry_id): + try: + entry = Entry.objects.get(id=entry_id) + except Entry.DoesNotExist: + return Response({"error": "Entry not found"}, status=status.HTTP_404_NOT_FOUND) + + # エントリーの所有者またはチームのメンバーのみが更新可能 + if entry.owner != request.user and not entry.team.members.filter(user=request.user).exists(): + return Response({"error": "You don't have permission to update this entry"}, status=status.HTTP_403_FORBIDDEN) + + hasParticipated = request.data.get('hasParticipated') + hasGoaled = request.data.get('hasGoaled') + + if hasParticipated is not None: + entry.hasParticipated = hasParticipated + if hasGoaled is not None: + entry.hasGoaled = hasGoaled + + entry.save() + serializer = EntrySerializer(entry) + return Response(serializer.data) + + def process_csv_upload(csv_file, event): decoded_file = csv_file.read().decode('utf-8') io_string = io.StringIO(decoded_file) @@ -109,7 +134,7 @@ class CSVUploadForm(forms.Form): csv_file = forms.FileField() class NewEvent2Admin(admin.ModelAdmin): - list_display = ['event_name', 'start_datetime', 'end_datetime'] + list_display = ['event_name', 'start_datetime', 'end_datetime', 'deadlineDateTime','public'] def get_urls(self): urls = super().get_urls() @@ -1219,9 +1244,9 @@ class TeamViewSet(viewsets.ModelViewSet): api_url = f"{settings.FRONTEND_URL}/gifuroge/update_team_name" headers = {"Content-Type": "application/x-www-form-urlencoded"} data = { - "zekken_number": zekken_number, + #"zekken_number": zekken_number, "new_team_name": team_name, - "event_code": event_code, + #"event_code": event_code, } try: response = requests.post(api_url, headers=headers, data=data)