Merge branch 'master' of github.com:MongoEngine/mongoengine into fix_complex_datetime_field_invalid_string_set
This commit is contained in:
		| @@ -36,7 +36,6 @@ class BaseField(object): | ||||
|     def __init__( | ||||
|         self, | ||||
|         db_field=None, | ||||
|         name=None, | ||||
|         required=False, | ||||
|         default=None, | ||||
|         unique=False, | ||||
| @@ -51,7 +50,6 @@ class BaseField(object): | ||||
|         """ | ||||
|         :param db_field: The database field to store this field in | ||||
|             (defaults to the name of the field) | ||||
|         :param name: Deprecated - use db_field | ||||
|         :param required: If the field is required. Whether it has to have a | ||||
|             value or not. Defaults to False. | ||||
|         :param default: (optional) The default value for this field if no value | ||||
| @@ -75,11 +73,8 @@ class BaseField(object): | ||||
|             existing attributes. Common metadata includes `verbose_name` and | ||||
|             `help_text`. | ||||
|         """ | ||||
|         self.db_field = (db_field or name) if not primary_key else "_id" | ||||
|         self.db_field = db_field if not primary_key else "_id" | ||||
|  | ||||
|         if name: | ||||
|             msg = 'Field\'s "name" attribute deprecated in favour of "db_field"' | ||||
|             warnings.warn(msg, DeprecationWarning) | ||||
|         self.required = required or primary_key | ||||
|         self.default = default | ||||
|         self.unique = bool(unique or unique_with) | ||||
|   | ||||
| @@ -284,7 +284,6 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): | ||||
|                 "indexes": [],  # indexes to be ensured at runtime | ||||
|                 "id_field": None, | ||||
|                 "index_background": False, | ||||
|                 "index_drop_dups": False, | ||||
|                 "index_opts": None, | ||||
|                 "delete_rules": None, | ||||
|                 # allow_inheritance can be True, False, and None. True means | ||||
|   | ||||
| @@ -851,17 +851,13 @@ class Document(six.with_metaclass(TopLevelDocumentMetaclass, BaseDocument)): | ||||
|         index_spec = cls._build_index_spec(keys) | ||||
|         index_spec = index_spec.copy() | ||||
|         fields = index_spec.pop("fields") | ||||
|         drop_dups = kwargs.get("drop_dups", False) | ||||
|         if drop_dups: | ||||
|             msg = "drop_dups is deprecated and is removed when using PyMongo 3+." | ||||
|             warnings.warn(msg, DeprecationWarning) | ||||
|         index_spec["background"] = background | ||||
|         index_spec.update(kwargs) | ||||
|  | ||||
|         return cls._get_collection().create_index(fields, **index_spec) | ||||
|  | ||||
|     @classmethod | ||||
|     def ensure_index(cls, key_or_list, drop_dups=False, background=False, **kwargs): | ||||
|     def ensure_index(cls, key_or_list, background=False, **kwargs): | ||||
|         """Ensure that the given indexes are in place. Deprecated in favour | ||||
|         of create_index. | ||||
|  | ||||
| @@ -869,12 +865,7 @@ class Document(six.with_metaclass(TopLevelDocumentMetaclass, BaseDocument)): | ||||
|             construct a multi-field index); keys may be prefixed with a **+** | ||||
|             or a **-** to determine the index ordering | ||||
|         :param background: Allows index creation in the background | ||||
|         :param drop_dups: Was removed/ignored with MongoDB >2.7.5. The value | ||||
|             will be removed if PyMongo3+ is used | ||||
|         """ | ||||
|         if drop_dups: | ||||
|             msg = "drop_dups is deprecated and is removed when using PyMongo 3+." | ||||
|             warnings.warn(msg, DeprecationWarning) | ||||
|         return cls.create_index(key_or_list, background=background, **kwargs) | ||||
|  | ||||
|     @classmethod | ||||
| @@ -887,12 +878,8 @@ class Document(six.with_metaclass(TopLevelDocumentMetaclass, BaseDocument)): | ||||
|                   `auto_create_index` to False in the documents meta data | ||||
|         """ | ||||
|         background = cls._meta.get("index_background", False) | ||||
|         drop_dups = cls._meta.get("index_drop_dups", False) | ||||
|         index_opts = cls._meta.get("index_opts") or {} | ||||
|         index_cls = cls._meta.get("index_cls", True) | ||||
|         if drop_dups: | ||||
|             msg = "drop_dups is deprecated and is removed when using PyMongo 3+." | ||||
|             warnings.warn(msg, DeprecationWarning) | ||||
|  | ||||
|         collection = cls._get_collection() | ||||
|         # 746: when connection is via mongos, the read preference is not necessarily an indication that | ||||
|   | ||||
| @@ -1091,14 +1091,12 @@ class DictField(ComplexBaseField): | ||||
|             msg = "Invalid dictionary key - documents must have only string keys" | ||||
|             self.error(msg) | ||||
|  | ||||
|         curr_mongo_ver = get_mongodb_version() | ||||
|  | ||||
|         if curr_mongo_ver < MONGODB_36 and key_has_dot_or_dollar(value): | ||||
|             self.error( | ||||
|                 'Invalid dictionary key name - keys may not contain "."' | ||||
|                 ' or startswith "$" characters' | ||||
|             ) | ||||
|         elif curr_mongo_ver >= MONGODB_36 and key_starts_with_dollar(value): | ||||
|         # Following condition applies to MongoDB >= 3.6 | ||||
|         # older Mongo has stricter constraints but | ||||
|         # it will be rejected upon insertion anyway | ||||
|         # Having a validation that depends on the MongoDB version | ||||
|         # is not straightforward as the field isn't aware of the connected Mongo | ||||
|         if key_starts_with_dollar(value): | ||||
|             self.error( | ||||
|                 'Invalid dictionary key name - keys may not startswith "$" characters' | ||||
|             ) | ||||
|   | ||||
| @@ -11,7 +11,7 @@ MONGODB_36 = (3, 6) | ||||
|  | ||||
|  | ||||
| def get_mongodb_version(): | ||||
|     """Return the version of the connected mongoDB (first 2 digits) | ||||
|     """Return the version of the default connected mongoDB (first 2 digits) | ||||
|  | ||||
|     :return: tuple(int, int) | ||||
|     """ | ||||
|   | ||||
| @@ -60,7 +60,6 @@ class BaseQuerySet(object): | ||||
|         self._ordering = None | ||||
|         self._snapshot = False | ||||
|         self._timeout = True | ||||
|         self._slave_okay = False | ||||
|         self._read_preference = None | ||||
|         self._iter = False | ||||
|         self._scalar = [] | ||||
| @@ -260,16 +259,18 @@ class BaseQuerySet(object): | ||||
|         except StopIteration: | ||||
|             msg = "%s matching query does not exist." % queryset._document._class_name | ||||
|             raise queryset._document.DoesNotExist(msg) | ||||
|  | ||||
|         try: | ||||
|             # Check if there is another match | ||||
|             six.next(queryset) | ||||
|         except StopIteration: | ||||
|             return result | ||||
|  | ||||
|         # If we were able to retrieve the 2nd doc, rewind the cursor and | ||||
|         # raise the MultipleObjectsReturned exception. | ||||
|         queryset.rewind() | ||||
|         message = u"%d items returned, instead of 1" % queryset.count() | ||||
|         raise queryset._document.MultipleObjectsReturned(message) | ||||
|         raise queryset._document.MultipleObjectsReturned( | ||||
|             u"2 or more items returned, instead of 1" | ||||
|         ) | ||||
|  | ||||
|     def create(self, **kwargs): | ||||
|         """Create new object. Returns the saved object instance. | ||||
| @@ -775,7 +776,6 @@ class BaseQuerySet(object): | ||||
|             "_ordering", | ||||
|             "_snapshot", | ||||
|             "_timeout", | ||||
|             "_slave_okay", | ||||
|             "_read_preference", | ||||
|             "_iter", | ||||
|             "_scalar", | ||||
| @@ -1026,9 +1026,11 @@ class BaseQuerySet(object): | ||||
|  | ||||
|             posts = BlogPost.objects(...).fields(comments=0) | ||||
|  | ||||
|         To retrieve a subrange of array elements: | ||||
|         To retrieve a subrange or sublist of array elements, | ||||
|         support exist for both the `slice` and `elemMatch` projection operator: | ||||
|  | ||||
|             posts = BlogPost.objects(...).fields(slice__comments=5) | ||||
|             posts = BlogPost.objects(...).fields(elemMatch__comments="test") | ||||
|  | ||||
|         :param kwargs: A set of keyword arguments identifying what to | ||||
|             include, exclude, or slice. | ||||
| @@ -1037,7 +1039,7 @@ class BaseQuerySet(object): | ||||
|         """ | ||||
|  | ||||
|         # Check for an operator and transform to mongo-style if there is | ||||
|         operators = ["slice"] | ||||
|         operators = ["slice", "elemMatch"] | ||||
|         cleaned_fields = [] | ||||
|         for key, value in kwargs.items(): | ||||
|             parts = key.split("__") | ||||
| @@ -1170,20 +1172,6 @@ class BaseQuerySet(object): | ||||
|         queryset._timeout = enabled | ||||
|         return queryset | ||||
|  | ||||
|     # DEPRECATED. Has no more impact on PyMongo 3+ | ||||
|     def slave_okay(self, enabled): | ||||
|         """Enable or disable the slave_okay when querying. | ||||
|  | ||||
|         :param enabled: whether or not the slave_okay is enabled | ||||
|  | ||||
|         .. deprecated:: Ignored with PyMongo 3+ | ||||
|         """ | ||||
|         msg = "slave_okay is deprecated as it has no impact when using PyMongo 3+." | ||||
|         warnings.warn(msg, DeprecationWarning) | ||||
|         queryset = self.clone() | ||||
|         queryset._slave_okay = enabled | ||||
|         return queryset | ||||
|  | ||||
|     def read_preference(self, read_preference): | ||||
|         """Change the read_preference when querying. | ||||
|  | ||||
| @@ -1958,23 +1946,3 @@ class BaseQuerySet(object): | ||||
|         setattr(queryset, "_" + method_name, val) | ||||
|  | ||||
|         return queryset | ||||
|  | ||||
|     # Deprecated | ||||
|     def ensure_index(self, **kwargs): | ||||
|         """Deprecated use :func:`Document.ensure_index`""" | ||||
|         msg = ( | ||||
|             "Doc.objects()._ensure_index() is deprecated. " | ||||
|             "Use Doc.ensure_index() instead." | ||||
|         ) | ||||
|         warnings.warn(msg, DeprecationWarning) | ||||
|         self._document.__class__.ensure_index(**kwargs) | ||||
|         return self | ||||
|  | ||||
|     def _ensure_indexes(self): | ||||
|         """Deprecated use :func:`~Document.ensure_indexes`""" | ||||
|         msg = ( | ||||
|             "Doc.objects()._ensure_indexes() is deprecated. " | ||||
|             "Use Doc.ensure_indexes() instead." | ||||
|         ) | ||||
|         warnings.warn(msg, DeprecationWarning) | ||||
|         self._document.__class__.ensure_indexes() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user