Skip to content

Commit 811e940

Browse files
committed
merged from 'staging'
2 parents 7cb0460 + 92072bb commit 811e940

24 files changed

+343
-385
lines changed

api_v2/serializers/abstracts.py

Lines changed: 4 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -84,65 +84,22 @@ def get_dynamic_params(self):
8484
return self.parent._context.get("dynamic_params", {})
8585
return self._context.get("dynamic_params", {})
8686

87-
def handle_depth_serialization(self, instance, representation):
88-
"""
89-
Handles the serialization of fields based on the current depth
90-
compared to the maximum allowed depth. This function modifies
91-
the representation to include only URLs for nested serializers
92-
when the maximum depth is reached.
93-
"""
94-
max_depth = self._context.get("max_depth", 0)
95-
current_depth = self._context.get("current_depth", 0)
96-
97-
# if we reach the maximum depth, nested serializers return their pk (url)
98-
if current_depth >= max_depth:
99-
for field_name, field in self.fields.items():
100-
if isinstance(field, serializers.HyperlinkedModelSerializer):
101-
nested_representation = representation.get(field_name)
102-
if nested_representation and "url" in nested_representation:
103-
representation[field_name] = nested_representation["url"]
104-
return representation
105-
106-
# otherwise, pass depth to children serializers
107-
for field_name, field in self.fields.items():
108-
# Guard clause: make sure the child is a GameContentSerializer
109-
if not isinstance(field, GameContentSerializer):
110-
continue
111-
112-
nested_instance = getattr(instance, field_name)
113-
nested_serializer = field.__class__(nested_instance, context={
114-
**self._context,
115-
"current_depth": current_depth + 1,
116-
"max_depth": max_depth,
117-
})
118-
119-
# Ensure dynamic params are specific to the child serializer
120-
child_dynamic_params = self.get_or_create_dynamic_params(field_name)
121-
nested_serializer._context['dynamic_params'] = child_dynamic_params
122-
representation[field_name] = nested_serializer.data
123-
return representation
124-
125-
12687
def __init__(self, *args, **kwargs):
12788
request = kwargs.get("context", {}).get("request")
12889
super().__init__(*args, **kwargs)
12990

91+
# Request is only present on root serializer
13092
if request:
131-
self._context["max_depth"] = int(request.query_params.get("depth", 0))
13293
dynamic_params = self.get_dynamic_params_for_root(request)
13394
self._context.update({"dynamic_params": dynamic_params})
13495

13596
def to_representation(self, instance):
97+
# if dynamic params are present, rmv requested fields and pass params
98+
# to child serializers
13699
if dynamic_params := self.get_dynamic_params().copy():
137100
self.remove_unwanted_fields(dynamic_params)
138101
self.set_dynamic_params_for_children(dynamic_params)
139-
140-
representation = super().to_representation(instance)
141-
142-
representation = self.handle_depth_serialization(instance, representation)
143-
144-
return representation
145-
102+
return super().to_representation(instance)
146103

147104
class Meta:
148105
abstract = True

api_v2/serializers/background.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .abstracts import GameContentSerializer
88
from .document import DocumentSummarySerializer
99

10-
class BackgroundBenefitSerializer(serializers.ModelSerializer):
10+
class BackgroundBenefitSerializer(GameContentSerializer):
1111
class Meta:
1212
model = models.BackgroundBenefit
1313
fields = ['name','desc','type']

api_v2/serializers/characterclass.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class Meta:
6969
'feature_items'
7070
]
7171

