Skip to main content

pypi actions codecov downloads clinicedc

edc-visit-tracking

Track study participant visit reports.

Declaring a visit model

A visit_model is declared using the model mixin VisitModelMixin. Normally, a visit_model will be declared with additional model mixins, but VisitModelMixin must be there.

class SubjectVisit(VisitModelMixin, BaseUuidModel):
    ...

Also, ensure the Meta class attributes of VisitModelMixin are inherited. These include required constraints and ordering.

class SubjectVisit(VisitModelMixin, BaseUuidModel):

    ...

    class Meta(VisitModelMixin.Meta):
        pass

Among other features, VisitModelMixin adds a OneToOneField foreign key to the visit_model that points to edc_appointment.Appointment.

Important: A visit model is a special model in the EDC. A model declared with the model mixin, VisitModelMixin, is the definition of a visit model. CRFs and Requisitions have a foreign key pointing to a visit model. A number of methods on CRFs and Requisitions detect their visit model foreign key name, model class and value by looking for the FK declared with VisitModelMixin.

For a subject that requires ICF the visit model would use the RequiresConsentModelMixin:

class SubjectVisit(
    VisitModelMixin,
    RequiresConsentFieldsModelMixin,
    BaseUuidModel,
):

    class Meta(VisitModelMixin.Meta, BaseUuidModel.Meta):
        pass

If the subject does not require ICF, such as an infant, don’t include the RequiresConsentModelMixin:

class InfantVisit(
    VisitModelMixin,
    BaseUuidModel
):

    class Meta(VisitModelMixin.Meta, BaseUuidModel.Meta):
        pass

A more complete declaration will include model mixins from other libraries. For example:

from edc_consent.model_mixins import RequiresConsentFieldsModelMixin
from edc_metadata.model_mixins.creates import CreatesMetadataModelMixin
from edc_model.models import BaseUuidModel
from edc_offstudy.model_mixins import OffstudyVisitModelMixin
from edc_sites.managers import CurrentSiteManager
from edc_sites.model_mixins import SiteModelMixin
from edc_visit_tracking.managers import VisitModelManager
from edc_visit_tracking.model_mixins import VisitModelMixin

class SubjectVisit(
    SiteModelMixin,
    VisitModelMixin,
    CreatesMetadataModelMixin,
    RequiresConsentFieldsModelMixin,
    OffstudyNonCrfModelMixin,
    BaseUuidModel,
):

    objects = VisitModelManager()

    on_site = CurrentSiteManager()

    history = edc_models.HistoricalRecords()

class Meta(VisitModelMixin.Meta, BaseUuidModel.Meta):
    pass

Declaring a CRF

The CrfModelMixin is required for all CRF models. CRF models have a OneToOneField key to a visit model.

class CrfOne(CrfModelMixin, OffstudyCrfModelMixin, RequiresConsentModelMixin,
             UpdatesCrfMetadataModelMixin, BaseUuidModel):

    subject_visit = models.OneToOneField(SubjectVisit)

    f1 = models.CharField(max_length=10, default='erik')

    vl = models.CharField(max_length=10, default=NO)

    rdb = models.CharField(max_length=10, default=NO)

    class Meta:
        consent_model = 'myapp.subjectconsent'  # for RequiresConsentModelMixin

Declaring forms:

The VisitFormMixin includes a number of common validations in the clean method:

class SubjectVisitForm(VisitFormMixin, FormValidatorMixin, forms.ModelForm):

    form_validator_cls = VisitFormValidator

    class Meta:
        model = SubjectVisit

PreviousVisitModelMixin

The PreviousVisitModelMixin ensures that visits are entered in sequence. It is included with the VisitModelMixin.

VisitTrackingModelFormMixin

see DEFAULT_REPORT_DATETIME_ALLOWANCE

Missed Visit Report

A detail report should be submitted for scheduled visits that are missed. By selecting the reason missed visit on SubjectVisit, only the missed visit CRF will be required for the timepoint. All other CRFs and requisitions will be excluded.

Unscheduled visits cannot be missed. (To change this behaviour see settings attrubute EDC_VISIT_TRACKING_ALLOW_MISSED_UNSCHEDULED)

The model mixin SubjectVisitMissedModelMixin provides the basic features of a SubjectVisitMissed model.

In your subject app declare:

from django.db.models import PROTECT
from edc_crf.model_mixins import CrfWithActionModelMixin
from edc_model import models as edc_models
from edc_visit_tracking.model_mixins import SubjectVisitMissedModelMixin

class SubjectVisitMissed(SubjectVisitMissedModelMixin, edc_models.BaseUuidModel):

    missed_reasons = models.ManyToManyField(
        SubjectVisitMissedReasons, blank=True, related_name="+"
    )

    class Meta(CrfWithActionModelMixin.Meta, edc_models.BaseUuidModel.Meta):
        verbose_name = "Missed Visit Report"
        verbose_name_plural = "Missed Visit Report"

In your list model app, e.g. meta_lists, declare the list model:

class SubjectVisitMissedReasons(ListModelMixin):
    class Meta(ListModelMixin.Meta):
        verbose_name = "Subject Missed Visit Reasons"
        verbose_name_plural = "Subject Missed Visit Reasons"

… and update the list_data dictionary, for example:

