X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fupstream%2Fdjango-ldapdb.git;a=blobdiff_plain;f=ldapdb%2Fmodels%2Ffields.py;h=4c3cfe2fa598f7de2940da45b1d5b65b5b9d4da0;hp=d21bbd0dc258c31bc05a35b8a1ee2d7a0b69eb07;hb=3e119b381a67261e2b70646117f29bd799c776c1;hpb=ab216ac000ca0b6aeea64d9ce112395bbb7962d5 diff --git a/ldapdb/models/fields.py b/ldapdb/models/fields.py index d21bbd0..4c3cfe2 100644 --- a/ldapdb/models/fields.py +++ b/ldapdb/models/fields.py @@ -1,21 +1,35 @@ # -*- coding: utf-8 -*- # # django-ldapdb -# Copyright (C) 2009-2010 Bolloré telecom +# Copyright (c) 2009-2011, Bolloré telecom +# All rights reserved. +# # See AUTHORS file for a full list of contributors. # -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# 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. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# 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. # -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# 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 import fields, SubfieldBase @@ -27,12 +41,19 @@ class CharField(fields.CharField): kwargs['max_length'] = 200 super(CharField, self).__init__(*args, **kwargs) - def get_db_prep_lookup(self, lookup_type, value): + def from_ldap(self, value, connection): + if len(value) == 0: + return '' + else: + return value[0].decode(connection.charset) + + def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): + "Returns field's value prepared for database lookup." if lookup_type == 'endswith': return ["*%s" % escape_ldap_filter(value)] elif lookup_type == 'startswith': return ["%s*" % escape_ldap_filter(value)] - elif lookup_type == 'contains': + elif lookup_type in ['contains', 'icontains']: return ["*%s*" % escape_ldap_filter(value)] elif lookup_type == 'exact': return [escape_ldap_filter(value)] @@ -41,24 +62,79 @@ class CharField(fields.CharField): raise TypeError("CharField has invalid lookup: %s" % lookup_type) + def get_db_prep_save(self, value, connection): + return [value.encode(connection.charset)] + def get_prep_lookup(self, lookup_type, value): - return escape_ldap_filter(value) - + "Perform preliminary non-db specific lookup checks and conversions" + if lookup_type == 'endswith': + return "*%s" % escape_ldap_filter(value) + elif lookup_type == 'startswith': + return "%s*" % escape_ldap_filter(value) + elif lookup_type in ['contains', 'icontains']: + 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) + class ImageField(fields.Field): - def get_db_prep_lookup(self, lookup_type, value): + def from_ldap(self, value, connection): + if len(value) == 0: + return '' + else: + return value[0] + + def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): + "Returns field's value prepared for database lookup." + return [self.get_prep_lookup(lookup_type, value)] + + def get_db_prep_save(self, value, connection): + return [value] + + def get_prep_lookup(self, lookup_type, value): + "Perform preliminary non-db specific lookup checks and conversions" raise TypeError("ImageField has invalid lookup: %s" % lookup_type) class IntegerField(fields.IntegerField): - def get_db_prep_lookup(self, lookup_type, value): - if lookup_type in ('exact', 'gte', 'lte'): - return [value] + def from_ldap(self, value, connection): + if len(value) == 0: + return 0 + else: + return int(value[0]) + + def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): + "Returns field's value prepared for database lookup." + return [self.get_prep_lookup(lookup_type, value)] + + def get_db_prep_save(self, value, connection): + return [str(value)] + def get_prep_lookup(self, lookup_type, value): + "Perform preliminary non-db specific lookup checks and conversions" + if lookup_type in ('exact', 'gte', 'lte'): + return value raise TypeError("IntegerField has invalid lookup: %s" % lookup_type) class ListField(fields.Field): __metaclass__ = SubfieldBase - def get_db_prep_lookup(self, lookup_type, value): + def from_ldap(self, value, connection): + return value + + def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): + "Returns field's value prepared for database lookup." + return [self.get_prep_lookup(lookup_type, value)] + + def get_db_prep_save(self, value, connection): + return [x.encode(connection.charset) for x in value] + + def get_prep_lookup(self, lookup_type, value): + "Perform preliminary non-db specific lookup checks and conversions" + if lookup_type == 'contains': + return escape_ldap_filter(value) raise TypeError("ListField has invalid lookup: %s" % lookup_type) def to_python(self, value):