Skip to content

Commit 7c3c5b0

Browse files
committed
chore(program_v2): split forms.graphql.response to {_limited,_full,_profile}
1 parent c1a3588 commit 7c3c5b0

File tree

8 files changed

+120
-106
lines changed

8 files changed

+120
-106
lines changed

backend/forms/graphql/meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ..models.meta import FormsEventMeta, FormsProfileMeta
1212
from ..models.response import Response
1313
from ..models.survey import Survey
14-
from .response import ProfileResponseType
14+
from .response_profile import ProfileResponseType
1515
from .survey_full import FullSurveyType
1616

1717
DEFAULT_LANGUAGE: str = settings.LANGUAGE_CODE

backend/forms/graphql/mutations/create_survey_response.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from ...models.response import Response
88
from ...models.survey import Survey
9-
from ..response import ProfileResponseType
9+
from ..response_profile import ProfileResponseType
1010

1111

1212
class CreateSurveyResponseInput(graphene.InputObjectType):

backend/forms/graphql/mutations/update_response_dimensions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from dimensions.utils.process_dimensions_form import process_dimensions_form
66

77
from ...models.survey import Survey
8-
from ..response import FullResponseType
8+
from ..response_full import FullResponseType
99

1010

1111
class UpdateResponseDimensionsInput(graphene.InputObjectType):
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import graphene
2+
3+
from ..models.response import Response
4+
from .form import FormType
5+
from .response_dimension_value import ResponseDimensionValueType
6+
from .response_limited import LimitedResponseType
7+
8+
9+
class FullResponseType(LimitedResponseType):
10+
@staticmethod
11+
def resolve_form(parent: Response, info):
12+
return parent.form
13+
14+
form = graphene.Field(graphene.NonNull(FormType))
15+
16+
@staticmethod
17+
def resolve_dimensions(parent: Response, info, key_dimensions_only: bool = False):
18+
qs = parent.dimensions.all()
19+
20+
if key_dimensions_only:
21+
qs = qs.filter(dimension__is_key_dimension=True)
22+
23+
return qs
24+
25+
dimensions = graphene.List(
26+
graphene.NonNull(ResponseDimensionValueType),
27+
key_dimensions_only=graphene.Boolean(),
28+
)
29+
30+
class Meta:
31+
model = Response
32+
fields = (
33+
"id",
34+
"form_data",
35+
"created_at",
36+
"sequence_number",
37+
)
Lines changed: 0 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
from graphql_api.utils import resolve_local_datetime_field
99

1010
from ..models.response import Response
11-
from .form import FormType
12-
from .response_dimension_value import ResponseDimensionValueType
1311

1412

