Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create admin user in django tests.py

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!

like image 804
PhoebeB Avatar asked Aug 16 '10 16:08

PhoebeB


1 Answers

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 
like image 124
Sam Dolan Avatar answered Sep 26 '22 12:09

Sam Dolan