All notable changes to this project are documented here. The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Version 1.0.2 February 4, 2026
Added
Bulk Kits Endpoint
Bulk Kits Endpoint
GET /api/kits/bulk - New endpoint for retrieving multiple kits in a single request- Accepts comma-separated slugs or full URLs
- Minimum 2 kits, maximum 30 kits per request
- Returns reduced schema for efficiency
- Preserves input order in response
User Collection API
User Collection API
User Collection Endpoints - Retrieve user kit collections from FootballKitArchive.com
GET /api/user-collection/{userid}- Get user collection with paginationPOST /api/user-collection/{userid}/scrape- Trigger collection scrape (cached 1 week or async via Celery)- Scraper includes filtering (skips entries with custom_* fields)
- Proxy support for scraping
- Data enrichment with brands, clubs, and user info from
/api/user.php
Additional Features
Additional Features
- IP Whitelist - Rate limiting whitelist support via
.envconfiguration - Management Command -
clean_double_slash_urlsto fix double slashes in URL fields (Brand, Club, Competition, Kit) - HTML Sanitization - Safe tag whitelist for documentation rendering to mitigate XSS
- SonarCloud Badges - Added to documentation README
- Test Improvements - Cache clearing in setUp/tearDown for better isolation; improved Celery mock handling
Changed
- Healthcheck Improvements - Now uses
http.client.HTTPConnectionand accepts 200 or 301 status codes (fixes failure whenSECURE_SSL_REDIRECTredirects to HTTPS) - Environment Configuration -
.env.exampleand docker-compose updated forDJANGO_SECRET_KEY; Celery script errors written to stderr - Cache Invalidation Refactor -
cache_utilsrefactored around a dictionary of model invalidators - Scraper Enhancements:
- HTML parser constant for consistency
- Season slug normalization
- ReDoS-safe slug parsing
- Reduced cognitive complexity across multiple functions
- API & Docs Views - Refactored to reduce cognitive complexity; docs restricted to GET with sanitized output
- User Scraper -
scrape_usermanagement command now uses the new user collection API scraper - Documentation - API documentation updated for bulk and user-collection endpoints (endpoint catalog, usage examples, Postman collection)
Removed
- Large Data File - Removed
data.jsonfrom repository - Legacy Views and Routes - Removed:
- Views: country-assignment, propagation, review, suggest-competition
- Routes: clubs-without-country, competition-clubs, random-kits/clubs, top-clubs-by-country
- Note: API and docs endpoints unchanged
Fixed
- Healthcheck - No longer fails on production due to HTTPS redirect
- Test Reliability - Fixed cache cross-contamination issues
- Celery Utils - Better handling of mocks without
__name__attribute - Type_K Documentation - Corrected translation of “jacket” from Spanish to English
Security
- Documentation Views - Restricted to GET requests only; rendered HTML sanitized to prevent XSS
- HTTP Method Restrictions - Added to assign_countries and suggest_competition_countries views
Version 1.0.1 January 23, 2026
Added
Type_K Categorization System
Type_K Categorization System
Automatic Kit Type Categorization
- New fields:
category,category_order,order_priority,is_goalkeeper - Management command
categorize_type_kfor bulk categorization - Automatic categorization on kit creation during scraping
- Enhanced Django Admin interface with new categorization fields
Enhanced Season Search
Enhanced Season Search
Priority-based Season Ordering
- Improved search for 4-digit years (e.g., “2025” returns “2025”, “2025-26”, “2024-25” in correct order)
- Support for 2-digit year searches (e.g., “97” matches “1997”, “1996-97”)
- Uses
first_yearandsecond_yearfields for accurate matching
Secondary Team Filtering
Secondary Team Filtering
Smart Team Prioritization
- Prioritizes primary teams over secondary teams (B, C, youth, women’s teams)
- Detects: II, III, B, C, Jong, Youth, U17-U23, Ladies, Women, Femenino, Féminas, Féminine, Lads, Frauen
Season Management Commands
Season Management Commands
delete_future_seasons- Delete seasons with incorrect future years and save kit slugsrescrape_from_file- Rescrape kits from a JSON file containing slugs
Changed
- API Response - Now includes Type_K categorization fields (
category,category_order,order_priority,is_goalkeeper) - Kit Search - Orders results by Type_K category and priority
- Season Search - Uses priority-based ordering for better relevance
- Error Handling - Improved validation across the API
Fixed
- Season Search - Ordering now prioritizes exact matches and relevant results
- Type_K Categorization - Logic correctly distinguishes “training” from “jacket” types
- Unicode Encoding - Fixed issues in management commands for Windows compatibility
Security
Security improvements from previous releases (headers, validation, etc.)Testing
- Comprehensive tests for Type_K categorization
- Tests for season search priority ordering
- Tests for secondary team filtering
Version 1.0.0 Initial Release
Initial Release
Core API
Full REST API functionality with Django Ninja
Data Models
Kit, Club, Season, Brand, Competition models
Search & Filter
Comprehensive search and filtering capabilities
Web Scraping
Ethical web scraping integration
Redis Caching
Performance optimization with Redis
Celery Support
Optional async task processing
Documentation
Complete API documentation
Admin Interface
Django admin for data management
Core Features
- RESTful API - Clean, intuitive API design
- Database Models - Well-structured relational database schema
- Search Functionality - Powerful search across kits, clubs, and more
- Web Scraping - Automated data collection with rate limiting
- Caching Layer - Redis-based caching for performance
- Async Tasks - Optional Celery integration for background jobs
- API Documentation - Interactive API docs with Django Ninja
- Admin Interface - Django admin for data management
- Testing Suite - Comprehensive test coverage
- Docker Support - Containerized deployment
Release Links
For detailed commit history, see the GitHub repository.