1, acccunts.serializers.UserSerializer に 「User.nameが他のユーザとカブっているとバリデーションエラーになる」バリデーションを追加してください。 エラーメッセージは「そのユーザは既にいます」にしてください。
from accounts.models import User
from accounts.serializers import UserSerializer
_ = User.objects.get_or_create(name='test', email='example.com')
s = UserSerializer(data={'name': 'test', 'email': 'test@example.com'})
s.is_valid() # False
s.errors # {'name': [ErrorDetail(string='そのユーザは既にいます', code='unique')]}
2, tasks.serializers.TimeSerializer に 「start が end より後(大きければ)ならバリデーションエラーになる」バリデーションを追加してください。
エラーメッセージは 開始、終了時間が不正です
にしてください。
from datetime import datetime
from accounts.models import User
from tasks.models import Task, Status
from tasks.serializers import TimeSerializer
u, _ = User.objects.get_or_create(name='test', email='example.com')
st, _ = Status.objects.get_or_create(name='test')
t, _ = Task.objects.get_or_create(owner=u, status=st)
s = TimeSerializer(data={
'task': t.id,
'note': 'test',
'start': datetime(2019, 3, 1),
'end': datetime(2019, 2, 1),
})
s.is_valid() # False
s.errors # {'non_field_errors': [ErrorDetail(string='開始、終了時間が不正です', code='invalid')]}
3, accounts.serializers.GroupSerializer に 「parent が循環するようなときにバリデーションエラーになる」バリデーションを追加してください。
(RecursiveField にも to_internal_value
メソッドの追加が必要。処理は何でもいい)
異常系の確認
from accounts.models import Group
from accounts.serializers import GroupSerializer
g1, _ = Group.objects.get_or_create(name='g1')
g2, _ = Group.objects.get_or_create(name='g2', parent=g1)
g3, _ = Group.objects.get_or_create(name='g3', parent=g2)
s = GroupSerializer(g1, data={'parent': g3.id}, partial=True)
s.is_valid() # False
s.errors # {'parent': [ErrorDetail(string='循環してます', code='invalid')]}
正常系の確認
from accounts.models import Group
from accounts.serializers import GroupSerializer
g4, _ = Group.objects.get_or_create(name='g4')
g5, _ = Group.objects.get_or_create(name='g5', parent=g4)
g6, _ = Group.objects.get_or_create(name='g6')
s = GroupSerializer(g4, data={'parent': g6.id}, partial=True)
s.is_valid() # True
4, Groupにメンバーを追加するとき、 request.user が そのグループのオーナーでないとバリデーションエラーになるようなバリデーションを accounts.serializers.UserSerializer に追加してください。
準備
from accounts.models import User, Group
cr, _ = User.objects.get_or_create(email='test.example.com')
g1, _ = Group.objects.get_or_create(name='q4-cros', owner=cr)
g2, _ = Group.objects.get_or_create(name='q4-others')
グループのIDを確認
>>> g1.id # 所有してるグループID
UUID('0a256cc9-79d2-402a-bb5c-15e182c1b938')
>>> g2.id # 所有してないグループID
UUID('c619250b-c73e-4b05-87db-5e1720f38f95')
BrowsableAPIから以下のJSONをPOSTで送ってみて、エラーになること
{
"name": "adding_to_group",
"email": "testtesttest@example.com",
"file": null,
"belongs": ["c619250b-c73e-4b05-87db-5e1720f38f95"]
}
※ belongs の IDは変動するので環境に応じて変えること
BrowsableAPIから以下のJSONをPOSTで送ってみて、エラーにならないこと
{
"name": "adding_to_group2",
"email": "testtesttest1@example.com",
"file": null,
"belongs": ["0a256cc9-79d2-402a-bb5c-15e182c1b938"]
}
※ belongs の IDは変動するので環境に応じて変えること