Skip to main content

Get info on a data collection device for clinicedc/edc projects

Project description

pypi actions coverage

edc-device

edc-device provides device roles unique device IDs for hosts and clients where the hostname may not be reliable. Hosts can be group as servers, clients, node_servers and some of their functionality limited according to this role.

A unique device ID is used to seed unique subject and sample identifiers. Uniqueness is evaluated during deployment.

Device information is set in and read from edc_device.apps.AppConfig.

You should subclass into your projects apps.py like this, for example:

from edc_device.apps import AppConfig as EdcDeviceAppConfigParent

class EdcDeviceAppConfig(EdcDeviceAppConfigParent):
    device_id = '32'
    device_role = CLIENT
    device_permissions = DevicePermissions(
        plot_add, plot_change, ...)

and then in your settings:

INSTALLED_APPS = [
    ...
    my_app.apps.EdcDeviceAppConfig,
    myapp.apps.AppConfig',
]

Include in your urls.py:

urlpatterns = [
    ...
    path('edc_device/', include('edc_device.urls')),
    ...
]

To get to the Edc Device home page, reverse the url like this:

reverse('edc_device:home_url')

Usage

A client might look like this:

class EdcDeviceAppConfig(EdcDeviceAppConfigParent):
    device_id = '18'
    node_server_id_list = [97, 98, 99]
    middleman_id_list = [95, 96]

>>> from django.apps import apps as django_apps
>>> app_config = django_apps.get_app_config('edc_device')
>>> app_config.device_id
'18'
>>> app_config.is_client
True
>>> app_config.device_role
'Client'

A node server server might look like this:

class EdcDeviceAppConfig(EdcDeviceAppConfigParent):
    device_id = '98'
    node_server_id_list = [97, 98, 99]
    middleman_id_list = [95, 96]

>>> from django.apps import apps as django_apps
>>> app_config = django_apps.get_app_config('edc_device')
>>> app_config.device_id
'98'
>>> app_config.is_node_server
True
>>> app_config.device_role
'NodeServer'

A middleman server might look like this:

class EdcDeviceAppConfig(EdcDeviceAppConfigParent):
    device_id = '95'
    node_server_id_list = [97, 98, 99]
    middleman_id_list = [95, 96]

>>> from django.apps import apps as django_apps
>>> app_config = django_apps.get_app_config('edc_device')
>>> app_config.device_id
'95'
>>> app_config.is_middleman
True
>>> app_config.device_role
'Middleman'

The central server might look like this:

class EdcDeviceAppConfig(EdcDeviceAppConfigParent):
    device_id = '99'
    node_server_id_list = [97, 98, 99]
    middleman_id_list = [95, 96]

>>> from django.apps import apps as django_apps
>>> app_config = django_apps.get_app_config('edc_device')
>>> app_config.device_id
'99'
>>> app_config.is_middleman
True
>>> app_config.device_role
'CentralServer'

See also django-collect-offline.

Device Permissions by Model

You can use the device role, or the device ID, to limit ADD/CHANGE permissions on a model.

edc-device AppConfig maintains a collection of DeviceAddPermission and DeviceChangePermission instances that are inspected in the save method of a model using the DeviceModelMixin.

To declare a DeviceAddPermission object:

test_model_add = DeviceAddPermission(
    model='my_app.mymodel, device_roles=[NODE_SERVER, CENTRAL_SERVER])

To declare a DeviceChangePermission object:

test_model_change = DeviceChangePermission(
    model='my_app.mymodel, device_roles=[CLIENT])

This means that if app_config.device_role is anything other than NODE_SERVER or CENTRAL_SERVER, the save method will raise a DevicePermissionsAddError.

To register the instances with edc_device.apps.AppConfig.device_permissions:

device_permissions = DevicePermissions(test_model_add, test_model_change)

This means that if app_config.device_role is anything other than CLIENT, the save method will raise a DevicePermissionsChangeError.

On boot up you should see:

Loading Edc Device ...
  * device id is '10'.
  * device role is 'Client'.
  * device permissions exist for:
    - edc_device.testmodel ADD NodeServer,CentralServer
    - edc_device.testmodel CHANGE Client
Done loading Edc Device.

Models declared with the EdcDeviceModelMixin check the device permissions collection on save. Note the model mixin is already declared with BaseUuidModel.

from edc_model.models import BaseUuidModel

class TestModel(BaseUuidModel):
    pass

Declaring device permissions directly on model Meta class:

You can declare device permissions on Meta.device_permissions in the same way as above.

[...]
class Meta(DeviceModelMixin.Meta):
    device_permissions = DevicePermissions(...)

Both Meta and AppConfig device permissions will be called, where the Meta class object will be called first.

Disable device permissions by model instance:

You can disable device permissions per model instance by setting check_device_permissions to False

Customizing Device Permissions

The ADD and CHANGE device permission objects by default inspect the model’s id. If obj.id is None, it as an ADD model operation; If obj.id is not None, it is a CHANGE model operation.

You can change this by overriding the model_operation method. The model_operation must return None or some value, such as self.label.

For example:

# default for DeviceAddPermission
label = 'ADD'

def model_operation(self, model_obj=None, **kwargs):
    if not model_obj.id:
        return self.label
    return None

# overridden
def model_operation(self, model_obj=None, **kwargs):
    """Return ADD if both id and plot identifier are None.
    """
    if not model_obj.id and not obj.plot_identifier:
        return self.label
    return None

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edc-device-0.3.15.tar.gz (29.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

edc_device-0.3.15-py3-none-any.whl (28.3 kB view details)

Uploaded Python 3

File details

Details for the file edc-device-0.3.15.tar.gz.

File metadata

  • Download URL: edc-device-0.3.15.tar.gz
  • Upload date:
  • Size: 29.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for edc-device-0.3.15.tar.gz
Algorithm Hash digest
SHA256 a720063380b00acefc69c20d768f3cb1b24d29a1faaf746dbd50ddacb0975aa7
MD5 f5bd8950416cd914d320cd5b51d7f298
BLAKE2b-256 eac4b7eda17f039b7cc0e6943d070bec7fecaf82345bf24056247f88bc1d8d40

See more details on using hashes here.

File details

Details for the file edc_device-0.3.15-py3-none-any.whl.

File metadata

  • Download URL: edc_device-0.3.15-py3-none-any.whl
  • Upload date:
  • Size: 28.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for edc_device-0.3.15-py3-none-any.whl
Algorithm Hash digest
SHA256 9a36a1c41fcf6cf4045819438e0c7a8f436c48a2db7bc3e215ae9d1152df30a0
MD5 2f7af510733db750c42df25d48524df2
BLAKE2b-256 8d242f51e1979b1f6650c7fbc61ef08409d0130f50565dfe35a8c9b231259c78

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page