Code

Opened 20 months ago

Closed 6 months ago

Last modified 6 months ago

#18866 closed Bug (fixed)

model Meta verbose_name too long error message not obvious

Reported by: elena Owned by: toyg
Component: contrib.auth Version: 1.4
Severity: Normal Keywords:
Cc: kerry@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Running:

$ python manage.py syncdb

The following error messages:

Postgres:

Creating tables ...
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/Library/Python/2.7/site-packages/django/core/management/commands/syncdb.py", line 110, in handle_noargs
    emit_post_sync_signal(created_models, verbosity, interactive, db)
  File "/Library/Python/2.7/site-packages/django/core/management/sql.py", line 189, in emit_post_sync_signal
    interactive=interactive, db=db)
  File "/Library/Python/2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/Library/Python/2.7/site-packages/django/contrib/auth/management/__init__.py", line 54, in create_permissions
    auth_app.Permission.objects.bulk_create(objs)
  File "/Library/Python/2.7/site-packages/django/db/models/manager.py", line 140, in bulk_create
    return self.get_query_set().bulk_create(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 416, in bulk_create
    self.model._base_manager._insert(objs_without_pk, fields=[f for f in fields if not isinstance(f, AutoField)], using=self.db)
  File "/Library/Python/2.7/site-packages/django/db/models/manager.py", line 203, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 1576, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py", line 910, in execute_sql
    cursor.execute(sql, params)
  File "/Library/Python/2.7/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/Library/Python/2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: value too long for type character varying(50)

MySQL:

Creating tables ...
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 110, in handle_noargs
    emit_post_sync_signal(created_models, verbosity, interactive, db)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/sql.py", line 189, in emit_post_sync_signal
    interactive=interactive, db=db)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 54, in create_permissions
    auth_app.Permission.objects.bulk_create(objs)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/manager.py", line 140, in bulk_create
    return self.get_query_set().bulk_create(*args, **kwargs)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/query.py", line 416, in bulk_create
    self.model._base_manager._insert(objs_without_pk, fields=[f for f in fields if not isinstance(f, AutoField)], using=self.db)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/manager.py", line 203, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/query.py", line 1576, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 910, in execute_sql
    cursor.execute(sql, params)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 114, in execute
    return self.cursor.execute(query, args)
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/MySQLdb/cursors.py", line 176, in execute
    if not self._defer_warnings: self._warning_check()
  File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/MySQLdb/cursors.py", line 92, in _warning_check
    warn(w[-1], self.Warning, 3)
_mysql_exceptions.Warning: Data truncated for column 'name' at row 13

What is this error?

It is caused by contenttypes.name, see SO:
http://stackoverflow.com/questions/10855978/heroku-and-django-value-too-long-for-type-character-varying50

Easily replicated:

class MyModel(models.Model):
    class Meta:
        verbose_name = "soem ridiculously long verbose name that is out of control"

This is not serious. It's just not obvious.

Attachments (0)

Change History (14)

comment:1 Changed 20 months ago by thejaswi_puthraya

  • Component changed from Uncategorized to Database layer (models, ORM)
  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

comment:2 Changed 17 months ago by aaugustin

  • Component changed from Database layer (models, ORM) to contrib.auth
  • Triage Stage changed from Unreviewed to Accepted
  • Type changed from Uncategorized to Bug

Yes, I've hit that several times myself. It's annoying. syncdb crashes because it tries to create a permission with a name that's longer than 50 characters.

Possible solutions:

  • improve the error message
  • display a warning and truncate the value
  • increase the size of the field to 200 characters (insert usual rant about lack of migrations in core here)

comment:5 Changed 11 months ago by djangsters

I added a simple validation before bulk_creation and a hint to the verbose_name
see: https://github.com/django/django/pull/1140

comment:6 Changed 11 months ago by filias

Wouldn't it be good to have a test for this?

comment:7 Changed 11 months ago by filias

  • Has patch set
  • Needs tests set

comment:8 Changed 10 months ago by kerry@…

  • Cc kerry@… added

This also applies with a very similar error if you create your own Model permissions in Meta with a description over 50 Chars,

class Meta:
        permissions = (
            ("view_desks", "Can view desks"),
            ("track_attendance", "Can track attended/no-show with this unfeasibly long description of over 50 Chars"),
        )

I've added this comment in case it's useful to someone else following the same route as me when identifying the problem.

Would it make sense to fix under this ticket or shall I put in a new ticket?

comment:9 Changed 8 months ago by rasca

Related to #18959 that tracks the verbose_name errors

Version 0, edited 8 months ago by rasca (next)

comment:10 Changed 7 months ago by toyg

Ok, the problem is a bit more complex, and the abovementioned patch does not fix it.

The problem is that verbose_name is used to generate the auth_permission table; the "name" field in that table is set to varchar(50) (at least on PostgreSQL), but this record actually includes sentences ("Can add <verbose_name>", "Can delete <verbose_name>" and so on); so the actual practical limit is 39 characters for verbose_name. This is a weird number, common knowledge is that verbose_name can be up to 50 characters.

So the real fix is either to widen that field to 61 or more (50 + "Can delete ", which is 11 characters), or document that the limit is 39 on non-sqlite backends (sqlite doesn't really enforce limits to text fields).

I have a test and a fix for the validator to spot values that are too long, but there's no point in submitting a pull request if this point isn't settled first.

Last edited 7 months ago by toyg (previous) (diff)

comment:11 Changed 7 months ago by toyg

  • Resolution set to duplicate
  • Status changed from new to closed

Duplicate of #8548 and #8162

comment:12 Changed 7 months ago by toyg

  • Resolution duplicate deleted
  • Status changed from closed to new

comment:13 Changed 7 months ago by toyg

  • Owner changed from nobody to toyg
  • Status changed from new to assigned

Ok, using this bug to track *validation* only - the actual limit will stay at 39 as per #8162.

comment:14 Changed 6 months ago by joaoxsouls <joaoxsouls@…>

  • Resolution set to fixed
  • Status changed from assigned to closed

In 1ab27e9a65015373a49688f3ff6723cf85d5de56:

Fixed #18866 -- added validation error for verbose_name longer than 39 characters

Added a validation error check when creating the permissions for model, to avoid
cryptic database error when the verbose_name is longer than 39 characters
thanks elena for reporting it

comment:15 Changed 6 months ago by Marc Tamlyn <marc.tamlyn@…>

In 8ce3c3a9282ac19282060ddf6928b34a09d26672:

Merge pull request #1733 from joaoxsouls/#18866

Fixed #18866 -- added validation error for verbose_name longer than 39 characters

comment:16 Changed 6 months ago by Tim Graham <timograham@…>

In 91c77eeab837ff793311ac5b0321015a4e66d6da:

Avoided hardcoding Permission.name max_length

refs #18866.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.