Skip to content

Commit 3ccd293

Browse files
Merge pull request open5e#715 from calumbell/703/sundry-summary-serializers
Summary Serializers
2 parents 3218c61 + 3d9c7a9 commit 3ccd293

27 files changed

+484
-305
lines changed

api_v2/serializers/ability.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ class Meta:
2323
fields = '__all__'
2424

2525
class AbilitySummarySerializer(GameContentSerializer):
26+
'''
27+
A slimmer AbilitySerializer, designed to serialize Ability FKs on other
28+
serializers. ie. The `saving_throws` field on CharacterClassSerializer. Not
29+
intended to be used directly with in a ModelViewset.
30+
'''
2631
class Meta:
2732
model = models.Ability
2833
fields = ['name', 'url']

api_v2/serializers/characterclass.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ class Meta:
7070
]
7171

7272
class CharacterClassSummarySerializer(serializers.ModelSerializer):
73+
'''
74+
A slimmer CharacterClassSerializer, designed to serialize Class FKs on
75+
other serializers. ie. The `subclass_of` field on the
76+
CharacterClassSerializer serializer. Not intended to be used directly in a
77+
ModelViewset.
78+
'''
7379
class Meta:
7480
model = models.CharacterClass
7581
fields = ['name', 'key', 'url']

api_v2/serializers/condition.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,13 @@ class ConditionSerializer(GameContentSerializer):
1616
class Meta:
1717
model = models.Condition
1818
fields = '__all__'
19+
20+
class ConditionSummarySerializer(GameContentSerializer):
21+
'''
22+
A slimmer ConditionSerializer, designed to serialize Condition FKs on
23+
other serializers. ie. The `condition_immunities` field on the Creature
24+
serializer. Not intended to be used directly with in a ModelViewset.
25+
'''
26+
class Meta:
27+
model = models.Condition
28+
fields = ['name', 'key', 'url']

api_v2/serializers/creature.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
from api_v2 import models
88

99
from .abstracts import GameContentSerializer
10-
from .damagetype import DamageTypeSerializer
11-
from .condition import ConditionSerializer
10+
from .damagetype import DamageTypeSummarySerializer
11+
from .condition import ConditionSummarySerializer
1212
from .document import DocumentSummarySerializer
1313
from .language import LanguageSummarySerializer
14-
from .environment import EnvironmentSerializer
15-
from .size import SizeSerializer
14+
from .environment import EnvironmentSummarySerializer
15+
from .size import SizeSummarySerializer
1616
from drf_spectacular.utils import extend_schema_field, inline_serializer
1717
from drf_spectacular.types import OpenApiTypes
1818

@@ -47,6 +47,15 @@ class Meta:
4747
model = models.CreatureType
4848
fields = '__all__'
4949

50+
class CreatureTypeSummarySerializer(serializers.ModelSerializer):
51+
'''
52+
A slimmer CreatureTypeSerializer, designed to serialize CreatureType FKs on
53+
other serializers . Not intended to be used directly with in a ModelViewset.
54+
'''
55+
class Meta:
56+
model = models.CreatureType
57+
fields = ['name', 'key', 'url']
58+
5059

5160
class CreatureTraitSerializer(GameContentSerializer):
5261
'''Serializer for the Creature Trait object'''
@@ -74,45 +83,45 @@ class CreatureSerializer(GameContentSerializer):
7483
saving_throws_all = serializers.SerializerMethodField()
7584
skill_bonuses = serializers.SerializerMethodField()
7685
skill_bonuses_all = serializers.SerializerMethodField()
77-
damage_immunities = DamageTypeSerializer(many=True)
78-
damage_resistances = DamageTypeSerializer(many=True)
79-
damage_vulnerabilities = DamageTypeSerializer(many=True)
80-
condition_immunities = ConditionSerializer(many=True)
86+
damage_immunities = DamageTypeSummarySerializer(many=True)
87+
damage_resistances = DamageTypeSummarySerializer(many=True)
88+
damage_vulnerabilities = DamageTypeSummarySerializer(many=True)
89+
condition_immunities = ConditionSummarySerializer(many=True)
8190
actions = CreatureActionSerializer(many=True)
8291
traits = CreatureTraitSerializer(many=True, read_only=True)
8392
speed = serializers.SerializerMethodField()
8493
speed_all = serializers.SerializerMethodField()
8594
challenge_rating_text = serializers.SerializerMethodField()
8695
experience_points = serializers.SerializerMethodField()
8796
document = DocumentSummarySerializer()
88-
type = CreatureTypeSerializer()
89-
size = SizeSerializer()
97+
type = CreatureTypeSummarySerializer()
98+
size = SizeSummarySerializer()
9099
languages = CreatureLanguageSerializer(source='*')
91-
environments = EnvironmentSerializer(many=True)
100+
environments = EnvironmentSummarySerializer(many=True)
92101
initiative_bonus = serializers.SerializerMethodField()
93102

