Skip to content

Instantly share code, notes, and snippets.

@crohas
Last active March 26, 2019 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save crohas/bf2a72b4eb8b8e22632f8afd38613830 to your computer and use it in GitHub Desktop.
Save crohas/bf2a72b4eb8b8e22632f8afd38613830 to your computer and use it in GitHub Desktop.

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は変動するので環境に応じて変えること

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment