Product

Product

A raster product that connects band information to imagery.

ProductCollection

DeletionTaskStatus

The asynchronous deletion task's status


class Product(*args, **kwargs)[source]

A raster product that connects band information to imagery.

Instantiating a product indicates that you want to create a new Descartes Labs catalog product. If you instead want to retrieve an existing catalog product use Product.get(), or if you’re not sure use Product.get_or_create(). You can also use Product.search(). Also see the example for save().

Parameters:

Note

The reader and writer IDs must be prefixed with email:, user:, group: or org:. The owner ID only accepts org: and user:. Using org: as an owner will assign those privileges only to administrators for that organization; using org: as a reader or writer assigns those privileges to everyone in that organization. The readers and writers attributes are only visible in full to the owners. If you are a reader or a writer those attributes will only display the element of those lists by which you are gaining read or write access.

Any user with owner privileges is able to read, modify, or delete the product, including reading and modifying the owners, writers, and readers attributes. Any user with owner privileges can also create, read, modify, or delete bands and images for the product.

Any user with writer privileges is able to read or modify the product, but not delete the product. A writer may create, read or modify bands and images for the product. A writer can read the product owners and can only read the entry in the writers and/or readers by which they gain access to the product.

Any user with reader privileges is able to read the product, bands, and images. A reader can read the product owners and can only read the entry in the writers and/or readers by which they gain access to the product.

Also see Sharing Resources.

delete()

Delete this catalog object from the Descartes Labs catalog.

Once deleted, you cannot use the catalog object and should release any references.

Raises:

Methods:

bands([request_params])

A search query for all bands for this product, sorted by default band sort_order.

delete(id[, client])

Delete the catalog object with the given id.

delete_related_objects()

Delete all related bands and images for this product.

exists(id[, client])

Checks if an object exists in the Descartes Labs catalog.

get(id[, client, request_params])

Get an existing object from the Descartes Labs catalog.

get_band(name[, client, request_params])

Retrieve the request band associated with this product by name.

get_delete_status()

Fetches the status of a deletion task.

get_image(name[, client, request_params])

Retrieve the request image associated with this product by name.

get_many(ids[, ignore_missing, client, ...])

Get existing objects from the Descartes Labs catalog.

get_or_create(id[, client])

Get an existing object from the Descartes Labs catalog or create a new object.

image_uploads()

A search query for all uploads in this product created by this user.

images([request_params])

A search query for all images in this product.

named_id(name)

