|
- # -*- coding: utf-8 -*-
- import sys
- from ldap3 import BASE, Reader, SUBTREE, ObjectDef
-
-
- __all__ = ('BaseQuery',)
-
-
- class BaseQuery(object):
-
- def __init__(self, obj):
- self.obj = obj
- self.query = []
- self.base_dn = obj.base_dn
- self.sub_tree = obj.sub_tree
- self.object_def = ObjectDef(obj.object_classes)
- self.operational_attributes = obj.operational_attributes
- self.components_in_and = True
-
- def add_abstract_attr_def(self):
- for name, attr in self.obj._fields.items():
- attr_def = attr.get_abstract_attr_def(name)
- self.object_def.add_attribute(attr_def)
-
- def __iter__(self):
- for entry in self.get_reader_result():
- module = sys.modules.get(self.obj.__module__)
- new_cls = getattr(module, self.obj.__name__)
- ldapentry = new_cls(dn=entry.entry_dn,
- changetype='modify',
- **entry.entry_attributes_as_dict)
- yield ldapentry
-
- def get_reader_result(self):
- query = ','.join(self.query)
- ldapc = current_app.extensions.get('ldap_conn')
- self.add_abstract_attr_def()
- reader = Reader(connection=ldapc.connection,
- object_def=self.object_def,
- query=query,
- base=self.base_dn,
- components_in_and=self.components_in_and,
- sub_tree=self.sub_tree,
- get_operational_attributes=self.operational_attributes,
- controls=None)
- reader.search()
- return reader.entries
-
- def get(self, ldap_dn):
- '''Return an LDAP entry by DN
-
- Args:
- ldap_dn (str): LDAP DN
- '''
- self.base_dn = ldap_dn
- self.sub_tree = BASE
- return self.first()
-
- def filter(self, *query_filter):
- '''Set the query filter to perform the query with
-
- Args:
- *query_filter: Simplified Query Language filter
- '''
- for query in query_filter:
- self.query.append(query)
- return self
-
- def first(self):
- '''Execute the query and return the first result
-
- If there are no entries, first returns ``None``
- '''
- for entry in iter(self):
- return entry
- return None
-
- def all(self, components_in_and=True):
- '''Return all of the results of a query in a list'''
- self.components_in_and = components_in_and
- return [obj for obj in iter(self)]
|