list_data = {
# ...
"meta_lists.subjectvisitmissedreasons": [
    ("forgot", "Forgot / Can’t remember being told about appointment"),
    ("family_emergency", "Family emergency (e.g. funeral) and was away"),
    ("travelling", "Away travelling/visiting"),
    ("working_schooling", "Away working/schooling"),
    ("too_sick", "Too sick or weak to come to the centre"),
    ("lack_of_transport", "Transportation difficulty"),
    (OTHER, "Other reason (specify below)",),
],
# ...
}

Window period

By default, the visit report_datetime is validated to stay within the same window period as the appointment. This may be too restrictive in some cases.

To bypass this override `validate_visit_datetime_in_window_period` in the `VisitFormValidator`

from edc_visit_tracking.form_validators import VisitFormValidator as BaseVisitFormValidator

class VisitFormValidator(BaseVisitFormValidator):

    ...

    def validate_visit_datetime_in_window_period():
        pass

    ...

Be sure that your appointment form validator is enforcing window periods before bypassing this check.

See also edc_appointment.

Metadata

Release files for edc-visit-tracking 1.0.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for edc-visit-tracking 1.0.6
File Size Uploaded
edc_visit_tracking-1.0.6.tar.gz 48.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for edc-visit-tracking 1.0.6
File Interpreter ABI Platform
edc_visit_tracking-1.0.6-py3-none-any.whl Python 3 none any Details

Total release size: 128.9 kB

Release files / edc_visit_tracking-1.0.6.tar.gz

Download URL edc_visit_tracking-1.0.6.tar.gz
Size 48.6 kB
Tags Source
SHA-256 checksum
How to use checksums
d62c875b17a9c7c28187f659908c952e2a97be35ea624e3ba25f22c52a59d1c3
BLAKE2b-256 checksum
How to use checksums
cc554d82c4295a6ab45089668169c9f3a17fc3873459335ff9225ad749b32ddf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.8.4

Release files / edc_visit_tracking-1.0.6-py3-none-any.whl

Download URL edc_visit_tracking-1.0.6-py3-none-any.whl
Size 80.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
21a14ccd5300a9c1eba4bc8f589a3e8c66b0c360ad3fe650294bc37ddbc41185
BLAKE2b-256 checksum
How to use checksums
369b32440961d8e4229bc93855e437408b5262e7ce0b2ed932753ef3de4e5bd3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.8.4

Release history Release notifications | RSS feed

This release

1.0.6 This release

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.94

2 release files

0.3.93

2 release files

0.3.92

2 release files

0.3.91

2 release files

0.3.90

2 release files

0.3.86

2 release files

0.3.85

2 release files

0.3.84

2 release files

0.3.81

2 release files

0.3.80

2 release files

0.3.79

2 release files

0.3.77

2 release files

0.3.76

2 release files

0.3.74

2 release files

0.3.73

2 release files

0.3.71

2 release files

0.3.70

2 release files

0.3.69

2 release files

0.3.65

2 release files

0.3.64

2 release files

0.3.63

2 release files

0.3.62

2 release files

0.3.61

2 release files

0.3.60

2 release files

0.3.59

2 release files

0.3.58

2 release files

0.3.57

2 release files

0.3.54

2 release files

0.3.53

2 release files

0.3.51

2 release files

0.3.50

2 release files

0.3.47

2 release files

0.3.46

2 release files

0.3.45

2 release files

0.3.44

2 release files

0.3.43

2 release files

0.3.42

2 release files

0.3.40

2 release files

0.3.39

2 release files

0.3.38

2 release files

0.3.37

2 release files

0.3.36

2 release files

0.3.35

2 release files

0.3.34

2 release files

0.3.31

2 release files

0.3.30

2 release files

0.3.29

2 release files

0.3.28

2 release files

0.3.27

2 release files

0.3.26

2 release files

0.3.22

2 release files

0.3.21

2 release files

0.3.20

2 release files

0.3.19

1 release file

0.3.18

1 release file

0.3.17

1 release file

0.3.16

1 release file

0.3.15

1 release file

0.3.14

1 release file

0.3.13

1 release file

0.3.12

1 release file

0.3.11

1 release file

0.3.10

1 release file

0.3.9

1 release file

0.3.8

1 release file

0.3.7

1 release file

0.3.6

1 release file

0.3.5

1 release file

0.3.4

1 release file

0.3.3

1 release file

0.3.2

1 release file

0.3.1

1 release file

0.3.0

1 release file

0.2.63

1 release file

0.2.62

1 release file

0.2.61

1 release file

0.2.60

1 release file

0.2.59

1 release file

0.2.58

1 release file

0.2.57

1 release file

0.2.56

1 release file

0.2.55

1 release file

0.2.54

1 release file

0.2.53

1 release file

0.2.52

1 release file

0.2.51

1 release file

0.2.50

1 release file

0.2.49

1 release file

0.2.48

1 release file

0.2.47

1 release file

0.2.46

1 release file

0.2.45

1 release file

0.2.44

1 release file

0.2.43

1 release file

0.2.42

1 release file

0.2.41

1 release file

0.2.40

1 release file

0.2.39

1 release file

0.2.38

1 release file

0.2.37

1 release file

0.2.36

1 release file

0.2.35

1 release file

0.2.34

1 release file

0.2.33

1 release file

0.2.32

1 release file

0.2.30

1 release file

0.2.29

1 release file

0.2.28

1 release file

0.2.27

1 release file

0.2.26

1 release file

0.2.25

1 release file

0.2.24

1 release file

0.2.23

1 release file

0.2.22

1 release file

0.2.21

1 release file

0.2.19

2 release files

0.2.18

2 release files

0.2.17

2 release files

0.2.15

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.10

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page