mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #32528 -- Replaced django.utils.topological_sort with graphlib.TopologicalSort().
graphlib.TopologicalSort() is available since Python 3.9.
This commit is contained in:
committed by
Mariusz Felisiak
parent
4470c2405c
commit
1282b5e420
@@ -6,6 +6,7 @@ import copy
|
||||
import datetime
|
||||
import warnings
|
||||
from collections import defaultdict
|
||||
from graphlib import CycleError, TopologicalSorter
|
||||
from itertools import chain
|
||||
|
||||
from django.forms.utils import to_current_timezone
|
||||
@@ -17,7 +18,6 @@ from django.utils.formats import get_format
|
||||
from django.utils.html import format_html, html_safe
|
||||
from django.utils.regex_helper import _lazy_re_compile
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.topological_sort import CyclicDependencyError, stable_topological_sort
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from .renderers import get_default_renderer
|
||||
@@ -151,22 +151,22 @@ class Media:
|
||||
in a certain order. In JavaScript you may not be able to reference a
|
||||
global or in CSS you might want to override a style.
|
||||
"""
|
||||
dependency_graph = defaultdict(set)
|
||||
ts = TopologicalSorter()
|
||||
all_items = OrderedSet()
|
||||
for list_ in filter(None, lists):
|
||||
head = list_[0]
|
||||
# The first items depend on nothing but have to be part of the
|
||||
# dependency graph to be included in the result.
|
||||
dependency_graph.setdefault(head, set())
|
||||
ts.add(head)
|
||||
for item in list_:
|
||||
all_items.add(item)
|
||||
# No self dependencies
|
||||
if head != item:
|
||||
dependency_graph[item].add(head)
|
||||
ts.add(item, head)
|
||||
head = item
|
||||
try:
|
||||
return stable_topological_sort(all_items, dependency_graph)
|
||||
except CyclicDependencyError:
|
||||
return list(ts.static_order())
|
||||
except CycleError:
|
||||
warnings.warn(
|
||||
"Detected duplicate Media files in an opposite order: {}".format(
|
||||
", ".join(repr(list_) for list_ in lists)
|
||||
|
||||
Reference in New Issue
Block a user