import graphene
from ..enums import NoValue
__author__ = "Artur Barseghyan <artur.barseghyan@gmail.com>"
__copyright__ = "2019-2022 Artur Barseghyan"
__license__ = "GPL-2.0-only OR LGPL-2.1-or-later"
__all__ = (
'Contains',
'Direction',
'EndsWith',
'Exclude',
'Exists',
'GeoBoundingBox',
'GeoDistance',
'GeoPolygon',
'Gt',
'Gte',
'In',
'IsNull',
'Lt',
'Lte',
'Point',
'Prefix',
'Range',
'StartsWith',
'Term',
'Terms',
'Wildcard',
)
class _ListOfTypeString(graphene.List):
"""List of type string."""
required = True
def __init__(self, *args, **kwargs):
super(_ListOfTypeString, self).__init__(
of_type=graphene.String,
*args,
**kwargs
)
_number_or_date_types = (
graphene.Decimal,
graphene.Float,
graphene.Int,
graphene.Date,
graphene.DateTime,
)
class _NumberOrDate(graphene.InputObjectType):
"""Number or Date."""
decimal = graphene.Decimal(required=False)
float = graphene.Float(required=False)
int = graphene.Int(required=False)
datetime = graphene.DateTime(required=False)
date = graphene.Date(required=False)
# ***************************************************************
# ************************* Filtering ***************************
# ***************************************************************
[docs]class Term(graphene.String):
"""Terms.
filter:[
{category: {term: "Python"}]}}
]
"""
required = True
[docs]class Terms(_ListOfTypeString):
"""Terms.
filter:[
{category: {terms: ["Python", "Django"]}}
]
"""
[docs]class Range(graphene.InputObjectType):
"""Range.
filter:[
{range: {lower: "1000", upper: "2000", boost: "2.0"}]}}
]
"""
lower = graphene.Field(_NumberOrDate, required=True)
upper = graphene.Field(_NumberOrDate)
boost = graphene.Decimal()
[docs]class Exists(graphene.Boolean):
"""Exists.
filter:[
{category: {exist: true}]}}
]
"""
required = True
[docs]class Prefix(graphene.String):
"""Prefix.
filter:[
{category: {prefix: "bio"}]}}
]
"""
required = True
[docs]class StartsWith(Prefix):
"""Starts with (alias of prefix)."""
[docs]class Wildcard(graphene.String):
"""Wildcard.
filter:[
{category: {wildcard: "*bio*"}]}}
]
"""
required = True
[docs]class GeoDistance(graphene.InputObjectType):
"""Geo distance.
filter:[
{place: {geoDistance: {distance: "9km", lat: "40.0", lon="70.0"}}}
]
"""
distance = graphene.String(required=True)
lat = graphene.Decimal(required=True)
lon = graphene.Decimal(required=True)
[docs]class Point(graphene.InputObjectType):
"""Point. Helper for many geo lookups."""
lat = graphene.Decimal(required=True)
lon = graphene.Decimal(required=True)
[docs]class GeoPolygon(graphene.InputObjectType):
"""Geo polygon.
filter:[
{place: {geoPolygon: {points: [{lat: "40.0", lon="70.0"}]}}}
]
"""
points = graphene.List(Point, required=True)
[docs]class GeoBoundingBox(graphene.InputObjectType):
"""Geo polygon.
filter:[
{place: {geoBoundingBox: {
topLeft: {lat: "40.0", lon="70.0"},
bottomRight: {lat: "80.0", lon: "90.0"}
}}}
]
"""
top_left = graphene.Field(Point, required=True)
bottom_right = graphene.Field(Point, required=True)
[docs]class Contains(graphene.String):
"""Wildcard.
filter:[
{category: {contains: "lish"}]}}
]
"""
required = True
[docs]class In(_ListOfTypeString):
"""In.
filter:[
{category: {in: ["Python", "Django"]}}
]
"""
[docs]class Gt(_NumberOrDate):
"""Gt.
filter:[
{category: {gt: "1"}]}}
]
"""
class Meta:
types = list(_number_or_date_types)
required = True
[docs]class Gte(_NumberOrDate):
"""Gte.
filter:[
{category: {gte: "1"}]}}
]
"""
class Meta:
types = list(_number_or_date_types)
required = True
[docs]class Lt(_NumberOrDate):
"""Lt.
filter:[
{category: {lt: "1"}]}}
]
"""
class Meta:
types = list(_number_or_date_types)
required = True
[docs]class Lte(_NumberOrDate):
"""Lte.
filter:[
{category: {lte: "1"}]}}
]
"""
class Meta:
types = list(_number_or_date_types)
required = True
[docs]class EndsWith(graphene.String):
"""Ends with.
filter:[
{category: {endsWith: "dren"}]}}
]
"""
required = True
[docs]class IsNull(graphene.Boolean):
"""Is null.
filter:[
{category: {isNull: true}]}}
]
"""
required = True
[docs]class Exclude(_ListOfTypeString):
"""Exclude.
filter:[
{category: {exclude: ["Python", "Django"]}}
]
"""
# ***************************************************************
# ************************** Ordering ***************************
# ***************************************************************
@graphene.Enum.from_enum
class Direction(NoValue):
"""Ordering direction."""
ASC = 'asc'
DESC = 'desc'