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
-~----------~----~----~----~------~----~------~--~---

Reply via email to