def range_filter(field, start_date_math=None, end_date_math=None, **kwargs):
    """Create a range filter.

    :param field: Field name.
    :param start_date_math: Starting date.
    :param end_date_math: Ending date.
    :param kwargs: Addition arguments passed to the Range query.
    :returns: Function that returns the Range query.
    """
    def inner(values):
        if len(values) != 1 or values[0].count('--') != 1 or values[0] == '--':
            raise RESTValidationError(
                errors=[FieldError(field, 'Invalid range format.')])

        range_ends = values[0].split('--')
        range_args = dict()

        ineq_opers = [{'strict': 'gt', 'nonstrict': 'gte'},
                      {'strict': 'lt', 'nonstrict': 'lte'}]
        date_maths = [start_date_math, end_date_math]

        # Add the proper values to the dict
        for (range_end, strict, opers,
             date_math) in zip(range_ends, ['>', '<'], ineq_opers, date_maths):

            if range_end != '':
                # If first char is '>' for start or '<' for end
                if range_end[0] == strict:
                    dict_key = opers['strict']
                    range_end = range_end[1:]
                else:
                    dict_key = opers['nonstrict']

                if date_math:
                    range_end = '{0}||{1}'.format(range_end, date_math)

                range_args[dict_key] = range_end

        args = kwargs.copy()
        args.update(range_args)

        return Range(**{field: args})

    return inner
def range_filter ( field , start_date_math = None , end_date_math = None , ** kwargs ) : def inner ( values ) : if len ( values ) != 1 or values [ 0 ] . count ( '--' ) != 1 or values [ 0 ] == '--' : raise RESTValidationError ( errors = [ FieldError ( field , 'Invalid range format.' ) ] ) range_ends = values [ 0 ] . split ( '--' ) range_args = dict ( ) ineq_opers = [ { 'strict' : 'gt' , 'nonstrict' : 'gte' } , { 'strict' : 'lt' , 'nonstrict' : 'lte' } ] date_maths = [ start_date_math , end_date_math ] for ( range_end , strict , opers , date_math ) in zip ( range_ends , [ '>' , '<' ] , ineq_opers , date_maths ) : if range_end != '' : if range_end [ 0 ] == strict : dict_key = opers [ 'strict' ] range_end = range_end [ 1 : ] else : dict_key = opers [ 'nonstrict' ] if date_math : range_end = '{0}||{1}' . format ( range_end , date_math ) range_args [ dict_key ] = range_end args = kwargs . copy ( ) args . update ( range_args ) return Range ( ** { field : args } ) return inner
Create a range filter.

    :param field: Field name.
    :param start_date_math: Starting date.
    :param end_date_math: Ending date.
    :param kwargs: Addition arguments passed to the Range query.
    :returns: Function that returns the Range query.