-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerics.py
More file actions
129 lines (96 loc) · 4.16 KB
/
Copy pathgenerics.py
File metadata and controls
129 lines (96 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import graphene
from .generics_utils import (
decorate_mutate_func,
define_mutation_errors,
create_default_create_function,
default_update_function,
default_delete_function,
)
from .types import MutationPayload
class DefaultMutationOptions(graphene.types.mutation.MutationOptions):
checks: list = None # iterable of tuples (error_class, checker (will receive mutate args))
auth_required: bool = None
# root: MutationRoot = None
# root_name: str = None
root_required: bool = None
class DefaultMutation(MutationPayload, graphene.Mutation):
@classmethod
def __init_subclass_with_meta__(
cls, resolver=None, output=None, arguments=None, _meta=None,
checks=None, auth_required=True, record_type=None, root_required=False,
**options
):
checks = checks or []
if not _meta:
_meta = DefaultMutationOptions(cls)
_meta.auth_required = auth_required
_meta.checks = checks
_meta.root_required = root_required
define_mutation_errors(cls, checks)
if record_type:
cls.record = graphene.Field(record_type, default_value=None, description='Обработанная сущность')
super(DefaultMutation, cls).__init_subclass_with_meta__(
resolver=resolver, output=output, arguments=arguments, _meta=_meta, **options
)
@classmethod
def mutate(cls, root, info, **kwargs):
raise NotImplementedError('Mutate is not implemented for {}'.format(cls.__name__))
@classmethod
def Field(cls, name=None, description=None, deprecation_reason=None, required=False):
pre_mutate = getattr(cls, 'pre_mutate', lambda *args, **kwargs: None)
return graphene.Field(
cls._meta.output,
args=cls._meta.arguments,
resolver=decorate_mutate_func(cls._meta.resolver, pre_mutate, cls, cls._meta),
name=name,
description=description,
deprecation_reason=deprecation_reason,
required=required,
)
class CreateMutationOptions(DefaultMutationOptions):
create_function = None
model = None
include_user = None
user_field_name = None
class CreateMutation(DefaultMutation):
@classmethod
def __init_subclass_with_meta__(
cls, resolver=None, output=None, arguments=None,
create_function=None, model=None, include_user=True, user_field_name='owner',
_meta=None, **options
):
if not _meta:
_meta = CreateMutationOptions(cls)
assert create_function or model, 'You must provide model or create_function in CreateMutation Meta'
_meta.create_function = create_function or create_default_create_function(model, include_user, user_field_name)
super(CreateMutation, cls).__init_subclass_with_meta__(
resolver=resolver, output=output, arguments=arguments, _meta=_meta, **options
)
@classmethod
def mutate(cls, root, info, input, **kwargs):
instance = cls._meta.create_function(user=info.context.user, **input.__dict__)
post_mutate = getattr(cls, 'post_mutate', None)
if callable(post_mutate):
post_mutate(instance, user=info.context.user)
return cls(record=instance)
class UpdateMutationOptions(graphene.types.objecttype.ObjectTypeOptions):
pass
class UpdateMutation(DefaultMutation):
@classmethod
def mutate(cls, instance, info, input):
instance = default_update_function(instance, user=info.context.user, **input.__dict__)
post_mutate = getattr(cls, 'post_mutate', None)
if callable(post_mutate):
post_mutate(instance, user=info.context.user)
return cls(record=instance)
class DeleteMutationOptions(graphene.types.objecttype.ObjectTypeOptions):
pass
class DeleteMutation(DefaultMutation):
@classmethod
def mutate(cls, instance, info, errors=None):
errors = errors or set()
default_delete_function(instance, user=info.context.user)
post_mutate = getattr(cls, 'post_mutate', None)
if callable(post_mutate):
post_mutate(instance, user=info.context.user)
return cls()