ports/175178: www/py27-django: python manage.py syncdb fails if no locale is set
Gunther Stengl
gunther.stengl at googlemail.com
Thu Jan 10 12:00:00 UTC 2013
>Number: 175178
>Category: ports
>Synopsis: www/py27-django: python manage.py syncdb fails if no locale is set
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Jan 10 12:00:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator: Gunther Stengl
>Release: 9.1-RELEASE i386
>Organization:
>Environment:
FreeBSD fbsd.local.lan 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243826: Tue Dec 4 06:55:39 UTC 2012 root at obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
>Description:
Django (py27-django-1.4.3) fails to create the db-superuser when doing a "python mange.py syncdb" AND "LC_ALL" is unset.
"LC_ALL=" causes the locale.getdefaultlocale() to return "(None, None)" which is not a String, as needed by decode().
If LC_ALL is set correctly, the scripts runs as expected.
>How-To-Repeat:
unset LC_ALL
python manage.py syncdb
--> Script bails out after "You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes"
See attached logfile at "Problem situation"
>Fix:
e.g. (bash): export LC_ALL=de_DE.UTF-8
Corrections for django, manage.py:
Check if locale.getdefaultlocale() returns something!=None.
Fallback to just using "getpass.getuser()" or issuing a warning ("Set your locale correctly") and terminating gracefully.
See attached logfile at "Testing and solution"
Patch attached with submission follows:
Problem situation
=================
Script started on Thu Jan 10 12:21:15 2013
[gunhed at fbsd ~/bin/test]$ django-admin.py startproject testproj
[gunhed at fbsd ~/bin/test]$ cd testproj
[gunhed at fbsd ~/bin/test/testproj]$ ls -l
total 8
-rwxr-xr-x 1 gunhed gunhed 251 Jan 10 12:21 manage.py
drwxr-xr-x 2 gunhed gunhed 512 Jan 10 12:21 testproj
[gunhed at fbsd ~/bin/test/testproj]$ cd testproj/
[gunhed at fbsd ~/bin/test/testproj/testproj]$ cp settings.py settings.py.orig
[gunhed at fbsd ~/bin/test/testproj/testproj]$ vi settings.py
[gunhed at fbsd ~/bin/test/testproj/testproj]$ diff settings.py.orig settings.py
14,15c14,15
< 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
< 'NAME': '', # Or path to database file if using sqlite3.
---
> 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
> 'NAME': 'test.sqlite3', # Or path to database file if using sqlite3.
[gunhed at fbsd ~/bin/test/testproj/testproj]$ cd ..
[gunhed at fbsd ~/bin/test/testproj]$ python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
return self.handle_noargs(**options)
File "/usr/local/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 "/usr/local/lib/python2.7/site-packages/django/core/management/sql.py", line 189, in emit_post_sync_signal
interactive=interactive, db=db)
File "/usr/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send
response = receiver(signal=self, sender=sender, **named)
File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 73, in create_superuser
call_command("createsuperuser", interactive=True, database=db)
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 150, in call_command
return klass.execute(*args, **defaults)
File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 70, in handle
default_username = get_default_username()
File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 105, in get_default_username
default_username = get_system_username()
File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 85, in get_system_username
return getpass.getuser().decode(locale.getdefaultlocale()[1])
TypeError: decode() argument 1 must be string, not None
[gunhed at fbsd ~/bin/test/testproj]$ ipython
Python 2.7.3 (default, Jan 8 2013, 14:31:16)
Type "copyright", "credits" or "license" for more information.
IPython 0.13.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import os
In [2]: import getpass
In [3]: import locale
In [4]: getpass.getuser()
Out[4]: 'gunhed'
In [5]: getpass.getuser().decode(locale.getdefaultlocale()[1])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-654a16de3ed2> in <module>()
----> 1 getpass.getuser().decode(locale.getdefaultlocale()[1])
TypeError: decode() argument 1 must be string, not None
In [6]: locale.getdefaultlocale()
Out[6]: (None, None)
In [7]:
Do you really want to exit ([y]/n)?
[gunhed at fbsd ~/bin/test/testproj]$ exit
Script done on Thu Jan 10 12:27:10 2013
Testing and solution
====================
Proving assumption
------------------
Script started on Thu Jan 10 12:32:36 2013
[gunhed at fbsd ~]$ locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
[gunhed at fbsd ~]$ ipython
Python 2.7.3 (default, Jan 8 2013, 14:31:16)
Type "copyright", "credits" or "license" for more information.
IPython 0.13.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import getpass
In [2]: import locale
In [3]: getpass.getuser()
Out[3]: 'gunhed'
In [4]: locale.getdefaultlocale()
Out[4]: (None, None)
In [5]: # so, the following must fail ...
In [6]: getpass.getuser().decode(locale.getdefaultlocale()[1])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-654a16de3ed2> in <module>()
----> 1 getpass.getuser().decode(locale.getdefaultlocale()[1])
TypeError: decode() argument 1 must be string, not None
In [7]: exit
Solution proposal
-----------------
[gunhed at fbsd ~]$ export LC_ALL=de_DE.UTF-8
[gunhed at fbsd ~]$ locale
LANG=
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_ALL=de_DE.UTF-8
[gunhed at fbsd ~]$ ipython
Python 2.7.3 (default, Jan 8 2013, 14:31:16)
Type "copyright", "credits" or "license" for more information.
IPython 0.13.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import getpass
In [2]: import locale
In [3]: getpass.getuser()
Out[3]: 'gunhed'
In [4]: locale.getdefaultlocale()
Out[4]: ('de_DE', 'UTF-8')
In [5]: # now let's see what happens ...
In [6]: getpass.getuser().decode(locale.getdefaultlocale()[1])
Out[6]: u'gunhed'
In [7]: exit
[gunhed at fbsd ~]$ exit
Script done on Thu Jan 10 12:34:57 2013
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list