]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
netcmd: models: Model.query method makes use of Query class
authorRob van der Linde <rob@catalyst.net.nz>
Wed, 8 Nov 2023 01:06:10 +0000 (14:06 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 15 Nov 2023 04:05:34 +0000 (04:05 +0000)
Signed-off-by: Rob van der Linde <rob@catalyst.net.nz>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/netcmd/domain/models/model.py

index a1eee7116a127ab1ea4064ef6d1d0640e9cecf18..2724adaa0c39e23d9d9d2744a0b1d50d2c52cbab 100644 (file)
@@ -28,9 +28,10 @@ from ldb import ERR_NO_SUCH_OBJECT, FLAG_MOD_ADD, FLAG_MOD_REPLACE, LdbError,\
 from samba.sd_utils import SDUtils
 
 from .exceptions import DeleteError, DoesNotExist, FieldError,\
-    MultipleObjectsReturned, ProtectError, UnprotectError
+    ProtectError, UnprotectError
 from .fields import DateTimeField, DnField, Field, GUIDField, IntegerField,\
     StringField
+from .query import Query
 
 # Keeps track of registered models.
 # This gets populated by the ModelMeta class.
@@ -246,11 +247,7 @@ class Model(metaclass=ModelMeta):
                 raise DoesNotExist(f"Container does not exist: {base_dn}")
             raise
 
-        # For now this returns a simple generator of model instances.
-        # This could eventually become a QuerySet class if we need to add
-        # additional methods on the return value for example .order_by()
-        for message in result:
-            yield cls.from_message(ldb, message)
+        return Query(cls, ldb, result)
 
     @classmethod
     def get(cls, ldb, **kwargs):
@@ -278,27 +275,10 @@ class Model(metaclass=ModelMeta):
                     return None
                 else:
                     raise
-        else:
-            base_dn = cls.get_search_dn(ldb)
 
-            # If the container does not exist produce a friendly error message.
-            try:
-                res = ldb.search(base_dn,
-                                 scope=SCOPE_SUBTREE,
-                                 expression=cls.build_expression(**kwargs))
-            except LdbError as e:
-                if e.args[0] == ERR_NO_SUCH_OBJECT:
-                    raise DoesNotExist(f"Container does not exist: {base_dn}")
-                raise
-
-        # Expect to get one object back or raise MultipleObjectsReturned.
-        # For multiple records, please call .query() instead.
-        count = len(res)
-        if count > 1:
-            raise MultipleObjectsReturned(
-                f"More than one object returned (got {count}).")
-        elif count == 1:
             return cls.from_message(ldb, res[0])
+        else:
+            return cls.query(ldb, **kwargs).get()
 
     @classmethod
     def create(cls, ldb, **kwargs):