Anonymous avatar Anonymous committed 2ea4a5a

Make a) stubs freeze with models they depend on for their PK and b) cross-app model references for those work - #121.

Comments (0)

Files changed (3)

south/management/commands/startmigration.py

         depends.update(field_dependencies(field, last_models))
     return depends
 
+def stub_model_dependencies(model, last_models=None):
+    """
+    Returns a set of models this one depends on to be defined as a stub model
+    (i.e. deps of the PK).
+    """
+    return field_dependencies(model._meta.pk, last_models)
+
 def field_dependencies(field, last_models=None):
     depends = {}
     if isinstance(field, (models.OneToOneField, models.ForeignKey, models.ManyToManyField)):
-        if last_models:
-            depends[field.rel.to] = last_models
-        else:
-            depends[field.rel.to] = None
+        depends[field.rel.to] = last_models
+        depends.update(stub_model_dependencies(field.rel.to, last_models))
     return depends
     
 

south/modelsparser.py

             fields[fieldname] = inherited_fields[fieldname]
         # Is it a _ptr?
         elif fieldname.endswith("_ptr"):
-            fields[fieldname] = ("models.OneToOneField", [field.rel.to.__name__], {})
+            fields[fieldname] = ("models.OneToOneField", ["orm['%s.%s']" % (field.rel.to._meta.app_label, field.rel.to._meta.object_name)], {})
         # Try a default for 'id'.
         elif fieldname == "id":
             fields[fieldname] = ("models.AutoField", [], {"primary_key": "True"})
             if name.split(".")[0] == app
         ]))
         
+        # Ourselves as orm, to allow non-fail cross-app referencing
+        fake_locals['orm'] = self
+        
         # And a fake _ function
         fake_locals['_'] = lambda x: x
         
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.