Sodar Cache Usage
Usage instructions for the sodarcache app are detailed in this document.
Backend API for Data Caching
The Django backend API for caching data is located in sodarcache.api.
Details of the API can be found in Sodarcache Django API Documentation.
Invoking the API
The API is accessed through a backend plugin. This means you can write calls to the API without any hard-coded imports and your code should work even if the sodarcache app has not been installed on the site.
Initialize the API using projectroles.plugins.get_backend_api() as follows:
from projectroles.plugins import get_backend_api
cache_backend = get_backend_api('sodar_cache')
Setting and Getting Cache Items
Once you can access the sodarcache backend, you should set up the
update_cache() function in the ProjectAppPlugin of the app with which
you want to cache or aggregate data. The update process can be limited by two
parameters: cached item name and project. If neither are specified, the function
should update cached data for all known items within all projects.
def update_cache(self, name=None, project=None):
"""
Update cached data for this app, limitable to item ID and/or project.
:param project: Project object to limit update to (optional)
:param name: Item name to limit update to (string, optional)
"""
# TODO: Implement this in your app plugin
return None
Updating a specific cache item within the update_cache() function (or
elsewhere) should be done using sodarcache.api.set_cache_item(). A minimal
example is as follows:
cache_item = cache_backend.set_cache_item(
project=project, # Project object
app_name=APP_NAME, # Name of the current app
user=request.user, # The user triggering the cache update
name='some_item', # Cached item ID
data_type='json', # Data type ("json" currently supported)
data={'key': 'val'}, # The actual data that should be cached
)
Note
The item ID in the name argument is not unique, but it is expected to
be unique together with the project and app_name arguments.
Retrieve items with get_cache_item() or just check the
time the item was last updated with get_update_time() like
this:
cache_backend.get_cache_item(
app_name='yourapp',
name='some_item',
project=project,
data_type='json'
) # Returns a JsonCacheItem
cache_backend.get_update_time(
app_name='yourapp',
name='some_item',
project=project
)
It is also possible to retrieve a Queryset with all cached items for a specific
project with get_project_cache().
cache_backend.get_project_cache(
project=project, # Project object
data_type='json' # must be 'json' for JsonCacheItem
)
Management Commands
To create or update the data cache for all apps and projects, you can use a management command.
$ ./manage.py synccache
To limit the sync to a specific project, you can provide the -p or
--project argument with the project UUID.
$ ./manage.py synccache -p e9701604-4ccc-426c-a67c-864c15aff6e2
Similarly, there is a command to delete all cached data:
$ ./manage.py deletecache