edc-appointment


Nameedc-appointment JSON
Version 0.3.30 PyPI version JSON
download
home_pagehttps://github.com/clinicedc/edc-appointment
SummaryAppointment module for clinicedc/edc projects
upload_time2022-06-29 19:17:32
maintainer
docs_urlNone
authorErik van Widenfelt
requires_python>=3.9
licenseGPL license, see LICENSE
keywords django appointments data collection clinicedc clinical trials
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            |pypi| |actions| |codecov| |downloads|

edc-appointment
---------------

This module works closely with ``edc_visit_tracking`` and ``edc_visit_schedule``.

Subject data is collected on predefined timepoints. We describe these data collection timepoints in a ``visit_schedule`` as provided by ``edc-visit-schedule``. In ``edc-appointment`` timepoints are represented by appointments. ``edc-appointment`` provides classes for creating and managing appointments.

See also ``edc-visit-schedule``. 


AppointmentModelMixin
+++++++++++++++++++++

A model mixin for the Appointment model. Each project may have one appointment model. For example:

.. code-block:: python

    class Appointment(AppointmentModelMixin, RequiresConsentModelMixin, BaseUuidModel):
    
        class Meta(AppointmentModelMixin.Meta):
            consent_model = 'edc_example.subjectconsent'
            app_label = 'edc_example'


Appointment is a required foreignkey for the visit report
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

The ``Appointment`` model is a required foreignkey for the visit report. Be sure to set ``on_delete=PROTECT``.

.. code-block:: python

    class SubjectVisit(VisitModelMixin, OffstudyMixin, CreatesMetadataModelMixin,
                       RequiresConsentModelMixin, BaseUuidModel):
    
        appointment = models.OneToOneField(Appointment, on_delete=PROTECT)
    
        objects = VisitModelManager()
    
        class Meta(VisitModelMixin.Meta):
            consent_model = 'edc_example.subjectconsent'
            app_label = 'edc_example'


CreatesAppointmentsModelMixin
+++++++++++++++++++++++++++++

A model mixin for the model that triggers the creation of appointments when the model is saved. This is typically an enrollment model.

Adds the model field ``facility``. The value of field ``facility`` tells the ``CreateAppointmentsMixin`` to create appointments for the subject on dates that are available at the ``facility``.

.. code-block:: python

    class Enrollment(EnrollmentModelMixin, CreateAppointmentsMixin,
                     RequiresConsentModelMixin, BaseUuidModel):
    
        class Meta(EnrollmentModelMixin.Meta):
            visit_schedule_name = 'subject_visit_schedule.schedule1'
            consent_model = 'edc_example.subjectconsent'
            app_label = 'edc_example'

When ``Enrollment`` declared above is saved, one appointment will be created for the subject for each ``visit`` in schedule ``schedule1`` of visit_schedule ``subject_visit_schedule``. 

Note: the value for ``facility`` must be provided by the user, either through the form interface or programmatically. 


Customizing appointment scheduling by ``Facility``
++++++++++++++++++++++++++++++++++++++++++++++++++

see ``edc_facility``


Available Appointment Model Manager Methods
===========================================

The ``Appointment`` model is declared with ``AppointmentManager``. It has several useful methods. 


first_appointment() last_appointment()
++++++++++++++++++++++++++++++++++++++

Returns the first (or last) appointment. If just the ``subject_identifier`` is provided, the first appointment of the protocol for the subject is returned. To be more specific, provide ``{subject_identifier=subject_identifier, visit_schedule_name=visit_schedule_name}``.
To be even more specific,  ``{subject_identifier=subject_identifier, visit_schedule_name=visit_schedule_name, schedule_name=schedule_name}``.

The most common usage is to just provide these values with an appointment instance:

.. code-block:: python

    first_appointment = Appointment.objects.first_appointment(appointment=appointment)


next_appointment() previous_appointment()
+++++++++++++++++++++++++++++++++++++++++

