diff options
| author | CoprDistGit <infra@openeuler.org> | 2023-05-15 09:27:39 +0000 |
|---|---|---|
| committer | CoprDistGit <infra@openeuler.org> | 2023-05-15 09:27:39 +0000 |
| commit | e2bfc16385d3c1f41e283223a66ef98aa87bd61c (patch) | |
| tree | 39f8f15e882420d2c93608d8457865e706773e77 /python-edc-randomization.spec | |
| parent | 032831faf5c4b29a7e0455e319305b31462892c2 (diff) | |
automatic import of python-edc-randomization
Diffstat (limited to 'python-edc-randomization.spec')
| -rw-r--r-- | python-edc-randomization.spec | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/python-edc-randomization.spec b/python-edc-randomization.spec new file mode 100644 index 0000000..6f6b6b5 --- /dev/null +++ b/python-edc-randomization.spec @@ -0,0 +1,447 @@ +%global _empty_manifest_terminate_build 0 +Name: python-edc-randomization +Version: 0.3.45 +Release: 1 +Summary: Randomization classes for clinicedc/edc +License: GPL license, see LICENSE +URL: https://github.com/clinicedc/edc-randomization +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/b1/6e/c958aaac83febe90c0943511540a31d9cf18787bcc866dd9add9b9ff4b5d/edc-randomization-0.3.45.tar.gz +BuildArch: noarch + + +%description +Randomization objects for clinicedc projects +Overview +++++++++ +The ``Randomizer`` class emulates the randomization of a clincial trial participant in +realtime. This module doesn't actually `randomize` in realtime. Instead, a CSV file is +prepared in advance by the statistician. This CSV file lists the order in which subjects +are to be randomized. The ``Randomizer`` class initially imports the entire list in order +into a ``model``. When a subject is to be randomized, the ``Randomizer`` class selects +the next available row from the model. +A very basic ``randomization_list.csv`` prepared in advance might look like this:: + site_name,sid,assignment + temeke,1000,active + temeke,1001,active + temeke,1002,placebo + temeke,1003,active + temeke,1004,placebo + temeke,1005,placebo +For large multisite trials this may be thousands of lines ordered using some type of block +randomization. +This module will import (only once) all rows from the CSV file into a model. The ``Randomizer`` +class selects and allocates in order by site_name one row per participant from the model. + randomizer_cls = site_randomizers.get("default") + randomizer_cls.randomize(subject_identifier=subject_identifier, ...) + # or just: + site_randomizers.randomize("default", subject_identifier=subject_identifier, ...) +Usually, the ``Randomizer`` class is instantiated in a ``signal`` once the subject's +eligibility is confirmed and the subject's informed consent is submitted. A +`signal` attached to the subject's informed consent is a good place to do this assuming the sequence +of events are 1) pass eligibility criteria, 2) complete informed consent, 3) `randomize` and +issue study identifier 4) start baseline visit. + @receiver( + post_save, + weak=False, + sender=SubjectConsent, + dispatch_uid="subject_consent_on_post_save", + ) + def subject_consent_on_post_save(sender, instance, raw, created, **kwargs): + if not raw: + if created: + # randomize + site_randomizers.randomize( + "default", + subject_identifier=instance.subject_identifier, + report_datetime=instance.consent_datetime, + site=instance.site, + user=instance.user_created, + ) +Registering a randomizer +++++++++++++++++++++++++ +The default ``Randomizer`` class is ``edc_randomization.randomizer.Randomizer``. Unless you +indicate otherwise, it will be automatically registered with the site controller, +``site_randomizers`` with the name ``default``. It is recommended you access the ``Randomizer`` +class through ``site_randomizers`` instead of directly importing. + randomizer_cls = site_randomizers.get("default") +Customizing the default randomizer +++++++++++++++++++++++++++++++++++ +Some attributes of the default ``Randomizer`` class can be customized using ``settings`` attributes: + EDC_RANDOMIZATION_LIST_PATH = 'path/to/csv_file' + EDC_RANDOMIZATION_ASSIGNMENT_MAP = { + "intervention": 1, + "control": 2, + } + EDC_RANDOMIZATION_ASSIGNMENT_DESCRIPTION_MAP = { + "intervention": "Fluconazole plus flucytosine", + "control": "Fluconazole" + } +Creating a custom randomizer +++++++++++++++++++++++++++++ +If you need to customize further, create a custom ``Randomizer`` class. +In the example below, ``gender`` is added for a trial stratified by ``gender``. +Custom ``Randomizer`` classes live in ``randomizers.py`` in the root of your app. The +``site_randomizers`` controller will ``autodiscover`` them. + # my_app/randomizers.py + @register() + class MyRandomizer(Randomizer): + name = "my_randomizer" + model = "edc_randomization.myrandomizationlist" + randomization_list_path = tmpdir + assignment_map = {"Intervention": 1, "Control": 0} + assignment_description_map = {"Intervention": "Fluconazole plus flucytosine", "Control": "Fluconazole"} + extra_csv_fieldnames = ["gender"] + def __init__(self, gender=None, **kwargs): + self.gender = gender + super().__init__(**kwargs) + @property + def extra_required_instance_attrs(self): + return dict(gender=self.gender) + @property + def extra_model_obj_options(self): + return dict(gender=self.gender) + @classmethod + def get_extra_list_display(cls): + return [(4, "gender")] +The ``register()`` decorator registers the custom class with ``site_randomizers``. +With a custom randomizer, the default ``Randomizer`` class is no longer needed, +update settings to prevent the default class from registering. +Use the settings attribute: + EDC_RANDOMIZATION_REGISTER_DEFAULT_RANDOMIZER = False +Confirm this by checking the ``site_randomizers``: + >>> randomizer_cls = site_randomizers.get("default") + NotRegistered: A Randomizer class by this name ... + >>> randomizer_cls = site_randomizers.get("my_randomizer") + >>> randomizer_cls.name + "my_randomizer" +Manually Importing from CSV ++++++++++++++++++++++++++++ +A ``Randomizer`` class will call ``import_list`` when it is instantiated +for the first time. If you want to load the CSV file manually, +import the ``Randomizer`` class and call ``import_list()``. + >>> randomizer_cls = site_randomizers.get("my_randomizer") + >>> randomizer_cls.import_list() + Import CSV data + Randomizer: + - Name: my_randomizer + - Assignments: {'active': 1, 'placebo': 2} + - Model: edc_randomization.myrandomizationlist + - Path: /home/me/.etc/randomization_list.csv + - Imported 5 SIDs for randomizer `my_randomizer` into model `edc_randomization.myrandomizationlist` + from /home/me/.etc/randomization_list.csv. + - Verified OK. +Manually Export to CSV +++++++++++++++++++++++ + >>> from edc_randomization.utils import export_randomization_list + >>> export_randomization_list(randomizer_name="default",path="~/", username="erikvw") +If the user does not have permissions to view the randomizationlist table, a ``RandomizationListExporterError`` will be raised: + RandomizationListExporterError: User `erikvw` does not have permission to view 'edc_randomization.randomizationlist' + +%package -n python3-edc-randomization +Summary: Randomization classes for clinicedc/edc +Provides: python-edc-randomization +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-edc-randomization +Randomization objects for clinicedc projects +Overview +++++++++ +The ``Randomizer`` class emulates the randomization of a clincial trial participant in +realtime. This module doesn't actually `randomize` in realtime. Instead, a CSV file is +prepared in advance by the statistician. This CSV file lists the order in which subjects +are to be randomized. The ``Randomizer`` class initially imports the entire list in order +into a ``model``. When a subject is to be randomized, the ``Randomizer`` class selects +the next available row from the model. +A very basic ``randomization_list.csv`` prepared in advance might look like this:: + site_name,sid,assignment + temeke,1000,active + temeke,1001,active + temeke,1002,placebo + temeke,1003,active + temeke,1004,placebo + temeke,1005,placebo +For large multisite trials this may be thousands of lines ordered using some type of block +randomization. +This module will import (only once) all rows from the CSV file into a model. The ``Randomizer`` +class selects and allocates in order by site_name one row per participant from the model. + randomizer_cls = site_randomizers.get("default") + randomizer_cls.randomize(subject_identifier=subject_identifier, ...) + # or just: + site_randomizers.randomize("default", subject_identifier=subject_identifier, ...) +Usually, the ``Randomizer`` class is instantiated in a ``signal`` once the subject's +eligibility is confirmed and the subject's informed consent is submitted. A +`signal` attached to the subject's informed consent is a good place to do this assuming the sequence +of events are 1) pass eligibility criteria, 2) complete informed consent, 3) `randomize` and +issue study identifier 4) start baseline visit. + @receiver( + post_save, + weak=False, + sender=SubjectConsent, + dispatch_uid="subject_consent_on_post_save", + ) + def subject_consent_on_post_save(sender, instance, raw, created, **kwargs): + if not raw: + if created: + # randomize + site_randomizers.randomize( + "default", + subject_identifier=instance.subject_identifier, + report_datetime=instance.consent_datetime, + site=instance.site, + user=instance.user_created, + ) +Registering a randomizer +++++++++++++++++++++++++ +The default ``Randomizer`` class is ``edc_randomization.randomizer.Randomizer``. Unless you +indicate otherwise, it will be automatically registered with the site controller, +``site_randomizers`` with the name ``default``. It is recommended you access the ``Randomizer`` +class through ``site_randomizers`` instead of directly importing. + randomizer_cls = site_randomizers.get("default") +Customizing the default randomizer +++++++++++++++++++++++++++++++++++ +Some attributes of the default ``Randomizer`` class can be customized using ``settings`` attributes: + EDC_RANDOMIZATION_LIST_PATH = 'path/to/csv_file' + EDC_RANDOMIZATION_ASSIGNMENT_MAP = { + "intervention": 1, + "control": 2, + } + EDC_RANDOMIZATION_ASSIGNMENT_DESCRIPTION_MAP = { + "intervention": "Fluconazole plus flucytosine", + "control": "Fluconazole" + } +Creating a custom randomizer +++++++++++++++++++++++++++++ +If you need to customize further, create a custom ``Randomizer`` class. +In the example below, ``gender`` is added for a trial stratified by ``gender``. +Custom ``Randomizer`` classes live in ``randomizers.py`` in the root of your app. The +``site_randomizers`` controller will ``autodiscover`` them. + # my_app/randomizers.py + @register() + class MyRandomizer(Randomizer): + name = "my_randomizer" + model = "edc_randomization.myrandomizationlist" + randomization_list_path = tmpdir + assignment_map = {"Intervention": 1, "Control": 0} + assignment_description_map = {"Intervention": "Fluconazole plus flucytosine", "Control": "Fluconazole"} + extra_csv_fieldnames = ["gender"] + def __init__(self, gender=None, **kwargs): + self.gender = gender + super().__init__(**kwargs) + @property + def extra_required_instance_attrs(self): + return dict(gender=self.gender) + @property + def extra_model_obj_options(self): + return dict(gender=self.gender) + @classmethod + def get_extra_list_display(cls): + return [(4, "gender")] +The ``register()`` decorator registers the custom class with ``site_randomizers``. +With a custom randomizer, the default ``Randomizer`` class is no longer needed, +update settings to prevent the default class from registering. +Use the settings attribute: + EDC_RANDOMIZATION_REGISTER_DEFAULT_RANDOMIZER = False +Confirm this by checking the ``site_randomizers``: + >>> randomizer_cls = site_randomizers.get("default") + NotRegistered: A Randomizer class by this name ... + >>> randomizer_cls = site_randomizers.get("my_randomizer") + >>> randomizer_cls.name + "my_randomizer" +Manually Importing from CSV ++++++++++++++++++++++++++++ +A ``Randomizer`` class will call ``import_list`` when it is instantiated +for the first time. If you want to load the CSV file manually, +import the ``Randomizer`` class and call ``import_list()``. + >>> randomizer_cls = site_randomizers.get("my_randomizer") + >>> randomizer_cls.import_list() + Import CSV data + Randomizer: + - Name: my_randomizer + - Assignments: {'active': 1, 'placebo': 2} + - Model: edc_randomization.myrandomizationlist + - Path: /home/me/.etc/randomization_list.csv + - Imported 5 SIDs for randomizer `my_randomizer` into model `edc_randomization.myrandomizationlist` + from /home/me/.etc/randomization_list.csv. + - Verified OK. +Manually Export to CSV +++++++++++++++++++++++ + >>> from edc_randomization.utils import export_randomization_list + >>> export_randomization_list(randomizer_name="default",path="~/", username="erikvw") +If the user does not have permissions to view the randomizationlist table, a ``RandomizationListExporterError`` will be raised: + RandomizationListExporterError: User `erikvw` does not have permission to view 'edc_randomization.randomizationlist' + +%package help +Summary: Development documents and examples for edc-randomization +Provides: python3-edc-randomization-doc +%description help +Randomization objects for clinicedc projects +Overview +++++++++ +The ``Randomizer`` class emulates the randomization of a clincial trial participant in +realtime. This module doesn't actually `randomize` in realtime. Instead, a CSV file is +prepared in advance by the statistician. This CSV file lists the order in which subjects +are to be randomized. The ``Randomizer`` class initially imports the entire list in order +into a ``model``. When a subject is to be randomized, the ``Randomizer`` class selects +the next available row from the model. +A very basic ``randomization_list.csv`` prepared in advance might look like this:: + site_name,sid,assignment + temeke,1000,active + temeke,1001,active + temeke,1002,placebo + temeke,1003,active + temeke,1004,placebo + temeke,1005,placebo +For large multisite trials this may be thousands of lines ordered using some type of block +randomization. +This module will import (only once) all rows from the CSV file into a model. The ``Randomizer`` +class selects and allocates in order by site_name one row per participant from the model. + randomizer_cls = site_randomizers.get("default") + randomizer_cls.randomize(subject_identifier=subject_identifier, ...) + # or just: + site_randomizers.randomize("default", subject_identifier=subject_identifier, ...) +Usually, the ``Randomizer`` class is instantiated in a ``signal`` once the subject's +eligibility is confirmed and the subject's informed consent is submitted. A +`signal` attached to the subject's informed consent is a good place to do this assuming the sequence +of events are 1) pass eligibility criteria, 2) complete informed consent, 3) `randomize` and +issue study identifier 4) start baseline visit. + @receiver( + post_save, + weak=False, + sender=SubjectConsent, + dispatch_uid="subject_consent_on_post_save", + ) + def subject_consent_on_post_save(sender, instance, raw, created, **kwargs): + if not raw: + if created: + # randomize + site_randomizers.randomize( + "default", + subject_identifier=instance.subject_identifier, + report_datetime=instance.consent_datetime, + site=instance.site, + user=instance.user_created, + ) +Registering a randomizer +++++++++++++++++++++++++ +The default ``Randomizer`` class is ``edc_randomization.randomizer.Randomizer``. Unless you +indicate otherwise, it will be automatically registered with the site controller, +``site_randomizers`` with the name ``default``. It is recommended you access the ``Randomizer`` +class through ``site_randomizers`` instead of directly importing. + randomizer_cls = site_randomizers.get("default") +Customizing the default randomizer +++++++++++++++++++++++++++++++++++ +Some attributes of the default ``Randomizer`` class can be customized using ``settings`` attributes: + EDC_RANDOMIZATION_LIST_PATH = 'path/to/csv_file' + EDC_RANDOMIZATION_ASSIGNMENT_MAP = { + "intervention": 1, + "control": 2, + } + EDC_RANDOMIZATION_ASSIGNMENT_DESCRIPTION_MAP = { + "intervention": "Fluconazole plus flucytosine", + "control": "Fluconazole" + } +Creating a custom randomizer +++++++++++++++++++++++++++++ +If you need to customize further, create a custom ``Randomizer`` class. +In the example below, ``gender`` is added for a trial stratified by ``gender``. +Custom ``Randomizer`` classes live in ``randomizers.py`` in the root of your app. The +``site_randomizers`` controller will ``autodiscover`` them. + # my_app/randomizers.py + @register() + class MyRandomizer(Randomizer): + name = "my_randomizer" + model = "edc_randomization.myrandomizationlist" + randomization_list_path = tmpdir + assignment_map = {"Intervention": 1, "Control": 0} + assignment_description_map = {"Intervention": "Fluconazole plus flucytosine", "Control": "Fluconazole"} + extra_csv_fieldnames = ["gender"] + def __init__(self, gender=None, **kwargs): + self.gender = gender + super().__init__(**kwargs) + @property + def extra_required_instance_attrs(self): + return dict(gender=self.gender) + @property + def extra_model_obj_options(self): + return dict(gender=self.gender) + @classmethod + def get_extra_list_display(cls): + return [(4, "gender")] +The ``register()`` decorator registers the custom class with ``site_randomizers``. +With a custom randomizer, the default ``Randomizer`` class is no longer needed, +update settings to prevent the default class from registering. +Use the settings attribute: + EDC_RANDOMIZATION_REGISTER_DEFAULT_RANDOMIZER = False +Confirm this by checking the ``site_randomizers``: + >>> randomizer_cls = site_randomizers.get("default") + NotRegistered: A Randomizer class by this name ... + >>> randomizer_cls = site_randomizers.get("my_randomizer") + >>> randomizer_cls.name + "my_randomizer" +Manually Importing from CSV ++++++++++++++++++++++++++++ +A ``Randomizer`` class will call ``import_list`` when it is instantiated +for the first time. If you want to load the CSV file manually, +import the ``Randomizer`` class and call ``import_list()``. + >>> randomizer_cls = site_randomizers.get("my_randomizer") + >>> randomizer_cls.import_list() + Import CSV data + Randomizer: + - Name: my_randomizer + - Assignments: {'active': 1, 'placebo': 2} + - Model: edc_randomization.myrandomizationlist + - Path: /home/me/.etc/randomization_list.csv + - Imported 5 SIDs for randomizer `my_randomizer` into model `edc_randomization.myrandomizationlist` + from /home/me/.etc/randomization_list.csv. + - Verified OK. +Manually Export to CSV +++++++++++++++++++++++ + >>> from edc_randomization.utils import export_randomization_list + >>> export_randomization_list(randomizer_name="default",path="~/", username="erikvw") +If the user does not have permissions to view the randomizationlist table, a ``RandomizationListExporterError`` will be raised: + RandomizationListExporterError: User `erikvw` does not have permission to view 'edc_randomization.randomizationlist' + +%prep +%autosetup -n edc-randomization-0.3.45 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-edc-randomization -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Mon May 15 2023 Python_Bot <Python_Bot@openeuler.org> - 0.3.45-1 +- Package Spec generated |
