cli_utils.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. """
  2. Shared CLI utilities for ArchiveBox commands.
  3. This module contains common utilities used across multiple CLI commands,
  4. extracted to avoid code duplication.
  5. """
  6. __package__ = 'archivebox.cli'
  7. from typing import Optional
  8. def apply_filters(queryset, filter_kwargs: dict, limit: Optional[int] = None):
  9. """
  10. Apply Django-style filters from CLI kwargs to a QuerySet.
  11. Supports: --status=queued, --url__icontains=example, --id__in=uuid1,uuid2
  12. Args:
  13. queryset: Django QuerySet to filter
  14. filter_kwargs: Dict of filter key-value pairs from CLI
  15. limit: Optional limit on results
  16. Returns:
  17. Filtered QuerySet
  18. Example:
  19. queryset = Snapshot.objects.all()
  20. filter_kwargs = {'status': 'queued', 'url__icontains': 'example.com'}
  21. filtered = apply_filters(queryset, filter_kwargs, limit=10)
  22. """
  23. filters = {}
  24. for key, value in filter_kwargs.items():
  25. if value is None or key in ('limit', 'offset'):
  26. continue
  27. # Handle CSV lists for __in filters
  28. if key.endswith('__in') and isinstance(value, str):
  29. value = [v.strip() for v in value.split(',')]
  30. filters[key] = value
  31. if filters:
  32. queryset = queryset.filter(**filters)
  33. if limit:
  34. queryset = queryset[:limit]
  35. return queryset