From a88dd691ae82b3e4e953a654a31dcc72a727e128 Mon Sep 17 00:00:00 2001 From: jlaine Date: Mon, 24 May 2010 07:41:43 +0000 Subject: [PATCH] rework field preparation git-svn-id: https://svn.bolloretelecom.eu/opensource/django-ldapdb/trunk@860 e071eeec-0327-468d-9b6a-08194a12b294 --- ldapdb/models/fields.py | 20 +++++++++++++++++++- ldapdb/models/query.py | 17 +++-------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/ldapdb/models/fields.py b/ldapdb/models/fields.py index 6162c7f..f269d7c 100644 --- a/ldapdb/models/fields.py +++ b/ldapdb/models/fields.py @@ -27,6 +27,20 @@ class CharField(fields.CharField): kwargs['max_length'] = 200 super(CharField, self).__init__(*args, **kwargs) + def get_db_prep_lookup(self, lookup_type, value): + if lookup_type == 'endswith': + return ["*%s" % escape_ldap_filter(value)] + elif lookup_type == 'startswith': + return ["%s*" % escape_ldap_filter(value)] + elif lookup_type == 'contains': + return ["*%s*" % escape_ldap_filter(value)] + elif lookup_type == 'exact': + return [escape_ldap_filter(value)] + elif lookup_type == 'in': + return [escape_ldap_filter(v) for v in value] + + raise TypeError("CharField has invalid lookup: %s" % lookup_type) + def get_prep_lookup(self, lookup_type, value): return escape_ldap_filter(value) @@ -34,7 +48,11 @@ class ImageField(fields.Field): pass class IntegerField(fields.IntegerField): - pass + def get_db_prep_lookup(self, lookup_type, value): + if lookup_type == 'exact': + return [value] + + raise TypeError("IntegerField has invalid lookup: %s" % lookup_type) class ListField(fields.Field): __metaclass__ = SubfieldBase diff --git a/ldapdb/models/query.py b/ldapdb/models/query.py index 5f522a6..67d1936 100644 --- a/ldapdb/models/query.py +++ b/ldapdb/models/query.py @@ -28,7 +28,7 @@ from django.db.models.sql.where import WhereNode as BaseWhereNode, Constraint as import ldapdb -from ldapdb import escape_ldap_filter +from ldapdb.models.fields import CharField class Constraint(BaseConstraint): """ @@ -43,23 +43,12 @@ class Constraint(BaseConstraint): # Because of circular imports, we need to import this here. from django.db.models.base import ObjectDoesNotExist - if lookup_type == 'endswith': - params = ["*%s" % escape_ldap_filter(value)] - elif lookup_type == 'startswith': - params = ["%s*" % escape_ldap_filter(value)] - elif lookup_type == 'contains': - params = ["*%s*" % escape_ldap_filter(value)] - elif lookup_type == 'exact': - params = [escape_ldap_filter(value)] - elif lookup_type == 'in': - params = [escape_ldap_filter(v) for v in value] - else: - raise TypeError("Field has invalid lookup: %s" % lookup_type) - try: if self.field: + params = self.field.get_db_prep_lookup(lookup_type, value) db_type = self.field.db_type() else: + params = CharField().get_db_prep_lookup(lookup_type, value) db_type = None except ObjectDoesNotExist: raise EmptyShortCircuit -- 2.30.2