Index: ldapdb/models/query.py =================================================================== --- ldapdb/models/query.py (revision 849) +++ ldapdb/models/query.py (working copy) @@ -53,6 +53,8 @@ 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': Index: ldapdb/tests.py =================================================================== --- ldapdb/tests.py (revision 849) +++ ldapdb/tests.py (working copy) @@ -49,6 +49,10 @@ where.add((Constraint("cn", "cn", None), 'in', ["foo", "bar"]), AND) self.assertEquals(where.as_sql(), "(|(cn=foo)(cn=bar))") + where = WhereNode() + where.add((Constraint("cn", "cn", None), 'contains', "test"), AND) + self.assertEquals(where.as_sql(), "(cn=*es*)") + def test_escaped(self): where = WhereNode() where.add((Constraint("cn", "cn", None), 'exact', "(test)"), AND)