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_db_prep_save(self, value, connection):
46 return [value.encode(connection.charset)]
48 def get_prep_lookup(self, lookup_type, value):
49 "Perform preliminary non-db specific lookup checks and conversions"
50 if lookup_type == 'endswith':
51 return "*%s" % escape_ldap_filter(value)
52 elif lookup_type == 'startswith':
53 return "%s*" % escape_ldap_filter(value)
54 elif lookup_type in ['contains', 'icontains']:
55 return "*%s*" % escape_ldap_filter(value)
56 elif lookup_type == 'exact':
57 return escape_ldap_filter(value)
58 elif lookup_type == 'in':
59 return [escape_ldap_filter(v) for v in value]
61 raise TypeError("CharField has invalid lookup: %s" % lookup_type)
63 class ImageField(fields.Field):
64 def get_db_prep_lookup(self, lookup_type, value):
65 "Returns field's value prepared for database lookup."
66 return [self.get_prep_lookup(lookup_type, value)]
68 def get_db_prep_save(self, value, connection):
71 def get_prep_lookup(self, lookup_type, value):
72 "Perform preliminary non-db specific lookup checks and conversions"
73 raise TypeError("ImageField has invalid lookup: %s" % lookup_type)
75 class IntegerField(fields.IntegerField):
76 def get_db_prep_lookup(self, lookup_type, value):
77 "Returns field's value prepared for database lookup."
78 return [self.get_prep_lookup(lookup_type, value)]
80 def get_db_prep_save(self, value, connection):
83 def get_prep_lookup(self, lookup_type, value):
84 "Perform preliminary non-db specific lookup checks and conversions"
85 if lookup_type in ('exact', 'gte', 'lte'):
87 raise TypeError("IntegerField has invalid lookup: %s" % lookup_type)
89 class ListField(fields.Field):
90 __metaclass__ = SubfieldBase
92 def get_db_prep_lookup(self, lookup_type, value):
93 "Returns field's value prepared for database lookup."
94 return [self.get_prep_lookup(lookup_type, value)]
96 def get_db_prep_save(self, value, connection):
97 return [x.encode(connection.charset) for x in value]
99 def get_prep_lookup(self, lookup_type, value):
100 "Perform preliminary non-db specific lookup checks and conversions"
101 if lookup_type == 'contains':
102 return escape_ldap_filter(value)
103 raise TypeError("ListField has invalid lookup: %s" % lookup_type)
105 def to_python(self, value):