{ "info": { "author": "Erik van Widenfelt", "author_email": "ew2789@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "|pypi| |travis| |codecov| |downloads|\n\nedc-timepoint\n-------------\n\nLock a \"timepoint\" from further editing once data is cleaned and reviewed.\n\nWith module ``edc_timepoint`` a data manager or supervisor is able to flag a model instance, that represents a timepoint, as closed to further edit. A good candidate for a \"timepoint\" model is one that is used to cover other data collection, such as an `edc_appointment.Appointment`. When the appointment status is set to something like 'complete' the timepoint status is set to ``closed`` and no further edits are allowed for data covered by that appointment. \n\n\nConfiguring the Timepoint Model\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSelect a model that represent a timepoint. The model should at least have a `datetime` field and a `status` field. For example `Appointment`:\n\n\n.. code-block:: python\n\n class Appointment(TimepointModelMixin, BaseUuidModel):\n\n appt_datetime = models.DateTimeField(\n verbose_name='Appointment date and time')\n\n appt_status = models.CharField(\n verbose_name='Status',\n choices=APPT_STATUS,\n max_length=25,\n default='NEW')\n\nThe ``TimepointModelMixin`` adds fields and methods prefixed as ``timepoint_``. There is also a signal that is loaded in the ``AppConfig.ready`` that resets the timepoint attributes should ``Appointment.appt_status`` change from ``DONE``.\n\nOnly field ``timepoint_status`` is meant to be edited by the user. The other ``timepoint_`` are managed automatically.\n\nIn your projects ``apps.py`` subclass ``edc_timepoint.apps.AppConfig`` and declare ``Appointment`` as a timepoint model by creating a ``Timepoint`` instance and appending it to ``AppConfig.timepoints``:\n\n.. code-block:: python\n\n from django.apps import AppConfig as DjangoAppConfig\n\n from edc_timepoint.apps import AppConfig as EdcTimepointAppConfigParent\n from edc_timepoint.timepoint import Timepoint\n\n\n class AppConfig(DjangoAppConfig):\n name = 'example'\n\n class EdcTimepointAppConfig(EdcTimepointAppConfigParent):\n timepoints = TimepointCollection(\n timepoints=[Timepoint(\n model='example.appointment',\n datetime_field='appt_datetime',\n status_field='appt_status',\n closed_status='DONE')])\n\nThe user updates the ``Appointment`` normally closing it when the appointment is done. Then a data manager or supervisor can close the ``Appointment`` to further edit once the data has been reviewed.\n\nTo close the ``Appointment`` to further edit the code needs to call the ``timepoint_close_timepoint`` method:\n\n.. code-block:: python\n\n appointment = Appointment.objects.create(**options)\n appointment.appt_status = 'DONE'\n appointment.timepoint_close_timepoint()\n\nIf the ``appointment.appt_status`` is not ``DONE`` when ``timepoint_close_timepoint`` is called, a ``TimepointError`` is raised.\n\nIf the appointment is successfully closed to further edit, any attempts to call ``appointment.save()`` will raise a ``TimepointError``.\n\nThe ``Appointment`` may be re-opened for edit by calling method ``timepoint_open_timepoint``.\n\nConfiguring others to use the Timepoint Model\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nContinuing with the example above where ``Appointment`` is the timepoint model.\n\nTo prevent further edits to models related to ``Appointment``, configure the model with the ``TimepointLookupModelMixin`` and the ``TimepointLookup`` class. These models will refer to the timepoint model on ``save``.\n\nFor example:\n\n.. code-block:: python\n\n class VisitTimepointLookup(TimepointLookup):\n timepoint_related_model_lookup = 'appointment'\n\n class VisitModel(TimepointLookupModelMixin, BaseUuidModel):\n\n timepoint_lookup_cls = VisitTimepointLookup\n\n appointment = models.ForeignKey(Appointment)\n\n report_datetime = models.DateTimeField(\n default=timezone.now)\n\nIf the timepoint model's ``timepoint_status`` is ``closed``, any attempt to create or modify ``VisitModel`` will raise a ``TimepointClosed`` exception. \n\n\n\n.. |pypi| image:: https://img.shields.io/pypi/v/edc-timepoint.svg\n :target: https://pypi.python.org/pypi/edc-timepoint\n\n.. |travis| image:: https://travis-ci.org/clinicedc/edc-timepoint.svg?branch=develop\n :target: https://travis-ci.org/clinicedc/edc-timepoint\n\n.. |codecov| image:: https://codecov.io/gh/clinicedc/edc-timepoint/branch/develop/graph/badge.svg\n :target: https://codecov.io/gh/clinicedc/edc-timepoint\n\n.. |downloads| image:: https://pepy.tech/badge/edc-timepoint\n :target: https://pepy.tech/project/edc-timepoint\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/clinicedc/edc-timepoint", "keywords": "django timepoint research protocol EDC", "license": "GPL license, see LICENSE", "maintainer": "", "maintainer_email": "", "name": "edc-timepoint", "package_url": "https://pypi.org/project/edc-timepoint/", "platform": "", "project_url": "https://pypi.org/project/edc-timepoint/", "project_urls": { "Homepage": "https://github.com/clinicedc/edc-timepoint" }, "release_url": "https://pypi.org/project/edc-timepoint/0.1.13/", "requires_dist": [ "edc-appointment" ], "requires_python": ">=3.7", "summary": "Lock a timepoint from further editing once data is cleaned and reviewed.", "version": "0.1.13" }, "last_serial": 5120802, "releases": { "0.1.10": [ { "comment_text": "", "digests": { "md5": "0908065011450875387d25ecad46dcdb", "sha256": "b851be6dee4030388d6f04eb4a1da5a9114e9f217adec8c65425b03c73a6f9ad" }, "downloads": -1, "filename": "edc_timepoint-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "0908065011450875387d25ecad46dcdb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 28666, "upload_time": "2019-03-06T04:10:28", "url": "https://files.pythonhosted.org/packages/88/7a/3e8517dbdc0d6d691a843e7c927cdc3bf94217780838ec41c132eebd12f2/edc_timepoint-0.1.10-py3-none-any.whl" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "485a74ba3e553ecad6fd137548167ad5", "sha256": "cce3e894325e1cd13bf5caf21cab758eb4e5be8f58232ecdeb09d4569a3d5d26" }, "downloads": -1, "filename": "edc_timepoint-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "485a74ba3e553ecad6fd137548167ad5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 28626, "upload_time": "2019-03-25T23:28:46", "url": "https://files.pythonhosted.org/packages/c1/52/dd108e3e1748547e8919237145f50c3082546185cf4c84fc95bf1c0f2475/edc_timepoint-0.1.11-py3-none-any.whl" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "c573d04ad6767395c03697e9b9b8840c", "sha256": "7f0f567e5657433d897af3cba210d6465a8e96760ba1aff424d1c3a6e1b276b3" }, "downloads": -1, "filename": "edc_timepoint-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "c573d04ad6767395c03697e9b9b8840c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 27785, "upload_time": "2019-03-30T04:22:09", "url": "https://files.pythonhosted.org/packages/b2/51/acc4b70405285c346e09f31020aeb3c869826a062f6a5de584692e358ada/edc_timepoint-0.1.12-py3-none-any.whl" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "6e0887b06bc11dd74a32394563cce17b", "sha256": "ed75ea7daa67af62ab9c00c23114093f71959af2940b3103499f0e67e0ca4472" }, "downloads": -1, "filename": "edc_timepoint-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "6e0887b06bc11dd74a32394563cce17b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 27783, "upload_time": "2019-04-09T20:50:42", "url": "https://files.pythonhosted.org/packages/e6/ef/b50f5445bd6331cb7e9c60909506d8fa5e3aa45a40376b8437c2ae0cd519/edc_timepoint-0.1.13-py3-none-any.whl" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "da617026e6bf707155be40cab9130518", "sha256": "53793e0fa02b44af30d11acde1eb75d291d8e925339d5c653a6d2544e9471419" }, "downloads": -1, "filename": "edc-timepoint-0.1.3.macosx-10.13-x86_64.tar.gz", "has_sig": false, "md5_digest": "da617026e6bf707155be40cab9130518", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23079, "upload_time": "2018-07-21T08:11:37", "url": "https://files.pythonhosted.org/packages/6b/06/8b2d6a6ae7959645a360ca753e36e3218248833b1ab4578a827935576c41/edc-timepoint-0.1.3.macosx-10.13-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "c24e3620de1a9562061daf7bd3b75c6e", "sha256": "534031cd89f45bf800170ddc8a8f0afd759087aa69da65ed48d09cebeefb31f2" }, "downloads": -1, "filename": "edc_timepoint-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c24e3620de1a9562061daf7bd3b75c6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16475, "upload_time": "2018-07-21T08:11:35", "url": "https://files.pythonhosted.org/packages/f4/b4/bc9122164cdca78545976efc0cab7f7eab53a6d55a94379ae1b6385583ea/edc_timepoint-0.1.3-py3-none-any.whl" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "d193a3ff7149bb808aed98dbdd49afa7", "sha256": "8adad5b27106b7a1e837ba19b696ccdfef0eb76c550c698fa0868fbbdcdf0bcd" }, "downloads": -1, "filename": "edc-timepoint-0.1.4.macosx-10.13-x86_64.tar.gz", "has_sig": false, "md5_digest": "d193a3ff7149bb808aed98dbdd49afa7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23089, "upload_time": "2018-08-01T01:54:28", "url": "https://files.pythonhosted.org/packages/57/28/41f49d008f74366813a40c82be834d47a77a8a0ce97e2ceb78e2b0f4aa7c/edc-timepoint-0.1.4.macosx-10.13-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "64501cfaf72b9b2f37d5c9693c4ce4d3", "sha256": "8480a0117f9199dcfa951864ed84e02995d57fdd5f51500326cb702dfcf77789" }, "downloads": -1, "filename": "edc_timepoint-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "64501cfaf72b9b2f37d5c9693c4ce4d3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16476, "upload_time": "2018-08-01T01:54:26", "url": "https://files.pythonhosted.org/packages/5a/1a/c4eb258ee830e26e8824544724fcb5e223e5a38e04d94d5b71869dc750da/edc_timepoint-0.1.4-py3-none-any.whl" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "00a04ab6fdd5912b972ada4d3d186600", "sha256": "e3582468aaf026f68c3f3de5de875f1eb246d222ce2851790f893a78e1b7440f" }, "downloads": -1, "filename": "edc-timepoint-0.1.5.macosx-10.13-x86_64.tar.gz", "has_sig": false, "md5_digest": "00a04ab6fdd5912b972ada4d3d186600", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22768, "upload_time": "2018-08-07T21:38:51", "url": "https://files.pythonhosted.org/packages/d0/fd/389928f2939373e235c202ffcfb9402ea907eb5199ffc470ed359e910465/edc-timepoint-0.1.5.macosx-10.13-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "9b52a8033a7395f35a5e54bb96f77d5c", "sha256": "0a361cbdfcdf5c521a8db19bcad2320a1f7d62781d4bc3a53837b8ad9d1c7960" }, "downloads": -1, "filename": "edc_timepoint-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "9b52a8033a7395f35a5e54bb96f77d5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16352, "upload_time": "2018-08-07T21:38:50", "url": "https://files.pythonhosted.org/packages/d3/73/0ff33ebb4b575b9dd2f27c362c390c7acd50b203da33b9051f79a66795d3/edc_timepoint-0.1.5-py3-none-any.whl" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "ddb36fb84a1060e28cd05d26332aabf2", "sha256": "3feec93be8496be9b8f13150b3923c0d06801e3b3db112806bde72b43faf8366" }, "downloads": -1, "filename": "edc-timepoint-0.1.6.macosx-10.13-x86_64.tar.gz", "has_sig": false, "md5_digest": "ddb36fb84a1060e28cd05d26332aabf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22775, "upload_time": "2018-08-07T22:23:45", "url": "https://files.pythonhosted.org/packages/46/32/3231a7ab1488c1fad1314ea4a3032a5753ac9eb878f63fb7c6ead0c56395/edc-timepoint-0.1.6.macosx-10.13-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "4539de997eb12b97d8f91dd7ade6bd76", "sha256": "e2262eabe86fe4d5ae48682110c49948ed3a25894d7b58c4629ed1a340dfb502" }, "downloads": -1, "filename": "edc_timepoint-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "4539de997eb12b97d8f91dd7ade6bd76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16351, "upload_time": "2018-08-07T22:23:43", "url": "https://files.pythonhosted.org/packages/c4/af/576f81b69f28f3654449dceb2005380aab39013ab02471a8bb99b9e128c5/edc_timepoint-0.1.6-py3-none-any.whl" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "18b6c58ca32bd4b735faa804e58db79b", "sha256": "f4b07c46288e2a00012f1af23e16bae7c1466e9fce20d4792c163129d3fafded" }, "downloads": -1, "filename": "edc_timepoint-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "18b6c58ca32bd4b735faa804e58db79b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28709, "upload_time": "2019-02-11T05:38:56", "url": "https://files.pythonhosted.org/packages/62/4e/c988de0520e2e92fefdbdc0895c842403373ade064a8d7b5279c55717e98/edc_timepoint-0.1.7-py3-none-any.whl" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "e56e889be66448797f1f4604e5aad723", "sha256": "27730cd9b05472cebb0dbd091d31902d66adbd37cb07fbd560ba7bcb8224ed53" }, "downloads": -1, "filename": "edc_timepoint-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "e56e889be66448797f1f4604e5aad723", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 28653, "upload_time": "2019-03-05T05:07:14", "url": "https://files.pythonhosted.org/packages/c1/0d/29cc799ceae696f22103b23d009a018bb1b5e3d9e050a84ea1ed52a79440/edc_timepoint-0.1.8-py3-none-any.whl" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "302399c648dc2d506f1eb9d77a0926f7", "sha256": "86e752b5fc705b751a743ef3405c8299fa31a0fa06bc6febf138d41eb29697a2" }, "downloads": -1, "filename": "edc_timepoint-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "302399c648dc2d506f1eb9d77a0926f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 28653, "upload_time": "2019-03-05T05:24:33", "url": "https://files.pythonhosted.org/packages/42/30/00edc84d521bf954d5cae001420fd0a150805eb967498059d05f60b7526d/edc_timepoint-0.1.9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6e0887b06bc11dd74a32394563cce17b", "sha256": "ed75ea7daa67af62ab9c00c23114093f71959af2940b3103499f0e67e0ca4472" }, "downloads": -1, "filename": "edc_timepoint-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "6e0887b06bc11dd74a32394563cce17b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 27783, "upload_time": "2019-04-09T20:50:42", "url": "https://files.pythonhosted.org/packages/e6/ef/b50f5445bd6331cb7e9c60909506d8fa5e3aa45a40376b8437c2ae0cd519/edc_timepoint-0.1.13-py3-none-any.whl" } ] }