Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self._mongotize(lookup, resource)
client_projection = self._client_projection(req)
datasource, filter_, projection, _ = self._datasource_ex(
resource,
lookup,
client_projection,
check_auth_value=check_auth_value,
force_auth_field_projection=force_auth_field_projection,
)
if (
(config.DOMAIN[resource]["soft_delete"])
and (not req or not req.show_deleted)
and (not self.query_contains_field(lookup, config.DELETED))
):
filter_ = self.combine_queries(filter_, {config.DELETED: {"$ne": True}})
# Here, we feed pymongo with `None` if projection is empty.
return (
self.pymongo(resource).db[datasource].find_one(filter_, projection or None)
)
document[config.LINKS] = self_dict
elif "self" not in document[config.LINKS]:
document[config.LINKS].update(self_dict)
# add data relation links if hateoas enabled
resolve_data_relation_links(document, resource)
# add version numbers
resolve_document_version(document, resource, "GET", latest_doc)
# resolve media
resolve_media_files(document, resource)
# resolve soft delete
if resource_def["soft_delete"] is True:
if document.get(config.DELETED) is None:
document[config.DELETED] = False
elif document[config.DELETED] is True:
# Soft deleted documents are sent without expansion of embedded
# documents. Return before resolving them.
return
# resolve embedded documents
resolve_embedded_documents(document, resource, embedded_fields)
retrieves the target collection via the new config.SOURCES helper.
"""
self._mongotize(lookup, resource)
client_projection = self._client_projection(req)
datasource, filter_, projection, _ = self._datasource_ex(
resource,
lookup,
client_projection)
if (config.DOMAIN[resource]['soft_delete']) and \
(not req or not req.show_deleted) and \
(not self.query_contains_field(lookup, config.DELETED)):
filter_ = self.combine_queries(
filter_, {config.DELETED: {"$ne": True}})
document = self.pymongo(resource).db[datasource] \
.find_one(filter_, projection)
return document
client_projection = self._client_projection(req)
datasource, filter_, projection, _ = self._datasource_ex(
resource,
lookup,
client_projection,
check_auth_value=check_auth_value,
force_auth_field_projection=force_auth_field_projection,
)
if (
(config.DOMAIN[resource]["soft_delete"])
and (not req or not req.show_deleted)
and (not self.query_contains_field(lookup, config.DELETED))
):
filter_ = self.combine_queries(filter_, {config.DELETED: {"$ne": True}})
# Here, we feed pymongo with `None` if projection is empty.
return (
self.pymongo(resource).db[datasource].find_one(filter_, projection or None)
)
document[config.LINKS].update(self_dict)
# add data relation links if hateoas enabled
resolve_data_relation_links(document, resource)
# add version numbers
resolve_document_version(document, resource, "GET", latest_doc)
# resolve media
resolve_media_files(document, resource)
# resolve soft delete
if resource_def["soft_delete"] is True:
if document.get(config.DELETED) is None:
document[config.DELETED] = False
elif document[config.DELETED] is True:
# Soft deleted documents are sent without expansion of embedded
# documents. Return before resolving them.
return
# resolve embedded documents
resolve_embedded_documents(document, resource, embedded_fields)
# Apply coerced values
document = validator.document
if validation:
# sneak in a shadow copy if it wasn't already there
late_versioning_catch(original, resource)
# update meta
last_modified = datetime.utcnow().replace(microsecond=0)
document[config.LAST_UPDATED] = last_modified
document[config.DATE_CREATED] = original[config.DATE_CREATED]
if resource_def["soft_delete"] is True:
# PUT with soft delete enabled should always set the DELETED
# field to False. We are either carrying through un-deleted
# status, or restoring a soft deleted document
document[config.DELETED] = False
# id_field not in document means it is not being automatically
# handled (it has been set to a field which exists in the
# resource schema.
if resource_def["id_field"] not in document:
document[resource_def["id_field"]] = object_id
resolve_user_restricted_access(document, resource)
store_media_files(document, resource, original)
resolve_document_version(document, resource, "PUT", original)
# notify callbacks
getattr(app, "on_replace")(resource, document, original)
getattr(app, "on_replace_%s" % resource)(document, original)
resolve_document_etag(document, resource)
Pass current resource to ``parse_request``, allowing for proper
processing of new configuration settings: `filters`, `sorting`, `paging`.
.. versionchanged:: 0.0.4
Added the ``requires_auth`` decorator.
"""
resource_def = config.DOMAIN[resource]
soft_delete_enabled = resource_def["soft_delete"]
original = get_document(
resource,
concurrency_check,
original,
force_auth_field_projection=soft_delete_enabled,
**lookup
)
if not original or (soft_delete_enabled and original.get(config.DELETED) is True):
return all_done()
# notify callbacks
if not suppress_callbacks:
getattr(app, "on_delete_item")(resource, original)
getattr(app, "on_delete_item_%s" % resource)(original)
if soft_delete_enabled:
# Instead of removing the document from the db, just mark it as deleted
marked_document = copy.deepcopy(original)
# Set DELETED flag and update metadata
last_modified = datetime.utcnow().replace(microsecond=0)
marked_document[config.DELETED] = True
marked_document[config.LAST_UPDATED] = last_modified
# return an error)
client_sort = self._convert_sort_request_to_dict(req)
spec = self._convert_where_request_to_dict(req)
bad_filter = validate_filters(spec, resource)
if bad_filter:
abort(400, bad_filter)
if sub_resource_lookup:
spec = self.combine_queries(spec, sub_resource_lookup)
if (
config.DOMAIN[resource]["soft_delete"]
and not (req and req.show_deleted)
and not self.query_contains_field(spec, config.DELETED)
):
# Soft delete filtering applied after validate_filters call as
# querying against the DELETED field must always be allowed when
# soft_delete is enabled
spec = self.combine_queries(spec, {config.DELETED: {"$ne": True}})
spec = self._mongotize(spec, resource)
client_projection = self._client_projection(req)
datasource, spec, projection, sort = self._datasource_ex(
resource, spec, client_projection, client_sort
)
if req and req.if_modified_since:
spec[config.LAST_UPDATED] = {"$gt": req.if_modified_since}
# Apply coerced values
# sneak in a shadow copy if it wasn't already there
late_versioning_catch(original, resource)
store_media_files(updates, resource, original)
resolve_document_version(updates, resource, "PATCH", original)
# some datetime precision magic
updates[config.LAST_UPDATED] = datetime.utcnow().replace(microsecond=0)
if resource_def["soft_delete"] is True:
# PATCH with soft delete enabled should always set the DELETED
# field to False. We are either carrying through un-deleted
# status, or restoring a soft deleted document
updates[config.DELETED] = False
# the mongo driver has a different precision than the python
# datetime. since we don't want to reload the document once it
# has been updated, and we still have to provide an updated
# etag, we're going to update the local version of the
# 'original' document, and we will use it for the etag
# computation.
updated = deepcopy(original)
# notify callbacks
getattr(app, "on_update")(resource, updates, original)
getattr(app, "on_update_%s" % resource)(updates, original)
if resource_def["merge_nested_documents"]:
updates = resolve_nested_documents(updates, updated)
updated.update(updates)
if i == 0:
documents.append(document)
else:
documents.append(
diff_document(resource_def, last_document, document)
)
last_document = document
else:
documents.append(document)
# add documents to response
if config.DOMAIN[resource]["hateoas"]:
response[config.ITEMS] = documents
else:
response = documents
elif soft_delete_enabled and document.get(config.DELETED) is True:
# This document was soft deleted. Respond with 404 and the deleted
# version of the document.
document[config.STATUS] = (config.STATUS_ERR,)
document[config.ERROR] = {
"code": 404,
"message": "The requested URL was not found on this server.",
}
return document, last_modified, etag, 404
else:
response = document
# extra hateoas links
if config.DOMAIN[resource]["hateoas"]:
# use the id of the latest document for multi-document requests
if cursor:
response[config.LINKS] = _pagination_links(