From 1ca54525f2155b214ef8702c39081d9838a98381 Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Sat, 31 Jan 2026 08:24:50 +0000 Subject: [PATCH] FIX: uuid_compat --- archivebox/__init__.py | 4 ++++ archivebox/uuid_compat.py | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/archivebox/__init__.py b/archivebox/__init__.py index 0079c7cc..7d471b40 100755 --- a/archivebox/__init__.py +++ b/archivebox/__init__.py @@ -15,6 +15,10 @@ import os import sys from pathlib import Path +# Import uuid_compat early to monkey-patch uuid.uuid7 before Django loads migrations +# This fixes migrations generated on Python 3.14+ that reference uuid.uuid7 directly +from archivebox import uuid_compat # noqa: F401 + # Force unbuffered output for real-time logs if hasattr(sys.stdout, 'reconfigure'): sys.stdout.reconfigure(line_buffering=True) diff --git a/archivebox/uuid_compat.py b/archivebox/uuid_compat.py index 00af61f5..d9b7c456 100755 --- a/archivebox/uuid_compat.py +++ b/archivebox/uuid_compat.py @@ -1,19 +1,40 @@ """UUID7 compatibility layer for Python 3.13+ Python 3.14+ has native uuid7 support. For Python 3.13, we use uuid_extensions. + +IMPORTANT: We also monkey-patch uuid.uuid7 for backward compatibility with +migrations that were auto-generated on Python 3.14+ systems. """ import sys +import uuid +import functools if sys.version_info >= (3, 14): - from uuid import uuid7 + from uuid import uuid7 as _uuid7 else: try: - from uuid_extensions import uuid7 + from uuid_extensions import uuid7 as _uuid7 except ImportError: raise ImportError( "uuid_extensions package is required for Python <3.14. " "Install it with: pip install uuid_extensions" ) + # Monkey-patch uuid module for migrations generated on Python 3.14+ + # that reference uuid.uuid7 directly + if not hasattr(uuid, 'uuid7'): + uuid.uuid7 = _uuid7 + + +@functools.wraps(_uuid7) +def uuid7(): + """Generate a UUID7 (time-ordered UUID). + + This wrapper ensures Django migrations always reference + 'archivebox.uuid_compat.uuid7' regardless of Python version. + """ + return _uuid7() + + __all__ = ['uuid7']