イベントにpublicや対応クラスなどを追加
This commit is contained in:
@ -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()}の間である必要があります。'
|
||||||
})
|
})
|
||||||
|
|
||||||
# メンバーの年齢と性別をチェック
|
# メンバーの年齢と性別をチェック
|
||||||
|
|||||||
@ -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():
|
||||||
|
|||||||
@ -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'),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|||||||
31
rog/views.py
31
rog/views.py
@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user