Simon Law avatar Simon Law committed 30b5b2f

Make forwards_plan() and backwards_plan() use SortedDict to remove duplicates

Comments (0)

Files changed (1)

south/migration/base.py

 
 from django.core.exceptions import ImproperlyConfigured
 from django.db import models
+from django.utils.datastructures import SortedDict
 
 from south import exceptions
 from south.migration.utils import get_app_name
     def backwards(self):
         return self.migration_instance().backwards
 
+    def _forwards_plan(self):
+        result = SortedDict()
+        # We need to apply all the migrations this one depends on
+        for migration in self.dependencies():
+            result.update(migration._forwards_plan())
+        # Append ourselves to the result
+        result[self] = None
+        return result
+
     def forwards_plan(self):
         """
         Returns a list of Migration objects to be applied, in order.
 
         This list includes `self`, which will be applied last.
         """
-        result = []
+        return list(self._forwards_plan().iterkeys())
+
+    def _backwards_plan(self):
+        result = SortedDict()
         # We need to apply all the migrations this one depends on
-        for migration in self.dependencies():
-            result.extend([m for m in migration.forwards_plan()
-                           if m not in result])
+        for migration in self.dependents():
+            result.update(migration._backwards_plan())
         # Append ourselves to the result
-        result.append(self)
+        result[self] = None
         return result
 
     def backwards_plan(self):
 
         This list includes `self`, which will be unapplied last.
         """
-        result = []
-        # We need to apply all the migrations this one depends on
-        for migration in self.dependents():
-            result.extend([m for m in migration.backwards_plan()
-                           if m not in result])
-        # Append ourselves to the result
-        result.append(self)
-        return result
+        return list(self._backwards_plan().iterkeys())
 
     def is_before(self, other):
         if self.migrations == other.migrations:
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.