makeplane/plane · error · ValueError

Invalid date format: {value}

Error message

Invalid date format: {value}

What it means

ValueError raised in `_process_date_field` (converters.py:280) when `strict=True` and a simple (no ';') date value fails `_validate_date`, which uses dateutil's parser. It only fires in strict mode; non-strict skips the value. The bad value is interpolated into the message.

Source

Thrown at apps/api/plane/utils/filters/converters.py:280

                if len(parts) > 0 and self.DATE_PATTERN.match(parts[0]):
                    # Skip relative date patterns entirely
                    return {}

        # Skip complex conditions (more than 2 values)
        if len(values) > 2:
            return {}

        # Process each date value
        exact_dates = []
        after_dates = []
        before_dates = []

        for value in values:
            if ";" not in value:
                # Simple date string
                if not self._validate_date(value):
                    if strict:
                        raise ValueError(f"Invalid date format: {value}")
                    continue
                exact_dates.append(value)
            else:
                # Directional date - only handle basic after/before
                parts = value.split(";")
                if len(parts) < 2:
                    if strict:
                        raise ValueError(f"Invalid date format: {value}")
                    continue

                date_part = parts[0]
                direction = parts[1]

                if not self._validate_date(date_part):
                    if strict:
                        raise ValueError(f"Invalid date format: {date_part}")
                    continue

View on GitHub (pinned to 1c8a60f858)

Solutions

  1. Send dates in ISO 8601 (YYYY-MM-DD) which dateutil reliably parses.
  2. Disable strict mode (strict=False) to skip invalid date values instead of raising.
  3. Pre-validate each date with dateutil.parser.parse client-side before submitting the filter.
  4. Strip whitespace and non-printable characters from pasted date strings.

Example fix

# before
filters = {"target_date": ["not-a-date"]}
converter.convert(filters, strict=True)  # raises

# after
filters = {"target_date": ["2024-08-12"]}
converter.convert(filters, strict=True)
Defensive patterns

Strategy: validation

Validate before calling

from dateutil.parser import parse as dateutil_parse

def is_parseable_date(value: str) -> bool:
    # mirrors converters.py _validate_date for strings
    try:
        dateutil_parse(value); return True
    except (ValueError, TypeError):
        return False

Try / catch

try:
    converter.convert(filters, strict=True)
except ValueError as e:
    if 'Invalid date format' in str(e):
        reject_bad_dates(e)

Prevention

When it happens

Trigger: Calling the legacy-to-rich filter converter with strict=True and a date filter value that dateutil cannot parse - e.g. '2024-13-99', 'not-a-date', 'tomorrow', or a locale-formatted string dateutil rejects. Single (non-directional) date values hit this branch.

Common situations: Migrating legacy filter payloads with strict validation enabled; client sending free-text instead of ISO dates; locale-specific formats dateutil does not accept by default; copy-paste from spreadsheets with invisible characters.

Related errors


AI-assisted analysis of makeplane/plane@1c8a60f858 (2026-08-12). Data as JSON: /api/errors/6253d937262b74ba. Report an issue: GitHub.