API debugging 1 まだ問題あり

This commit is contained in:
2024-07-26 04:03:15 +00:00
parent c0fb177d02
commit 9215ba8f9f
4 changed files with 339 additions and 98 deletions

View File

@ -18,6 +18,9 @@ from .utils import send_activation_email
from .models import TestModel
import logging
from django.shortcuts import get_object_or_404
from django.utils import timezone
from datetime import datetime, date
logger = logging.getLogger(__name__)
@ -221,9 +224,10 @@ class NewEventSerializer(serializers.ModelSerializer):
fields = ['event_name', 'start_datetime', 'end_datetime']
class TeamSerializer(serializers.ModelSerializer):
#category = serializers.PrimaryKeyRelatedField(queryset=NewCategory.objects.all())
category = serializers.PrimaryKeyRelatedField(queryset=NewCategory.objects.all())
category = NewCategorySerializer(read_only=True)
#category = serializers.IntegerField()
#category = NewCategorySerializer(read_only=True)
#category_id = serializers.PrimaryKeyRelatedField(
# queryset=NewCategory.objects.all(),
# source='category',
@ -239,32 +243,60 @@ class TeamSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['category'] = {
'id': instance.category.id,
'category_name': instance.category.category_name,
'category_number': instance.category.category_number
}
if instance.category:
ret['category'] = {
'id': instance.category.id,
'category_name': instance.category.category_name,
'category_number': instance.category.category_number
}
else:
ret['category'] = None
ret['owner'] = CustomUserSerializer(instance.owner).data
return ret
def validate_category(self, value):
if not NewCategory.objects.filter(id=value.id).exists():
raise serializers.ValidationError("Invalid category ID.")
if not isinstance(value, NewCategory):
raise serializers.ValidationError("Invalid category")
return value
#if not NewCategory.objects.filter(id=value).exists():
# raise serializers.ValidationError("Invalid category ID")
#return value
def create(self, validated_data):
category = validated_data.pop('category')
team = Team.objects.create(category=category, **validated_data)
return team
return Team.objects.create(**validated_data)
#category_id = validated_data.pop('category')
#category = get_object_or_404(NewCategory, id=category_id)
#team = Team.objects.create(category=category, **validated_data)
#team.category = category
#return team
#category = validated_data.pop('category')
#team = Team.objects.create(category=category, **validated_data)
#return team
#logger.debug(f"Creating team with data: {validated_data}")
#validated_data['owner'] = self.context['request'].user
#return super().create(validated_data)
def update(self, instance, validated_data):
if 'category' in validated_data:
instance.category = validated_data.pop('category')
return super().update(instance, validated_data)
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()
return instance
#if 'category' in validated_data:
# category_id = validated_data.pop('category')
# category = get_object_or_404(NewCategory, id=category_id)
# instance.category = category
#return super().update(instance, validated_data)
#if 'category' in validated_data:
# instance.category = validated_data.pop('category')
#return super().update(instance, validated_data)
class CategorySerializer(serializers.ModelSerializer):
class Meta:
@ -273,27 +305,98 @@ class CategorySerializer(serializers.ModelSerializer):
class EntrySerializer(serializers.ModelSerializer):
team = serializers.PrimaryKeyRelatedField(queryset=Team.objects.all())
event = serializers.PrimaryKeyRelatedField(queryset=NewEvent.objects.all())
event = serializers.PrimaryKeyRelatedField(queryset=NewEvent2.objects.all())
category = serializers.PrimaryKeyRelatedField(queryset=NewCategory.objects.all())
owner = serializers.PrimaryKeyRelatedField(read_only=True)
date = serializers.DateTimeField(input_formats=['%Y-%m-%d'])
#date = serializers.DateTimeField(default_timezone=timezone.get_current_timezone())
class Meta:
model = Entry
fields = ['id','team', 'event', 'category', 'date','owner']
read_only_fields = ['id','owner']
def validate_date(self, value):
if isinstance(value, str):
try:
value = datetime.strptime(value, "%Y-%m-%d")
except ValueError:
raise serializers.ValidationError("Invalid date format. Use YYYY-MM-DD.")
if isinstance(value, date):
value = datetime.combine(value, datetime.min.time())
if timezone.is_naive(value):
return timezone.make_aware(value, timezone.get_current_timezone())
return value
#if isinstance(value, date):
# # dateオブジェクトをdatetimeオブジェクトに変換
# value = datetime.combine(value, datetime.min.time())
#if timezone.is_naive(value):
# return timezone.make_aware(value, timezone.get_current_timezone())
#return value
def validate_team(self, value):
if not value.members.exists():
raise serializers.ValidationError("チームにメンバーが登録されていません。")
return value
def validate_date(self, value):
if isinstance(value, datetime):
return value.date()
return value
def validate(self, data):
team = data.get('team')
event = data.get('event')
category = data.get('category')
entry_date = data.get('date')
owner = self.context['request'].user
# Check if team, event, and category exist
if not Team.objects.filter(id=team.id).exists():
raise serializers.ValidationError("指定されたチームは存在しません。")
if not NewEvent2.objects.filter(id=event.id).exists():
raise serializers.ValidationError("指定されたイベントは存在しません。")
if not NewCategory.objects.filter(id=category.id).exists():
raise serializers.ValidationError("指定されたカテゴリーは存在しません。")
# Check for unique constraint
if Entry.objects.filter(team=team, event=event, date__date=entry_date, owner=owner).exists():
raise serializers.ValidationError("既に登録済みです。")
return data
def to_internal_value(self, data):
# dateフィールドが文字列で来た場合の処理
if 'date' in data and isinstance(data['date'], str):
try:
# 文字列をdatetimeオブジェクトに変換
data['date'] = datetime.strptime(data['date'], "%Y-%m-%d")
except ValueError:
raise serializers.ValidationError({"date": "無効な日付形式です。YYYY-MM-DD形式を使用してください。"})
return super().to_internal_value(data)
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['team'] = instance.team.team_name
ret['event'] = instance.event.event_name
ret['category'] = instance.category.category_name
ret['owner'] = instance.owner.email
if isinstance(ret['date'], datetime):
ret['date'] = ret['date'].date().isoformat()
return ret
#def to_representation(self, instance):
# ret = super().to_representation(instance)
# ret['team'] = instance.team.team_name
# ret['event'] = instance.event.event_name
# ret['category'] = instance.category.category_name
# ret['owner'] = instance.owner.email
# return ret
class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
@ -326,6 +429,15 @@ class UserUpdateSerializer(serializers.ModelSerializer):
instance.save()
return instance
class MemberCreationSerializer(serializers.Serializer):
#email = serializers.EmailField()
email = serializers.EmailField(allow_blank=True, required=False)
firstname = serializers.CharField(required=False)
lastname = serializers.CharField(required=False)
date_of_birth = serializers.DateField(required=False)
female = serializers.BooleanField(required=False)
class MemberWithUserSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
@ -335,7 +447,7 @@ class MemberWithUserSerializer(serializers.ModelSerializer):
fields = ['user', 'team']
class MemberSerializer(serializers.ModelSerializer):
user = CustomUserSerializer()
user = CustomUserSerializer(read_only=True)
team = TeamDetailSerializer(read_only=True)
#email = serializers.EmailField(write_only=True, required=False)
@ -347,50 +459,29 @@ class MemberSerializer(serializers.ModelSerializer):
class Meta:
model = Member
fields = ['id','user','team'] # ,'email','firstname','lastname','date_of_birth','female']
#read_only_fields = ['id', 'team']
read_only_fields = ['id', 'team']
'''
def create(self, validated_data):
team = validated_data['team']
email = validated_data.get('email')
if email:
user, created = CustomUser.objects.get_or_create(email=email)
if created:
user.firstname = validated_data.get('firstname', '')
user.lastname = validated_data.get('lastname', '')
user.date_of_birth = validated_data.get('date_of_birth')
user.female = validated_data.get('female', False)
user.is_active = False
user.activation_token = str(uuid.uuid4())
user.save()
activation_link = self.context['request'].build_absolute_uri(
reverse('user-activation', kwargs={'activation_token': user.activation_token})
)
try:
send_activation_email(user, activation_link)
except Exception as e:
logger.error(f"アクティベーションメールの送信中にエラーが発生しました: {str(e)}")
# メール送信に失敗しても、ユーザー作成は続行します
else:
dummy_email = f"dummy_{uuid.uuid4()}@example.com"
user = CustomUser.objects.create(
email=dummy_email,
firstname=validated_data.get('firstname', ''),
lastname=validated_data.get('lastname', ''),
date_of_birth=validated_data.get('date_of_birth'),
female=validated_data.get('female', False),
is_active=True
if email.startswith('dummy_'):
user, _ = CustomUser.objects.get_or_create(
email=email,
defaults={**user_data, 'is_active': True}
)
else:
user, _ = CustomUser.objects.get_or_create(
email=email,
defaults={**user_data, 'is_active': False}
)
try:
member = Member.objects.create(user=user, team=team)
except IntegrityError:
# ユーザーがすでにチームのメンバーの場合
raise serializers.ValidationError("このユーザーは既にチームのメンバーです。")
member = Member.objects.create(user=user, **validated_data)
return member
'''
def update(self, instance, validated_data):
user_data = validated_data.pop('user', {})