Return the ~descarteslabs.catalog.NamedCatalogObject.id` for the given named catalog object.

namespace_id(id_[, client])

Generate a fully namespaced id.

reload([request_params])

Reload all attributes from the Descartes Labs catalog.

save([request_params])

Saves this object to the Descartes Labs catalog.

search([client, request_params])

A search query for all objects of the type this class represents.

serialize([modified_only, jsonapi_format])

Serialize the catalog object into json.

update([ignore_errors])

Update multiple attributes at once using the given keyword arguments.

Attributes:

ATTRIBUTES

created

The point in time this object was created.

default_display_bands

Which bands to use for RGBA display.

description

A description with further details on this product.

end_datetime

The end of the mission for this product.

extra_properties

A dictionary of up to 50 key/value pairs.

id

A unique identifier for this object.

image_index_name

The name of the image index for this product.

is_core

Whether this is a Descartes Labs catalog core product.

is_modified

Whether any attributes were changed (see state).

modified

The point in time this object was last modified.

name

The name of this product.

owners

User, group, or organization IDs that own this product.

product_tier

Product tier for this product.

readers

User, email, group, or organization IDs that can read this product.

resolution_max

Maximum resolution of the bands for this product.

resolution_min

Minimum resolution of the bands for this product.

revisit_period_minutes_max

Maximum length of the time interval between observations.

revisit_period_minutes_min

Minimum length of the time interval between observations.

start_datetime

The beginning of the mission for this product.

state

The state of this catalog object.

tags

A list of up to 32 tags, each up to 1000 bytes long.

writers

User, group, or organization IDs that can edit this product.

bands(request_params=None)[source]

A search query for all bands for this product, sorted by default band sort_order.

Returns:

A Search instance configured to find all bands for this product.

Return type:

Search

Raises:

DeletedObjectError – If this product was deleted.

classmethod delete(id, client=None)

Delete the catalog object with the given id.

Parameters:
Returns:

True if this object was successfully deleted. False if the object was not found.

Return type:

bool

Raises:

Example

>>> Image.delete('my-image-id') 

Delete all related bands and images for this product.

Starts an asynchronous operation that deletes all bands and images associated with this product. If the product has a large number of associated images, this operation could take several minutes, or even hours.

Returns:

Returns DeletionTaskStatus if deletion task was successfully started and None if there were no related objects to delete.

Return type:

DeletionTaskStatus

Raises:
classmethod exists(id, client=None)

Checks if an object exists in the Descartes Labs catalog.

Parameters:
Returns:

Returns True if the given id represents an existing object in the Descartes Labs catalog and False if not.

Return type:

bool

Raises:

ClientError or ServerErrorSpurious exception that can occur during a network request.

classmethod get(id, client=None, request_params=None)

Get an existing object from the Descartes Labs catalog.

If the Descartes Labs catalog object is found, it will be returned in the SAVED state. Subsequent changes will put the instance in the MODIFIED state, and you can use save() to commit those changes and update the Descartes Labs catalog object. Also see the example for save().

For bands, if you request a specific band type, for example SpectralBand.get(), you will only receive that type. Use Band.get() to receive any type.

Parameters:
Returns:

The object you requested, or None if an object with the given id does not exist in the Descartes Labs catalog.

Return type:

CatalogObject or None

Raises:

ClientError or ServerErrorSpurious exception that can occur during a network request.

get_band(name, client=None, request_params=None)[source]

Retrieve the request band associated with this product by name.

Parameters:
Returns:

A derived class of Band that represents the requested band object if found, None if not found.

Return type:

Band or None

get_delete_status()[source]

Fetches the status of a deletion task.

Fetches the status of a deletion task started using delete_related_objects().

Return type:

DeletionTaskStatus

Raises:
get_image(name, client=None, request_params=None)[source]

Retrieve the request image associated with this product by name.

Parameters:
Returns:

The requested image if found, or None if not found.

Return type:

Image or None

classmethod get_many(ids, ignore_missing=False, client=None, request_params=None)

Get existing objects from the Descartes Labs catalog.

All returned Descartes Labs catalog objects will be in the SAVED state. Also see get().

For bands, if you request a specific band type, for example SpectralBand.get_many(), you will only receive that type. Use Band.get_many() to receive any type.

Parameters:
  • ids (list(str)) – A list of identifiers for the objects you are requesting.

  • ignore_missing (bool, optional) – Whether to raise a NotFoundError exception if any of the requested objects are not found in the Descartes Labs catalog. False by default which raises the exception.

  • client (CatalogClient, optional) – A CatalogClient instance to use for requests to the Descartes Labs catalog. The get_default_client() will be used if not set.

Returns:

List of the objects you requested in the same order.

Return type:

list(CatalogObject)

Raises:
classmethod get_or_create(id, client=None, **kwargs)

Get an existing object from the Descartes Labs catalog or create a new object.

If the Descartes Labs catalog object is found, and the remainder of the arguments do not differ from the values in the retrieved instance, it will be returned in the SAVED state.

If the Descartes Labs catalog object is found, and the remainder of the arguments update one or more values in the instance, it will be returned in the MODIFIED state.

If the Descartes Labs catalog object is not found, it will be created and the state will be UNSAVED. Also see the example for save().

Parameters:
  • id (str) – The id of the object you are requesting.

  • client (CatalogClient, optional) – A CatalogClient instance to use for requests to the Descartes Labs catalog. The get_default_client() will be used if not set.

  • kwargs (dict, optional) – With the exception of readonly attributes (created, modified), any attribute of a catalog object can be set as a keyword argument (Also see ATTRIBUTES).

Returns:

The requested catalog object that was retrieved or created.

Return type:

CatalogObject

image_uploads()[source]

A search query for all uploads in this product created by this user.

Returns:

A Search instance configured to find all uploads in this product.

Return type:

Search

Raises:

DeletedObjectError – If this product was deleted.

images(request_params=None)[source]

A search query for all images in this product.

Returns:

A Search instance configured to find all images in this product.

Return type:

Search

Raises:

DeletedObjectError – If this product was deleted.

named_id(name)[source]

Return the ~descarteslabs.catalog.NamedCatalogObject.id` for the given named catalog object.

