#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.

Reply via email to