From e049cef00afb2fc1ae0e315674282a2d39464b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alice=20Bevan=E2=80=93McGregor?= Date: Tue, 13 Oct 2015 21:54:58 -0400 Subject: [PATCH] Add arbitrary metadata capture to `BaseField`. Includes ability to detect and report conflicts. --- mongoengine/base/fields.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/mongoengine/base/fields.py b/mongoengine/base/fields.py index 304c084d..d92e9b3a 100644 --- a/mongoengine/base/fields.py +++ b/mongoengine/base/fields.py @@ -42,7 +42,8 @@ class BaseField(object): def __init__(self, db_field=None, name=None, required=False, default=None, unique=False, unique_with=None, primary_key=False, validation=None, choices=None, verbose_name=None, - help_text=None, null=False, sparse=False, custom_data=None): + help_text=None, null=False, sparse=False, custom_data=None + **kwargs): """ :param db_field: The database field to store this field in (defaults to the name of the field) @@ -70,6 +71,7 @@ class BaseField(object): :param sparse: (optional) `sparse=True` combined with `unique=True` and `required=False` means that uniqueness won't be enforced for `None` values :param custom_data: (optional) Custom metadata for this field. + :param **kwargs: (optional) Arbitrary indirection-free metadata for this field. """ self.db_field = (db_field or name) if not primary_key else '_id' @@ -89,6 +91,15 @@ class BaseField(object): self.sparse = sparse self._owner_document = None self.custom_data = custom_data + + conflicts = set(dir(self)).intersect(kwargs) + if conflicts: + raise TypeError("%s already has attribute(s): %s" % ( + self.__class__.__name__, + ', '.join(conflicts) + )) + + self.__dict__.update(kwargs) # Adjust the appropriate creation counter, and save our local copy. if self.db_field == '_id':