
.. _FetchAttrs:

Loaded attributes and default sorting management
````````````````````````````````````````````````

* The class attribute `fetch_attrs` allows to define in an entity class a list
  of names of attributes or relations that should be automatically loaded when
  entities of this type are fetched from the database. In the case of relations,
  we are limited to *subject of cardinality `?` or `1`* relations.

* The class method `fetch_order(attr, var)` expects an attribute (or relation)
  name as a parameter and a variable name, and it should return a string
  to use in the requirement `ORDERBY` of an RQL query to automatically
  sort the list of entities of such type according to this attribute, or
  `None` if we do not want to sort on the attribute given in the parameter.
  By default, the entities are sorted according to their creation date.

* The class method `fetch_unrelated_order(attr, var)` is similar to
  the method `fetch_order` except that it is essentially used to
  control the sorting of drop-down lists enabling relations creation
  in the editing view of an entity. The default implementation uses
  the modification date. Here's how to adapt it for one entity (sort
  on the name attribute): ::

   class MyEntity(AnyEntity):
       __regid__ = 'MyEntity'
       fetch_attrs = ('modification_date', 'name')

       @classmethod
       def fetch_unrelated_order(cls, attr, var):
           if attr == 'name':
              return '%s ASC' % var
           return None


The function `fetch_config(fetchattrs, mainattr=None)` simplifies the
definition of the attributes to load and the sorting by returning a
list of attributes to pre-load (considering automatically the
attributes of `AnyEntity`) and a sorting function based on the main
attribute (the second parameter if specified, otherwise the first
attribute from the list `fetchattrs`). This function is defined in
`cubicweb.entities`.

For example: ::

  class Transition(AnyEntity):
    """..."""
    __regid__ = 'Transition'
    fetch_attrs, fetch_order = fetch_config(['name'])

Indicates that for the entity type "Transition", you have to pre-load
the attribute `name` and sort by default on this attribute.
