#13868: Inability to create superuser during syncdb when using GIS fields in
AUTH_PROFILE_MODULE
--------------------+-------------------------------------------------------
Reporter: jskitz | Owner: nobody
Status: new | Milestone:
Component: GIS | Version: 1.2
Keywords: | Stage: Unreviewed
Has_patch: 0 |
--------------------+-------------------------------------------------------
= Overview =
I have an AUTH_PROFILE_MODULE that contains a GIS PointField for
maintaining a users current location. When a new user is created, I have
a post_save signal handler that creates a UserProfile object for the new
user. When I run syncdb, and try to create a superuser during the
process, I get the following traceback:
{{{
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "/Library/Python/2.5/site-
packages/django/core/management/__init__.py", line 438, in execute_manager
utility.execute()
File "/Library/Python/2.5/site-
packages/django/core/management/__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Python/2.5/site-packages/django/core/management/base.py",
line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "/Library/Python/2.5/site-packages/django/core/management/base.py",
line 218, in execute
output = self.handle(*args, **options)
File "/Library/Python/2.5/site-packages/django/core/management/base.py",
line 347, in handle
return self.handle_noargs(**options)
File "/Library/Python/2.5/site-
packages/django/core/management/commands/syncdb.py", line 103, in
handle_noargs
emit_post_sync_signal(created_models, verbosity, interactive, db)
File "/Library/Python/2.5/site-packages/django/core/management/sql.py",
line 185, in emit_post_sync_signal
interactive=interactive, db=db)
File "/Library/Python/2.5/site-packages/django/dispatch/dispatcher.py",
line 162, in send
response = receiver(signal=self, sender=sender, **named)
File "/Library/Python/2.5/site-
packages/django/contrib/auth/management/__init__.py", line 44, in
create_superuser
call_command("createsuperuser", interactive=True)
File "/Library/Python/2.5/site-
packages/django/core/management/__init__.py", line 166, in call_command
return klass.execute(*args, **defaults)
File "/Library/Python/2.5/site-packages/django/core/management/base.py",
line 218, in execute
output = self.handle(*args, **options)
File "/Library/Python/2.5/site-
packages/django/contrib/auth/management/commands/createsuperuser.py", line
134, in handle
User.objects.create_superuser(username, email, password)
File "/Library/Python/2.5/site-packages/django/contrib/auth/models.py",
line 133, in create_superuser
u = self.create_user(username, email, password)
File "/Library/Python/2.5/site-packages/django/contrib/auth/models.py",
line 129, in create_user
user.save(using=self._db)
File "/Library/Python/2.5/site-packages/django/db/models/base.py", line
435, in save
self.save_base(using=using, force_insert=force_insert,
force_update=force_update)
File "/Library/Python/2.5/site-packages/django/db/models/base.py", line
543, in save_base
created=(not record_exists), raw=raw)
File "/Library/Python/2.5/site-packages/django/dispatch/dispatcher.py",
line 162, in send
response = receiver(signal=self, sender=sender, **named)
File "/usr/local/findmefit/../findmefit/accounts/models.py", line 25, in
profile_creation_handler
profile, created = UserProfile.objects.get_or_create(user=instance)
File "/Library/Python/2.5/site-packages/django/db/models/manager.py",
line 135, in get_or_create
return self.get_query_set().get_or_create(**kwargs)
File "/Library/Python/2.5/site-packages/django/db/models/query.py", line
366, in get_or_create
return self.get(**kwargs), False
File "/Library/Python/2.5/site-packages/django/db/models/query.py", line
336, in get
num = len(clone)
File "/Library/Python/2.5/site-packages/django/db/models/query.py", line
81, in __len__
self._result_cache = list(self.iterator())
File "/Library/Python/2.5/site-packages/django/db/models/query.py", line
269, in iterator
for row in compiler.results_iter():
File "/Library/Python/2.5/site-
packages/django/db/models/sql/compiler.py", line 672, in results_iter
for rows in self.execute_sql(MULTI):
File "/Library/Python/2.5/site-
packages/django/db/models/sql/compiler.py", line 727, in execute_sql
cursor.execute(sql, params)
File "/Library/Python/2.5/site-packages/django/db/backends/util.py",
line 15, in execute
return self.cursor.execute(sql, params)
File "/Library/Python/2.5/site-
packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in
execute
return self.cursor.execute(query, args)
django.db.utils.DatabaseError: column
accounts_userprofile.current_location does not exist
LINE 1: ...ion_name", "accounts_userprofile"."friends_list", "accounts_...
^
}}}
This is due to the fact that the custom SQL commands have not been run
yet. If I do a syncdb without creating the superuser in the process, and
then create superusers from the command line after a successful syncdb,
everything works correctly.
I am using PostgreSQL 8.4.3-1 and PostGIS 1.5.1-1.
= Setup =
The following assumes that you have a working GeoDjango installation,
which I have. This was verified by running the GeoDjango tutorial without
fail.
* In settings.py add a profile model
{{{
AUTH_PROFILE_MODULE = 'accounts.UserProfile'
}}}
* In the application accounts, add the following simple UserProfile model
{{{
from django.contrib.auth.models import User
from django.contrib.gis.db import models
from django.db.models.signals import post_save
def profile_creation_handler(sender, instance, created, **kwargs):
"""
This is a post_save handler on the User class so that we create a
user's profile whenever a
new User is created.
"""
if created:
profile, created =
UserProfile.objects.get_or_create(user=instance)
class UserProfile(models.Model):
"""
UserProfile model with PointField for a users current_location
"""
user = models.ForeignKey(User, unique=True, editable=False)
profile_url = models.URLField(verify_exists=False, blank=True)
current_location = models.PointField(blank=True, null=True)
objects = models.GeoManager()
class Meta:
pass
def __unicode__(self):
return u'%s (%s)' % (self.user, self.profile_url,)
def __repr__(self):
return '<%s Object: %s (%s)>' % (self.__class__.__name__,
self.user, self.profile_url,)
post_save.connect(profile_creation_handler, sender=User)
}}}
I believe the reason the problem happens is that custom SQL is done after
the prompt for creating a super user, which means that the geometry column
in UserProfile has not been created yet. This is why if I create super
users after syncdb has properly run, everything works correctly. I
assigned this to the component GIS, but I believe it could be more related
to the order in which things happen during syncdb.
--
Ticket URL: <http://code.djangoproject.com/ticket/13868>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.