1513
class LimitedResponseType(DjangoObjectType):
@@ -104,102 +102,3 @@ class Meta:
104102
"created_at",
105103
"sequence_number",
106104
)
107-
108-
109-
class FullResponseType(LimitedResponseType):
110-
@staticmethod
111-
def resolve_form(parent: Response, info):
112-
return parent.form
113-
114-
form = graphene.Field(graphene.NonNull(FormType))
115-
116-
@staticmethod
117-
def resolve_dimensions(parent: Response, info, key_dimensions_only: bool = False):
118-
qs = parent.dimensions.all()
119-
120-
if key_dimensions_only:
121-
qs = qs.filter(dimension__is_key_dimension=True)
122-
123-
return qs
124-
125-
dimensions = graphene.List(
126-
graphene.NonNull(ResponseDimensionValueType),
127-
key_dimensions_only=graphene.Boolean(),
128-
)
129-
130-
class Meta:
131-
model = Response
132-
fields = (
133-
"id",
134-
"form_data",
135-
"created_at",
136-
"sequence_number",
137-
)
138-
139-
140-
class ProfileResponseType(LimitedResponseType):
141-
@staticmethod
142-
def resolve_form(parent: Response, info):
143-
return parent.form
144-
145-
form = graphene.Field(graphene.NonNull(FormType))
146-
147-
@staticmethod
148-
def resolve_dimensions(response: Response, info, key_dimensions_only: bool = False):
149-
"""
150-
The respondent will only see values of dimensions that are designated as
151-
being shown to the respondent.
152-
"""
153-
qs = response.dimensions.filter(value__dimension__is_public=True)
154-
155-
if key_dimensions_only:
156-
qs = qs.filter(value__dimension__is_key_dimension=True)
157-
158-
return qs
159-
160-
dimensions = graphene.List(
161-
graphene.NonNull(ResponseDimensionValueType),
162-
key_dimensions_only=graphene.Boolean(),
163-
)
164-
165-
@staticmethod
166-
def resolve_cached_dimensions(response: Response, info, key_dimensions_only: bool = False):
167-
"""
168-
Returns the dimensions of the response as
169-
a dict of dimension slug -> list of dimension value slugs. If the response
170-
is not related to a survey, there will be no dimensions and an empty dict
171-
will always be returned.
172-
173-
Using this field is more efficient than querying the dimensions field
174-
on the response, as the dimensions are cached on the response object.
175-
176-
The respondent will only see values of dimensions that are designated as
177-
being shown to the respondent.
178-
"""
179-
cached_dimensions = response.cached_dimensions
180-
181-
included_dimensions = response.dimensions.filter(
182-
value__dimension__slug__in=cached_dimensions.keys(),
183-
value__dimension__is_shown_to_subject=True,
184-
)
185-
186-
if key_dimensions_only:
187-
included_dimensions = included_dimensions.filter(value__dimension__is_key_dimension=True)
188-
189-
included_dimension_slugs = response.dimensions.values_list("value__dimension__slug", flat=True)
190-
191-
return {k: v for k, v in cached_dimensions.items() if k in included_dimension_slugs}
192-
193-
cached_dimensions = graphene.Field(
194-
GenericScalar,
195-
description=normalize_whitespace(resolve_cached_dimensions.__doc__ or ""),
196-
key_dimensions_only=graphene.Boolean(),
197-
)
198-
199-
class Meta:
200-
model = Response
201-
fields = (
202-
"id",
203-
"form_data",
204-
"created_at",
205-
)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import graphene
2+
from graphene.types.generic import GenericScalar
3+
4+
from core.utils.text_utils import normalize_whitespace
5+
6+
from ..models.response import Response
7+
from .form import FormType
8+
from .response_dimension_value import ResponseDimensionValueType
9+
from .response_limited import LimitedResponseType
10+
11+
12+
class ProfileResponseType(LimitedResponseType):
13+
@staticmethod
14+
def resolve_form(parent: Response, info):
15+
return parent.form
16+
17+
form = graphene.Field(graphene.NonNull(FormType))
18+
19+
@staticmethod
20+
def resolve_dimensions(response: Response, info, key_dimensions_only: bool = False):
21+
"""
22+
The respondent will only see values of dimensions that are designated as
23+
being shown to the respondent.
24+
"""
25+
qs = response.dimensions.filter(value__dimension__is_public=True)
26+
27+
if key_dimensions_only:
28+
qs = qs.filter(value__dimension__is_key_dimension=True)
29+
30+
return qs
31+
32+
dimensions = graphene.List(
33+
graphene.NonNull(ResponseDimensionValueType),
34+
key_dimensions_only=graphene.Boolean(),
35+
)
36+
37+
@staticmethod
38+
def resolve_cached_dimensions(response: Response, info, key_dimensions_only: bool = False):
39+
"""
40+
Returns the dimensions of the response as
41+
a dict of dimension slug -> list of dimension value slugs. If the response
42+
is not related to a survey, there will be no dimensions and an empty dict
43+
will always be returned.
44+
45+
Using this field is more efficient than querying the dimensions field
46+
on the response, as the dimensions are cached on the response object.
47+
48+
The respondent will only see values of dimensions that are designated as
49+
being shown to the respondent.
50+
"""
51+
cached_dimensions = response.cached_dimensions
52+
53+
included_dimensions = response.dimensions.filter(
54+
value__dimension__slug__in=cached_dimensions.keys(),
55+
value__dimension__is_shown_to_subject=True,
56+
)
57+
58+
if key_dimensions_only:
59+
included_dimensions = included_dimensions.filter(value__dimension__is_key_dimension=True)
60+
61+
included_dimension_slugs = response.dimensions.values_list("value__dimension__slug", flat=True)
62+
63+
return {k: v for k, v in cached_dimensions.items() if k in included_dimension_slugs}
64+
65+
cached_dimensions = graphene.Field(
66+
GenericScalar,
67+
description=normalize_whitespace(resolve_cached_dimensions.__doc__ or ""),
68+
key_dimensions_only=graphene.Boolean(),
69+
)
70+
71+
class Meta:
72+
model = Response
73+
fields = (
74+
"id",
75+
"form_data",
76+
"created_at",
77+
)

backend/forms/graphql/survey_full.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
from ..models.survey import Survey
1515
from ..utils.summarize_responses import summarize_responses
1616
from .form import FormType
17-
from .response import FullResponseType, LimitedResponseType
17+
from .response_full import FullResponseType
18+
from .response_limited import LimitedResponseType
1819
from .survey_limited import LimitedSurveyType
1920

2021
DEFAULT_LANGUAGE: str = settings.LANGUAGE_CODE

backend/program_v2/graphql/meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from core.utils.text_utils import normalize_whitespace
1111
from dimensions.graphql.dimension import FullDimensionType
1212
from dimensions.graphql.dimension_filter_input import DimensionFilterInput
13-
from forms.graphql.response import FullResponseType
13+
from forms.graphql.response_full import FullResponseType
1414
from forms.models.response import Response
1515
from graphql_api.language import DEFAULT_LANGUAGE
1616

0 commit comments

Comments
 (0)