Commit f5ea730d authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #18843 -- Replaced more special chars in column names (inspectdb)

Thanks airstrike for the report.
parent 395c6083
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
from __future__ import unicode_literals

import keyword
import re
from optparse import make_option

from django.core.management.base import NoArgsCommand, CommandError
@@ -142,17 +143,15 @@ class Command(NoArgsCommand):
            else:
                field_params['db_column'] = col_name

        if ' ' in new_name:
            new_name = new_name.replace(' ', '_')
            field_notes.append('Field renamed to remove spaces.')

        if '-' in new_name:
            new_name = new_name.replace('-', '_')
            field_notes.append('Field renamed to remove dashes.')
        new_name, num_repl = re.subn(r'\W', '_', new_name)
        if num_repl > 0:
            field_notes.append('Field renamed to remove unsuitable characters.')

        if new_name.find('__') >= 0:
            while new_name.find('__') >= 0:
                new_name = new_name.replace('__', '_')
            if col_name.lower().find('__') >= 0:
                # Only add the comment if the double underscore was in the original name
                field_notes.append("Field renamed because it contained more than one '_' in a row.")

        if new_name.startswith('_'):
+4 −1
Original line number Diff line number Diff line
@@ -20,8 +20,11 @@ class DigitsInColumnName(models.Model):
    leading_digit = models.CharField(max_length=11, db_column='4extra')
    leading_digits = models.CharField(max_length=11, db_column='45extra')

class UnderscoresInColumnName(models.Model):
class SpecialColumnName(models.Model):
    field = models.IntegerField(db_column='field')
    # Underscores
    field_field_0 = models.IntegerField(db_column='Field_')
    field_field_1 = models.IntegerField(db_column='Field__')
    field_field_2 = models.IntegerField(db_column='__field')
    # Other chars
    prc_x = models.IntegerField(db_column='prc(%) x')
+5 −2
Original line number Diff line number Diff line
@@ -59,8 +59,10 @@ class InspectDBTestCase(TestCase):
        self.assertNotIn("    45extra = models.CharField", output, msg=error_message)
        self.assertIn("number_45extra = models.CharField", output)

    def test_underscores_column_name_introspection(self):
        """Introspection of column names containing underscores (#12460)"""
    def test_special_column_name_introspection(self):
        """Introspection of column names containing special characters,
           unsuitable for Python identifiers
        """
        out = StringIO()
        call_command('inspectdb', stdout=out)
        output = out.getvalue()
@@ -68,3 +70,4 @@ class InspectDBTestCase(TestCase):
        self.assertIn("field_field = models.IntegerField(db_column='Field_')", output)
        self.assertIn("field_field_0 = models.IntegerField(db_column='Field__')", output)
        self.assertIn("field_field_1 = models.IntegerField(db_column='__field')", output)
        self.assertIn("prc_x = models.IntegerField(db_column='prc(%) x')", output)