Author: floguy
Date: Sun Sep 21 14:24:17 2008
New Revision: 31
Modified:
trunk/things/__init__.py
trunk/things/fields.py
trunk/things/options.py
Log:
Added the ability to order based on the count of models with
genericforeignkeys back to the given model.
Modified: trunk/things/__init__.py
==============================================================================
--- trunk/things/__init__.py (original)
+++ trunk/things/__init__.py Sun Sep 21 14:24:17 2008
@@ -1,6 +1,6 @@
from things.options import ModelThing, BaseThing
from things.sites import ThingSite, site
-from things.fields import OrderField, OrderCountField
+from things.fields import OrderField, OrderCountField,
OrderGenericCountField
def autodiscover():
"""
Modified: trunk/things/fields.py
==============================================================================
--- trunk/things/fields.py (original)
+++ trunk/things/fields.py Sun Sep 21 14:24:17 2008
@@ -3,6 +3,7 @@
from django.db.models import ManyToManyField
from django.db.models.options import FieldDoesNotExist
from django.db import connection
+from django.contrib.contenttypes.models import ContentType
__all__ = ('OrderField', )
@@ -12,13 +13,12 @@
return inner
class BaseField(object):
- pass
-
-class OrderField(BaseField):
parent = None
field_name = None
modifies_query_set = False
-
+ is_aggregate = False
+
+class OrderField(BaseField):
def __init__(self, verbose_name_asc=None, verbose_name_desc=None,
url_asc=None, url_desc=None, field_url=None):
self._verbose_name_asc = verbose_name_asc
@@ -82,6 +82,7 @@
class OrderCountField(OrderField):
modifies_query_set = True
+ is_aggregate=True
def _get_aggregate_name(self):
return '%s_count' % self.field_name
@@ -119,5 +120,31 @@
SELECT COUNT(*)
FROM %(related_table)s
WHERE %(related_table)s.%(related_column_name)s = %(self_table)s.id
+ """ % locals()
+ return qs.extra(select={self.aggregate_name: SQL})
+
+class OrderGenericCountField(OrderField):
+ modifies_query_set = True
+ is_aggregate = True
+
+ def __init__(self, generic_model, *args, **kwargs):
+ self.generic_model = generic_model
+ super(OrderGenericCountField, self).__init__(*args, **kwargs)
+
+ def _get_aggregate_name(self):
+ return '%s_count' % self.field_name
+ aggregate_name = property(_get_aggregate_name)
+
+ def modify_query_set(self, qs):
+ qn = connection.ops.quote_name
+ related_table = qn(self.generic_model._meta.db_table)
+ self_content_type = int(ContentType.objects.get_for_model(
+ self.parent.model).id)
+ self_table = qn(self.parent.model._meta.db_table)
+ SQL = u"""
+ SELECT COUNT(*)
+ FROM %(related_table)s
+ WHERE %(related_table)s.content_type_id=%(self_content_type)i
+ AND %(related_table)s.object_id=%(self_table)s.id
""" % locals()
return qs.extra(select={self.aggregate_name: SQL})
Modified: trunk/things/options.py
==============================================================================
--- trunk/things/options.py (original)
+++ trunk/things/options.py Sun Sep 21 14:24:17 2008
@@ -59,7 +59,7 @@
pre = ''
if descending == True:
pre = '-'
- if isinstance(field, OrderCountField):
+ if field.is_aggregate:
items = items.order_by('%s%s' % (pre,
field.aggregate_name))
else:
items = items.order_by('%s%s' % (pre, field.field_name))
@@ -112,8 +112,8 @@
self.detail_view, name='%s_detail' % name_prefix)
]
tmp_urls.extend([
- url('%s(?P<url_prefix>%s)order/%s/%s/' % (prefix,
self.url_prefix, field.field_url,
- field.url_asc),
+ url('%s(?P<url_prefix>%s)order/%s/%s/' % (prefix,
self.url_prefix,
+ field.field_url, field.url_asc),
self.list_view,
{'descending': False,
'field': self.fields.get(field.field_name, None),},
@@ -121,8 +121,8 @@
for (name, field) in self.fields.iteritems()
])
tmp_urls.extend([
- url('%s(?P<url_prefix>%s)order/%s/%s/' % (prefix,
self.url_prefix, field.field_url,
- field.url_desc),
+ url('%s(?P<url_prefix>%s)order/%s/%s/' % (prefix,
self.url_prefix,
+ field.field_url, field.url_desc),
self.list_view,
{'descending': True,
'field': self.fields.get(field.field_name, None)},
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pinax-updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/pinax-updates?hl=en
-~----------~----~----~----~------~----~------~--~---