94103
class Meta:
95104
'''Serializer meta options.'''
96105
model = models.Creature
97106
fields = [
98107
'url',
99-
'document',
100108
'key',
101109
'name',
110+
'document',
111+
'type',
102112
'size',
113+
'challenge_rating_decimal',
114+
'challenge_rating_text',
103115
'speed',
104116
'speed_all',
105117
'category',
106118
'subcategory',
107-
'type',
108119
'alignment',
109120
'languages',
110121
'armor_class',
111122
'armor_detail',
112123
'hit_points',
113124
'hit_dice',
114-
'challenge_rating_decimal',
115-
'challenge_rating_text',
116125
'experience_points',
117126
'ability_scores',
118127
'modifiers',

api_v2/serializers/damagetype.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,12 @@ class DamageTypeSerializer(GameContentSerializer):
1212
class Meta:
1313
model = models.DamageType
1414
fields = '__all__'
15+
16+
class DamageTypeSummarySerializer(serializers.ModelSerializer):
17+
'''
18+
A slimmer DamageTypeSerializer, designed to serialize DamageType FKs on
19+
other serializers. Not intended to be used directly with in a ModelViewset.
20+
'''
21+
class Meta:
22+
model = models.DamageType
23+
fields = ['name', 'key', 'url']

api_v2/serializers/document.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ class Meta:
1212
fields = '__all__'
1313

1414
class GameSystemSummarySerializer(serializers.ModelSerializer):
15+
'''
16+
A slimmer GameSystemSerializer, designed to serialize GameSystem FKs on
17+
other serializers. Not intended to be used directly with in a ModelViewset.
18+
'''
1519
class Meta:
1620
model = models.GameSystem
1721
fields = ['name', 'key', 'url']
@@ -25,7 +29,10 @@ class Meta:
2529
fields = '__all__'
2630

2731
class LicenseSummarySerializer(GameContentSerializer):
28-
key = serializers.ReadOnlyField()
32+
'''
33+
A slimmer LicenseSerializer, designed to serialize License FKs on other
34+
serializers. Not intended to be used directly with in a ModelViewset.
35+
'''
2936
class Meta:
3037
model = models.License
3138
fields = ['name', 'key', 'url']
@@ -38,7 +45,10 @@ class Meta:
3845
fields = '__all__'
3946

4047
class PublisherSummarySerializer(serializers.ModelSerializer):
41-
key = serializers.ReadOnlyField()
48+
'''
49+
A slimmer PublisherSerializer, designed to serialize Publisher FKs on other
50+
serializers. Not intended to be used directly with in a ModelViewset.
51+
'''
4252
class Meta:
4353
model = models.Publisher
4454
fields = ['name', 'key', 'url']
@@ -54,9 +64,13 @@ class Meta:
5464
fields = '__all__'
5565

5666
class DocumentSummarySerializer(GameContentSerializer):
57-
key = serializers.ReadOnlyField()
67+
'''
68+
A slimmer DocumentSerializer, designed to serialize Documents FKs on other
69+
serializers. Not intended to be used directly with in a ModelViewset.
70+
'''
5871
publisher = PublisherSummarySerializer()
59-
gamesystem = GameSystemSummarySerializer()
72+
gamesystem = GameSystemSummarySerializer()
73+
6074
class Meta:
6175
model = models.Document
6276
fields = ['name', 'key', 'publisher', 'gamesystem', 'permalink']

api_v2/serializers/environment.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,13 @@ class EnvironmentSerializer(GameContentSerializer):
1212
class Meta:
1313
model = models.Environment
1414
fields = '__all__'
15+
16+
class EnvironmentSummarySerializer(GameContentSerializer):
17+
'''
18+
A slimmer EnvironmentSerializer, designed to serialize Enviroment FKs on
19+
other serializers. ie. The `environments` field on the CreatureSerializer.
20+
Not intended to be used directly in a ModelViewset.
21+
'''
22+
class Meta:
23+
model = models.Environment
24+
fields = ['name', 'key', 'url']

api_v2/serializers/item.py

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from api_v2 import models
66

77
from .abstracts import GameContentSerializer
8-
from .size import SizeSerializer
8+
from .damagetype import DamageTypeSummarySerializer
99
from .document import DocumentSummarySerializer
10+
from .size import SizeSummarySerializer
1011
from drf_spectacular.utils import extend_schema_field
1112
from drf_spectacular.types import OpenApiTypes
1213

@@ -20,8 +21,30 @@ class Meta:
2021
model = models.Armor
2122
fields = '__all__'
2223

24+
class ArmorSummarySerializer(serializers.ModelSerializer):
25+
'''
26+
A slightly slimmer ArmorSerializer, designed to serialize Armor FKs on
27+
other serializers. ie. The `armor` field on the ItemSerializer. Not
28+
intended to be used directly in a ModelViewset.
29+
'''
30+
class Meta:
31+
model = models.Armor
32+
fields = [
33+
'name',
34+
'key',
35+
'url',
36+
'category',
37+
'ac_base',
38+
'ac_display',
39+
'ac_add_dexmod',
40+
'ac_cap_dexmod',
41+
'grants_stealth_disadvantage',
42+
'strength_score_required',
43+
]
44+
2345
class WeaponSerializer(GameContentSerializer):
2446
key = serializers.ReadOnlyField()
47+
damage_type = DamageTypeSummarySerializer()
2548
is_versatile = serializers.ReadOnlyField()
2649
is_martial = serializers.ReadOnlyField()
2750
is_melee = serializers.ReadOnlyField()
@@ -41,14 +64,12 @@ def get_distance_unit(self, Weapon):
4164
return Weapon.get_distance_unit
4265

4366

44-
class ItemRaritySerializer(GameContentSerializer):
45-
key=serializers.ReadOnlyField()
46-
67+
class ItemRaritySerializer(serializers.ModelSerializer):
4768
class Meta:
4869
model = models.ItemRarity
49-
fields = '__all__'
70+
fields = ['name', 'url', 'key', 'rank']
5071

51-
class ItemCategorySerializer(GameContentSerializer):
72+
class ItemCategorySerializer(serializers.ModelSerializer):
5273
key = serializers.ReadOnlyField()
5374

5475
class Meta:
@@ -58,21 +79,14 @@ class Meta:
5879
class ItemSerializer(GameContentSerializer):
5980
key = serializers.ReadOnlyField()
6081
is_magic_item = serializers.ReadOnlyField()
61-
weapon = WeaponSerializer(read_only=True, context={'request':{}})
62-
armor = ArmorSerializer(read_only=True, context={'request':{}})
82+
weapon = WeaponSerializer()
83+
armor = ArmorSummarySerializer()
6384
document = DocumentSummarySerializer()
6485
category = ItemCategorySerializer()
6586
rarity = ItemRaritySerializer()
66-
67-
def to_representation(self, instance):
68-
"""Ensures weapon/armor remain null instead of empty objects at depth>0."""
69-
data = super().to_representation(instance)
70-
71-
for field in ["weapon", "armor"]:
72-
if getattr(instance, field, None) is None:
73-
data[field] = None
74-
return data
75-
87+
damage_immunities = DamageTypeSummarySerializer(many=True)
88+
size = SizeSummarySerializer()
89+
7690
class Meta:
7791
model = models.Item
7892
fields = '__all__'

api_v2/serializers/size.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,13 @@ class Meta:
2323
@extend_schema_field(OpenApiTypes.STR)
2424
def get_distance_unit(self, Size):
2525
return Size.get_distance_unit
26+
27+
class SizeSummarySerializer(serializers.ModelSerializer):
28+
'''
29+
A slimmer SizeSerializer, designed to serialize Size FKs on other
30+
serializers. ie. The `size` field on the CreatureSerializer. Not intended
31+
to be used directly in a ModelViewset.
32+
'''
33+
class Meta:
34+
model = models.Size
35+
fields = ['name', 'key', 'url']

api_v2/serializers/spell.py

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

19+
class SpellSchoolSummarySerializer(serializers.ModelSerializer):
20+
'''
21+
A slimmer SpellSchoolSerializer, designed to serialize Spell School FKs on
22+
other serializers. ie. The `school` field on the SpellSerializer. Not
23+
intended to be used directly in a ModelViewset.
24+
'''
25+
class Meta:
26+
model = models.SpellSchool
27+
fields = ['name', 'key', 'url']
1928

2029
class SpellCastingOptionSerializer(serializers.ModelSerializer):
2130
class Meta:
@@ -27,7 +36,7 @@ class SpellSerializer(GameContentSerializer):
2736
document = DocumentSummarySerializer()
2837
key = serializers.ReadOnlyField()
2938
casting_options = SpellCastingOptionSerializer(many=True)
30-
school = SpellSchoolSerializer()
39+
school = SpellSchoolSummarySerializer()
3140
classes = CharacterClassSummarySerializer(many=True)
3241

3342
range_unit = serializers.SerializerMethodField()

0 commit comments

Comments
 (0)