72-
class CharacterClassSummarySerializer(serializers.ModelSerializer):
72+
class CharacterClassSummarySerializer(GameContentSerializer):
7373
'''
7474
A slimmer CharacterClassSerializer, designed to serialize Class FKs on
7575
other serializers. ie. The `subclass_of` field on the

api_v2/serializers/creature.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
from drf_spectacular.utils import extend_schema_field, inline_serializer
1717
from drf_spectacular.types import OpenApiTypes
1818

19-
class CreatureActionAttackSerializer(serializers.ModelSerializer):
20-
19+
class CreatureActionAttackSerializer(GameContentSerializer):
2120
distance_unit = serializers.SerializerMethodField()
21+
damage_type = DamageTypeSummarySerializer()
22+
extra_damage_type = DamageTypeSummarySerializer()
2223

2324
class Meta:
2425
model = models.CreatureActionAttack
@@ -46,7 +47,7 @@ class Meta:
4647
def get_distance_unit(self, CreatureActionAttack):
4748
return CreatureActionAttack.get_distance_unit
4849

49-
class CreatureActionSerializer(serializers.ModelSerializer):
50+
class CreatureActionSerializer(GameContentSerializer):
5051
attacks = CreatureActionAttackSerializer(many=True, read_only=True)
5152
usage_limits = serializers.SerializerMethodField()
5253

@@ -85,7 +86,7 @@ class Meta:
8586
model = models.CreatureType
8687
fields = '__all__'
8788

88-
class CreatureTypeSummarySerializer(serializers.ModelSerializer):
89+
class CreatureTypeSummarySerializer(GameContentSerializer):
8990
'''
9091
A slimmer CreatureTypeSerializer, designed to serialize CreatureType FKs on
9192
other serializers . Not intended to be used directly with in a ModelViewset.

api_v2/serializers/damagetype.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Meta:
1313
model = models.DamageType
1414
fields = '__all__'
1515

16-
class DamageTypeSummarySerializer(serializers.ModelSerializer):
16+
class DamageTypeSummarySerializer(GameContentSerializer):
1717
'''
1818
A slimmer DamageTypeSerializer, designed to serialize DamageType FKs on
1919
other serializers. Not intended to be used directly with in a ModelViewset.

api_v2/serializers/document.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class Meta:
4444
model = models.Publisher
4545
fields = '__all__'
4646

47-
class PublisherSummarySerializer(serializers.ModelSerializer):
47+
class PublisherSummarySerializer(GameContentSerializer):
4848
'''
4949
A slimmer PublisherSerializer, designed to serialize Publisher FKs on other
5050
serializers. Not intended to be used directly with in a ModelViewset.

api_v2/serializers/item.py

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ class ArmorSerializer(GameContentSerializer):
1616
key = serializers.ReadOnlyField()
1717
ac_display = serializers.ReadOnlyField()
1818
category = serializers.ReadOnlyField()
19+
document = DocumentSummarySerializer()
1920

2021
class Meta:
2122
model = models.Armor
2223
fields = '__all__'
2324

