Author: ramiro
Date: 2011-01-24 08:58:05 -0600 (Mon, 24 Jan 2011)
New Revision: 15296

Added:
   django/trunk/tests/regressiontests/inspectdb/
   django/trunk/tests/regressiontests/inspectdb/__init__.py
   django/trunk/tests/regressiontests/inspectdb/bug/
   django/trunk/tests/regressiontests/inspectdb/bug/__init__.py
   django/trunk/tests/regressiontests/inspectdb/bug/models.py
   django/trunk/tests/regressiontests/inspectdb/models.py
   django/trunk/tests/regressiontests/inspectdb/tests.py
Modified:
   django/trunk/django/core/management/commands/inspectdb.py
Log:
Fixed 14796 -- Modified order of operations performed on field names by the 
inspectdb command so it doesn't generates model fields with names equal to 
Python keywords. Thanks pappjm at gmail dot com for the report and mmcnickle 
for the fix.

Modified: django/trunk/django/core/management/commands/inspectdb.py
===================================================================
--- django/trunk/django/core/management/commands/inspectdb.py   2011-01-24 
14:24:35 UTC (rev 15295)
+++ django/trunk/django/core/management/commands/inspectdb.py   2011-01-24 
14:58:05 UTC (rev 15296)
@@ -20,7 +20,7 @@
     def handle_noargs(self, **options):
         try:
             for line in self.handle_inspection(options):
-                print line
+                self.stdout.write("%s\n" % line)
         except NotImplementedError:
             raise CommandError("Database inspection isn't supported for the 
currently selected database backend.")
 
@@ -66,12 +66,11 @@
                 if ' ' in att_name:
                     att_name = att_name.replace(' ', '_')
                     comment_notes.append('Field renamed to remove spaces.')
+                    
                 if '-' in att_name:
                     att_name = att_name.replace('-', '_')
                     comment_notes.append('Field renamed to remove dashes.')
-                if keyword.iskeyword(att_name):
-                    att_name += '_field'
-                    comment_notes.append('Field renamed because it was a 
Python reserved word.')
+                    
                 if column_name != att_name:
                     comment_notes.append('Field name made lowercase.')
 
@@ -97,6 +96,10 @@
                             extra_params['unique'] = True
 
                     field_type += '('
+                    
+                if keyword.iskeyword(att_name):
+                    att_name += '_field'
+                    comment_notes.append('Field renamed because it was a 
Python reserved word.')
 
                 # Don't output 'id = meta.AutoField(primary_key=True)', because
                 # that's assumed if it doesn't exist.

Added: django/trunk/tests/regressiontests/inspectdb/__init__.py
===================================================================
--- django/trunk/tests/regressiontests/inspectdb/__init__.py                    
        (rev 0)
+++ django/trunk/tests/regressiontests/inspectdb/__init__.py    2011-01-24 
14:58:05 UTC (rev 15296)
@@ -0,0 +1 @@
+

Added: django/trunk/tests/regressiontests/inspectdb/bug/__init__.py
===================================================================
--- django/trunk/tests/regressiontests/inspectdb/bug/__init__.py                
                (rev 0)
+++ django/trunk/tests/regressiontests/inspectdb/bug/__init__.py        
2011-01-24 14:58:05 UTC (rev 15296)
@@ -0,0 +1 @@
+

Added: django/trunk/tests/regressiontests/inspectdb/bug/models.py
===================================================================
--- django/trunk/tests/regressiontests/inspectdb/bug/models.py                  
        (rev 0)
+++ django/trunk/tests/regressiontests/inspectdb/bug/models.py  2011-01-24 
14:58:05 UTC (rev 15296)
@@ -0,0 +1,7 @@
+from django.db import models
+
+class People(models.Model):
+    name = models.CharField(max_length=255)
+
+class Message(models.Model):
+    from_field = models.ForeignKey(People, db_column='from_id')

Added: django/trunk/tests/regressiontests/inspectdb/models.py
===================================================================
--- django/trunk/tests/regressiontests/inspectdb/models.py                      
        (rev 0)
+++ django/trunk/tests/regressiontests/inspectdb/models.py      2011-01-24 
14:58:05 UTC (rev 15296)
@@ -0,0 +1 @@
+

Added: django/trunk/tests/regressiontests/inspectdb/tests.py
===================================================================
--- django/trunk/tests/regressiontests/inspectdb/tests.py                       
        (rev 0)
+++ django/trunk/tests/regressiontests/inspectdb/tests.py       2011-01-24 
14:58:05 UTC (rev 15296)
@@ -0,0 +1,29 @@
+import os
+import sys
+from StringIO import StringIO
+
+from django.conf import settings
+from django.core.management import call_command
+from django.db.models.loading import load_app
+from django.test import TestCase
+
+class InspectDBTestCase(TestCase):
+    
+    def setUp(self):
+        self.old_sys_path = sys.path[:]
+        sys.path.append(os.path.dirname(os.path.abspath(__file__)))
+        self.old_installed_apps = settings.INSTALLED_APPS
+        settings.INSTALLED_APPS = ('bug',)
+        map(load_app, settings.INSTALLED_APPS)
+        call_command('syncdb', verbosity=0)
+        
+    def test_attribute_name_not_python_keyword(self):
+        out = StringIO()
+        call_command('inspectdb', stdout=out)
+        error_message = "inspectdb generated an attribute name which is a 
python keyword"
+        self.assertNotIn("from = models.ForeignKey(BugPeople)", 
out.getvalue(), msg=error_message)
+        out.close()
+        
+    def tearDown(self):
+        settings.INSTALLED_APPS = self.old_installed_apps
+        sys.path = self.old_sys_path

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to