]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
netcmd: models: field to_db_value needs ldb param
authorRob van der Linde <rob@catalyst.net.nz>
Wed, 20 Sep 2023 00:50:15 +0000 (12:50 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 29 Sep 2023 02:18:34 +0000 (02:18 +0000)
Required by SDDL field type added in next commit

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/fields.py
python/samba/netcmd/domain/models/model.py
python/samba/tests/samba_tool/domain_models.py

index 523b7d69d57f16ad80cca1768de107a4246a5dca..b60f2e4d4b4f64a9db07643d7bf9ae3070ed35e8 100644 (file)
@@ -74,12 +74,13 @@ class Field(metaclass=ABCMeta):
         pass
 
     @abstractmethod
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Converts value to database value.
 
         This should return a MessageElement or None, where None means
         the field will be unset on the next save.
 
+        :param ldb: Ldb connection
         :param value: Input value from Python field
         :param flags: MessageElement flags
         :returns: MessageElement or None
@@ -99,7 +100,7 @@ class IntegerField(Field):
         else:
             return int(value[0])
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert int or list of int to MessageElement."""
         if value is None:
             return
@@ -129,7 +130,7 @@ class BinaryField(Field):
         else:
             return bytes(value[0])
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert bytes or list of bytes to MessageElement."""
         if value is None:
             return
@@ -152,7 +153,7 @@ class StringField(Field):
         else:
             return str(value)
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert str or list of str to MessageElement."""
         if value is None:
             return
@@ -190,7 +191,7 @@ class EnumField(Field):
         else:
             return self.enum_from_value(value)
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert enum or list of enum to MessageElement."""
         if value is None:
             return
@@ -214,7 +215,7 @@ class DateTimeField(Field):
         else:
             return datetime.fromtimestamp(string_to_time(str(value)))
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert datetime or list of datetime to MessageElement."""
         if value is None:
             return
@@ -251,7 +252,7 @@ class RelatedField(Field):
         else:
             return self.model.get(ldb, dn=Dn(ldb, str(value)))
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert related object or list of objects to MessageElement."""
         if value is None:
             return
@@ -276,7 +277,7 @@ class DnField(Field):
         else:
             return Dn(ldb, str(value))
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert Dn object or list of Dn objects into a MessageElement."""
         if value is None:
             return
@@ -299,7 +300,7 @@ class GUIDField(Field):
         else:
             return str(ndr_unpack(GUID, value[0]))
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert str with GUID into MessageElement."""
         if value is None:
             return
@@ -322,7 +323,7 @@ class BooleanField(Field):
         else:
             return str(value) == "TRUE"
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert bool or list of bool into a MessageElement."""
         if value is None:
             return
@@ -378,7 +379,7 @@ class PossibleClaimValuesField(Field):
 
             return values
 
-    def to_db_value(self, value, flags):
+    def to_db_value(self, ldb, value, flags):
         """Convert list of dicts back to XML as a MessageElement."""
         if value is None:
             return
index 00722c04272337c5234a66077781a40988345546..3a95595736a0af4aa131f16deb05979b5312745f 100644 (file)
@@ -27,8 +27,8 @@ from ldb import ERR_NO_SUCH_OBJECT, FLAG_MOD_ADD, FLAG_MOD_REPLACE, LdbError,\
     Message, MessageElement, SCOPE_BASE, SCOPE_SUBTREE, binary_encode
 from samba.sd_utils import SDUtils
 
-from .exceptions import DeleteError, DoesNotExist, MultipleObjectsReturned,\
-    ProtectError, UnprotectError
+from .exceptions import DeleteError, DoesNotExist, ModelError,\
+    MultipleObjectsReturned, ProtectError, UnprotectError
 from .fields import DateTimeField, DnField, Field, GUIDField, IntegerField,\
     StringField
 
@@ -359,7 +359,10 @@ class Model(metaclass=ModelMeta):
             for attr, field in self.fields.items():
                 if attr != "dn":
                     value = getattr(self, attr)
-                    db_value = field.to_db_value(value, FLAG_MOD_ADD)
+                    try:
+                        db_value = field.to_db_value(ldb, value, FLAG_MOD_ADD)
+                    except ValueError as e:
+                        raise ModelError(e)
 
                     # Don't add empty fields.
                     if db_value is not None and len(db_value):
@@ -384,7 +387,11 @@ class Model(metaclass=ModelMeta):
                     old_value = getattr(existing_obj, attr)
 
                     if value != old_value:
-                        db_value = field.to_db_value(value, FLAG_MOD_REPLACE)
+                        try:
+                            db_value = field.to_db_value(ldb, value,
+                                                         FLAG_MOD_REPLACE)
+                        except ValueError as e:
+                            raise ModelError(e)
 
                         # When a field returns None or empty list, delete attr.
                         if db_value in (None, []):
index 4b0b10ead2ebb4699e0e9981982b3c90f3128f3b..545050184466c5bd9ea9a310657e1d69f552ec90 100644 (file)
@@ -58,7 +58,7 @@ class FieldTestMixin:
         # If the expected value is callable, treat it as a validation callback.
         # NOTE: perhaps we should be using subtests for this.
         for (value, expected) in self.to_db_value:
-            db_value = self.field.to_db_value(value, FLAG_MOD_ADD)
+            db_value = self.field.to_db_value(self.samdb, value, FLAG_MOD_ADD)
             if callable(expected):
                 self.assertTrue(expected(db_value))
             else: