Opened 15 years ago
Closed 15 years ago
#12224 closed (duplicate)
psycopg2 raises "can't adapt" when use gettext extensions on model meta permissions field.
Reported by: | Felipe 'chronos' Prenholato | Owned by: | Felipe 'chronos' Prenholato |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Keywords: | psycopg2, permissions, i18n, gettext, "can't adapt", syncdb | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | yes | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When we create custom permissions for model, works perfectly if we use like this:
class Meta: permissions = ( ('can_view_info',"Can view info."), ('can_view_reports',"Can view reports."), ('can_export_reports',"Can export reports."), ('can_search',"Can search."), )
But, if we use like that, for multiple language sites:
class Meta: permissions = ( ('can_view_info',_("Can view info.")), ('can_view_reports',_("Can view reports.")), ('can_export_reports',_("Can export reports.")), ('can_search',_("Can search.")), )
We get psycopg2 raising following error on syncdb:
... 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): no Traceback (most recent call last): File "manage.py", line 11, in <module> execute_manager(settings) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/__init__.py", line 439, in execute_manager utility.execute() File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/__init__.py", line 380, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/base.py", line 195, in run_from_argv self.execute(*args, **options.__dict__) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/base.py", line 222, in execute output = self.handle(*args, **options) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/base.py", line 351, in handle return self.handle_noargs(**options) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/commands/syncdb.py", line 89, in handle_noargs emit_post_sync_signal(created_models, verbosity, interactive) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/core/management/sql.py", line 194, in emit_post_sync_signal interactive=interactive) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/dispatch/dispatcher.py", line 166, in send response = receiver(signal=self, sender=sender, **named) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/contrib/auth/management/__init__.py", line 28, in create_permissions defaults={'name': name, 'content_type': ctype}) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/manager.py", line 122, in get_or_create return self.get_query_set().get_or_create(**kwargs) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/query.py", line 328, in get_or_create obj.save(force_insert=True) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/base.py", line 419, in save self.save_base(force_insert=force_insert, force_update=force_update) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/base.py", line 504, in save_base result = manager._insert(values, return_id=update_pk) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/manager.py", line 179, in _insert return insert_query(self.model, values, **kwargs) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/query.py", line 1087, in insert_query return query.execute_sql(return_id) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/sql/subqueries.py", line 320, in execute_sql cursor = super(InsertQuery, self).execute_sql(None) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/models/sql/query.py", line 2373, in execute_sql cursor.execute(sql, params) File "/home/felipe.prenholato/.python/lib/python2.5/site-packages/django/db/backends/util.py", line 19, in execute return self.cursor.execute(sql, params) psycopg2.ProgrammingError: can't adapt
This error happens with Django 1.1 beta 1 and Django 1.2 pre-alpha (current svn). I tested with psycopg2 versions 2.0.12 and 2.0.13.
This problem probably is similar to SafeString and/or SafeUnicode issues on #5996.
Soon I'll try to fix this and post more info about problem.
Attachments (2)
Change History (7)
comment:1 by , 15 years ago
Has patch: | set |
---|
comment:2 by , 15 years ago
Needs tests: | set |
---|---|
Patch needs improvement: | set |
Triage Stage: | Unreviewed → Accepted |
comment:3 by , 15 years ago
Patch needs improvement: | unset |
---|
comment:4 by , 15 years ago
I little doubt about this ticket ( I not have more time to work on ).
This 'fix' save string in unicode in database, that's ok, but we need a change on interfaces that show this string from DB (contrib.auth views for admin for now) to show translated strings (by ugettext) or a real fix using a new 'data type' in psycopg2 backend.
Some of two options can be considered? Which could be the guidelines?
comment:5 by , 15 years ago
milestone: | 1.2 |
---|---|
Resolution: | → duplicate |
Status: | new → closed |
This is a specific case of trying to have a field value stored in the database and marked for translation, which has been debated and, for the moment, wontfix'd. See #9601 for pointers to discussion.
With help of SmileyChris on #django-dev I fixed this problem forcing unicode with force_unicode (my original idea was use mark_safe). Similar fix was did Alex in #10616.