###############################################
#
# sqlSortable Class - this class supports sorting of objects using
# the same terms as used when specifying a sort in SQL
# Andrew M. Henshaw 8/15/01
class sqlSortable:
def __init__(self, **args):
self.__dict__.update(args)
def setSort(self, sortOrder):
self.sortFields = []
for text in sortOrder:
sortBy, direction = (text+' ').split(' ', 1)
self.sortFields.append((sortBy, direction[0:4].lower() == 'desc'))
def __repr__(self):
return repr([getattr(self, x) for x, reverse in self.sortFields])
def __cmp__(self, other):
myFields = []
otherFields = []
for sortBy, reverse in self.sortFields:
myField, otherField = getattr(self, sortBy), getattr(other, sortBy)
if reverse:
myField, otherField = otherField, myField
myFields.append(myField)
otherFields.append(otherField)
return cmp(myFields, otherFields)
def testSqlSortable():
data = [('Premier', 'Stealth U-11'),('Premier', 'Stealth U-10'),('Premier', 'Stealth U-12'),
('Co-ed', 'Cyclones'), ('Co-ed', 'Lightning'), ('Co-ed', 'Dolphins'),
('Girls', 'Dynamos'), ('Girls', 'Tigers'), ('Girls', 'Dolphins')]
testList = [sqlSortable(program=program, name=name) for program, name in data]
tests = [['program DESC', 'name'],
['name desc', 'program asc']]
for sortBy in tests:
print '#### Test basic sorting ###', sortBy
for sortable in testList:
sortable.setSort(sortBy)
testList.sort()
for item in testList:
print item
print '#### Test modification of attributes ###', sortBy
assert testList[4].name == 'Lightning'
testList[4].name = 'ZZ 1st name'
testList.sort()
for item in testList:
print item
if __name__ == '__main__':
testSqlSortable()