Skip to content

FilterExtensionGetRequest invalid fields #713

@jamesfisher-geo

Description

@jamesfisher-geo

https://github.com/stac-utils/stac-fastapi/blob/main/stac_fastapi/extensions/stac_fastapi/extensions/core/filter/request.py#L13-L20

The filter_crs and filter_lang fields are invalid because FilterExtensionGetRequest is an attrs class, but it uses Field from pydantic.

If I try to init the class and define filter_lang, for example.

from typing import Any, Dict, Literal, Optional

import attr
from pydantic import BaseModel, Field

from stac_fastapi.types.search import APIRequest

FilterLang = Literal["cql-json", "cql2-json", "cql2-text"]


@attr.s
class FilterExtensionGetRequest(APIRequest):
    """Filter extension GET request model."""

    filter: Optional[str] = attr.ib(default=None)
    filter_crs: Optional[str] = Field(alias="filter-crs", default=None)
    filter_lang: Optional[FilterLang] = Field(alias="filter-lang", default="cql2-text")


FilterExtensionGetRequest(
    filter="{}",
    filter_crs="",
    filter_lang="cql2-json"
)
# TypeError: init() got an unexpected keyword argument 'filter_crs'

the class also does not impose the default values for filter_crs and filter_lang

FilterExtensionGetRequest()
# FilterExtensionGetRequest(filter=None)

I think there are two options:

  • Make filter_crs and filter_lang into attrs fields. AFAIK attrs does not support applying an alias to fields.
  • Make FilterExtensionGetRequest into a pydantic class.

Why do we have GET request models as attrs classes and POST request models as pydantic classes?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions