import ldap
-from django.db.models.sql import compiler
+from django.db.models.sql import aggregates, compiler
+from django.db.models.sql.where import AND, OR
def get_lookup_operator(lookup_type):
if lookup_type == 'gte':
else:
return '='
-def where_as_sql(self, qn=None, connection=None):
+def query_as_ldap(query):
+ filterstr = ''.join(['(objectClass=%s)' % cls for cls in query.model.object_classes])
+ sql, params = where_as_ldap(query.where)
+ filterstr += sql
+ return '(&%s)' % filterstr
+
+def where_as_ldap(self):
bits = []
for item in self.children:
if hasattr(item, 'as_sql'):
- sql, params = where_as_sql(item, qn=qn, connection=connection)
+ sql, params = where_as_ldap(item)
bits.append(sql)
continue
self.connection = connection
self.using = using
- def _ldap_filter(self):
- filterstr = ''.join(['(objectClass=%s)' % cls for cls in self.query.model.object_classes])
- sql, params = where_as_sql(self.query.where)
- filterstr += sql
- return '(&%s)' % filterstr
+ def execute_sql(self, result_type=compiler.MULTI):
+ if result_type !=compiler.SINGLE:
+ raise Exception("LDAP does not support MULTI queries")
+
+ for key, aggregate in self.query.aggregate_select.items():
+ if not isinstance(aggregate, aggregates.Count):
+ raise Exception("Unsupported aggregate %s" % aggregate)
+
+ try:
+ vals = self.connection.search_s(
+ self.query.model.base_dn,
+ self.query.model.search_scope,
+ filterstr=query_as_ldap(self.query),
+ attrlist=['dn'],
+ )
+ except ldap.NO_SUCH_OBJECT:
+ vals = []
+
+ if not vals:
+ return None
+
+ output = []
+ for alias, col in self.query.extra_select.iteritems():
+ output.append(col[0])
+ for key, aggregate in self.query.aggregate_select.items():
+ if isinstance(aggregate, aggregates.Count):
+ output.append(len(vals))
+ else:
+ output.append(None)
+ return output
def results_iter(self):
if self.query.select_fields:
vals = self.connection.search_s(
self.query.model.base_dn,
self.query.model.search_scope,
- filterstr=self._ldap_filter(),
+ filterstr=query_as_ldap(self.query),
attrlist=attrlist,
)
except ldap.NO_SUCH_OBJECT:
vals = self.connection.search_s(
self.query.model.base_dn,
self.query.model.search_scope,
- filterstr=self._ldap_filter(),
- attrlist=[],
+ filterstr=query_as_ldap(self.query),
+ attrlist=['dn'],
)
except ldap.NO_SUCH_OBJECT:
return