From 33c3aded3a1944d93e9e6bca53e2f749980b8b09 Mon Sep 17 00:00:00 2001 From: Nils Philippsen Date: Mon, 9 Nov 2015 14:50:23 +0100 Subject: [PATCH] py2k: accept unicode literals on :func:`backref`, too Fixed bug where in Py2K a unicode literal would not be accepted as the string name of a class or other argument within declarative using :func:`.backref` on :func:`.relationship`. amends commit e6f67f48054d906856f879bc1803ea639aa4b670 (cherry picked from commit 58f73d2278393d813c7f39736fc96c5086f18f6d) --- doc/build/changelog/changelog_10.rst | 10 ++++++++ lib/sqlalchemy/ext/declarative/clsregistry.py | 3 ++- test/ext/declarative/test_basic.py | 23 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index b7b792d4d5..f5e550ed0d 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -18,6 +18,16 @@ .. changelog:: :version: 1.0.10 + .. change:: + :tags: bug, orm + :pullreq: github:212 + :versions: 1.1.0b1 + + Fixed bug where in Py2K a unicode literal would not be accepted as the + string name of a class or other argument within declarative using + :func:`.backref` on :func:`.relationship`. Pull request courtesy + Nils Philippsen. + .. change:: :tags: bug, mssql :versions: 1.1.0b1 diff --git a/lib/sqlalchemy/ext/declarative/clsregistry.py b/lib/sqlalchemy/ext/declarative/clsregistry.py index c3887d6cf1..050923980f 100644 --- a/lib/sqlalchemy/ext/declarative/clsregistry.py +++ b/lib/sqlalchemy/ext/declarative/clsregistry.py @@ -321,7 +321,8 @@ def _deferred_relationship(cls, prop): key, kwargs = prop.backref for attr in ('primaryjoin', 'secondaryjoin', 'secondary', 'foreign_keys', 'remote_side', 'order_by'): - if attr in kwargs and isinstance(kwargs[attr], str): + if attr in kwargs and isinstance(kwargs[attr], + util.string_types): kwargs[attr] = resolve_arg(kwargs[attr]) return prop diff --git a/test/ext/declarative/test_basic.py b/test/ext/declarative/test_basic.py index ab0de801ce..b8e17debbd 100644 --- a/test/ext/declarative/test_basic.py +++ b/test/ext/declarative/test_basic.py @@ -102,6 +102,29 @@ class DeclarativeTest(DeclarativeTestBase): assert User.addresses.property.mapper.class_ is Address + def test_unicode_string_resolve_backref(self): + class User(Base, fixtures.ComparableEntity): + __tablename__ = 'users' + + id = Column('id', Integer, primary_key=True, + test_needs_autoincrement=True) + name = Column('name', String(50)) + + class Address(Base, fixtures.ComparableEntity): + __tablename__ = 'addresses' + + id = Column(Integer, primary_key=True, + test_needs_autoincrement=True) + email = Column(String(50), key='_email') + user_id = Column('user_id', Integer, ForeignKey('users.id'), + key='_user_id') + user = relationship( + User, + backref=backref("addresses", + order_by=util.u("Address.email"))) + + assert Address.user.property.mapper.class_ is User + def test_no_table(self): def go(): class User(Base): -- 2.47.2