Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement meta-field key filtering #318

Merged
merged 1 commit into from Mar 8, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions caluma/core/filters.py
Expand Up @@ -183,6 +183,10 @@ def filter_for_lookup(cls, field, lookup_type):
return filter_class, params


class MetaFilterSet(FilterSet):
meta_has_key = CharFilter(lookup_expr="has_key", field_name="meta")


class DjangoFilterConnectionField(filter.DjangoFilterConnectionField):
"""
Django connection filter field with object type get_queryset support.
Expand Down
12 changes: 6 additions & 6 deletions caluma/form/filters.py
@@ -1,14 +1,14 @@
from . import models
from ..core.filters import (
FilterSet,
GlobalIDFilter,
GlobalIDMultipleChoiceFilter,
MetaFilterSet,
OrderingFilter,
SearchFilter,
)


class FormFilterSet(FilterSet):
class FormFilterSet(MetaFilterSet):
search = SearchFilter(fields=("slug", "name", "description"))
order_by = OrderingFilter(label="FormOrdering", fields=("name",))

Expand All @@ -17,7 +17,7 @@ class Meta:
fields = ("slug", "name", "description", "is_published", "is_archived")


class OptionFilterSet(FilterSet):
class OptionFilterSet(MetaFilterSet):
search = SearchFilter(fields=("slug", "label"))
order_by = OrderingFilter(label="OptionOrdering", fields=("label",))

Expand All @@ -26,7 +26,7 @@ class Meta:
fields = ("slug", "label")


class QuestionFilterSet(FilterSet):
class QuestionFilterSet(MetaFilterSet):
exclude_forms = GlobalIDMultipleChoiceFilter(field_name="forms", exclude=True)
search = SearchFilter(fields=("slug", "label"))
order_by = OrderingFilter(label="QuestionOrdering", fields=("label",))
Expand All @@ -36,7 +36,7 @@ class Meta:
fields = ("slug", "label", "is_required", "is_hidden", "is_archived")


class DocumentFilterSet(FilterSet):
class DocumentFilterSet(MetaFilterSet):
id = GlobalIDFilter()
search = SearchFilter(
fields=("form__slug", "form__name", "form__description", "answers__value")
Expand All @@ -48,7 +48,7 @@ class Meta:
fields = ("form", "search", "id")


class AnswerFilterSet(FilterSet):
class AnswerFilterSet(MetaFilterSet):
search = SearchFilter(fields=("value",))
order_by = OrderingFilter(label="AnswerOrdering")

Expand Down
6 changes: 4 additions & 2 deletions caluma/form/schema.py
@@ -1,5 +1,6 @@
import graphene
from graphene import relay
from graphene.types import generic
from graphene_django.rest_framework import serializer_converter

from . import filters, models, serializers
Expand Down Expand Up @@ -43,7 +44,7 @@ class Question(Node, graphene.Interface):
is_required = QuestionJexl(required=True)
is_hidden = QuestionJexl(required=True)
is_archived = graphene.Boolean(required=True)
meta = graphene.JSONString(required=True)
meta = generic.GenericScalar(required=True)
forms = DjangoFilterConnectionField(
"caluma.form.schema.Form", filterset_class=filters.FormFilterSet
)
Expand Down Expand Up @@ -172,6 +173,7 @@ class Form(DjangoObjectType):
questions = DjangoFilterSetConnectionField(
QuestionConnection, filterset_class=filters.QuestionFilterSet
)
meta = generic.GenericScalar()

class Meta:
model = models.Form
Expand Down Expand Up @@ -299,7 +301,7 @@ class Answer(Node, graphene.Interface):
created_by_group = graphene.String()
modified_at = graphene.DateTime(required=True)
question = graphene.Field(Question, required=True)
meta = graphene.JSONString(required=True)
meta = generic.GenericScalar(required=True)

@classmethod
def resolve_type(cls, instance, info):
Expand Down
14 changes: 7 additions & 7 deletions caluma/form/tests/snapshots/snap_test_form.py
Expand Up @@ -19,7 +19,7 @@
"clientMutationId": "testid",
"form": {
"id": "Rm9ybTplZmZvcnQtbWVldA==",
"meta": "{}",
"meta": {},
"name": "Brian Williams",
"slug": "effort-meet",
},
Expand All @@ -31,7 +31,7 @@
"clientMutationId": "testid",
"form": {
"id": "Rm9ybTplZmZvcnQtbWVldA==",
"meta": "{}",
"meta": {},
"name": "Brian Williams",
"slug": "effort-meet",
},
Expand All @@ -43,7 +43,7 @@
"clientMutationId": "testid",
"form": {
"id": "Rm9ybTplZmZvcnQtbWVldA==",
"meta": "{}",
"meta": {},
"name": "Brian Williams",
"slug": "effort-meet",
},
Expand All @@ -55,7 +55,7 @@
"clientMutationId": "testid",
"form": {
"id": "Rm9ybTplZmZvcnQtbWVldA==",
"meta": "{}",
"meta": {},
"name": "Brian Williams",
"slug": "effort-meet",
},
Expand All @@ -69,7 +69,7 @@
"node": {
"description": "First result",
"id": "Rm9ybTplZmZvcnQtbWVldA==",
"meta": "{}",
"meta": {},
"name": "1st",
"questions": {
"edges": [
Expand All @@ -89,7 +89,7 @@
"node": {
"description": "Second result",
"id": "Rm9ybTpraXRjaGVuLWRldmVsb3A=",
"meta": "{}",
"meta": {},
"name": "2nd",
"questions": {"edges": []},
"slug": "kitchen-develop",
Expand All @@ -99,7 +99,7 @@
"node": {
"description": "Second result",
"id": "Rm9ybTpzZXJ2aWNlLWJhbmstYXJt",
"meta": "{}",
"meta": {},
"name": "3rd",
"questions": {"edges": []},
"slug": "service-bank-arm",
Expand Down
32 changes: 16 additions & 16 deletions caluma/form/tests/snapshots/snap_test_question.py
Expand Up @@ -14,7 +14,7 @@
"__typename": "TableQuestion",
"id": "VGFibGVRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"rowForm": {"slug": "effort-meet"},
"slug": "sound-air-mission",
},
Expand All @@ -31,7 +31,7 @@
"integerMaxValue": 10,
"integerMinValue": 0,
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
}
}
Expand All @@ -49,7 +49,7 @@
"floatMinValue": 0.0,
"id": "RmxvYXRRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
}
}
Expand All @@ -67,7 +67,7 @@
"floatMinValue": None,
"id": "RmxvYXRRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
}
}
Expand All @@ -84,7 +84,7 @@
"id": "VGV4dFF1ZXN0aW9uOnNvdW5kLWFpci1taXNzaW9u",
"label": "Thomas Johnson",
"maxLength": 10,
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
}
}
Expand All @@ -101,7 +101,7 @@
"id": "VGV4dGFyZWFRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"maxLength": 10,
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
}
}
Expand All @@ -117,7 +117,7 @@
"__typename": "ChoiceQuestion",
"id": "Q2hvaWNlUXVlc3Rpb246c291bmQtYWlyLW1pc3Npb24=",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"options": {"edges": [{"node": {"slug": "example-indicate"}}]},
"slug": "sound-air-mission",
}
Expand All @@ -134,7 +134,7 @@
"__typename": "MultipleChoiceQuestion",
"id": "TXVsdGlwbGVDaG9pY2VRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"options": {"edges": [{"node": {"slug": "example-indicate"}}]},
"slug": "sound-air-mission",
}
Expand All @@ -150,7 +150,7 @@
"__typename": "TextQuestion",
"id": "VGV4dFF1ZXN0aW9uOnNvdW5kLWFpci1taXNzaW9u",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
},
}
Expand All @@ -163,7 +163,7 @@
"__typename": "TextareaQuestion",
"id": "VGV4dGFyZWFRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
},
}
Expand All @@ -176,7 +176,7 @@
"__typename": "IntegerQuestion",
"id": "SW50ZWdlclF1ZXN0aW9uOnNvdW5kLWFpci1taXNzaW9u",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
},
}
Expand All @@ -189,7 +189,7 @@
"__typename": "FloatQuestion",
"id": "RmxvYXRRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
},
}
Expand All @@ -203,7 +203,7 @@
"id": "RmxvYXRRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"maxValue": 10.0,
"meta": "{}",
"meta": {},
"minValue": 0.0,
"slug": "sound-air-mission",
},
Expand All @@ -217,7 +217,7 @@
"__typename": "IntegerQuestion",
"id": "SW50ZWdlclF1ZXN0aW9uOnNvdW5kLWFpci1taXNzaW9u",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"slug": "sound-air-mission",
},
}
Expand All @@ -230,7 +230,7 @@
"__typename": "MultipleChoiceQuestion",
"id": "TXVsdGlwbGVDaG9pY2VRdWVzdGlvbjpzb3VuZC1haXItbWlzc2lvbg==",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"options": {
"edges": [
{
Expand All @@ -254,7 +254,7 @@
"__typename": "ChoiceQuestion",
"id": "Q2hvaWNlUXVlc3Rpb246c291bmQtYWlyLW1pc3Npb24=",
"label": "Thomas Johnson",
"meta": "{}",
"meta": {},
"options": {
"edges": [
{"node": {"label": "Kelly Brock", "slug": "example-indicate"}}
Expand Down