from django.db.models import signals
import ldapdb
-from ldapdb.models.query import QuerySet
-
-class ModelBase(django.db.models.base.ModelBase):
- """
- Metaclass for all LDAP models.
- """
- def __new__(cls, name, bases, attrs):
- super_new = super(ModelBase, cls).__new__
- new_class = super_new(cls, name, bases, attrs)
-
- # patch manager to use our own QuerySet class
- if not new_class._meta.abstract:
- def get_query_set():
- return QuerySet(new_class)
- new_class.objects.get_query_set = get_query_set
- new_class._default_manager.get_query_set = get_query_set
-
- return new_class
class Model(django.db.models.base.Model):
"""
Base class for all LDAP models.
"""
- __metaclass__ = ModelBase
-
dn = django.db.models.fields.CharField(max_length=200)
# meta-data
+++ /dev/null
-# -*- 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.
-#
-
-from django.db.models.query import QuerySet as BaseQuerySet
-from django.db.models.sql import Query
-from django.db.models.sql.where import WhereNode as BaseWhereNode, Constraint as BaseConstraint, AND, OR
-
-from ldapdb.models.fields import CharField
-
-class Constraint(BaseConstraint):
- """
- An object that can be passed to WhereNode.add() and knows how to
- pre-process itself prior to including in the WhereNode.
-
- NOTES:
- - we redefine this class, because when self.field is None calls
- Field().get_db_prep_lookup(), which short-circuits our LDAP-specific code.
- """
- def process(self, lookup_type, value, connection):
- """
- Returns a tuple of data suitable for inclusion in a WhereNode
- instance.
- """
- # Because of circular imports, we need to import this here.
- from django.db.models.base import ObjectDoesNotExist
-
- try:
- if self.field:
- params = self.field.get_db_prep_lookup(lookup_type, value,
- connection=connection, prepared=True)
- db_type = self.field.db_type()
- else:
- params = CharField().get_db_prep_lookup(lookup_type, value,
- connection=connection, prepared=True)
- db_type = None
- except ObjectDoesNotExist:
- raise EmptyShortCircuit
-
- return (self.alias, self.col, db_type), params
-
-class WhereNode(BaseWhereNode):
- def add(self, data, connector):
- if not isinstance(data, (list, tuple)):
- super(WhereNode, self).add(data, connector)
- return
-
- # we replace the native Constraint by our own
- obj, lookup_type, value = data
- if hasattr(obj, "process"):
- obj = Constraint(obj.alias, obj.col, obj.field)
- super(WhereNode, self).add((obj, lookup_type, value), connector)
-
-class QuerySet(BaseQuerySet):
- def __init__(self, model=None, query=None, using=None):
- if not query:
- query = Query(model, WhereNode)
- super(QuerySet, self).__init__(model=model, query=query, using=using)
-