イベントにpublicや対応クラスなどを追加

This commit is contained in:
hayano
2024-10-21 12:48:42 +00:00
parent 6f0d8d15fd
commit b8d7029965
4 changed files with 59 additions and 16 deletions

View File

@ -289,13 +289,21 @@ class NewEvent2(models.Model):
end_datetime = models.DateTimeField() end_datetime = models.DateTimeField()
deadlineDateTime = models.DateTimeField(null=True, blank=True) 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): def __str__(self):
return f"{self.event_name} - From:{self.start_datetime} To:{self.end_datetime}" return f"{self.event_name} - From:{self.start_datetime} To:{self.end_datetime}"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.deadlineDateTime: if not self.deadlineDateTime:
self.deadlineDateTime = self.end_datetime - timedelta(days=7) self.deadlineDateTime = self.end_datetime #- timedelta(days=7)
super().save(*args, **kwargs) super().save(*args, **kwargs)
class NewEvent(models.Model): 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 owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE,blank=True, null=True) # Akira 2024-7-24
zekken_number = models.IntegerField(default=0) zekken_number = models.IntegerField(default=0)
is_active = models.BooleanField(default=True) # 新しく追加 is_active = models.BooleanField(default=True) # 新しく追加
hasParticipated = models.BooleanField(default=False) # 新しく追加
hasGoaled = models.BooleanField(default=False) # 新しく追加
class Meta: class Meta:
unique_together = ('zekken_number', 'event', 'date') unique_together = ('zekken_number', 'event', 'date')
def __str__(self): 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): def clean(self):
super().clean() super().clean()
if self.event and self.category and self.date: if self.event and self.category and self.date:
start = self.event.start_datetime start = self.event.start_datetime
end = self.event.end_datetime - self.category.duration end = self.event.end_datetime #- self.category.duration
if not (start <= self.date <= end): if not (start.date() <= self.date.date() <= end.date()):
raise ValidationError({ raise ValidationError({
'date': f'日時{start}から{end}の間である必要があります。' 'date': f'日時{self.date}{start.date()}から{end.date()}の間である必要があります。'
}) })
# メンバーの年齢と性別をチェック # メンバーの年齢と性別をチェック

View File

@ -344,7 +344,7 @@ class NewCategorySerializer(serializers.ModelSerializer):
class NewEvent2Serializer(serializers.ModelSerializer): class NewEvent2Serializer(serializers.ModelSerializer):
class Meta: class Meta:
model = NewEvent2 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 NewEventSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -448,7 +448,7 @@ class EntrySerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Entry 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'] read_only_fields = ['id','owner']
def validate_date(self, value): def validate_date(self, value):
@ -494,18 +494,24 @@ class EntrySerializer(serializers.ModelSerializer):
elif isinstance(entry_date, str): elif isinstance(entry_date, str):
entry_date = datetime.strptime(entry_date, "%Y-%m-%d").date() 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(): 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()}の間である必要があります。") raise serializers.ValidationError(f"日付は{event.start_datetime.date()}から{event.end_datetime.date()}の間である必要があります。")
logger.debug("test-1")
try:
logger.debug(f"Parsed data: team={team}, event={event}, category={category}, ")
owner = self.context['request'].user owner = self.context['request'].user
zekken_number = data.get('zekken_number') zekken_number = data.get('zekken_number')
logger.debug(f"Parsed data: team={team}, event={event}, category={category}, " logger.debug(f"entry_date={entry_date}, owner={owner}, zekken_number={zekken_number}")
f"entry_date={entry_date}, owner={owner}, zekken_number={zekken_number}")
except Exception:
raise serializers.ValidationError(f"何らかのエラーが発生しました")
# Check if team, event, and category exist # Check if team, event, and category exist
if not Team.objects.filter(id=team.id).exists(): if not Team.objects.filter(id=team.id).exists():

View File

@ -1,7 +1,7 @@
from sys import prefix from sys import prefix
from rest_framework import urlpatterns from rest_framework import urlpatterns
from rest_framework.routers import DefaultRouter 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 django.urls import path, include
from knox import views as knox_views 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/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('admin/', admin.site.urls),
path('entries/<int:entry_id>/update-status/', update_entry_status, name='update-entry-status'),
] ]

View File

@ -87,6 +87,31 @@ from django.core.exceptions import ValidationError
logger = logging.getLogger(__name__) 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): def process_csv_upload(csv_file, event):
decoded_file = csv_file.read().decode('utf-8') decoded_file = csv_file.read().decode('utf-8')
io_string = io.StringIO(decoded_file) io_string = io.StringIO(decoded_file)
@ -109,7 +134,7 @@ class CSVUploadForm(forms.Form):
csv_file = forms.FileField() csv_file = forms.FileField()
class NewEvent2Admin(admin.ModelAdmin): 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): def get_urls(self):
urls = super().get_urls() urls = super().get_urls()
@ -1219,9 +1244,9 @@ class TeamViewSet(viewsets.ModelViewSet):
api_url = f"{settings.FRONTEND_URL}/gifuroge/update_team_name" api_url = f"{settings.FRONTEND_URL}/gifuroge/update_team_name"
headers = {"Content-Type": "application/x-www-form-urlencoded"} headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = { data = {
"zekken_number": zekken_number, #"zekken_number": zekken_number,
"new_team_name": team_name, "new_team_name": team_name,
"event_code": event_code, #"event_code": event_code,
} }
try: try:
response = requests.post(api_url, headers=headers, data=data) response = requests.post(api_url, headers=headers, data=data)