From: Jonathan LaCour Date: Wed, 28 Jun 2006 17:26:48 +0000 (+0000) Subject: Updated ActiveMapper to support order_by parameters on all relationships. X-Git-Tag: rel_0_2_5~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=70b2dec19a9d5f2dd163704e58f38f2f82e5bf45;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Updated ActiveMapper to support order_by parameters on all relationships. Thanks to Charles Duffy for this patch! --- diff --git a/lib/sqlalchemy/ext/activemapper.py b/lib/sqlalchemy/ext/activemapper.py index a7be6ada91..22087e5ead 100644 --- a/lib/sqlalchemy/ext/activemapper.py +++ b/lib/sqlalchemy/ext/activemapper.py @@ -47,7 +47,7 @@ class column(object): # class relationship(object): def __init__(self, classname, colname=None, backref=None, private=False, - lazy=True, uselist=True, secondary=None): + lazy=True, uselist=True, secondary=None, order_by=False): self.classname = classname self.colname = colname self.backref = backref @@ -55,25 +55,28 @@ class relationship(object): self.lazy = lazy self.uselist = uselist self.secondary = secondary + self.order_by = order_by class one_to_many(relationship): def __init__(self, classname, colname=None, backref=None, private=False, - lazy=True): + lazy=True, order_by=False): relationship.__init__(self, classname, colname, backref, private, - lazy, uselist=True) + lazy, uselist=True, order_by=order_by) class one_to_one(relationship): def __init__(self, classname, colname=None, backref=None, private=False, - lazy=True): + lazy=True, order_by=False): if backref is not None: backref = create_backref(backref, uselist=False) relationship.__init__(self, classname, colname, backref, private, - lazy, uselist=False) + lazy, uselist=False, order_by=order_by) class many_to_many(relationship): - def __init__(self, classname, secondary, backref=None, lazy=True): + def __init__(self, classname, secondary, backref=None, lazy=True, + order_by=False): relationship.__init__(self, classname, None, backref, False, lazy, - uselist=True, secondary=secondary) + uselist=True, secondary=secondary, + order_by=order_by) # @@ -125,12 +128,19 @@ def process_relationships(klass, was_deferred=False): relations = {} for propname, reldesc in klass.relations.items(): relclass = ActiveMapperMeta.classes[reldesc.classname] + if isinstance(reldesc.order_by, str): + reldesc.order_by = [ reldesc.order_by ] + if isinstance(reldesc.order_by, list): + for itemno in range(len(reldesc.order_by)): + if isinstance(reldesc.order_by[itemno], str): + reldesc.order_by[itemno] = getattr(relclass.c, reldesc.order_by[itemno]) relations[propname] = relation(relclass.mapper, secondary=reldesc.secondary, backref=reldesc.backref, private=reldesc.private, lazy=reldesc.lazy, - uselist=reldesc.uselist) + uselist=reldesc.uselist, + order_by=reldesc.order_by) class_mapper(klass).add_properties(relations) if klass in __deferred_classes__: diff --git a/test/ext/activemapper.py b/test/ext/activemapper.py index 6a8b0904ea..f33d3d9bbd 100644 --- a/test/ext/activemapper.py +++ b/test/ext/activemapper.py @@ -26,7 +26,7 @@ class testcase(testbase.PersistTest): cell_phone = column(String) work_phone = column(String) prefs_id = column(Integer, foreign_key=ForeignKey('preferences.id')) - addresses = one_to_many('Address', colname='person_id', backref='person') + addresses = one_to_many('Address', colname='person_id', backref='person', order_by=['state', 'city', 'postal_code']) preferences = one_to_one('Preferences', colname='pref_id', backref='person') def __str__(self): @@ -68,17 +68,6 @@ class testcase(testbase.PersistTest): def tearDown(self): for t in activemapper.metadata.table_iterator(reverse=True): t.delete().execute() - #people = Person.select() - #for person in people: person.delete() - - #addresses = Address.select() - #for address in addresses: address.delete() - - #preferences = Preferences.select() - #for preference in preferences: preference.delete() - - #objectstore.flush() - #objectstore.clear() def create_person_one(self): # create a person @@ -234,4 +223,4 @@ if __name__ == '__main__': # go ahead and setup the database connection, and create the tables # launch the unit tests - unittest.main() \ No newline at end of file + unittest.main()