def test_generate_hanging_list(): rs = ReaderStudyFactory() im1 = ImageFactory(name="im1") im2 = ImageFactory(name="im2") rs.generate_hanging_list() assert rs.hanging_list == [] rs.images.set([im1, im2]) rs.generate_hanging_list() assert rs.hanging_list == [ { "main": "im1" }, { "main": "im2" }, ]
def test_example_ground_truth(client, tmpdir): rs = ReaderStudyFactory() reader, editor = UserFactory(), UserFactory() q1, q2, q3 = ( QuestionFactory( reader_study=rs, question_text="q1", answer_type=Question.ANSWER_TYPE_BOOL, ), QuestionFactory( reader_study=rs, question_text="q2", answer_type=Question.ANSWER_TYPE_CHOICE, ), QuestionFactory( reader_study=rs, question_text="q3", answer_type=Question.ANSWER_TYPE_SINGLE_LINE_TEXT, ), ) CategoricalOptionFactory(question=q2, title="option") im1, im2, im3 = (ImageFactory(), ImageFactory(), ImageFactory()) rs.images.set([im1, im2, im3]) rs.add_reader(reader) rs.add_editor(editor) rs.generate_hanging_list() response = get_view_for_user( viewname="reader-studies:example-ground-truth", client=client, method=client.get, reverse_kwargs={"slug": rs.slug}, follow=True, user=reader, ) assert response.status_code == 403 response = get_view_for_user( viewname="reader-studies:example-ground-truth", client=client, method=client.get, reverse_kwargs={"slug": rs.slug}, follow=True, user=editor, ) assert response.status_code == 200 assert Answer.objects.count() == 0 gt = io.BytesIO() gt.write(response.content) gt.seek(0) response = get_view_for_user( viewname="reader-studies:add-ground-truth", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, follow=True, data={"ground_truth": gt}, user=editor, ) assert response.status_code == 200 assert Answer.objects.count() == rs.images.count() * rs.questions.count() for image in [im1, im2, im3]: for question in [q1, q2, q3]: assert Answer.objects.filter(images=image, question=question, is_ground_truth=True).exists()
def test_reader_study_copy(client): rs = ReaderStudyFactory(title="copied") editor = UserFactory() editor2 = UserFactory() reader = UserFactory() rs.add_reader(reader) rs.add_editor(editor) rs.add_editor(editor2) QuestionFactory( reader_study=rs, answer_type=Question.ANSWER_TYPE_BOOL, question_text="q1", ), QuestionFactory( reader_study=rs, answer_type=Question.ANSWER_TYPE_BOOL, question_text="q2", ) im1, im2 = ImageFactory(), ImageFactory() rs.images.set([im1, im2]) rs.generate_hanging_list() rs.case_text = {im1.name: "test", im2.name: "test2"} rs.save() assert ReaderStudy.objects.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={"title": "1"}, user=reader, follow=True, ) assert response.status_code == 403 assert ReaderStudy.objects.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={"title": "1"}, user=editor, follow=True, ) assert response.status_code == 403 assert ReaderStudy.objects.count() == 1 add_perm = Permission.objects.get( codename=f"add_{ReaderStudy._meta.model_name}") editor.user_permissions.add(add_perm) response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={"title": "1"}, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 2 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "1" assert _rs.images.count() == 0 assert _rs.questions.count() == 0 assert _rs.readers_group.user_set.count() == 0 assert _rs.editors_group.user_set.count() == 1 assert _rs.hanging_list == [] assert _rs.case_text == {} response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "2", "copy_questions": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 3 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "2" assert _rs.questions.count() == 2 assert _rs.images.count() == 0 assert _rs.hanging_list == [] assert _rs.case_text == {} assert _rs.readers_group.user_set.count() == 0 assert _rs.editors_group.user_set.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "3", "copy_images": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 4 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "3" assert _rs.questions.count() == 0 assert _rs.images.count() == 2 assert _rs.hanging_list == [] assert _rs.case_text == {} assert _rs.readers_group.user_set.count() == 0 assert _rs.editors_group.user_set.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "4", "copy_hanging_list": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ( "Hanging list and case text can only be copied if the images are copied as well" in response.rendered_content) assert ReaderStudy.objects.count() == 4 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "4", "copy_images": True, "copy_hanging_list": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 5 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "4" assert _rs.questions.count() == 0 assert _rs.images.count() == 2 assert _rs.hanging_list == rs.hanging_list assert _rs.case_text == {} assert _rs.readers_group.user_set.count() == 0 assert _rs.editors_group.user_set.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "5", "copy_images": True, "copy_case_text": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 6 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "5" assert _rs.questions.count() == 0 assert _rs.images.count() == 2 assert _rs.hanging_list == [] assert _rs.case_text == rs.case_text assert _rs.readers_group.user_set.count() == 0 assert _rs.editors_group.user_set.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "6", "copy_readers": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 7 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "6" assert _rs.questions.count() == 0 assert _rs.images.count() == 0 assert _rs.hanging_list == [] assert _rs.case_text == {} assert _rs.readers_group.user_set.count() == 1 assert _rs.editors_group.user_set.count() == 1 response = get_view_for_user( viewname="reader-studies:copy", client=client, method=client.post, reverse_kwargs={"slug": rs.slug}, data={ "title": "7", "copy_editors": True }, user=editor, follow=True, ) assert response.status_code == 200 assert ReaderStudy.objects.count() == 8 _rs = ReaderStudy.objects.order_by("created").last() assert _rs.title == "7" assert _rs.questions.count() == 0 assert _rs.images.count() == 0 assert _rs.hanging_list == [] assert _rs.case_text == {} assert _rs.readers_group.user_set.count() == 0 assert _rs.editors_group.user_set.count() == 2