40

I'm trying to create an admin user as part of my tests.py to check on persmissions.

UPDATE: The tests.py is standard format that subclasses TestCase and the code below is called in the setUp() function.

I can create a normal user but not an admin user. If I try this:

    self.adminuser = User.objects.create_user('admin', '[email protected]', 'pass')
    self.adminuser.save()
    self.adminuser.is_staff = True
    self.adminuser.save()

OR self.adminuser = User.objects.create_superuser('admin', '[email protected]', 'pass') self.adminuser.save()

I get:

Warning: Data truncated for column 'name' at row 1

If I remove the is_staff line all is well (except I can't do my test!)

Do I have to load admin users as fixtures?

UserProfile is defined as follows:

class UserProfile(models.Model):

    user = models.ForeignKey(User, unique=True)
    organisation = models.ForeignKey(Organisation, null=True, blank=True)
    telephone = models.CharField(max_length=20, null=True, blank=True)

and full error traceback is:

    Traceback (most recent call last):
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 242, in __call__
        self._pre_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 217, in _pre_setup
        self._fixture_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 440, in _fixture_setup
        return super(TestCase, self)._fixture_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 222, in _fixture_setup
        call_command('flush', verbosity=0, interactive=False)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/__init__.py", line 166, in call_command
        return klass.execute(*args, **defaults)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 222, in execute
        output = self.handle(*args, **options)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 351, in handle
        return self.handle_noargs(**options)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/commands/flush.py", line 61, in handle_noargs
        emit_post_sync_signal(models.get_models(), verbosity, interactive)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/sql.py", line 205, in emit_post_sync_signal
        interactive=interactive)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/dispatch/dispatcher.py", line 166, in send
        response = receiver(signal=self, sender=sender, **named)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions
        defaults={'name': name, 'content_type': ctype})
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 123, in get_or_create
        return self.get_query_set().get_or_create(**kwargs)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 335, in get_or_create
        obj.save(force_insert=True)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 410, in save
        self.save_base(force_insert=force_insert, force_update=force_update)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 495, in save_base
        result = manager._insert(values, return_id=update_pk)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 177, in _insert
        return insert_query(self.model, values, **kwargs)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 1087, in insert_query
        return query.execute_sql(return_id)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/subqueries.py", line 320, in execute_sql
        cursor = super(InsertQuery, self).execute_sql(None)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/query.py", line 2369, in execute_sql
        cursor.execute(sql, params)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/backends/mysql/base.py", line 84, in execute
        return self.cursor.execute(query, args)
      File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 175, in execute
      File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 89, in _warning_check
      File "/usr/lib64/python2.4/warnings.py", line 61, in warn
        warn_explicit(message, category, filename, lineno, module, registry)
      File "/usr/lib64/python2.4/warnings.py", line 96, in warn_explicit
        raise message
    Warning: Data truncated for column 'name' at row 1

The answer seems to be that you can't create an admin user in setUp but you can in any other function so if you want an admin user in testing, use a fixture!

7
  • 1
    @phoebebright: can you post model code? Specifically, UserProfile and its relation to User. Commented Aug 16, 2010 at 17:11
  • @phoebebright: And do you have any fixtures setup? Commented Aug 16, 2010 at 17:19
  • @phoebebright: On a side note, your UserProfile -> User reference should be a OneToOneField. See b-list.org/weblog/2006/jun/06/django-tips-extending-user-model Commented Aug 16, 2010 at 17:21
  • @phoebebright: are you calling this code snippet inside a test_ method? Or setUp? Or somewhere else? Commented Aug 16, 2010 at 17:32
  • @phoebebright: I second Manoj's comment... How about just posting the test case class in it's entirety? Commented Aug 16, 2010 at 17:37

2 Answers 2

74

I'd use the built-in create_superuser and log the user in before making any requests. The following should work:

from django.contrib.auth.models import User
from django.test.client import Client

# store the password to login later
password = 'mypassword' 

my_admin = User.objects.create_superuser('myuser', '[email protected]', password)

c = Client()

# You'll need to log him in before you can send requests through the client
c.login(username=my_admin.username, password=password)

# tests go here
Sign up to request clarification or add additional context in comments.

2 Comments

still get the same error when I change create_user to create_superuser, without even trying to do the client bit...
Drop c = Client() and replace c.login with self.client.login when executed from within a test inheriting from TestCase
6

Update 2

Executed the snippet to create the superuser from within a test case (subclass of django.test.TestCase). Everything went fine. Also created and saved an instance of UserProfile with user = self.adminuser. That too worked.

Update

This line is interesting:

File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions
        defaults={'name': name, 'content_type': ctype})

Looks like execution fails when creating permissions.

Original Answer

Warning: Data truncated for column 'name' at row 1

Strange. I tried this from the Django shell and it worked for me. I am using Postgresql 8.3 and Django 1.2.1 on Ubuntu Jaunty. Can you give more details about which version of Django/database are you using?

Also User does not have a name attribute. Can you double check if you are using auth.User?

Do I have to load admin users as fixtures?

You don't have to. But if you are creating this admin user solely for testing purposes then it would be a good idea to add a Fixture. That is what I do in my projects.

3 Comments

Tried in shell and it works fine. I have userprofile attached (that doesn't have name in it) and I can add userprofiles fine for other types of user, just not superuser or staff. Baffled!
@phoebebright: Does your error say what table it's occurring in... is it the auth_user table?
posted a bit more info above.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.