|pypi| |actions| |codecov| |downloads|
edc-form-runners
----------------
Classes to manually run modelform validation for clinicedc/edc projects.
The ``FormRunner`` class
++++++++++++++++++++++++
You can use the ``FormRunner`` to rerun modelform validation on all instances of a model.
For example:
.. code-block:: python
runner = FormRunner("intecomm_subject.vitals")
runner.run_all()
This re-runs ``form.is_valid()`` for all instances of ``intecomm_subject.vitals``.
If the Vitals ``ModelForm`` does not validate, the ``FormRunner`` stores each error
of the ``form.errors`` dictionary in model ``Issue`` where
one instance of ``Issue`` is created per field_name:error_message pair.
`Note: Your model must be registered with Admin.`
``run_form_runners``
++++++++++++++++++++
You can run a ``FormRunner`` for every CRF/Requisition model in a module:
.. code-block:: python
from django.apps import apps as django_apps
from edc_form_runners.run_form_runners import run_form_runners
run_form_runners(app_labels=["intecomm_subject"])
or just list a few models explicitly:
.. code-block:: python
from django.apps import apps as django_apps
from edc_form_runners.run_form_runners import run_form_runners
run_form_runners(model_names=["intecomm_subject.vitals", "intecomm_subject.medications"])
Custom FormRunners
++++++++++++++++++
You may wish to ignore some errors; that is, prevent ``FormRunner`` from creating an ``Issue`` instance
for specific fields that do not validate. To do this create a custom ``FormRunner`` for your model
and list the field names to exclude:
.. code-block:: python
class HtnMedicationAdherenceFormRunner(FormRunner):
model_name = "intecomm_subject.htnmedicationadherence"
exclude_formfields = ["pill_count"]
Now you can use the custom ``FormRunner``:
.. code-block:: python
runner = HtnMedicationAdherenceFormRunner()
runner.run_all()
if field ``pill_count`` does not validate, the error message will not be written to the ``Issues`` table.
Registering Custom FormRunners
++++++++++++++++++++++++++++++
A custom ``FormRunner`` must be registered to be used by ``edc_form_runners``.
Declare your custom ``FormRunnners`` in module ``form_runners.py`` in the root of your app:
.. code-block:: python
# form_runners.py
from edc_form_runners.decorators import register
from edc_form_runners.form_runner import FormRunner
@register
class HtnMedicationAdherenceFormRunner(FormRunner):
model_name = "intecomm_subject.htnmedicationadherence"
exclude_formfields = ["pill_count"]
@register
class DmMedicationAdherenceFormRunner(FormRunner):
model_name = "intecomm_subject.dmmedicationadherence"
exclude_formfields = ["pill_count"]
The ``register`` decorator registers the custom classes with ``site_form_runners``.
``get_form_runner``
+++++++++++++++++++
``edc_form_runners`` gets ``FormRunners`` using ``get_form_runner``.
Given a model name in ``label_lower`` format, ``get_form_runner`` checks the site global (``site_form_runners``) and returns
a custom ``FormRunner``, if it exists, otherwise returns the default ``FormRunner``.
In your code you should use ``get_form_runner``:
.. code-block:: python
# good, returned DmMedicationAdherenceFormRunner instead of the default FormRunner
runner = get_form_runner("intecomm_subject.dmmedicationadherence")
runner.run()
# works but does not use your custom form runner
runner = FormRunner("intecomm_subject.dmmedicationadherence")
runner.run_all()
Management Command ``run_form_runners``
+++++++++++++++++++++++++++++++++++++++
You can use the management command ``run_form_runners`` to run form runners for some or
all CRF/Requisitions. Run this command to initially populate ``Issue`` table and whenever you
change validation logic for a form.
Pass the management command one or more app_labels separated by comma:
.. code-block:: bash
>>> python manage.py run_form_runners -a intecomm_subject
or pass one or more model names (label_lower format) separated by comma:
.. code-block:: bash
>>> python manage.py run_form_runners -m intecomm_subject.vitals,intecomm_subject.dmmedicationadherence
You can skip a model as well:
.. code-block:: bash
>>> python manage.py run_form_runners -a intecomm_subject -s intecomm_subject.medicationadherence
``Issue`` ChangeList
++++++++++++++++++++
The ``ChangeList`` for the ``Issue model`` is available in ``edc_data_manager`` and ``edc_form_runners``.
You would typically use the one in ``edc_data_manager``.
From the change list you can:
* search, filter and re-order
* refresh selected ``Issue`` instances from the action menu.
* navigate to a subject`s dashboard
Integrated with the Subject Dashboard
+++++++++++++++++++++++++++++++++++++
The subject dashboard shows an "Issues" badge next to a CRF or Requisition if one exists. You can
hover over the badge to see some of the error messages detected when the ``FormRunner`` last ran.
If a user edits a CRF with a detected issue and the corrected form validates withour error, the
``Issue`` instance is deleted and the badge is no longer displayed.
(See also ``signals.py``)
``FormRunner`` is ``clinicedc`` specific
++++++++++++++++++++++++++++++++++++++++
At the moment, the ``FormRunner`` class is currently ``clinicedc`` specific in that it only works for models with a
``subject_identifier`` or related_visit FK (e.g. ``subject_visit``).
The ``post_save`` signal that updates Issues listens for ``clinicedc`` CRFs and Requisitions by testing if the model instance
is an instance of ``CrfModelMixin``, ``CrfNoManagerModelMixin`` or ``RequisitionModelMixin``.
.. |pypi| image:: https://img.shields.io/pypi/v/edc-form-runners.svg
:target: https://pypi.python.org/pypi/edc-form-runners
.. |actions| image:: https://github.com/clinicedc/edc-form-runners/actions/workflows/build.yml/badge.svg
:target: https://github.com/clinicedc/edc-form-runners/actions/workflows/build.yml
.. |codecov| image:: https://codecov.io/gh/clinicedc/edc-form-runners/branch/develop/graph/badge.svg
:target: https://codecov.io/gh/clinicedc/edc-form-runners
.. |downloads| image:: https://pepy.tech/badge/edc-form-runners
:target: https://pepy.tech/project/edc-form-runners
Raw data
{
"_id": null,
"home_page": "https://github.com/clinicedc/edc-form-runners",
"name": "edc-form-runners",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": null,
"keywords": "django Edc, modelform, validation, clinicedc, clinical trials",
"author": "Erik van Widenfelt",
"author_email": "ew2789@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/75/75/afe5ab530d46ee11c88c7fdefd52e5ac996bd24cebe20eb62e4f64f86a8d/edc_form_runners-0.3.12.tar.gz",
"platform": null,
"description": "|pypi| |actions| |codecov| |downloads|\n\nedc-form-runners\n----------------\n\nClasses to manually run modelform validation for clinicedc/edc projects.\n\n\nThe ``FormRunner`` class\n++++++++++++++++++++++++\n\nYou can use the ``FormRunner`` to rerun modelform validation on all instances of a model.\n\nFor example:\n\n.. code-block:: python\n\n runner = FormRunner(\"intecomm_subject.vitals\")\n runner.run_all()\n\nThis re-runs ``form.is_valid()`` for all instances of ``intecomm_subject.vitals``.\nIf the Vitals ``ModelForm`` does not validate, the ``FormRunner`` stores each error\nof the ``form.errors`` dictionary in model ``Issue`` where\none instance of ``Issue`` is created per field_name:error_message pair.\n\n`Note: Your model must be registered with Admin.`\n\n``run_form_runners``\n++++++++++++++++++++\n\nYou can run a ``FormRunner`` for every CRF/Requisition model in a module:\n\n.. code-block:: python\n\n from django.apps import apps as django_apps\n from edc_form_runners.run_form_runners import run_form_runners\n\n run_form_runners(app_labels=[\"intecomm_subject\"])\n\n\nor just list a few models explicitly:\n\n.. code-block:: python\n\n from django.apps import apps as django_apps\n from edc_form_runners.run_form_runners import run_form_runners\n\n run_form_runners(model_names=[\"intecomm_subject.vitals\", \"intecomm_subject.medications\"])\n\n\nCustom FormRunners\n++++++++++++++++++\n\nYou may wish to ignore some errors; that is, prevent ``FormRunner`` from creating an ``Issue`` instance\nfor specific fields that do not validate. To do this create a custom ``FormRunner`` for your model\nand list the field names to exclude:\n\n.. code-block:: python\n\n class HtnMedicationAdherenceFormRunner(FormRunner):\n model_name = \"intecomm_subject.htnmedicationadherence\"\n exclude_formfields = [\"pill_count\"]\n\n\nNow you can use the custom ``FormRunner``:\n\n.. code-block:: python\n\n runner = HtnMedicationAdherenceFormRunner()\n runner.run_all()\n\nif field ``pill_count`` does not validate, the error message will not be written to the ``Issues`` table.\n\nRegistering Custom FormRunners\n++++++++++++++++++++++++++++++\n\nA custom ``FormRunner`` must be registered to be used by ``edc_form_runners``.\n\nDeclare your custom ``FormRunnners`` in module ``form_runners.py`` in the root of your app:\n\n.. code-block:: python\n\n # form_runners.py\n from edc_form_runners.decorators import register\n from edc_form_runners.form_runner import FormRunner\n\n\n @register\n class HtnMedicationAdherenceFormRunner(FormRunner):\n model_name = \"intecomm_subject.htnmedicationadherence\"\n exclude_formfields = [\"pill_count\"]\n\n @register\n class DmMedicationAdherenceFormRunner(FormRunner):\n model_name = \"intecomm_subject.dmmedicationadherence\"\n exclude_formfields = [\"pill_count\"]\n\n\nThe ``register`` decorator registers the custom classes with ``site_form_runners``.\n\n\n``get_form_runner``\n+++++++++++++++++++\n\n``edc_form_runners`` gets ``FormRunners`` using ``get_form_runner``.\nGiven a model name in ``label_lower`` format, ``get_form_runner`` checks the site global (``site_form_runners``) and returns\na custom ``FormRunner``, if it exists, otherwise returns the default ``FormRunner``.\n\nIn your code you should use ``get_form_runner``:\n\n.. code-block:: python\n\n # good, returned DmMedicationAdherenceFormRunner instead of the default FormRunner\n runner = get_form_runner(\"intecomm_subject.dmmedicationadherence\")\n runner.run()\n\n # works but does not use your custom form runner\n runner = FormRunner(\"intecomm_subject.dmmedicationadherence\")\n runner.run_all()\n\n\nManagement Command ``run_form_runners``\n+++++++++++++++++++++++++++++++++++++++\n\nYou can use the management command ``run_form_runners`` to run form runners for some or\nall CRF/Requisitions. Run this command to initially populate ``Issue`` table and whenever you\nchange validation logic for a form.\n\nPass the management command one or more app_labels separated by comma:\n\n.. code-block:: bash\n\n >>> python manage.py run_form_runners -a intecomm_subject\n\nor pass one or more model names (label_lower format) separated by comma:\n\n.. code-block:: bash\n\n >>> python manage.py run_form_runners -m intecomm_subject.vitals,intecomm_subject.dmmedicationadherence\n\nYou can skip a model as well:\n\n.. code-block:: bash\n\n >>> python manage.py run_form_runners -a intecomm_subject -s intecomm_subject.medicationadherence\n\n``Issue`` ChangeList\n++++++++++++++++++++\n\nThe ``ChangeList`` for the ``Issue model`` is available in ``edc_data_manager`` and ``edc_form_runners``.\nYou would typically use the one in ``edc_data_manager``.\n\nFrom the change list you can:\n\n* search, filter and re-order\n* refresh selected ``Issue`` instances from the action menu.\n* navigate to a subject`s dashboard\n\nIntegrated with the Subject Dashboard\n+++++++++++++++++++++++++++++++++++++\n\nThe subject dashboard shows an \"Issues\" badge next to a CRF or Requisition if one exists. You can\nhover over the badge to see some of the error messages detected when the ``FormRunner`` last ran.\n\nIf a user edits a CRF with a detected issue and the corrected form validates withour error, the\n``Issue`` instance is deleted and the badge is no longer displayed.\n(See also ``signals.py``)\n\n\n``FormRunner`` is ``clinicedc`` specific\n++++++++++++++++++++++++++++++++++++++++\nAt the moment, the ``FormRunner`` class is currently ``clinicedc`` specific in that it only works for models with a\n``subject_identifier`` or related_visit FK (e.g. ``subject_visit``).\n\nThe ``post_save`` signal that updates Issues listens for ``clinicedc`` CRFs and Requisitions by testing if the model instance\nis an instance of ``CrfModelMixin``, ``CrfNoManagerModelMixin`` or ``RequisitionModelMixin``.\n\n\n.. |pypi| image:: https://img.shields.io/pypi/v/edc-form-runners.svg\n :target: https://pypi.python.org/pypi/edc-form-runners\n\n.. |actions| image:: https://github.com/clinicedc/edc-form-runners/actions/workflows/build.yml/badge.svg\n :target: https://github.com/clinicedc/edc-form-runners/actions/workflows/build.yml\n\n.. |codecov| image:: https://codecov.io/gh/clinicedc/edc-form-runners/branch/develop/graph/badge.svg\n :target: https://codecov.io/gh/clinicedc/edc-form-runners\n\n.. |downloads| image:: https://pepy.tech/badge/edc-form-runners\n :target: https://pepy.tech/project/edc-form-runners\n",
"bugtrack_url": null,
"license": "GPL license, see LICENSE",
"summary": "Classes to manually run form validation for clinicedc/edc projects",
"version": "0.3.12",
"project_urls": {
"Homepage": "https://github.com/clinicedc/edc-form-runners"
},
"split_keywords": [
"django edc",
" modelform",
" validation",
" clinicedc",
" clinical trials"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ca8f4ccebe638815868528fbbd1592c6bd7b52dbf71c97ec3716660014ad518b",
"md5": "9e2fbd11ad26ad83ebf416002c989fc4",
"sha256": "83be6efb5acb966201239ab54ccd655906004f086be01488cb48579f4b9caa44"
},
"downloads": -1,
"filename": "edc_form_runners-0.3.12-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9e2fbd11ad26ad83ebf416002c989fc4",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.12",
"size": 48669,
"upload_time": "2024-11-20T22:48:34",
"upload_time_iso_8601": "2024-11-20T22:48:34.127313Z",
"url": "https://files.pythonhosted.org/packages/ca/8f/4ccebe638815868528fbbd1592c6bd7b52dbf71c97ec3716660014ad518b/edc_form_runners-0.3.12-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7575afe5ab530d46ee11c88c7fdefd52e5ac996bd24cebe20eb62e4f64f86a8d",
"md5": "39f10faeebfedfeff94fa98dff95680e",
"sha256": "70b56284dc57ca77eaf68078d191794d764987178e43f291d3cbb52fca72d129"
},
"downloads": -1,
"filename": "edc_form_runners-0.3.12.tar.gz",
"has_sig": false,
"md5_digest": "39f10faeebfedfeff94fa98dff95680e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 45030,
"upload_time": "2024-11-20T22:48:35",
"upload_time_iso_8601": "2024-11-20T22:48:35.857184Z",
"url": "https://files.pythonhosted.org/packages/75/75/afe5ab530d46ee11c88c7fdefd52e5ac996bd24cebe20eb62e4f64f86a8d/edc_form_runners-0.3.12.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-20 22:48:35",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "clinicedc",
"github_project": "edc-form-runners",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "edc-form-runners"
}