Parameters:

name (str) – The name of the catalog object within this product, see name.

Returns:

The named catalog object id within this product.

Return type:

str

classmethod namespace_id(id_, client=None)[source]

Generate a fully namespaced id.

Parameters:
  • id (str) – The unprefixed part of the id that you want prefixed.

  • client (CatalogClient, optional) – A CatalogClient instance to use for requests to the Descartes Labs catalog. The get_default_client() will be used if not set.

Returns:

The fully namespaced id.

Return type:

str

Example

>>> product_id = Product.namespace_id("my-product")
reload(request_params=None)

Reload all attributes from the Descartes Labs catalog.

Refresh the state of this catalog object from the object in the Descartes Labs catalog. This may be necessary if there are concurrent updates and the object in the Descartes Labs catalog was updated from another client. The instance state must be in the SAVED state.

If you want to revert a modified object to its original one, you should use get() on the object class with the object’s id.

Raises:

Example

>>> from descarteslabs.catalog import Product
>>> p = Product(id="my_org_id:my_product_id")
>>> # Some time elapses and a concurrent change was made
>>> p.state 
<DocumentState.SAVED: 'saved'>
>>> p.reload() 
>>> # But once you make changes, you cannot use this method any more
>>> p.name = "My name has changed"
>>> p.reload() 
Traceback (most recent call last):
  ...
ValueError: Product instance with id my_org_id:my_product_id has not been saved
>>> # But you can revert
>>> p = Product.get(p.id) 
>>> p.state 
<DocumentState.SAVED: 'saved'>
save(request_params=None)

Saves this object to the Descartes Labs catalog.

If this instance was created using the constructor, it will be in the UNSAVED state and is considered a new Descartes Labs catalog object that must be created. If the catalog object already exists in this case, this method will raise a BadRequestError.

If this instance was retrieved using get(), get_or_create() or any other way (for example as part of a search()), and any of its values were changed, it will be in the MODIFIED state and the existing catalog object will be updated.

If this instance was retrieved using get(), get_or_create() or any other way (for example as part of a search()), and none of its values were changed, it will be in the SAVED state, and if no request_params parameter is given, nothing will happen.

Parameters:

request_params (dict, optional) – A dictionary of attributes that should be sent to the catalog along with attributes already set on this object. Empty by default. If not empty, and the object is in the SAVED state, it is updated in the Descartes Labs catalog even though no attributes were modified.

Raises:

Example

>>> from descarteslabs.catalog import Product
>>> new_product = Product(
...     id="my-product",
...     name="My Product",
...     description="This is a test product"
... )
>>> new_product.state
<DocumentState.UNSAVED: 'unsaved'>
>>> new_product.save() 
>>> # ids will be automatically prefixed by the Descartes Labs catalog
>>> # with your organization id
>>> new_product.id 
my_org_id:my-product
>>> # Now you can retrieve the product and update it
>>> existing_product = Product.get(new_product.id) 
>>> existing_product.state 
<DocumentState.SAVED: 'saved'>
>>> existing_product.name = "My Updated Product" 
>>> existing_product.state 
<DocumentState.MODIFIED: 'modified'>
>>> existing_product.save() 
>>> existing_product.state 
<DocumentState.SAVED: 'saved'>
>>> # After you delete it...
>>> existing_product.delete() 
True
>>> product.state 
<DocumentState.DELETED: 'deleted'>
classmethod search(client=None, request_params=None)