The next and previous appointment are relative to the schedule and a visit_code within that schedule. If next is called on the last appointment in the sequence ``None`` is returned. If previous is called on the first appointment in the sequence ``None`` is returned.

For example, in a sequence of appointment 1000, 2000, 3000, 4000:

.. code-block:: python

    >>> appointment.visit_code
    1000
    >>> next_appointment = Appointment.objects.next_appointment(appointment=appointment)
    >>> next_appointment.visit_code
    2000


But you can also pass an appointment instance and pass the visit code:

.. code-block:: python

    >>> appointment.visit_code
    1000
    >>> next_appointment = Appointment.objects.next_appointment(
            appointment=appointment, visit_code=3000)
    >>> next_appointment.visit_code
    4000


If you ask for the next appointment from the last, ``None`` is returned:

.. code-block:: python

    >>> appointment.visit_code
    4000
    >>> next_appointment = Appointment.objects.next_appointment(
            appointment=appointment, visit_code=3000)
    >>> next_appointment.visit_code
    AttributeError: 'NoneType' object has no attribute 'visit_code'


The ``previous_appointment`` acts as expected:

.. code-block:: python

    >>> appointment.visit_code
    1000
    >>> previous_appointment = Appointment.objects.previous_appointment(appointment=appointment)
    >>> previous_appointment.visit_code
    AttributeError: 'NoneType' object has no attribute 'visit_code'


delete_for_subject_after_date()
+++++++++++++++++++++++++++++++

This method will delete all appointments for a subject after a given datetime. See also ``edc-offstudy``.

``Appointment`` is usually a foreignkey of a visit model. It's important when using this method to ensure that when declaring ``Appointment`` as a foreignkey you explicitly set ``on_delete=PROTECT``. If you don't, the deletion will cascade to other related instances -- and that's bad. 

.. code-block:: python

    appointment = models.OneToOneField(Appointment, on_delete=PROTECT)


.. |pypi| image:: https://img.shields.io/pypi/v/edc-appointment.svg
   :target: https://pypi.python.org/pypi/edc-appointment

.. |actions| image:: https://github.com/clinicedc/edc-appointment/workflows/build/badge.svg?branch=develop
  :target: https://github.com/clinicedc/edc-appointment/actions?query=workflow:build

.. |codecov| image:: https://codecov.io/gh/clinicedc/edc-appointment/branch/develop/graph/badge.svg
   :target: https://codecov.io/gh/clinicedc/edc-appointment

