Example #1
0
    def single_process_settings(self, env, settings):
        from multisite import SiteID
        settings['SITE_ID'] = SiteID(default=int(env('SITE_ID', 1)))
        settings['INSTALLED_APPS'].append('multisite')

        MIDDLEWARE_CLASSES = settings['MIDDLEWARE_CLASSES']

        # multisite.middleware.DynamicSiteMiddleware must be before
        # cms.middleware.utils.ApphookReloadMiddleware
        MIDDLEWARE_CLASSES.insert(
            MIDDLEWARE_CLASSES.index(
                'cms.middleware.utils.ApphookReloadMiddleware'),
            'django_multisite_plus.middlewares.DynamicSiteMiddleware',
        )

        # djangocms_multisite.middleware.CMSMultiSiteMiddleware must be after
        # cms.middleware.utils.ApphookReloadMiddleware
        MIDDLEWARE_CLASSES.insert(
            MIDDLEWARE_CLASSES.index(
                'cms.middleware.utils.ApphookReloadMiddleware') + 1,
            'django_multisite_plus.middlewares.CMSMultiSiteMiddleware',
        )

        # djangocms-multisite has it's own version of cms urls that cache
        # correctly. This will no longer be necessary for cms versions that
        # include https://github.com/divio/django-cms/pull/5832
        settings['ADDON_URLS_I18N_LAST'] = 'django_multisite_plus.cms_urls'
class TestSystemChecks(SiteTestCaseMixin, TestCase):
    def setUp(self):
        add_or_update_django_sites(sites=self.default_sites)

    @override_settings(
        SITE_ID=SiteID(default=10),
    )
    def test_(self):
        # app_configs = django_apps.get_app_configs()
        holiday_path_check(app_configs=None)

    @override_settings(
        HOLIDAY_FILE=None,
        SITE_ID=SiteID(default=10),
    )
    def test_file(self):
        app_configs = django_apps.get_app_configs()
        errors = holiday_path_check(app_configs=app_configs)
        self.assertIn("edc_facility.001", [error.id for error in errors])

    @override_settings(
        HOLIDAY_FILE=os.path.join(settings.BASE_DIR, "edc_facility", "tests", "blah.csv"),
        SITE_ID=SiteID(default=10),
    )
    def test_bad_path(self):
        app_configs = django_apps.get_app_configs()
        errors = holiday_path_check(app_configs=app_configs)
        self.assertIn("edc_facility.002", [error.id for error in errors])

    @override_settings(
        HOLIDAY_FILE=os.path.join(settings.BASE_DIR, "edc_facility", "tests", "holidays.csv"),
        SITE_ID=SiteID(default=60),
    )
    def test_no_country(self):
        app_configs = django_apps.get_app_configs()
        errors = holiday_country_check(app_configs=app_configs)
        self.assertIn("edc_facility.004", [error.id for error in errors])

    @override_settings(
        HOLIDAY_FILE=os.path.join(settings.BASE_DIR, "edc_facility", "tests", "holidays.csv"),
        SITE_ID=SiteID(default=60),
    )
    def test_unknown_country(self):
        import_holidays()
        app_configs = django_apps.get_app_configs()
        errors = holiday_country_check(app_configs=app_configs)
        self.assertIn("edc_facility.004", [error.id for error in errors])
Example #3
0
 def test_compare_default_site_id(self):
     self.site_id = SiteID(default=self.site.id)
     self.assertEqual(self.site_id, self.site.id)
     self.assertFalse(self.site_id != self.site.id)
     self.assertFalse(self.site_id < self.site.id)
     self.assertTrue(self.site_id <= self.site.id)
     self.assertFalse(self.site_id > self.site.id)
     self.assertTrue(self.site_id >= self.site.id)
