Commit f01e1cd4 authored by Ramiro Morales's avatar Ramiro Morales
Browse files

[1.2.X] Fixed #14796 -- Modified order of operations performed on field names...

[1.2.X] 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, mmcnickle for the fix and Alex for simplifying the tests.

Backport of r15296 and r15297 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15301 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 5f923671
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ class Command(NoArgsCommand):
    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 @@ class Command(NoArgsCommand):
                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.')

@@ -98,6 +97,10 @@ class Command(NoArgsCommand):

                    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.
                if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
+1 −0
Original line number Diff line number Diff line
+8 −0
Original line number Diff line number Diff line
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')
+14 −0
Original line number Diff line number Diff line
from StringIO import StringIO

from django.core.management import call_command
from django.test import TestCase


class InspectDBTestCase(TestCase):
    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.assertFalse("from = models.ForeignKey(InspectdbPeople)" in out.getvalue(), msg=error_message)
        self.assertTrue("from_field = models.ForeignKey(InspectdbPeople)" in out.getvalue())
        out.close()