A search query for all objects of the type this class represents.

Parameters:

client (CatalogClient, optional) – A CatalogClient instance to use for requests to the Descartes Labs catalog. The get_default_client() will be used if not set.

Returns:

An instance of the Search class.

Return type:

Search

Example

>>> search = Product.search().limit(10) 
>>> for result in search: 
        print(result.name) 
serialize(modified_only=False, jsonapi_format=False)

Serialize the catalog object into json.

Parameters:
  • modified_only (bool, optional) – Whether only modified attributes should be serialized. False by default. If set to True, only those attributes that were modified since the last time the catalog object was retrieved or saved will be included.

  • jsonapi_format (bool, optional) – Whether to use the data element for catalog objects. False by default. When set to False, the serialized data will directly contain the attributes of the catalog object. If set to True, the serialized data will follow the exact JSONAPI with a top-level data element which contains id, type, and attributes. The latter will contain the attributes of the catalog object.

update(ignore_errors=False, **kwargs)

Update multiple attributes at once using the given keyword arguments.

Parameters:

ignore_errors (bool, optional) – False by default. When set to True, it will suppress AttributeValidationError and AttributeError. Any given attribute that causes one of these two exceptions will be ignored, all other attributes will be set to the given values.

Raises:
  • AttributeValidationError – If one or more of the attributes being updated are immutable.

  • AttributeError – If one or more of the attributes are not part of this catalog object.

  • DeletedObjectError – If this catalog object was deleted.

ATTRIBUTES = ('name', 'description', 'owners', 'readers', 'writers', 'is_core', 'revisit_period_minutes_min', 'revisit_period_minutes_max', 'start_datetime', 'end_datetime', 'resolution_min', 'resolution_max', 'default_display_bands', 'image_index_name', 'product_tier', 'extra_properties', 'tags', 'id', 'created', 'modified')
created

The point in time this object was created.

Filterable, sortable.

Type:

datetime, readonly

default_display_bands

Which bands to use for RGBA display.

This field defines the default bands that are used for display purposes. There are four supported formats: ["greyscale-or-class"], ["greyscale-or-class", "alpha"], ["red", "green", "blue"], and ["red", "green", "blue", "alpha"].

Type:

list(str) or iterable

description

A description with further details on this product.

The description can be up to 80,000 characters and is used by Search.find_text().

Searchable

Type:

str, optional

end_datetime

The end of the mission for this product.

Filterable, sortable.

Type:

str or datetime, optional

extra_properties

A dictionary of up to 50 key/value pairs.

The keys of this dictionary must be strings, and the values of this dictionary can be strings or numbers. This allows for more structured custom metadata to be associated with objects.

Type:

dict, optional

id

A unique identifier for this object.

Note that if you pass a string that does not begin with your Descartes Labs user organization ID, it will be prepended to your id with a : as separator. If you are not part of an organization, your user ID is used. Once set, it cannot be changed.

Type:

str, immutable

image_index_name

The name of the image index for this product.

This is an internal field, accessible to privileged users only.

Filterable, sortable.

Type:

str

is_core

Whether this is a Descartes Labs catalog core product.

A core product is a product that is fully supported by Descartes Labs. By default this value is False and you must have a special permission (descarteslabs:core:create) to set it to True.

Filterable, sortable.

Type:

bool, optional

property is_modified

Whether any attributes were changed (see state).

True if any of the attribute values changed since the last time this catalog object was retrieved or saved. False otherwise.

Note that assigning an identical value does not affect the state.

Type:

bool

modified

The point in time this object was last modified.

Filterable, sortable.

Type:

datetime, readonly

name

The name of this product.

This should not be confused with a band name or image name. Unlike the band name and image name, this name is not unique and purely for display purposes and is used by Search.find_text(). It can contain a string with up to 2000 arbitrary characters.

Searchable, sortable.

Type:

str

owners

User, group, or organization IDs that own this product.

Defaults to [user:current_user, org:current_org]. The owner can edit, delete, and change access to this product. See this note.