.. |downloads| image:: https://pepy.tech/badge/edc-appointment
   :target: https://pepy.tech/project/edc-appointment

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/clinicedc/edc-appointment",
    "name": "edc-appointment",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "",
    "keywords": "django appointments data collection clinicedc clinical trials",
    "author": "Erik van Widenfelt",
    "author_email": "ew2789@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/8f/05/1feea2c1e2f00f9aa90a7522fac8a47d79e45c29a464852de53c72337558/edc-appointment-0.3.30.tar.gz",
    "platform": null,
    "description": "|pypi| |actions| |codecov| |downloads|\n\nedc-appointment\n---------------\n\nThis module works closely with ``edc_visit_tracking`` and ``edc_visit_schedule``.\n\nSubject data is collected on predefined timepoints. We describe these data collection timepoints in a ``visit_schedule`` as provided by ``edc-visit-schedule``. In ``edc-appointment`` timepoints are represented by appointments. ``edc-appointment`` provides classes for creating and managing appointments.\n\nSee also ``edc-visit-schedule``. \n\n\nAppointmentModelMixin\n+++++++++++++++++++++\n\nA model mixin for the Appointment model. Each project may have one appointment model. For example:\n\n.. code-block:: python\n\n    class Appointment(AppointmentModelMixin, RequiresConsentModelMixin, BaseUuidModel):\n    \n        class Meta(AppointmentModelMixin.Meta):\n            consent_model = 'edc_example.subjectconsent'\n            app_label = 'edc_example'\n\n\nAppointment is a required foreignkey for the visit report\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nThe ``Appointment`` model is a required foreignkey for the visit report. Be sure to set ``on_delete=PROTECT``.\n\n.. code-block:: python\n\n    class SubjectVisit(VisitModelMixin, OffstudyMixin, CreatesMetadataModelMixin,\n                       RequiresConsentModelMixin, BaseUuidModel):\n    \n        appointment = models.OneToOneField(Appointment, on_delete=PROTECT)\n    \n        objects = VisitModelManager()\n    \n        class Meta(VisitModelMixin.Meta):\n            consent_model = 'edc_example.subjectconsent'\n            app_label = 'edc_example'\n\n\nCreatesAppointmentsModelMixin\n+++++++++++++++++++++++++++++\n\nA model mixin for the model that triggers the creation of appointments when the model is saved. This is typically an enrollment model.\n\nAdds the model field ``facility``. The value of field ``facility`` tells the ``CreateAppointmentsMixin`` to create appointments for the subject on dates that are available at the ``facility``.\n\n.. code-block:: python\n\n    class Enrollment(EnrollmentModelMixin, CreateAppointmentsMixin,\n                     RequiresConsentModelMixin, BaseUuidModel):\n    \n        class Meta(EnrollmentModelMixin.Meta):\n            visit_schedule_name = 'subject_visit_schedule.schedule1'\n            consent_model = 'edc_example.subjectconsent'\n            app_label = 'edc_example'\n\nWhen ``Enrollment`` declared above is saved, one appointment will be created for the subject for each ``visit`` in schedule ``schedule1`` of visit_schedule ``subject_visit_schedule``. \n\nNote: the value for ``facility`` must be provided by the user, either through the form interface or programmatically. \n\n\nCustomizing appointment scheduling by ``Facility``\n++++++++++++++++++++++++++++++++++++++++++++++++++\n\nsee ``edc_facility``\n\n\nAvailable Appointment Model Manager Methods\n===========================================\n\nThe ``Appointment`` model is declared with ``AppointmentManager``. It has several useful methods. \n\n\nfirst_appointment() last_appointment()\n++++++++++++++++++++++++++++++++++++++\n\nReturns the first (or last) appointment. If just the ``subject_identifier`` is provided, the first appointment of the protocol for the subject is returned. To be more specific, provide ``{subject_identifier=subject_identifier, visit_schedule_name=visit_schedule_name}``.\nTo be even more specific,  ``{subject_identifier=subject_identifier, visit_schedule_name=visit_schedule_name, schedule_name=schedule_name}``.\n\nThe most common usage is to just provide these values with an appointment instance:\n\n.. code-block:: python\n\n    first_appointment = Appointment.objects.first_appointment(appointment=appointment)\n\n\nnext_appointment() previous_appointment()\n+++++++++++++++++++++++++++++++++++++++++\n\nThe next and previous appointment are relative to the schedule and a visit_code within that schedule. If next is called on the last appointment in the sequence ``None`` is returned. If previous is called on the first appointment in the sequence ``None`` is returned.\n\nFor example, in a sequence of appointment 1000, 2000, 3000, 4000:\n\n.. code-block:: python\n\n    >>> appointment.visit_code\n    1000\n    >>> next_appointment = Appointment.objects.next_appointment(appointment=appointment)\n    >>> next_appointment.visit_code\n    2000\n\n\nBut you can also pass an appointment instance and pass the visit code:\n\n.. code-block:: python\n\n    >>> appointment.visit_code\n    1000\n    >>> next_appointment = Appointment.objects.next_appointment(\n            appointment=appointment, visit_code=3000)\n    >>> next_appointment.visit_code\n    4000\n\n\nIf you ask for the next appointment from the last, ``None`` is returned:\n\n.. code-block:: python\n\n    >>> appointment.visit_code\n    4000\n    >>> next_appointment = Appointment.objects.next_appointment(\n            appointment=appointment, visit_code=3000)\n    >>> next_appointment.visit_code\n    AttributeError: 'NoneType' object has no attribute 'visit_code'\n\n\nThe ``previous_appointment`` acts as expected:\n\n.. code-block:: python\n\n    >>> appointment.visit_code\n    1000\n    >>> previous_appointment = Appointment.objects.previous_appointment(appointment=appointment)\n    >>> previous_appointment.visit_code\n    AttributeError: 'NoneType' object has no attribute 'visit_code'\n\n\ndelete_for_subject_after_date()\n+++++++++++++++++++++++++++++++\n\nThis method will delete all appointments for a subject after a given datetime. See also ``edc-offstudy``.\n\n``Appointment`` is usually a foreignkey of a visit model. It's important when using this method to ensure that when declaring ``Appointment`` as a foreignkey you explicitly set ``on_delete=PROTECT``. If you don't, the deletion will cascade to other related instances -- and that's bad. \n\n.. code-block:: python\n\n    appointment = models.OneToOneField(Appointment, on_delete=PROTECT)\n\n\n.. |pypi| image:: https://img.shields.io/pypi/v/edc-appointment.svg\n   :target: https://pypi.python.org/pypi/edc-appointment\n\n.. |actions| image:: https://github.com/clinicedc/edc-appointment/workflows/build/badge.svg?branch=develop\n  :target: https://github.com/clinicedc/edc-appointment/actions?query=workflow:build\n\n.. |codecov| image:: https://codecov.io/gh/clinicedc/edc-appointment/branch/develop/graph/badge.svg\n   :target: https://codecov.io/gh/clinicedc/edc-appointment\n\n.. |downloads| image:: https://pepy.tech/badge/edc-appointment\n   :target: https://pepy.tech/project/edc-appointment\n",
    "bugtrack_url": null,
    "license": "GPL license, see LICENSE",
    "summary": "Appointment module for clinicedc/edc projects",
    "version": "0.3.30",
    "split_keywords": [
        "django",
        "appointments",
        "data",
        "collection",
        "clinicedc",
        "clinical",
        "trials"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "bc6e835827128ffa82713b57a17db115",
                "sha256": "9f79700bc4ba76402f6ccb45136666ef273f549b925c2450478e973314ee8ecc"
            },
            "downloads": -1,
            "filename": "edc_appointment-0.3.30-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bc6e835827128ffa82713b57a17db115",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 102332,
            "upload_time": "2022-06-29T19:17:30",
            "upload_time_iso_8601": "2022-06-29T19:17:30.234674Z",
            "url": "https://files.pythonhosted.org/packages/a2/44/36ff825c38b2a86d4e6ef9c3715550ba9faa9b9b8e8249445828ed852f2c/edc_appointment-0.3.30-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "2aded0953cfef03df614ca3632ee8af1",
                "sha256": "393ffa4be0efb3003ed5bfc9a871034056bab05ae2a7c9bd34bc68a634d9cc7c"
            },
            "downloads": -1,
            "filename": "edc-appointment-0.3.30.tar.gz",
            "has_sig": false,
            "md5_digest": "2aded0953cfef03df614ca3632ee8af1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 70071,
            "upload_time": "2022-06-29T19:17:32",
            "upload_time_iso_8601": "2022-06-29T19:17:32.935504Z",
            "url": "https://files.pythonhosted.org/packages/8f/05/1feea2c1e2f00f9aa90a7522fac8a47d79e45c29a464852de53c72337558/edc-appointment-0.3.30.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-06-29 19:17:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "clinicedc",
    "github_project": "edc-appointment",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "requirements": [],
    "lcname": "edc-appointment"
}
        
Elapsed time: 0.54769s