""" Shared CLI utilities for ArchiveBox commands. This module contains common utilities used across multiple CLI commands, extracted to avoid code duplication. """ __package__ = "archivebox.cli" def apply_filters(queryset, filter_kwargs: dict, limit: int | None = None): """ Apply Django-style filters from CLI kwargs to a QuerySet. Supports: --status=queued, --url__icontains=example, --id__in=uuid1,uuid2 Args: queryset: Django QuerySet to filter filter_kwargs: Dict of filter key-value pairs from CLI limit: Optional limit on results Returns: Filtered QuerySet Example: queryset = Snapshot.objects.all() filter_kwargs = {'status': 'queued', 'url__icontains': 'example.com'} filtered = apply_filters(queryset, filter_kwargs, limit=10) """ filters = {} for key, value in filter_kwargs.items(): if value is None or key in ("limit", "offset"): continue # Handle CSV lists for __in filters if key.endswith("__in") and isinstance(value, str): value = [v.strip() for v in value.split(",")] filters[key] = value if filters: queryset = queryset.filter(**filters) if limit: queryset = queryset[:limit] return queryset