Filterable.

Type:

list(str), optional

product_tier

Product tier for this product.

This field can be set by privileged users only.

Filterable, sortable.

Type:

str

readers

User, email, group, or organization IDs that can read this product.

Will be empty by default. This attribute is only available in full to the owners of the product. See this note.

Type:

list(str), optional

resolution_max

Maximum resolution of the bands for this product.

If applying a filter with a plain unitless number the value is assumed to be in meters.

Filterable, sortable.

Type:

Resolution, readonly

resolution_min

Minimum resolution of the bands for this product.

If applying a filter with a plain unitless number the value is assumed to be in meters.

Filterable, sortable.

Type:

Resolution, readonly

revisit_period_minutes_max

Maximum length of the time interval between observations.

The maximum length of the time interval between observations of any given area in minutes.

Filterable, sortable.

Type:

float, optional

revisit_period_minutes_min

Minimum length of the time interval between observations.

The minimum length of the time interval between observations of any given area in minutes.

Filterable, sortable.

Type:

float, optional

start_datetime

The beginning of the mission for this product.

Filterable, sortable.

Type:

str or datetime, optional

property state

The state of this catalog object.

Type:

DocumentState

tags

A list of up to 32 tags, each up to 1000 bytes long.

The tags may support the classification and custom filtering of objects.

Filterable.

Type:

list, optional

writers

User, group, or organization IDs that can edit this product.

Writers will also have read permission. Writers will be empty by default. See note below. This attribute is only available in full to the owners of the product. See this note.

Type:

list(str), optional

class ProductCollection(iterable=None, item_type=None)[source]

Methods:

append(x)

Append x to the end of this Collection.

extend(x)

Extend this Collection by appending elements from the iterable.

filter(predicate)

Returns a Collection filtered by predicate.

groupby(*predicates)

Groups items by predicates.

map(f)

Returns a Collection of f applied to each item.

sort(field[, ascending])

Returns a Collection, sorted by the given field and direction.

sorted(*predicates, **reverse)

Returns a Collection, sorted by predicates in ascending order.

Attributes:

each

Any operations chained onto each (attribute access, item access, and calls) are applied to each item in the Collection.

append(x)

Append x to the end of this Collection.

The type of the item must match the type of the collection.

Parameters:

x (Any) – Add an item to the collection

extend(x)

Extend this Collection by appending elements from the iterable.

The type of the items in the list must all match the type of the collection.

Parameters:

x (List[Any]) – Extend a collection with the items from the list.

filter(predicate)

Returns a Collection filtered by predicate.

Predicate can either be a callable or an Expression from Properties.

If the predicate is a callable, filter() will return all items for which predicate(item) is True.

If the predicate is an Expression, filter() will return all items for which predicate.evaluate(item) is True.

Parameters:

predicate (callable or Expression) – Either a callable or a Properties Expression which is called or evaluated for each item in the list.

Returns:

A new collection with only those items for which the predicate returned or evaluated to True.

Return type:

Collection

groupby(*predicates)

Groups items by predicates.

Groups items by predicates and yields tuple of (group, items) for each group, where items is a Collection.

Each predicate can be a key function, or a string of dot-chained attributes to use as sort keys.

Parameters:

predicates (callable or str) – Any positional arguments are predicates. If the predicate is a string, it denotes an attribute for each element, potentially with levels separated by a dot. If the predicate is a callable, it must return the value to sort by for each given element.

Yields:

Tuple[str, Collection] – A tuple of (group, Collection) for each group.

Examples

>>> import collections
>>> FooBar = collections.namedtuple("FooBar", ["foo", "bar"])
>>> c = Collection([FooBar("a", True), FooBar("b", False), FooBar("a", False)])
>>> for group, items in c.groupby("foo"):
...     print(group)
...     print(items)
a
Collection([FooBar(foo='a', bar=True), FooBar(foo='a', bar=False)])
b
Collection([FooBar(foo='b', bar=False)])
>>> for group, items in c.groupby("bar"):
...     print(group)
...     print(items)
False
Collection([FooBar(foo='b', bar=False), FooBar(foo='a', bar=False)])
True
Collection([FooBar(foo='a', bar=True)])
map(f)