24-
class ArmorSummarySerializer(serializers.ModelSerializer):
25+
class ArmorSummarySerializer(GameContentSerializer):
2526
'''
2627
A slightly slimmer ArmorSerializer, designed to serialize Armor FKs on
2728
other serializers. ie. The `armor` field on the ItemSerializer. Not
@@ -44,6 +45,7 @@ class Meta:
4445

4546
class WeaponSerializer(GameContentSerializer):
4647
key = serializers.ReadOnlyField()
48+
document = DocumentSummarySerializer()
4749
damage_type = DamageTypeSummarySerializer()
4850
is_versatile = serializers.ReadOnlyField()
4951
is_martial = serializers.ReadOnlyField()
@@ -63,26 +65,84 @@ class Meta:
6365
def get_distance_unit(self, Weapon):
6466
return Weapon.get_distance_unit
6567

68+
class WeaponSummarySerializer(GameContentSerializer):
69+
'''
70+
A (slightly) more slender version of the WeaponSerializer. Designed for
71+
serializing FKs to the Weapons table in other serializers – ie. the
72+
`"weapon"` field on the ItemSerializer
73+
'''
74+
damage_type = DamageTypeSummarySerializer()
75+
is_versatile = serializers.ReadOnlyField()
76+
is_martial = serializers.ReadOnlyField()
77+
is_melee = serializers.ReadOnlyField()
78+
is_finesse = serializers.ReadOnlyField()
79+
ranged_attack_possible = serializers.ReadOnlyField()
80+
range_melee = serializers.ReadOnlyField()
81+
is_reach = serializers.ReadOnlyField()
82+
properties = serializers.ReadOnlyField()
83+
distance_unit = serializers.SerializerMethodField()
84+
85+
class Meta:
86+
model = models.Weapon
87+
fields = [
88+
'name',
89+
'key',
90+
'url',
91+
'damage_type',
92+
'damage_dice',
93+
'versatile_dice',
94+
'is_versatile',
95+
'reach',
96+
'is_reach',
97+
'is_finesse',
98+
'range',
99+
'range_melee',
100+
'long_range',
101+
'ranged_attack_possible',
102+
'is_thrown',
103+
'is_two_handed',
104+
'requires_ammunition',
105+
'requires_loading',
106+
'is_heavy',
107+
'is_light',
108+
'is_lance',
109+
'is_net',
110+
'is_melee',
111+
'is_simple',
112+
'is_martial',
113+
'is_improvised',
114+
'properties',
115+
'distance_unit',
116+
]
117+
118+
@extend_schema_field(OpenApiTypes.STR)
119+
def get_distance_unit(self, Weapon):
120+
return Weapon.get_distance_unit
66121

67-
class ItemRaritySerializer(serializers.ModelSerializer):
122+
class ItemRaritySerializer(GameContentSerializer):
68123
class Meta:
69124
model = models.ItemRarity
70125
fields = ['name', 'url', 'key', 'rank']
71126

72-
class ItemCategorySerializer(serializers.ModelSerializer):
127+
class ItemCategorySerializer(GameContentSerializer):
73128
key = serializers.ReadOnlyField()
129+
document = DocumentSummarySerializer()
130+
class Meta:
131+
model = models.ItemCategory
132+
fields = '__all__'
74133

134+
class ItemCategorySummarySerializer(GameContentSerializer):
75135
class Meta:
76136
model = models.ItemCategory
77-
fields = "__all__"
137+
fields = ['name', 'key', 'url']
78138

79139
class ItemSerializer(GameContentSerializer):
80140
key = serializers.ReadOnlyField()
81141
is_magic_item = serializers.ReadOnlyField()
82-
weapon = WeaponSerializer()
142+
weapon = WeaponSummarySerializer()
83143
armor = ArmorSummarySerializer()
84144
document = DocumentSummarySerializer()
85-
category = ItemCategorySerializer()
145+
category = ItemCategorySummarySerializer()
86146
rarity = ItemRaritySerializer()
87147
damage_immunities = DamageTypeSummarySerializer(many=True)
88148
size = SizeSummarySerializer()
@@ -96,11 +156,16 @@ class Meta:
96156
model = models.Item
97157
fields = '__all__'
98158

159+
class ItemSummarySerializer(GameContentSerializer):
160+
class Meta:
161+
model = models.Item
162+
fields = ['name', 'key', 'url']
163+
99164

100165

101166
class ItemSetSerializer(GameContentSerializer):
102167
key = serializers.ReadOnlyField()
103-
items = ItemSerializer(many=True, read_only=True, context={'request':{}})
168+
items = ItemSummarySerializer(many=True, read_only=True)
104169

105170
class Meta:
106171
model = models.ItemSet

api_v2/serializers/size.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Meta:
2424
def get_distance_unit(self, Size):
2525
return Size.get_distance_unit
2626

27-
class SizeSummarySerializer(serializers.ModelSerializer):
27+
class SizeSummarySerializer(GameContentSerializer):
2828
'''
2929
A slimmer SizeSerializer, designed to serialize Size FKs on other
3030
serializers. ie. The `size` field on the CreatureSerializer. Not intended

api_v2/serializers/species.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .abstracts import GameContentSerializer
88
from .document import DocumentSummarySerializer
99

10-
class SpeciesTraitSerializer(serializers.ModelSerializer):
10+
class SpeciesTraitSerializer(GameContentSerializer):
1111

1212
class Meta:
1313
model = models.SpeciesTrait

api_v2/serializers/spell.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Meta:
1616
model = models.SpellSchool
1717
fields='__all__'
1818

19-
class SpellSchoolSummarySerializer(serializers.ModelSerializer):
19+
class SpellSchoolSummarySerializer(GameContentSerializer):
2020
'''
2121
A slimmer SpellSchoolSerializer, designed to serialize Spell School FKs on
2222
other serializers. ie. The `school` field on the SpellSerializer. Not

0 commit comments

Comments
 (0)