Skip to content

Commit 5c98d41

Browse files
Merge pull request open5e#560 from calumbell/feature/v2-rules
Feature: V2 `/rules` endpoint
2 parents 8bffdc9 + 7d73978 commit 5c98d41

File tree

13 files changed

+253
-3
lines changed

13 files changed

+253
-3
lines changed

api_v2/admin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,6 @@ class LanguageAdmin(admin.ModelAdmin):
9797
admin.site.register(CharacterClass)
9898

9999
admin.site.register(Environment)
100+
101+
admin.site.register(Rule)
102+
admin.site.register(RuleSet)

api_v2/management/commands/buildindex.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def load_v1_content(self, model):
5555

5656
def load_v2_content(self, model):
5757
results = []
58-
standard_v2_models = ['Item','Spell','Creature','CharacterClass','Race','Feat','Condition','Background','Environment']
58+
standard_v2_models = ['Item','Spell','Creature','CharacterClass','Race','Feat','Condition','Background','Environment', 'Rule']
5959

6060
if model.__name__ in standard_v2_models:
6161
for o in model.objects.all():
@@ -147,6 +147,7 @@ def handle(self, *args, **options):
147147
self.load_content(v2.Condition,"v2")
148148
self.load_content(v2.Background,"v2")
149149
self.load_content(v2.Environment,"v2")
150+
self.load_content(v2.Rule, "v2")
150151

151152
# Take the content table's current data and load it into the index.
152153
self.load_index()
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Generated by Django 5.1.1 on 2024-10-08 21:31
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('api_v2', '0001_initial'),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='RuleGroup',
16+
fields=[
17+
('name', models.CharField(help_text='Name of the item.', max_length=100)),
18+
('desc', models.TextField(help_text='Description of the game content item. Markdown.')),
19+
('key', models.CharField(help_text='Unique key for the Document.', max_length=100, primary_key=True, serialize=False)),
20+
('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api_v2.document')),
21+
],
22+
options={
23+
'abstract': False,
24+
},
25+
),
26+
migrations.CreateModel(
27+
name='Rule',
28+
fields=[
29+
('name', models.CharField(help_text='Name of the item.', max_length=100)),
30+
('desc', models.TextField(help_text='Description of the game content item. Markdown.')),
31+
('key', models.CharField(help_text='Unique key for the Document.', max_length=100, primary_key=True, serialize=False)),
32+
('index', models.IntegerField(default=1)),
33+
('initialHeaderLevel', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)], default=1)),
34+
('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api_v2.document')),
35+
('ruleset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rules', to='api_v2.rulegroup')),
36+
],
37+
options={
38+
'abstract': False,
39+
},
40+
),
41+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 5.1.1 on 2024-10-08 21:38
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('api_v2', '0002_rulegroup_rule'),
10+
]
11+
12+
operations = [
13+
migrations.RenameModel(
14+
old_name='RuleGroup',
15+
new_name='RuleSet',
16+
),
17+
]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Generated by Django 5.1.1 on 2024-10-08 21:49
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('api_v2', '0003_rename_rulegroup_ruleset'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='rule',
16+
name='index',
17+
field=models.IntegerField(default=1, help_text="A rule's position in the list of rules of the parent RuleSet"),
18+
),
19+
migrations.AlterField(
20+
model_name='rule',
21+
name='initialHeaderLevel',
22+
field=models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)], default=1, help_text='The header level to set rule title to'),
23+
),
24+
migrations.AlterField(
25+
model_name='rule',
26+
name='ruleset',
27+
field=models.ForeignKey(help_text='The RuleSet which this Rule belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='rules', to='api_v2.ruleset'),
28+
),
29+
]

api_v2/models/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,6 @@
5656

5757
from .environment import Environment
5858

59-
from .speed import HasSpeed
59+
from .speed import HasSpeed
60+
61+
from .rule import Rule, RuleSet

api_v2/models/rule.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from django.db import models
2+
from .abstracts import HasName, HasDescription, key_field
3+
from .document import FromDocument
4+
5+
class RuleSet(HasName, HasDescription, FromDocument):
6+
"""
7+
The RuleSet model contains a set of Rules as part of a larger article, or
8+
as a chapter of a book.
9+
"""
10+
key = key_field()
11+
12+
13+
class Rule(HasName, HasDescription, FromDocument):
14+
""""
15+
The Rule model contains information about a single rule from a larger RuleSet.
16+
Each Rule is typically a paragraph or two long and might contain tables.
17+
"""
18+
19+
key = key_field()
20+
21+
index = models.IntegerField(
22+
default=1,
23+
help_text="A rule's position in the list of rules of the parent RuleSet"
24+
)
25+
26+
ruleset = models.ForeignKey(
27+
RuleSet,
28+
on_delete=models.CASCADE,
29+
related_name='rules',
30+
help_text="The RuleSet which this Rule belongs to"
31+
)
32+
33+
initialHeaderLevel = models.IntegerField(
34+
default=1,
35+
choices=((i, i) for i in range(1,6)),
36+
help_text="The header level to set rule title to"
37+
)

api_v2/serializers/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,6 @@
4646
from .environment import EnvironmentSerializer
4747

4848
from .ability import AbilitySerializer
49-
from .ability import SkillSerializer
49+
from .ability import SkillSerializer
50+
51+
from .rule import RuleSerializer, RuleSetSerializer

api_v2/serializers/rule.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
""" Serializer for the Rule model """
2+
3+
from rest_framework import serializers
4+
5+
from api_v2 import models
6+
7+
from .abstracts import GameContentSerializer
8+
9+
class RuleSerializer(GameContentSerializer):
10+
class Meta:
11+
model = models.Rule
12+
fields = '__all__'
13+
14+
class RuleSetSerializer(GameContentSerializer):
15+
class Meta:
16+
model = models.RuleSet
17+
fields = ['name', 'key', 'document', 'desc', 'rules']

api_v2/views/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838

3939
from .size import SizeViewSet
4040

41+
from .rule import RuleViewSet, RuleSetViewSet
42+
4143
from .enum import get_enums
4244

4345
from .environment import EnvironmentViewSet

0 commit comments

Comments
 (0)