Example #4
0
class TestSites(SiteTestCaseMixin, TestCase):
    @override_settings(SITE_ID=SiteID(default=20))
    def test_20(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        obj = TestModelWithSite.objects.create()
        self.assertEqual(obj.site.pk, 20)
        self.assertEqual(obj.site.pk, Site.objects.get_current().pk)

    @override_settings(SITE_ID=SiteID(default=30))
    def test_30(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        obj = TestModelWithSite.objects.create()
        self.assertEqual(obj.site.pk, 30)
        self.assertEqual(obj.site.pk, Site.objects.get_current().pk)

    @override_settings(SITE_ID=SiteID(default=30))
    def test_override_current(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        site = Site.objects.get(pk=40)
        obj = TestModelWithSite.objects.create(site=site)
        self.assertEqual(obj.site.pk, 40)
        self.assertNotEqual(obj.site.pk, Site.objects.get_current().pk)

    def test_get_site_id_by_name(self):
        add_or_update_django_sites(sites=self.default_sites)
        self.assertEqual(get_site_id("mochudi"), 10)

    def test_get_site_id_by_title(self):
        add_or_update_django_sites(sites=self.default_sites)
        self.assertEqual(get_site_id("Mochudi"), 10)

    def test_get_site_id_invalid(self):
        add_or_update_django_sites(sites=self.default_sites)
        self.assertRaises(InvalidSiteError, get_site_id, "blahblah")

    def test_get_site_id_without_sites(self):
        add_or_update_django_sites(sites=self.default_sites)
        self.assertEqual(get_site_id("mochudi"), 10)

    @override_settings(SITE_ID=SiteID(default=30))
    def test_site_profile(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        obj = TestModelWithSite.objects.create()
        site_profile = SiteProfile.objects.get(site=obj.site)
        self.assertEqual(obj.site.siteprofile, site_profile)

    def test_updates_sites(self):
        add_or_update_django_sites(sites=self.default_sites)
        for site in self.default_sites:
            self.assertIn(site.site_id, [obj.id for obj in Site.objects.all()])
        self.assertNotIn("example.com",
                         str([str(obj) for obj in Site.objects.all()]))
        self.assertEqual(len(self.default_sites), Site.objects.all().count())

    def test_domain(self):
        add_or_update_django_sites(sites=self.default_sites)
        obj = Site.objects.get(name="molepolole")
        self.assertEqual("molepolole.clinicedc.org", obj.domain)
        obj = Site.objects.get(name="mochudi")
        self.assertEqual("mochudi.bw.clinicedc.org", obj.domain)

    @override_settings(EDC_SITES_UAT_DOMAIN=True)
    def test_uat_domain(self):
        self.assertTrue(settings.EDC_SITES_UAT_DOMAIN)
        add_or_update_django_sites(sites=self.default_sites)
        obj = Site.objects.get(name="molepolole")
        self.assertEqual("molepolole.uat.clinicedc.org", obj.domain)
        obj = Site.objects.get(name="mochudi")
        self.assertEqual("mochudi.uat.bw.clinicedc.org", obj.domain)

    @override_settings(SITE_ID=SiteID(default=10))
    def test_country(self):
        for sites in self.default_all_sites.values():
            add_or_update_django_sites(sites=sites)
        self.assertEqual("mochudi", Site.objects.get_current().name)
        self.assertEqual("botswana",
                         Site.objects.get_current().siteprofile.country)
        self.assertEqual("botswana", get_current_country())
        self.assertEqual(self.default_all_sites.get("botswana"),
                         get_sites_by_country("botswana"))
        self.assertEqual(self.default_all_sites.get("botswana"),
                         get_sites_by_country())
        self.assertEqual(
            self.default_all_sites.get("botswana"),
            get_sites_by_country(all_sites=self.default_all_sites),
        )

        self.assertEqual(
            self.default_all_sites.get("botswana"),
            get_sites_by_country(country="botswana",
                                 all_sites=self.default_all_sites),
        )

    @override_settings(EDC_SITES_MODULE_NAME=None)
    def test_default_sites_module_domain(self):
        self.assertEqual(get_all_sites(), all_sites)
        for sites in get_all_sites().values():
            add_or_update_django_sites(sites=sites, verbose=False)
        site = Site.objects.get(id=1)
        self.assertEqual(Alias.objects.get(site=site).domain, "localhost")

    @override_settings(EDC_SITES_MODULE_NAME="edc_sites.tests.sites",
                       EDC_SITES_UAT_DOMAIN=False)
    def test_custom_sites_module_domain(self):
        self.assertEqual(get_all_sites(), all_test_sites)
        self.assertEqual(settings.SITE_ID, 10)
        for sites in get_all_sites().values():
            add_or_update_django_sites(sites=sites, verbose=False)
        site = Site.objects.get(id=10)
        self.assertEqual(get_current_country(), "botswana")
        self.assertEqual(
            Alias.objects.get(site=site).domain, "mochudi.bw.clinicedc.org")
Example #5
0
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = "en-us"

TIME_ZONE = "UTC"

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = "/static/"

# SUBJECT_VISIT_MODEL = "sarscov2.subjectvisit"
EMAIL_CONTACTS = {}
ADVERSE_EVENT_APP_LABEL = ""
SUBJECT_REQUISITION_MODEL = ""
SUBJECT_CONSENT_MODEL = ""
EDC_BOOTSTRAP = ""
KEY_PATH = os.path.join(BASE_DIR, "sarscov2", "tests", "etc", "crypto_fields")
ETC_DIR = BASE_DIR
AUTO_CREATE_KEYS = False
SITE_ID = SiteID(default=1)
CRF_STATUS_DEFAULT = COMPLETE
EDC_PROTOCOL_NUMBER = "100"
Example #6
0
 def setUp(self):
     Site.objects.all().delete()
     self.site = Site.objects.create(domain='example.com')
     self.site_id = SiteID()
Example #7
0
        self.host = host

    def get(self, path, data={}, host=None, **extra):
        if host is None:
            host = self.host
        return super(RequestFactory, self).get(path=path,
                                               data=data,
                                               HTTP_HOST=host,
                                               **extra)


@pytest.mark.django_db
@skipUnless(Site._meta.installed,
            'django.contrib.sites is not in settings.INSTALLED_APPS')
@override_settings(
    SITE_ID=SiteID(),
    CACHE_SITES_KEY_PREFIX='__test__',
)
class TestContribSite(TestCase):
    def setUp(self):
        Site.objects.all().delete()
        self.site = Site.objects.create(domain='example.com')
        settings.SITE_ID.set(self.site.id)

    def test_get_current_site(self):
        current_site = Site.objects.get_current()
        self.assertEqual(current_site, self.site)
        self.assertEqual(current_site.id, settings.SITE_ID)


# Because we are a middleware package, we have no views available to test with easily
class TestRegistration(SiteTestCaseMixin, TestCase):
    def test_creates_registered_subject(self):
        obj = SubjectModelOne.objects.create(screening_identifier="12345")
        try:
            RegisteredSubject.objects.get(
                registration_identifier=obj.to_string(
                    obj.registration_identifier))
        except ObjectDoesNotExist:
            self.fail("RegisteredSubject was unexpectedly not created")

    def test_updates_registered_subject(self):
        SubjectModelOne.objects.create(screening_identifier="12345",
                                       dob=get_utcnow() -
                                       relativedelta(years=5))

        new_dob = get_utcnow().date()
        obj = SubjectModelOne.objects.get(screening_identifier="12345")
        obj.dob = new_dob
        obj.save()

        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        self.assertEqual(rs.dob, new_dob)

    def test_creates_registered_subject_overridden(self):
        """Assert creates RegisteredSubject with registration_unique_field overridden."""
        obj = SubjectModelTwo.objects.create(subject_identifier="12345")
        try:
            RegisteredSubject.objects.get(
                subject_identifier=obj.subject_identifier)
        except ObjectDoesNotExist:
            self.fail("RegisteredSubject was unexpectedly not created")

    def test_updates_registered_subject_overridden(self):
        """Assert updates RegisteredSubject with registration_unique_field overridden."""
        SubjectModelTwo.objects.create(subject_identifier="12345",
                                       dob=get_utcnow() -
                                       relativedelta(years=5))

        new_dob = get_utcnow().date()
        obj = SubjectModelTwo.objects.get(subject_identifier="12345")
        obj.dob = new_dob
        obj.save()

        rs = RegisteredSubject.objects.get(
            subject_identifier=obj.subject_identifier)
        self.assertEqual(rs.dob, new_dob)

    def test_creates_registered_subject_overridden2(self):
        """Assert creates RegisteredSubject with registration_unique_field overridden."""
        obj = SubjectModelThree.objects.create(subject_identifier="12345")
        try:
            RegisteredSubject.objects.get(
                subject_identifier=obj.subject_identifier)
        except ObjectDoesNotExist:
            self.fail("RegisteredSubject was unexpectedly not created")

    def test_updates_registered_subject_overridden2(self):
        """Assert updates RegisteredSubject with registration_unique_field overridden."""
        SubjectModelThree.objects.create(subject_identifier="12345",
                                         dob=get_utcnow() -
                                         relativedelta(years=5))

        new_dob = get_utcnow().date()
        obj = SubjectModelThree.objects.get(subject_identifier="12345")
        obj.dob = new_dob
        obj.save()

        rs = RegisteredSubject.objects.get(
            subject_identifier=obj.subject_identifier)
        self.assertEqual(rs.dob, new_dob)

    def test_subject_identifier_as_uuid(self):
        obj = SubjectModelOne.objects.create(screening_identifier="12345")
        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        self.assertFalse(rs.subject_identifier_is_set)

    def test_masks_if_not_set(self):
        obj = SubjectModelOne.objects.create(screening_identifier="12345")
        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        self.assertEqual(str(rs), "<identifier not set>")
        rs.subject_identifier = "ABCDEF"
        rs.save()
        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        self.assertEqual(str(rs), "ABCDEF")

    def test_cannot_change_subject_identifier(self):
        obj = SubjectModelOne.objects.create(screening_identifier="12345")
        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        rs.subject_identifier = "ABCDEF"
        rs.save()
        rs.subject_identifier = "WXYZ"
        self.assertRaises(RegisteredSubjectError, rs.save)

    @override_settings(SITE_ID=SiteID(10))
    def test_site1(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        obj = SubjectModelOne.objects.create(screening_identifier="12345")
        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        self.assertEqual(rs.site.pk, 10)

    @override_settings(SITE_ID=SiteID(20))
    def test_site2(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        obj = SubjectModelOne.objects.create(screening_identifier="12345")
        rs = RegisteredSubject.objects.get(
            registration_identifier=obj.to_string(obj.registration_identifier))
        self.assertEqual(rs.site.pk, 20)
Example #9
0
class TestManifestReport(SiteTestCaseMixin, TestCase):
    def setUp(self):
        add_or_update_django_sites(sites=self.default_sites, verbose=False)
        self.user = User.objects.create(first_name="Noam", last_name="Chomsky")
        consignee = Consignee.objects.create(name="consignee")
        shipper = Shipper.objects.create(name="shipper")
        self.manifest = Manifest.objects.create(consignee=consignee, shipper=shipper)

    @override_settings(SITE_ID=SiteID(default=20))
    def test_report(self):
        self.assertEqual(self.manifest.site.name, "test_site")
        report = ManifestReport(manifest=self.manifest, user=self.user)
        report.render()

    @override_settings(SITE_ID=SiteID(default=20))
    def test_report_shipped(self):
        self.manifest.shipped = True
        self.manifest.save()
        self.assertEqual(self.manifest.site.name, "test_site")
        report = ManifestReport(manifest=self.manifest, user=self.user)
        report.render()

    @override_settings(SITE_ID=SiteID(default=20))
    def test_report_items_not_in_box(self):
        self.manifest.shipped = True
        self.manifest.save()
        for i in range(0, 3):
            ManifestItem.objects.create(
                manifest=self.manifest,
                identifier=f"{self.manifest.manifest_identifier}{i}",
            )
        self.assertEqual(self.manifest.site.name, "test_site")
        report = ManifestReport(manifest=self.manifest, user=self.user)
        self.assertRaises(ManifestReportError, report.render)
        try:
            report.render()
        except ManifestReportError as e:
            self.assertEqual(e.code, "unboxed_item")

    def test_box_type(self):
        BoxType.objects.create(name="box_type", across=8, down=8, total=64)

    def test_box(self):
        box_type = BoxType.objects.create(name="box_type", across=8, down=8, total=64)
        Box.objects.create(box_type=box_type)

    def test_box_item(self):
        box_type = BoxType.objects.create(name="box_type", across=8, down=8, total=64)
        box = Box.objects.create(box_type=box_type)
        BoxItem.objects.create(box=box, identifier=box.box_identifier, position=0)

    @override_settings(SITE_ID=SiteID(default=20))
    def test_report_invalid_invalid_aliquot_identifier(self):
        self.manifest.shipped = True
        self.manifest.save()
        box_type = BoxType.objects.create(name="box_type", across=8, down=8, total=64)
        box = Box.objects.create(box_type=box_type)
        # add box items with invalid aliquot identifiers
        for i in range(0, 3):
            BoxItem.objects.create(box=box, identifier=f"{i}", position=i)
        ManifestItem.objects.create(manifest=self.manifest, identifier=box.box_identifier)
        self.assertEqual(self.manifest.site.name, "test_site")
        report = ManifestReport(manifest=self.manifest, user=self.user)
        self.assertRaises(ManifestReportError, report.render)
        try:
            report.render()
        except ManifestReportError as e:
            self.assertEqual(e.code, "invalid_aliquot_identifier")

    @override_settings(SITE_ID=SiteID(default=20))
    def test_report_invalid_invalid_requisition_identifier(self):
        self.manifest.shipped = True
        self.manifest.save()
        prefix = "ABCDEFG"
        for i in range(0, 3):
            Aliquot.objects.create(count=i, aliquot_identifier=f"{prefix}{i}")
        box_type = BoxType.objects.create(name="box_type", across=8, down=8, total=64)
        box = Box.objects.create(box_type=box_type)
        # add box items with invalid aliquot identifiers
        for index, aliquot in enumerate(Aliquot.objects.all()):
            BoxItem.objects.create(
                box=box, identifier=aliquot.aliquot_identifier, position=index
            )
        ManifestItem.objects.create(manifest=self.manifest, identifier=box.box_identifier)
        self.assertEqual(self.manifest.site.name, "test_site")
        report = ManifestReport(manifest=self.manifest, user=self.user)
        self.assertRaises(ManifestReportError, report.render)
        try:
            report.render()
        except ManifestReportError as e:
            self.assertEqual(e.code, "invalid_requisition_identifier")
class TestRandomizer(TestCase):
    import_randomization_list = False
    site_names = [x.name for x in all_sites]

    def setUp(self):
        super().setUp()
        add_or_update_django_sites(sites=all_sites)
        site_randomizers._registry = {}
        site_randomizers.register(Randomizer)

    def populate_list(self,
                      randomizer_name=None,
                      site_names=None,
                      per_site=None,
                      overwrite_site=None):
        randomizer = site_randomizers.get(randomizer_name)
        make_test_list(
            full_path=randomizer.get_randomization_list_fullpath(),
            site_names=site_names or self.site_names,
            per_site=per_site,
        )
        randomizer.import_list(overwrite=True)
        if overwrite_site:
            site = Site.objects.get_current()
            randomizer.model_cls().objects.update(site_name=site.name)

    @override_settings(SITE_ID=SiteID(40))
    def test_(self):
        randomizer = site_randomizers.get("default")
        randomizer.import_list()

    @override_settings(SITE_ID=SiteID(40))
    def test_with_consent_insufficient_data(self):
        randomizer = site_randomizers.get("default")
        randomizer.import_list()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        self.assertRaises(
            RandomizationError,
            Randomizer,
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=None,
        )

    @override_settings(SITE_ID=SiteID(40))
    def test_with_consent(self):
        randomizer = site_randomizers.get("default")
        randomizer.import_list()
        site = Site.objects.get_current()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", site=site, user_created="erikvw")
        try:
            Randomizer(
                subject_identifier=subject_consent.subject_identifier,
                report_datetime=subject_consent.consent_datetime,
                site=subject_consent.site,
                user=subject_consent.user_created,
            )
        except Exception as e:
            self.fail(f"Exception unexpectedly raised. Got {str(e)}.")

    @override_settings(SITE_ID=SiteID(40))
    def test_with_gender_and_consent(self):
        class RandomizerWithGender(Randomizer):
            def __init__(self, gender=None, **kwargs):
                self.gender = gender
                super().__init__(**kwargs)

            @property
            def extra_required_attrs(self):
                return dict(gender=self.gender)

        randomizer = site_randomizers.get("default")
        randomizer.import_list()
        site = Site.objects.get_current()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345",
            site=site,
            gender=FEMALE,
            user_created="erikvw")
        try:
            RandomizerWithGender(
                subject_identifier=subject_consent.subject_identifier,
                report_datetime=subject_consent.consent_datetime,
                site=subject_consent.site,
                gender=FEMALE,
                user=subject_consent.user_created,
            )
        except Exception as e:
            self.fail(f"Exception unexpectedly raised. Got {str(e)}.")

    @override_settings(SITE_ID=SiteID(40))
    def test_with_list_selects_first(self):
        self.populate_list(randomizer_name="default", overwrite_site=True)
        first_obj = RandomizationList.objects.all().first()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        rando = Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        self.assertEqual(rando.sid, first_obj.sid)

    @override_settings(SITE_ID=SiteID(40))
    def test_updates_registered_subject(self):
        self.populate_list(randomizer_name="default", overwrite_site=True)
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        first_obj = RandomizationList.objects.all().first()
        rs = RegisteredSubject.objects.get(subject_identifier="12345")
        self.assertEqual(rs.subject_identifier, first_obj.subject_identifier)
        self.assertEqual(rs.sid, str(first_obj.sid))
        self.assertEqual(rs.randomization_datetime,
                         first_obj.allocated_datetime)
        self.assertEqual(rs.randomization_list_model,
                         first_obj._meta.label_lower)

    @override_settings(SITE_ID=SiteID(40))
    def test_updates_list_obj_as_allocated(self):
        self.populate_list(randomizer_name="default", overwrite_site=True)
        RandomizationList.objects.all().first()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        first_obj = RandomizationList.objects.all().first()
        self.assertEqual(first_obj.subject_identifier, "12345")
        self.assertTrue(first_obj.allocated)
        self.assertIsNotNone(first_obj.allocated_user)
        self.assertEqual(first_obj.allocated_user,
                         subject_consent.user_created)
        self.assertEqual(first_obj.allocated_datetime,
                         subject_consent.consent_datetime)
        self.assertGreater(first_obj.modified, subject_consent.created)

    @override_settings(SITE_ID=SiteID(40))
    def test_cannot_rerandomize(self):
        self.populate_list(randomizer_name="default", overwrite_site=True)
        first_obj = RandomizationList.objects.all().first()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        rando = Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        self.assertEqual(rando.sid, first_obj.sid)
        self.assertRaises(
            AlreadyRandomized,
            Randomizer,
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )

    @override_settings(SITE_ID=SiteID(40))
    def test_error_condition1(self):
        """Assert raises if RegisteredSubject not updated correctly."""
        self.populate_list(randomizer_name="default", overwrite_site=True)
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        rando = Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        rando.registered_subject.sid = None
        rando.registered_subject.save()
        with self.assertRaises(AlreadyRandomized) as cm:
            Randomizer(
                subject_identifier=subject_consent.subject_identifier,
                report_datetime=subject_consent.consent_datetime,
                site=subject_consent.site,
                user=subject_consent.user_created,
            )
        self.assertEqual(cm.exception.code,
                         "edc_randomization.randomizationlist")

    @override_settings(SITE_ID=SiteID(40))
    def test_error_condition2(self):
        """Assert raises if RandomizationList not updated correctly."""
        self.populate_list(randomizer_name="default", overwrite_site=True)
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", user_created="erikvw")
        rando = Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        rando.registered_subject.sid = None
        rando.registered_subject.save()
        with self.assertRaises(AlreadyRandomized) as cm:
            Randomizer(
                subject_identifier=subject_consent.subject_identifier,
                report_datetime=subject_consent.consent_datetime,
                site=subject_consent.site,
                user=subject_consent.user_created,
            )
        self.assertEqual(cm.exception.code,
                         "edc_randomization.randomizationlist")

    def test_error_condition3(self):
        """Assert raises if RandomizationList not updated correctly."""
        self.populate_list(randomizer_name="default", overwrite_site=True)
        site = Site.objects.get_current()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", site=site, user_created="erikvw")
        Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        RandomizationList.objects.update(subject_identifier=None)
        with self.assertRaises(AlreadyRandomized) as cm:
            Randomizer(
                subject_identifier=subject_consent.subject_identifier,
                report_datetime=subject_consent.consent_datetime,
                site=subject_consent.site,
                user=subject_consent.user_created,
            )
        self.assertEqual(cm.exception.code,
                         "edc_registration.registeredsubject")

    def test_subject_does_not_exist(self):
        self.populate_list(randomizer_name="default", overwrite_site=True)
        site = Site.objects.get_current()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", site=site, user_created="erikvw")
        RegisteredSubject.objects.all().delete()
        self.assertRaises(
            RandomizationError,
            Randomizer,
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_modified,
        )

    def test_str(self):
        self.populate_list(randomizer_name="default", overwrite_site=True)
        site = Site.objects.get_current()
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="12345", site=site, user_created="erikvw")
        Randomizer(
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_created,
        )
        obj = RandomizationList.objects.all().first()
        self.assertTrue(str(obj))

    @override_settings(SITE_ID=SiteID(40))
    def test_for_sites(self):
        """Assert that allocates by site correctly."""

        site_randomizers._registry = {}
        site_randomizers.register(MyRandomizer)

        model_cls = MyRandomizer.model_cls()
        model_cls.objects.all().delete()
        self.populate_list(randomizer_name=MyRandomizer.name,
                           site_names=self.site_names,
                           per_site=5)
        site_names = [obj.site_name for obj in model_cls.objects.all()]
        shuffle(site_names)
        self.assertEqual(len(site_names), len(self.site_names * 5))
        # consent and randomize 5 for each site
        for index, site_name in enumerate(site_names):
            site = Site.objects.get(name=site_name)
            subject_consent = SubjectConsent.objects.create(
                subject_identifier=f"12345{index}",
                site=site,
                user_created="erikvw")
            MyRandomizer(
                subject_identifier=subject_consent.subject_identifier,
                report_datetime=subject_consent.consent_datetime,
                site=subject_consent.site,
                user=subject_consent.user_created,
            )
        # assert consented subjects were allocated SIDs in the
        # correct order per site.
        for site_name in site_names:
            randomized_subjects = [
                (obj.subject_identifier, str(obj.sid))
                for obj in model_cls.objects.filter(
                    allocated_site__name=site_name,
                    subject_identifier__isnull=False).order_by("sid")
            ]
            for index, obj in enumerate(
                    SubjectConsent.objects.filter(
                        site__name=site_name).order_by("consent_datetime")):
                rs = RegisteredSubject.objects.get(
                    subject_identifier=obj.subject_identifier)
                self.assertEqual(obj.subject_identifier,
                                 randomized_subjects[index][0])
                self.assertEqual(rs.sid, randomized_subjects[index][1])

        # clear out any unallocated
        model_cls.objects.filter(subject_identifier__isnull=True).delete()

        # assert raises on next attempt to randomize
        subject_consent = SubjectConsent.objects.create(
            subject_identifier="ABCDEF",
            site=site,
            user_created="erikvw",
            user_modified="erikvw",
        )
        self.assertRaises(
            AllocationError,
            MyRandomizer,
            subject_identifier=subject_consent.subject_identifier,
            report_datetime=subject_consent.consent_datetime,
            site=subject_consent.site,
            user=subject_consent.user_modified,
        )

    @override_settings(SITE_ID=SiteID(40))
    def test_not_loaded(self):
        try:
            RandomizationListVerifier(randomizer_name=Randomizer.name)
        except RandomizationListError as e:
            self.assertIn("Randomization list has not been loaded", str(e))
        else:
            self.fail("RandomizationListError unexpectedly NOT raised")

    @override_settings(SITE_ID=SiteID(40))
    def test_cannot_overwrite(self):
        site_randomizers._registry = {}
        site_randomizers.register(MyRandomizer)
        make_test_list(
            full_path=MyRandomizer.get_randomization_list_fullpath(),
            site_names=self.site_names,
            count=5,
        )
        randomizer = site_randomizers.get(MyRandomizer.name)
        randomizer.import_list()
        self.assertRaises(RandomizationListImportError, randomizer.import_list)

    @override_settings(SITE_ID=SiteID(40))
    def test_can_overwrite_explicit(self):
        site_randomizers._registry = {}
        site_randomizers.register(MyRandomizer)
        make_test_list(
            full_path=MyRandomizer.get_randomization_list_fullpath(),
            site_names=self.site_names,
            count=5,
        )
        randomizer = site_randomizers.get(MyRandomizer.name)
        try:
            randomizer.import_list(overwrite=True)
        except RandomizationListImportError:
            self.fail("RandomizationListImportError unexpectedly raised")

    @override_settings(SITE_ID=SiteID(40))
    def test_invalid_assignment(self):
        site_randomizers._registry = {}
        site_randomizers.register(MyRandomizer)

        MyRandomizer.get_randomization_list_fullpath()
        make_test_list(
            full_path=MyRandomizer.get_randomization_list_fullpath(),
            site_names=self.site_names,
            # change to a different assignments
            assignments=[100, 101],
            count=5,
        )
        self.assertRaises(InvalidAssignment, MyRandomizer.import_list)

    @override_settings(SITE_ID=SiteID(40))
    def test_invalid_sid(self):
        self.populate_list(randomizer_name="default")
        # change to a different starting SID
        obj = RandomizationList.objects.all().order_by("sid").first()
        obj.sid = 99999
        obj.save()

        with self.assertRaises(RandomizationListError) as cm:
            RandomizationListVerifier(randomizer_name=Randomizer.name)
        self.assertIn("Randomization list has invalid SIDs", str(cm.exception))

    @override_settings(SITE_ID=SiteID(40))
    def test_invalid_count(self):
        site = Site.objects.get_current()
        # change number of SIDs in DB
        self.populate_list(randomizer_name="default")
        RandomizationList.objects.create(sid=100,
                                         assignment=ACTIVE,
                                         site_name=site.name)
        self.assertEqual(RandomizationList.objects.all().count(), 51)
        with self.assertRaises(RandomizationListError) as cm:
            RandomizationListVerifier(randomizer_name=Randomizer.name)
        self.assertIn("Randomization list count is off", str(cm.exception))
Example #11
0
"""
A settings file with the bare minimum attributes.
"""
import os
from pathlib import Path

import environ
from multisite import SiteID

APP_NAME = "inte_edc"
BASE_DIR = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.parent)
ENV_DIR = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.parent)

env = environ.Env()
env.read_env(os.path.join(ENV_DIR, ".env"))

EDC_SITES_MODULE_NAME = env.str("EDC_SITES_MODULE_NAME")
ETC_DIR = env.str("DJANGO_ETC_FOLDER")
SECRET_KEY = "blahblahblah"
ALLOWED_HOSTS = ["*"]
SITE_ID = SiteID(default=1)  # 1 is not a site
 def _update_defaults(self):
     """Assumes BASE_DIR, APP_NAME are in kwargs."""
     self.settings.update(
         ALLOWED_HOSTS=["localhost"],
         STATIC_URL="/static/",
         DATABASES={
             # required for tests when acting as a server that deserializes
             "default": {
                 "ENGINE": "django.db.backends.sqlite3",
                 "NAME": os.path.join(self.base_dir, "db.sqlite3"),
             },
             "client": {
                 "ENGINE": "django.db.backends.sqlite3",
                 "NAME": os.path.join(self.base_dir, "db.sqlite3"),
             },
         },
         TEMPLATES=[{
             "BACKEND": "django.template.backends.django.DjangoTemplates",
             "APP_DIRS": True,
             "OPTIONS": {
                 "context_processors": [
                     "django.contrib.auth.context_processors.auth",
                     "django.contrib.messages.context_processors.messages",
                     "django.template.context_processors.request",
                 ]
             },
         }],
         MIDDLEWARE=[
             "django.middleware.security.SecurityMiddleware",
             "django.contrib.sessions.middleware.SessionMiddleware",
             "django.middleware.common.CommonMiddleware",
             "django.middleware.csrf.CsrfViewMiddleware",
             "django.contrib.auth.middleware.AuthenticationMiddleware",
             "django.contrib.messages.middleware.MessageMiddleware",
             "django.middleware.clickjacking.XFrameOptionsMiddleware",
             "django.contrib.sites.middleware.CurrentSiteMiddleware",
         ],
         LANGUAGE_CODE="en-us",
         TIME_ZONE="UTC",
         USE_I18N=True,
         USE_L10N=True,
         USE_TZ=True,
         DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
         EDC_BOOTSTRAP=3,
         GIT_DIR=self.base_dir,
         LIVE_SYSTEM=False,
         REVIEWER_SITE_ID=0,
         SITE_ID=SiteID(default=1) if SiteID else 1,
         SILENCED_SYSTEM_CHECKS=[
             "sites.E101"
         ],  # The SITE_ID setting must be an integer
         SECRET_KEY=uuid4().hex,
         HOLIDAY_FILE=os.path.join(self.base_dir, self.app_name, "tests",
                                   "holidays.csv"),
         INDEX_PAGE_LABEL="",
         DASHBOARD_URL_NAMES={},
         DASHBOARD_BASE_TEMPLATES={},
         EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend",
         EMAIL_CONTACTS={
             "data_request": "*****@*****.**",
             "data_manager": "*****@*****.**",
             "tmg": "*****@*****.**",
         },
         EMAIL_ENABLED=True,
         INDEX_PAGE="http://localhost:8000",
         SENTRY_ENABLED=False,
         TWILIO_ENABLED=False,
         TWILIO_TEST_RECIPIENT="+15555555555",
         SUBJECT_SCREENING_MODEL=f"{self.app_name}.subjectscreening",
         SUBJECT_CONSENT_MODEL=f"{self.app_name}.subjectconsent",
         SUBJECT_VISIT_MODEL=f"{self.app_name}.subjectvisit",
         SUBJECT_VISIT_MISSED_MODEL=f"{self.app_name}.subjectvisitmissed",
         SUBJECT_REQUISITION_MODEL=f"{self.app_name}.subjectrequisition",
         SUBJECT_APP_LABEL=f"{self.app_name}",
         ADVERSE_EVENT_ADMIN_SITE="adverse_event_app_admin",
         ADVERSE_EVENT_APP_LABEL="adverse_event_app",
         DJANGO_COLLECT_OFFLINE_ENABLED=False,
         DJANGO_COLLECT_OFFLINE_FILES_REMOTE_HOST=None,
         DJANGO_COLLECT_OFFLINE_FILES_USB_VOLUME=None,
         DJANGO_COLLECT_OFFLINE_FILES_USER=None,
         DJANGO_COLLECT_OFFLINE_SERVER_IP=None,
         EDC_NAVBAR_DEFAULT=self.app_name,
         EDC_PROTOCOL_PROJECT_NAME="EDC TEST PROJECT",
         EDC_PROTOCOL_STUDY_OPEN_DATETIME=arrow.utcnow().datetime -
         relativedelta(years=1),
         EDC_PROTOCOL_STUDY_CLOSE_DATETIME=arrow.utcnow().datetime +
         relativedelta(years=1),
         EDC_PROTOCOL_NUMBER="101",
         EDC_FACILITY_USE_DEFAULTS=True,
         EDC_FACILITY_DEFAULT_FACILITY_NAME="7-day-clinic",
         LIST_MODEL_APP_LABEL=self.app_name.replace("edc", "lists"),
         EDC_RANDOMIZATION_LIST_PATH=os.path.join(self.base_dir,
                                                  self.app_name, "tests",
                                                  "etc"),
         EDC_RANDOMIZATION_REGISTER_DEFAULT_RANDOMIZER=True,
         EDC_RANDOMIZATION_SKIP_VERIFY_CHECKS=True,
         EDC_SITES_MODULE_NAME=None,
         DATA_DICTIONARY_APP_LABELS=[],
         DEFAULT_FILE_STORAGE="inmemorystorage.InMemoryStorage",
         MIGRATION_MODULES=get_migrations_module(),
         PASSWORD_HASHERS=(
             "django.contrib.auth.hashers.MD5PasswordHasher", ),
     )