def toggle_one_from_querystring(context, key, value, remove_values=None):
    """
    {% toggle_one_in_querystring "label" "foo" %}
        => remove foo from labels if present, or add it if not
    {% toggle_one_in_querystring "label" "foo" remove_values=somelist %}
        => remove foo from labels if present, or add it if not, and remove
           all values from remove_values, except the the one defined as value
    """
    qs_parts = _get_qs_parts_from_context(context)
    value = _coerce_value(value)

    if value is not None:
        _set_part_as_list(qs_parts, key)
        if value in qs_parts[key]:
            qs_parts[key].remove(value)
        else:
            qs_parts[key].append(value)

    if remove_values:
        for val in remove_values:
            if val != value:
                try:
                    qs_parts[key].remove(val)
                except ValueError:
                    pass

    if not len(qs_parts[key]):
        del qs_parts[key]
    return make_querystring(qs_parts)
def remove_from_querystring(context, key, *values):
    """
    {% remove_from_querystring "labels" "foo" %}
        => remove foo from labels
    {% remove_from_querystring "labels" "foo" "bar" %}
        => remove foo and bar from labels
    {% remove_from_querystring "labels" %}
        => remove the labels key
    """
    qs_parts = _get_qs_parts_from_context(context)
    if key in qs_parts:
        if not values:
            del qs_parts[key]
        else:
            _set_part_as_list(qs_parts, key)
            if isinstance(values[0], (list, tuple)):
                values = values[0]
            for value in values:
                value = _coerce_value(value)
                try:
                    qs_parts[key].remove(value)
                except ValueError:
                    pass
            if not len(qs_parts[key]):
                del qs_parts[key]
    return make_querystring(qs_parts)
def add_to_querystring(context, key, value):
    """
    {% add_to_querystring "labels" "foo" %}
        => add foo to labels
    """
    qs_parts = _get_qs_parts_from_context(context)
    value = _coerce_value(value)
    _set_part_as_list(qs_parts, key)
    qs_parts[key].append(value)
    return make_querystring(qs_parts)
    def prepare_issues_filter_context(self, filter_context):
        """
        Prepare a dict to use in the template, with many informations about the
        current filter: parts (as found in the querystring), objects (to use for
        display in the template), the base querystring (without user information
        ), and the full querystring (with user informations if a assigned/created
        filter is used)
        """
        # we need a querystring without the created/assigned parts
        qs_filter_without_user = dict(filter_context['qs_filters'])
        qs_filter_without_user.pop('user_filter_type', None)
        qs_filter_without_user.pop('username', None)

        context_issues_filter = {
            'parts': filter_context['qs_filters'],
            'objects': filter_context['filter_objects'],
            'querystring': make_querystring(qs_filter_without_user),
            'querystring_with_user': make_querystring(filter_context['qs_filters']),
        }

        return context_issues_filter
def replace_in_querystring(context, key, value):
    """
    {% replace_in_querystring "state" "open" %}
        => set the state to open
    """
    qs_parts = _get_qs_parts_from_context(context)
    value = _coerce_value(value)
    if value is None:
        qs_parts.pop(key, None)
    else:
        qs_parts[key] = value
    return make_querystring(qs_parts)
def toggle_in_querystring(context, key, value):
    """
    {% toggle_in_querystring "state" "open" %}
        => is state is open, remove the state, else set state to open
    """
    qs_parts = _get_qs_parts_from_context(context)
    value = _coerce_value(value)
    if value is not None:
        if key in qs_parts and qs_parts[key] == value:
            del qs_parts[key]
        else:
            qs_parts[key] = value
    return make_querystring(qs_parts)
def replace_many_in_querystring(context, *args):
    """
    {% replace_many_in_querystring "sort" "created" "direction" "asc" %}
        => set the sort to created and the direction to asc
    """
    qs_parts = _get_qs_parts_from_context(context)
    pairs = zip(args[::2], args[1::2])
    for key, value in pairs:
        value = _coerce_value(value)
        if value is None:
            qs_parts.pop(key, None)
        else:
            qs_parts[key] = value
    return make_querystring(qs_parts)