From: jlaine Date: Mon, 11 Apr 2011 07:50:03 +0000 (+0000) Subject: start splitting code to an actual backend X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fdjango-ldapdb.git;a=commitdiff_plain;h=3324b02df620784d3346aa87b3e1cea5e5018008 start splitting code to an actual backend git-svn-id: https://svn.bolloretelecom.eu/opensource/django-ldapdb/trunk@1013 e071eeec-0327-468d-9b6a-08194a12b294 --- diff --git a/ldapdb/backends/__init__.py b/ldapdb/backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ldapdb/backends/ldap/__init__.py b/ldapdb/backends/ldap/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ldapdb/backends/ldap/compiler.py b/ldapdb/backends/ldap/compiler.py new file mode 100644 index 0000000..ab17bd4 --- /dev/null +++ b/ldapdb/backends/ldap/compiler.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# django-ldapdb +# Copyright (c) 2009-2010, Bolloré telecom +# All rights reserved. +# +# See AUTHORS file for a full list of contributors. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of Bolloré telecom nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +class SQLCompiler(object): + def __init__(self, query, connection, using): + self.query = query + self.connection = connection + self.using = using + + def results_iter(self): + if self.query.select_fields: + fields = self.query.select_fields + else: + fields = self.query.model._meta.fields + + attrlist = [ x.db_column for x in fields if x.db_column ] + + try: + vals = self.connection.search_s( + self.query.model.base_dn, + self.query.model.search_scope, + filterstr=self.query._ldap_filter(), + attrlist=attrlist, + ) + except ldap.NO_SUCH_OBJECT: + return + + # perform sorting + if self.query.extra_order_by: + ordering = self.query.extra_order_by + elif not self.query.default_ordering: + ordering = self.query.order_by + else: + ordering = self.query.order_by or self.query.model._meta.ordering + def cmpvals(x, y): + for fieldname in ordering: + if fieldname.startswith('-'): + fieldname = fieldname[1:] + negate = True + else: + negate = False + field = self.query.model._meta.get_field(fieldname) + attr_x = field.from_ldap(x[1].get(field.db_column, []), connection=self.connection) + attr_y = field.from_ldap(y[1].get(field.db_column, []), connection=self.connection) + # perform case insensitive comparison + if hasattr(attr_x, 'lower'): + attr_x = attr_x.lower() + if hasattr(attr_y, 'lower'): + attr_y = attr_y.lower() + val = negate and cmp(attr_y, attr_x) or cmp(attr_x, attr_y) + if val: + return val + return 0