Finish basic API implementation
This commit is contained in:
@ -14,7 +14,7 @@ from django.db import transaction
|
||||
from rest_framework import serializers
|
||||
from rest_framework_gis.serializers import GeoFeatureModelSerializer
|
||||
from sqlalchemy.sql.functions import mode
|
||||
from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, UserTracks, GoalImages, CheckinImages,CustomUser,NewEvent,NewEvent2, Team, NewCategory, Category, Entry, Member, TempUser,EntryMember
|
||||
from .models import Location, Location_line, Location_polygon, JpnAdminMainPerf, Useractions, GifuAreas, RogUser, UserTracks, GoalImages, CheckinImages,CustomUser,NewEvent,NewEvent2, Team, NewCategory, Category, Entry, Member, TempUser,EntryMember, AppVersion, UploadedImage
|
||||
from drf_extra_fields.fields import Base64ImageField
|
||||
|
||||
#from django.contrib.auth.models import User
|
||||
@ -37,10 +37,54 @@ class LocationCatSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class LocationSerializer(GeoFeatureModelSerializer):
|
||||
# evaluation_valueに基づくインタラクション情報を追加
|
||||
interaction_type = serializers.SerializerMethodField()
|
||||
requires_photo = serializers.SerializerMethodField()
|
||||
requires_qr_code = serializers.SerializerMethodField()
|
||||
interaction_instructions = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model=Location
|
||||
geo_field='geom'
|
||||
fields="__all__"
|
||||
|
||||
def get_interaction_type(self, obj):
|
||||
"""evaluation_valueに基づくインタラクションタイプを返す"""
|
||||
try:
|
||||
from .location_interaction import get_interaction_type
|
||||
return get_interaction_type(obj)['type']
|
||||
except ImportError:
|
||||
return obj.evaluation_value or "0"
|
||||
|
||||
def get_requires_photo(self, obj):
|
||||
"""写真撮影が必要かどうかを返す"""
|
||||
try:
|
||||
from .location_interaction import get_interaction_type
|
||||
return get_interaction_type(obj)['requires_photo']
|
||||
except ImportError:
|
||||
return obj.evaluation_value == "1"
|
||||
|
||||
def get_requires_qr_code(self, obj):
|
||||
"""QRコードスキャンが必要かどうかを返す"""
|
||||
try:
|
||||
from .location_interaction import should_use_qr_code
|
||||
return should_use_qr_code(obj)
|
||||
except ImportError:
|
||||
return obj.evaluation_value == "2" or getattr(obj, 'use_qr_code', False)
|
||||
|
||||
def get_interaction_instructions(self, obj):
|
||||
"""インタラクション手順を返す"""
|
||||
try:
|
||||
from .location_interaction import get_interaction_type
|
||||
return get_interaction_type(obj)['instructions']
|
||||
except ImportError:
|
||||
evaluation_value = obj.evaluation_value or "0"
|
||||
if evaluation_value == "1":
|
||||
return "商品の写真を撮影してください。買い物をすることでポイントを獲得できます"
|
||||
elif evaluation_value == "2":
|
||||
return "QRコードをスキャンしてクイズに答えてください"
|
||||
else:
|
||||
return "この場所でチェックインしてポイントを獲得してください"
|
||||
|
||||
|
||||
class Location_lineSerializer(GeoFeatureModelSerializer):
|
||||
@ -343,9 +387,29 @@ class NewCategorySerializer(serializers.ModelSerializer):
|
||||
#fields = ['id','category_name', 'category_number']
|
||||
|
||||
class NewEvent2Serializer(serializers.ModelSerializer):
|
||||
# API変更要求書対応: deadline_datetime フィールド追加
|
||||
deadline_datetime = serializers.DateTimeField(source='deadlineDateTime', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = NewEvent2
|
||||
fields = ['id','event_name', 'start_datetime', 'end_datetime', 'deadlineDateTime', 'public', 'hour_3', 'hour_5', 'class_general','class_family','class_solo_male','class_solo_female']
|
||||
fields = [
|
||||
'id', 'event_name', 'start_datetime', 'end_datetime',
|
||||
'deadlineDateTime', 'deadline_datetime', 'status', 'public',
|
||||
'hour_3', 'hour_5', 'class_general', 'class_family',
|
||||
'class_solo_male', 'class_solo_female'
|
||||
]
|
||||
|
||||
def to_representation(self, instance):
|
||||
"""レスポンス形式を調整"""
|
||||
data = super().to_representation(instance)
|
||||
|
||||
# publicフィールドからstatusへの移行サポート
|
||||
if not data.get('status') and data.get('public'):
|
||||
data['status'] = 'public'
|
||||
elif not data.get('status'):
|
||||
data['status'] = 'draft'
|
||||
|
||||
return data
|
||||
|
||||
class NewEventSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
@ -450,8 +514,13 @@ class EntrySerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Entry
|
||||
fields = ['id','team', 'event', 'category', 'date','zekken_number','owner','is_active', 'hasParticipated', 'hasGoaled']
|
||||
read_only_fields = ['id','owner']
|
||||
fields = [
|
||||
'id', 'team', 'event', 'category', 'date', 'zekken_number', 'owner',
|
||||
'is_active', 'hasParticipated', 'hasGoaled',
|
||||
# API変更要求書対応: 新フィールド追加
|
||||
'staff_privileges', 'can_access_private_events', 'team_validation_status'
|
||||
]
|
||||
read_only_fields = ['id', 'owner']
|
||||
|
||||
def validate_date(self, value):
|
||||
if isinstance(value, str):
|
||||
@ -911,4 +980,120 @@ class LoginUserSerializer_old(serializers.Serializer):
|
||||
raise serializers.ValidationError('アカウントが有効化されていません。')
|
||||
else:
|
||||
raise serializers.ValidationError('認証情報が正しくありません。')
|
||||
|
||||
|
||||
class AppVersionSerializer(serializers.ModelSerializer):
|
||||
"""アプリバージョン管理シリアライザー"""
|
||||
|
||||
class Meta:
|
||||
model = AppVersion
|
||||
fields = [
|
||||
'id', 'version', 'platform', 'build_number',
|
||||
'is_latest', 'is_required', 'update_message',
|
||||
'download_url', 'release_date', 'created_at'
|
||||
]
|
||||
read_only_fields = ['id', 'created_at']
|
||||
|
||||
|
||||
class AppVersionCheckSerializer(serializers.Serializer):
|
||||
"""アプリバージョンチェック用シリアライザー"""
|
||||
|
||||
current_version = serializers.CharField(max_length=20, help_text="現在のアプリバージョン")
|
||||
platform = serializers.ChoiceField(
|
||||
choices=[('android', 'Android'), ('ios', 'iOS')],
|
||||
help_text="プラットフォーム"
|
||||
)
|
||||
build_number = serializers.CharField(max_length=20, required=False, help_text="ビルド番号")
|
||||
|
||||
|
||||
class AppVersionResponseSerializer(serializers.Serializer):
|
||||
"""アプリバージョンチェックレスポンス用シリアライザー"""
|
||||
|
||||
latest_version = serializers.CharField(help_text="最新バージョン")
|
||||
update_required = serializers.BooleanField(help_text="強制更新が必要かどうか")
|
||||
update_available = serializers.BooleanField(help_text="更新が利用可能かどうか")
|
||||
update_message = serializers.CharField(help_text="更新メッセージ")
|
||||
download_url = serializers.URLField(help_text="ダウンロードURL")
|
||||
release_date = serializers.DateTimeField(help_text="リリース日時")
|
||||
|
||||
|
||||
class UploadedImageSerializer(serializers.ModelSerializer):
|
||||
"""画像アップロード情報シリアライザー"""
|
||||
|
||||
file_size_mb = serializers.ReadOnlyField()
|
||||
|
||||
class Meta:
|
||||
model = UploadedImage
|
||||
fields = [
|
||||
'id', 'original_filename', 'server_filename', 'file_url',
|
||||
'file_size', 'file_size_mb', 'mime_type', 'event_code',
|
||||
'team_name', 'cp_number', 'upload_source', 'device_platform',
|
||||
'capture_timestamp', 'upload_timestamp', 'device_info',
|
||||
'processing_status', 'thumbnail_url', 'created_at', 'updated_at'
|
||||
]
|
||||
read_only_fields = ['id', 'server_filename', 'file_url', 'upload_timestamp', 'created_at', 'updated_at']
|
||||
|
||||
|
||||
class MultiImageUploadSerializer(serializers.Serializer):
|
||||
"""マルチ画像アップロード用シリアライザー"""
|
||||
|
||||
event_code = serializers.CharField(max_length=50)
|
||||
team_name = serializers.CharField(max_length=255)
|
||||
cp_number = serializers.IntegerField()
|
||||
images = serializers.ListField(
|
||||
child=serializers.DictField(),
|
||||
max_length=10, # 最大10ファイル
|
||||
help_text="アップロードする画像情報のリスト"
|
||||
)
|
||||
upload_source = serializers.ChoiceField(
|
||||
choices=['direct', 'sharing_intent', 'bulk_upload'],
|
||||
default='direct'
|
||||
)
|
||||
device_platform = serializers.ChoiceField(
|
||||
choices=['ios', 'android', 'web'],
|
||||
required=False
|
||||
)
|
||||
|
||||
def validate_images(self, value):
|
||||
"""画像データの検証"""
|
||||
if not value:
|
||||
raise serializers.ValidationError("画像が指定されていません")
|
||||
|
||||
total_size = 0
|
||||
for image_data in value:
|
||||
# 必須フィールドチェック
|
||||
required_fields = ['file_data', 'filename', 'mime_type', 'file_size']
|
||||
for field in required_fields:
|
||||
if field not in image_data:
|
||||
raise serializers.ValidationError(f"画像データに{field}が含まれていません")
|
||||
|
||||
# ファイルサイズチェック
|
||||
file_size = image_data.get('file_size', 0)
|
||||
if file_size > 10485760: # 10MB
|
||||
raise serializers.ValidationError(f"ファイル{image_data['filename']}のサイズが10MBを超えています")
|
||||
|
||||
total_size += file_size
|
||||
|
||||
# MIMEタイプチェック
|
||||
allowed_types = ['image/jpeg', 'image/png', 'image/heic', 'image/webp']
|
||||
if image_data.get('mime_type') not in allowed_types:
|
||||
raise serializers.ValidationError(f"サポートされていないファイル形式: {image_data.get('mime_type')}")
|
||||
|
||||
# 合計サイズチェック(50MB)
|
||||
if total_size > 52428800:
|
||||
raise serializers.ValidationError("合計ファイルサイズが50MBを超えています")
|
||||
|
||||
return value
|
||||
|
||||
|
||||
class MultiImageUploadResponseSerializer(serializers.Serializer):
|
||||
"""マルチ画像アップロードレスポンス用シリアライザー"""
|
||||
|
||||
status = serializers.CharField()
|
||||
uploaded_count = serializers.IntegerField()
|
||||
failed_count = serializers.IntegerField()
|
||||
uploaded_files = serializers.ListField(
|
||||
child=serializers.DictField()
|
||||
)
|
||||
total_upload_size = serializers.IntegerField()
|
||||
processing_time_ms = serializers.IntegerField()
|
||||
|
||||
Reference in New Issue
Block a user