Returns a Collection of f applied to each item.

Parameters:

f (callable) – Apply function f to each element of the collection and return the result as a collection.

Returns:

A collection with the results of the function f applied to each element of the original collection.

Return type:

Collection

sort(field, ascending=True)

Returns a Collection, sorted by the given field and direction.

Parameters:
  • field (str) – The name of the field to sort by

  • ascending (bool) – Sorts results in ascending order if True (the default), and in descending order if False.

Returns:

The sorted collection.

Return type:

Collection

Example

>>> from descarteslabs.catalog import Product
>>> collection = Product.search().collect() 
>>> sorted_collection = collection.sort("created", ascending=False) 
>>> sorted_collection 
sorted(*predicates, **reverse)

Returns a Collection, sorted by predicates in ascending order.

Each predicate can be a key function, or a string of dot-chained attributes to use as sort keys. The reverse flag returns results in descending order.

Parameters:
  • predicates (callable or str) – Any positional arguments are predicates. If the predicate is a string, it denotes an attribute for each element, potentially with levels separated by a dot. If the predicate is a callable, it must return the value to sort by for each given element.

  • reverse (bool) – The sort is ascending by default, by setting reverse to True, the sort will be descending.

Returns:

The sorted collection.

Return type:

Collection

Examples

>>> import collections
>>> FooBar = collections.namedtuple("FooBar", ["foo", "bar"])
>>> X = collections.namedtuple("X", "x")
>>> c = Collection([FooBar(1, X("one")), FooBar(2, X("two")), FooBar(3, X("three"))])
>>> c.sorted("foo")
Collection([FooBar(foo=1, bar=X(x='one')), FooBar(foo=2, bar=X(x='two')), FooBar(foo=3, bar=X(x='three'))])
>>> c.sorted("bar.x")
Collection([FooBar(foo=1, bar=X(x='one')), FooBar(foo=3, bar=X(x='three')), FooBar(foo=2, bar=X(x='two'))])
property each

Any operations chained onto each (attribute access, item access, and calls) are applied to each item in the Collection.

Yields:

Any – The result of an item with all operations following each applied to it.

Notes

  • Add combine() at the end of the operations chain to combine the results into a list by default, or any container type passed into combine()

  • Use pipe(f, *args, **kwargs) to yield f(x, *args, **kwargs) for each item x yielded by the preceeding operations chain

Examples

>>> c = Collection(["one", "two", "three", "four"])
>>> for x in c.each.capitalize():
...     print(x)
One
Two
Three
Four
>>> c.each.capitalize()[:2]
'On'
'Tw'
'Th'
'Fo'
>>> c.each.capitalize().pipe(len)
3
3
5
4
>>> list(c.each.capitalize().pipe(len).combine(set))
[3, 4, 5]
class DeletionTaskStatus(*args, **kwargs)[source]

The asynchronous deletion task’s status

product_id

The id of the product for which this task is running.

Type:

str

status

The state of the task as explained in TaskState.

Type:

TaskState

start_datetime

The date and time at which the task started running.

Type:

datetime

duration_in_seconds

The duration of the task.

Type:

float

objects_deleted

The number of object (a combination of bands or images) that were deleted.

Type:

int

errors

In case the status is FAILED this will contain a list of errors that were encountered. In all other states this will not be set.

Type:

list

Methods:

reload()

Update the task information.

wait_for_completion([timeout])

Wait for the task to complete.

reload()

Update the task information.

Raises:

ClientError or ServerErrorSpurious exception that can occur during a network request.

wait_for_completion(timeout=None)

Wait for the task to complete.

Parameters:

timeout (int, optional) – If specified, will wait up to specified number of seconds and will raise a concurrent.futures.TimeoutError if the task has not completed.

Raises:

concurrent.futures.TimeoutError – If the specified timeout elapses and the task has not completed