def test_csv_export(now, client, answer_type, answer): im = ImageFactory() rs = ReaderStudyFactory() rs.images.add(im) rs.save() editor = UserFactory() rs.add_editor(editor) reader = UserFactory() rs.add_reader(reader) q = QuestionFactory( question_text="foo", reader_study=rs, answer_type=answer_type ) a = AnswerFactory(question=q, answer=answer) a.images.add(im) a.save() response = get_view_for_user( viewname="api:reader-study-export-answers", reverse_kwargs={"pk": rs.pk}, user=editor, client=client, method=client.get, content_type="application/json", ) headers = str(response.serialize_headers()) content = str(response.content) assert response.status_code == 200 assert "Content-Type: text/csv" in headers assert ( f'filename="{rs.slug}-answers-2020-01-01T00:00:00+00:00.csv"' in headers ) assert a.question.question_text in content assert a.question.get_answer_type_display() in content assert str(a.question.required) in content assert a.question.get_image_port_display() in content if isinstance(answer, dict): for key in answer: assert key in content else: assert re.sub(r"[\n\r\t]", " ", str(a.answer)) in content assert im.name in content assert a.creator.username in content response = get_view_for_user( viewname="api:reader-study-export-answers", reverse_kwargs={"pk": rs.pk}, user=reader, client=client, method=client.get, content_type="application/json", ) assert response.status_code == 404
def test_csv_export(client, answer_type, answer): im = ImageFactory() rs = ReaderStudyFactory() rs.images.add(im) rs.save() editor = UserFactory() rs.add_editor(editor) reader = UserFactory() rs.add_reader(reader) q = QuestionFactory(question_text="foo", reader_study=rs, answer_type=answer_type) a = AnswerFactory(question=q, answer=answer) a.images.add(im) a.save() response = get_view_for_user( viewname="api:reader-studies-answer-list", params={"question__reader_study": str(rs.pk)}, user=editor, client=client, method=client.get, HTTP_ACCEPT="text/csv", ) headers = str(response.serialize_headers()) content = str(response.content) assert response.status_code == 200 assert "Content-Type: text/csv" in headers if isinstance(answer, dict): for key in answer: assert key in content else: assert re.sub(r"\n", r"\\n", str(a.answer)) in content assert a.creator.username in content response = get_view_for_user( viewname="api:reader-studies-question-list", params={"reader_study": str(rs.pk)}, user=editor, client=client, method=client.get, HTTP_ACCEPT="text/csv", ) headers = str(response.serialize_headers()) content = str(response.content) assert response.status_code == 200 assert "Content-Type: text/csv" in headers assert a.question.question_text in content assert a.question.get_answer_type_display() in content assert str(a.question.required) in content assert a.question.get_image_port_display() in content response = get_view_for_user( viewname="api:image-list", params={"readerstudies": str(rs.pk)}, user=editor, client=client, method=client.get, HTTP_ACCEPT="text/csv", ) headers = str(response.serialize_headers()) content = str(response.content) assert response.status_code == 200 assert "Content-Type: text/csv" in headers assert im.name in content
def test_progress_for_user(settings, use_display_sets): # noqa: C901 settings.task_eager_propagates = (True, ) settings.task_always_eager = (True, ) rs = ReaderStudyFactory(use_display_sets=use_display_sets) im1, im2 = ImageFactory(name="im1"), ImageFactory(name="im2") q1, q2, q3 = [ QuestionFactory(reader_study=rs), QuestionFactory(reader_study=rs), QuestionFactory(reader_study=rs), ] reader = UserFactory() rs.add_reader(reader) question_perc = 100 / 6 assert rs.get_progress_for_user(reader) == { "diff": 0.0, "hangings": 0.0, "questions": 0.0, } if use_display_sets: ci = ComponentInterface.objects.get(slug="generic-medical-image") civ1 = ComponentInterfaceValueFactory(image=im1, interface=ci) civ2 = ComponentInterfaceValueFactory(image=im2, interface=ci) ds1, ds2 = DisplaySetFactory(reader_study=rs), DisplaySetFactory( reader_study=rs) ds1.values.add(civ1) ds2.values.add(civ2) else: rs.images.set([im1, im2]) rs.hanging_list = [{"main": im1.name}, {"main": im2.name}] rs.save() progress = rs.get_progress_for_user(reader) assert progress["hangings"] == 0 assert progress["questions"] == 0 a11 = AnswerFactory(question=q1, answer="foo", creator=reader) if use_display_sets: a11.display_set = ds1 a11.save() else: a11.images.add(im1) progress = rs.get_progress_for_user(reader) assert progress["hangings"] == 0 assert progress["questions"] == pytest.approx(question_perc) a21 = AnswerFactory(question=q1, answer="foo", creator=reader) if use_display_sets: a21.display_set = ds2 a21.save() else: a21.images.add(im2) progress = rs.get_progress_for_user(reader) assert progress["hangings"] == 0 assert progress["questions"] == pytest.approx(question_perc * 2) a12 = AnswerFactory(question=q2, answer="foo", creator=reader) a13 = AnswerFactory(question=q3, answer="foo", creator=reader) if use_display_sets: a12.display_set = ds1 a12.save() a13.display_set = ds1 a13.save() else: a12.images.add(im1) a13.images.add(im1) progress = rs.get_progress_for_user(reader) assert progress["hangings"] == 50 assert progress["questions"] == pytest.approx(question_perc * 4) editor = UserFactory() rs.add_reader(editor) rs.add_editor(editor) for q in [q1, q2, q3]: if use_display_sets: for ds in [ds1, ds2]: a = AnswerFactory( question=q, answer="foo", creator=editor, is_ground_truth=True, display_set=ds, ) else: for im in [im1, im2]: a = AnswerFactory( question=q, answer="foo", creator=editor, is_ground_truth=True, ) a.images.add(im) progress = rs.get_progress_for_user(editor) assert progress["hangings"] == 0 assert progress["questions"] == 0 for q in [q1, q2, q3]: if use_display_sets: for ds in [ds1, ds2]: a = AnswerFactory( question=q, answer="foo", creator=editor, is_ground_truth=False, display_set=ds, ) else: for im in [im1, im2]: a = AnswerFactory( question=q, answer="foo", creator=editor, is_ground_truth=False, ) a.images.add(im) progress = rs.get_progress_for_user(editor) assert progress["hangings"] == 100.0 assert progress["questions"] == 100.0