API debugging 1 まだ問題あり
This commit is contained in:
@ -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', {})
|
||||
|
||||
Reference in New Issue
Block a user