1 # -*- coding: utf-8 -*-
4 # Copyright (C) 2009-2010 Bolloré telecom
5 # See AUTHORS file for a full list of contributors.
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 from django.db.models import fields, SubfieldBase
23 from ldapdb import escape_ldap_filter
25 class CharField(fields.CharField):
26 def __init__(self, *args, **kwargs):
27 kwargs['max_length'] = 200
28 super(CharField, self).__init__(*args, **kwargs)
30 def get_db_prep_lookup(self, lookup_type, value):
31 "Returns field's value prepared for database lookup."
32 if lookup_type == 'endswith':
33 return ["*%s" % escape_ldap_filter(value)]
34 elif lookup_type == 'startswith':
35 return ["%s*" % escape_ldap_filter(value)]
36 elif lookup_type in ['contains', 'icontains']:
37 return ["*%s*" % escape_ldap_filter(value)]
38 elif lookup_type == 'exact':
39 return [escape_ldap_filter(value)]
40 elif lookup_type == 'in':
41 return [escape_ldap_filter(v) for v in value]
43 raise TypeError("CharField has invalid lookup: %s" % lookup_type)
45 def get_prep_lookup(self, lookup_type, value):
46 "Perform preliminary non-db specific lookup checks and conversions"
47 if lookup_type == 'endswith':
48 return "*%s" % escape_ldap_filter(value)
49 elif lookup_type == 'startswith':
50 return "%s*" % escape_ldap_filter(value)
51 elif lookup_type in ['contains', 'icontains']:
52 return "*%s*" % escape_ldap_filter(value)
53 elif lookup_type == 'exact':
54 return escape_ldap_filter(value)
55 elif lookup_type == 'in':
56 return [escape_ldap_filter(v) for v in value]
58 raise TypeError("CharField has invalid lookup: %s" % lookup_type)
60 class ImageField(fields.Field):
61 def get_db_prep_lookup(self, lookup_type, value):
62 "Returns field's value prepared for database lookup."
63 return [self.get_prep_lookup(lookup_type, value)]
65 def get_prep_lookup(self, lookup_type, value):
66 "Perform preliminary non-db specific lookup checks and conversions"
67 raise TypeError("ImageField has invalid lookup: %s" % lookup_type)
69 class IntegerField(fields.IntegerField):
70 def get_db_prep_lookup(self, lookup_type, value):
71 "Returns field's value prepared for database lookup."
72 return [self.get_prep_lookup(lookup_type, value)]
74 def get_prep_lookup(self, lookup_type, value):
75 "Perform preliminary non-db specific lookup checks and conversions"
76 if lookup_type in ('exact', 'gte', 'lte'):
78 raise TypeError("IntegerField has invalid lookup: %s" % lookup_type)
80 class ListField(fields.Field):
81 __metaclass__ = SubfieldBase
83 def get_db_prep_lookup(self, lookup_type, value):
84 "Returns field's value prepared for database lookup."
85 return [self.get_prep_lookup(lookup_type, value)]
87 def get_prep_lookup(self, lookup_type, value):
88 "Perform preliminary non-db specific lookup checks and conversions"
89 if lookup_type == 'contains':
90 return escape_ldap_filter(value)
91 raise TypeError("ListField has invalid lookup: %s" % lookup_type)
93 def to_python(self, value):