| 1 | # apps/trees/serializers.py |
| 2 | from rest_framework import serializers |
| 3 | from .models import FileSystemTree, DirectoryNode, GameSession |
| 4 | |
| 5 | |
| 6 | class DirectoryNodeSerializer(serializers.ModelSerializer): |
| 7 | class Meta: |
| 8 | model = DirectoryNode |
| 9 | fields = ['id', 'name', 'path', 'is_fhs_standard', 'description', 'depth'] |
| 10 | read_only_fields = ['depth'] |
| 11 | |
| 12 | |
| 13 | class FileSystemTreeSerializer(serializers.ModelSerializer): |
| 14 | total_directories = serializers.SerializerMethodField() |
| 15 | |
| 16 | class Meta: |
| 17 | model = FileSystemTree |
| 18 | fields = [ |
| 19 | 'id', 'name', 'created_at', 'seed', |
| 20 | 'player_location', 'is_completed', 'completed_at', |
| 21 | 'tree_data', 'total_directories', 'moles_killed', |
| 22 | 'total_commands', 'total_directories_visited' |
| 23 | ] |
| 24 | read_only_fields = ['created_at', 'tree_data', 'total_directories', 'moles_killed'] |
| 25 | |
| 26 | def get_total_directories(self, obj): |
| 27 | return obj.nodes.count() |
| 28 | |
| 29 | |
| 30 | class GameSessionSerializer(serializers.ModelSerializer): |
| 31 | tree_name = serializers.CharField(source='tree.name', read_only=True) |
| 32 | score = serializers.SerializerMethodField() |
| 33 | |
| 34 | class Meta: |
| 35 | model = GameSession |
| 36 | fields = [ |
| 37 | 'id', 'tree', 'tree_name', 'player_name', |
| 38 | 'started_at', 'completed_at', 'commands_used', |
| 39 | 'directories_visited', 'time_taken', 'command_history', |
| 40 | 'moles_killed', 'mole_stats', 'score' |
| 41 | ] |
| 42 | read_only_fields = [ |
| 43 | 'started_at', 'completed_at', 'time_taken', 'command_history', |
| 44 | 'mole_stats', 'score' |
| 45 | ] |
| 46 | |
| 47 | def get_score(self, obj): |
| 48 | return obj.calculate_score() |
| 49 | |
| 50 | |
| 51 | class GameCommandSerializer(serializers.Serializer): |
| 52 | """Serializer for game commands""" |
| 53 | command = serializers.CharField(max_length=200) |
| 54 | session_id = serializers.IntegerField(required=False) |