Example #1
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="PHQ-9 total score (rating depressive symptoms)",
             axis_label=f"Score for Q1-9 (out of {self.MAX_SCORE_MAIN})",
             axis_min=-0.5,
             axis_max=self.MAX_SCORE_MAIN + 0.5,
             axis_ticks=[
                 TrackerAxisTick(27, "27"),
                 TrackerAxisTick(25, "25"),
                 TrackerAxisTick(20, "20"),
                 TrackerAxisTick(15, "15"),
                 TrackerAxisTick(10, "10"),
                 TrackerAxisTick(5, "5"),
                 TrackerAxisTick(0, "0"),
             ],
             horizontal_lines=[19.5, 14.5, 9.5, 4.5],
             horizontal_labels=[
                 TrackerLabel(23, req.sstring(SS.SEVERE)),
                 TrackerLabel(17, req.sstring(SS.MODERATELY_SEVERE)),
                 TrackerLabel(12, req.sstring(SS.MODERATE)),
                 TrackerLabel(7, req.sstring(SS.MILD)),
                 TrackerLabel(2.25, req.sstring(SS.NONE)),
             ],
         )
     ]
Example #2
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        score = self.total_score()
        exceeds_cutoff_1 = score >= 6
        exceeds_cutoff_2 = score >= 11
        main_dict = {
            None: None,
            "Y": req.sstring(SS.YES),
            "N": req.sstring(SS.NO),
        }
        q_a = ""
        for q in range(1, Dast.NQUESTIONS + 1):
            q_a += tr(
                self.wxstring(req, "q" + str(q)),
                answer(get_from_dict(main_dict, getattr(self, "q" + str(q)))) +
                " — " + answer(str(self.get_score(q))),
            )

        h = """
            <div class="{CssClass.SUMMARY}">
                <table class="{CssClass.SUMMARY}">
                    {tr_is_complete}
                    {total_score}
                    {exceeds_standard_cutoff_1}
                    {exceeds_standard_cutoff_2}
                </table>
            </div>
            <table class="{CssClass.TASKDETAIL}">
                <tr>
                    <th width="80%">Question</th>
                    <th width="20%">Answer</th>
                </tr>
                {q_a}
            </table>
            <div class="{CssClass.COPYRIGHT}">
                DAST: Copyright © Harvey A. Skinner and the Centre for
                Addiction and Mental Health, Toronto, Canada.
                Reproduced here under the permissions granted for
                NON-COMMERCIAL use only. You must obtain permission from the
                copyright holder for any other use.
            </div>
        """.format(
            CssClass=CssClass,
            tr_is_complete=self.get_is_complete_tr(req),
            total_score=tr(
                req.sstring(SS.TOTAL_SCORE),
                answer(score) + f" / {self.NQUESTIONS}",
            ),
            exceeds_standard_cutoff_1=tr_qa(
                self.wxstring(req, "exceeds_standard_cutoff_1"),
                get_yes_no(req, exceeds_cutoff_1),
            ),
            exceeds_standard_cutoff_2=tr_qa(
                self.wxstring(req, "exceeds_standard_cutoff_2"),
                get_yes_no(req, exceeds_cutoff_2),
            ),
            q_a=q_a,
        )
        return h
Example #3
0
 def severity(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     if score >= 31:
         return req.sstring(SS.VERY_SEVERE)
     elif score >= 25:
         return req.sstring(SS.MODERATE_TO_SEVERE)
     elif score >= 18:
         return req.sstring(SS.MILD_TO_MODERATE)
     else:
         return req.sstring(SS.MILD)
Example #4
0
 def severity(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     if score >= 15:
         return req.sstring(SS.SEVERE)
     elif score >= 10:
         return req.sstring(SS.MODERATE)
     elif score >= 5:
         return req.sstring(SS.MILD)
     else:
         return req.sstring(SS.NONE)
Example #5
0
 def get_task_html(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     likelihood = self.likelihood(req)
     main_dict = {
         None: None,
         "Y": req.sstring(SS.YES),
         "N": req.sstring(SS.NO),
     }
     q_a = ""
     for q in range(1, self.NQUESTIONS + 1):
         q_a += tr(
             self.wxstring(req, "q" + str(q)),
             answer(get_from_dict(main_dict, getattr(self, "q" + str(q))))
             + " — "
             + str(self.get_score(q)),
         )
     h = """
         <div class="{CssClass.SUMMARY}">
             <table class="{CssClass.SUMMARY}">
                 {tr_is_complete}
                 {total_score}
                 {problem_likelihood}
             </table>
         </div>
         <table class="{CssClass.TASKDETAIL}">
             <tr>
                 <th width="80%">Question</th>
                 <th width="20%">Answer</th>
             </tr>
             {q_a}
         </table>
         <div class="{CssClass.FOOTNOTES}">
             [1] Total score ≥3 probable, ≥2 possible, 0–1 unlikely.
         </div>
     """.format(
         CssClass=CssClass,
         tr_is_complete=self.get_is_complete_tr(req),
         total_score=tr(
             req.sstring(SS.TOTAL_SCORE),
             answer(score) + f" / {self.NQUESTIONS}",
         ),
         problem_likelihood=tr_qa(
             self.wxstring(req, "problem_likelihood") + " <sup>[1]</sup>",
             likelihood,
         ),
         q_a=q_a,
     )
     return h
Example #6
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        main_dict = {
            None: None,
            0: "0 — " + self.wxstring(req, "q1to3_option0"),
            1: "1 — " + self.wxstring(req, "q1to3_option1"),
            2: "2 — " + self.wxstring(req, "q1to3_option2"),
            3: "3 — " + self.wxstring(req, "q1to3_option3"),
            4: "4 — " + self.wxstring(req, "q1to3_option4"),
        }
        q4_dict = {
            None: None,
            0: "0 — " + self.wxstring(req, "q4_option0"),
            2: "2 — " + self.wxstring(req, "q4_option2"),
            4: "4 — " + self.wxstring(req, "q4_option4"),
        }
        q_a = tr_qa(self.wxstring(req, "q1"),
                    get_from_dict(main_dict, self.q1))
        q_a += tr_qa(self.wxstring(req, "q2"),
                     get_from_dict(main_dict, self.q2))
        q_a += tr_qa(self.wxstring(req, "q3"),
                     get_from_dict(main_dict, self.q3))
        q_a += tr_qa(self.wxstring(req, "q4"), get_from_dict(q4_dict, self.q4))

        tr_total_score = tr(
            req.sstring(SS.TOTAL_SCORE),
            answer(self.total_score()) + f" / {self.MAX_SCORE}",
        )
        tr_positive = tr_qa(
            self.wxstring(req, "positive") + " <sup>[1]</sup>",
            get_yes_no(req, self.is_positive()),
        )
        return f"""
Example #7
0
 def category(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     if self.highschooleducation == 1:
         if score >= 27:
             return req.sstring(SS.NORMAL)
         elif score >= 21:
             return self.wxstring(req, "category_mci")
         else:
             return self.wxstring(req, "category_dementia")
     else:
         if score >= 25:
             return req.sstring(SS.NORMAL)
         elif score >= 20:
             return self.wxstring(req, "category_mci")
         else:
             return self.wxstring(req, "category_dementia")
Example #8
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        score = self.total_score()
        severity = self.severity(req)
        answer_dict = {None: None}
        for option in range(0, 4):
            answer_dict[option] = (str(option) + " — " +
                                   self.wxstring(req, "a" + str(option)))

        q_a = ""
        for q in range(1, self.NQUESTIONS + 1):
            q_a += tr_qa(
                self.wxstring(req, "q" + str(q)),
                get_from_dict(answer_dict, getattr(self, "q" + str(q))),
            )

        return """
            <div class="{CssClass.SUMMARY}">
                <table class="{CssClass.SUMMARY}">
                    {tr_is_complete}
                    {total_score}
                    {anxiety_severity}
                </table>
            </div>
            <div class="{CssClass.EXPLANATION}">
                Ratings are over the last 2 weeks.
            </div>
            <table class="{CssClass.TASKDETAIL}">
                <tr>
                    <th width="50%">Question</th>
                    <th width="50%">Answer</th>
                </tr>
                {q_a}
            </table>
            <div class="{CssClass.FOOTNOTES}">
                [1] ≥15 severe, ≥10 moderate, ≥5 mild.
                Score ≥10 identifies: generalized anxiety disorder with
                sensitivity 89%, specificity 82% (Spitzer et al. 2006, PubMed
                ID 16717171);
                panic disorder with sensitivity 74%, specificity 81% (Kroenke
                et al. 2010, PMID 20633738);
                social anxiety with sensitivity 72%, specificity 80% (Kroenke
                et al. 2010);
                post-traumatic stress disorder with sensitivity 66%,
                specificity 81% (Kroenke et al. 2010).
                The majority of evidence contributing to these figures comes
                from primary care screening studies.
            </div>
        """.format(
            CssClass=CssClass,
            tr_is_complete=self.get_is_complete_tr(req),
            total_score=tr(
                req.sstring(SS.TOTAL_SCORE),
                answer(score) + " / {}".format(self.MAX_SCORE),
            ),
            anxiety_severity=tr(
                self.wxstring(req, "anxiety_severity") + " <sup>[1]</sup>",
                severity,
            ),
            q_a=q_a,
        )
Example #9
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        def bprs_string(x: str) -> str:
            return req.wxstring("bprs", x)

        main_dict = {
            None: None,
            0: "0 — " + bprs_string("old_option0"),
            1: "1 — " + bprs_string("old_option1"),
            2: "2 — " + bprs_string("old_option2"),
            3: "3 — " + bprs_string("old_option3"),
            4: "4 — " + bprs_string("old_option4"),
            5: "5 — " + bprs_string("old_option5"),
            6: "6 — " + bprs_string("old_option6"),
            7: "7 — " + bprs_string("old_option7"),
        }

        q_a = ""
        for i in range(1, self.NQUESTIONS + 1):
            q_a += tr_qa(
                self.wxstring(req, "q" + str(i) + "_s"),
                get_from_dict(main_dict, getattr(self, "q" + str(i))),
            )

        total_score = tr(
            req.sstring(SS.TOTAL_SCORE) +
            f" (0–{self.MAX_SCORE}; 24–{self.MAX_SCORE} if all rated)",
            answer(self.total_score()),
        )
        return f"""
Example #10
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="CIWA total score",
             axis_label=f"Total score (out of {self.MAX_SCORE})",
             axis_min=-0.5,
             axis_max=self.MAX_SCORE + 0.5,
             horizontal_lines=[14.5, 7.5],
             horizontal_labels=[
                 TrackerLabel(17, req.sstring(SS.SEVERE)),
                 TrackerLabel(11, req.sstring(SS.MODERATE)),
                 TrackerLabel(3.75, req.sstring(SS.MILD)),
             ],
         )
     ]
Example #11
0
 def get_task_html(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     exceeds_threshold = self.exceeds_ross_threshold()
     main_dict = {
         None: None,
         "Y": req.sstring(SS.YES),
         "N": req.sstring(SS.NO),
     }
     q_a = ""
     for q in range(1, self.NQUESTIONS + 1):
         q_a += tr(
             self.wxstring(req, "q" + str(q)),
             (answer(get_from_dict(main_dict, getattr(self, "q" + str(q))))
              + answer(" — " + str(self.get_score(q)))),
         )
     return f"""
Example #12
0
 def get_task_html(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     severity = self.severity(req)
     answer_dicts_dict = {}
     for q in self.SCORED_QUESTIONS:
         d = {None: None}
         for option in range(0, 8):
             if option > 4 and q == "q10":
                 continue
             d[option] = self.wxstring(req, q + "_option" + str(option))
         answer_dicts_dict[q] = d
     q_a = ""
     for q in range(1, Ciwa.NSCOREDQUESTIONS + 1):
         q_a += tr_qa(
             self.wxstring(req, "q" + str(q) + "_s"),
             get_from_dict(
                 answer_dicts_dict["q" + str(q)],
                 getattr(self, "q" + str(q)),
             ),
         )
     tr_total_score = tr(req.sstring(SS.TOTAL_SCORE),
                         answer(score) + f" / {self.MAX_SCORE}")
     tr_severity = tr_qa(
         self.wxstring(req, "severity") + " <sup>[1]</sup>", severity)
     return f"""
Example #13
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="GAD-7 total score",
             axis_label="Total score (out of 21)",
             axis_min=-0.5,
             axis_max=self.MAX_SCORE + 0.5,
             horizontal_lines=[14.5, 9.5, 4.5],
             horizontal_labels=[
                 TrackerLabel(17, req.sstring(SS.SEVERE)),
                 TrackerLabel(12, req.sstring(SS.MODERATE)),
                 TrackerLabel(7, req.sstring(SS.MILD)),
                 TrackerLabel(2.25, req.sstring(SS.NONE)),
             ],
         )
     ]
Example #14
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="PHQ-15 total score (rating somatic symptoms)",
             axis_label=f"Score for Q1-15 (out of {self.MAX_TOTAL})",
             axis_min=-0.5,
             axis_max=self.MAX_TOTAL + 0.5,
             horizontal_lines=[14.5, 9.5, 4.5],
             horizontal_labels=[
                 TrackerLabel(22, req.sstring(SS.SEVERE)),
                 TrackerLabel(12, req.sstring(SS.MODERATE)),
                 TrackerLabel(7, req.sstring(SS.MILD)),
                 TrackerLabel(2.25, req.sstring(SS.NONE)),
             ],
         )
     ]
Example #15
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="HAM-A total score",
             axis_label=f"Total score (out of {self.MAX_SCORE})",
             axis_min=-0.5,
             axis_max=self.MAX_SCORE + 0.5,
             horizontal_lines=[30.5, 24.5, 17.5],
             horizontal_labels=[
                 TrackerLabel(33, req.sstring(SS.VERY_SEVERE)),
                 TrackerLabel(27.5, req.sstring(SS.MODERATE_TO_SEVERE)),
                 TrackerLabel(21, req.sstring(SS.MILD_TO_MODERATE)),
                 TrackerLabel(8.75, req.sstring(SS.MILD)),
             ],
         )
     ]
Example #16
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="MOCA total score",
             axis_label=f"Total score (out of {self.MAX_SCORE})",
             axis_min=-0.5,
             axis_max=(self.MAX_SCORE + 0.5),
             horizontal_lines=[25.5],
             horizontal_labels=[
                 TrackerLabel(26, req.sstring(SS.NORMAL),
                              LabelAlignment.bottom),
                 TrackerLabel(25, req.sstring(SS.ABNORMAL),
                              LabelAlignment.top),
             ],
         )
     ]
Example #17
0
 def get_task_html(self, req: CamcopsRequest) -> str:
     main_dict = {
         None: None,
         1: "1 — " + self.wxstring(req, "wemwbs_a1"),
         2: "2 — " + self.wxstring(req, "wemwbs_a2"),
         3: "3 — " + self.wxstring(req, "wemwbs_a3"),
         4: "4 — " + self.wxstring(req, "wemwbs_a4"),
         5: "5 — " + self.wxstring(req, "wemwbs_a5"),
     }
     q_a = ""
     for i in range(1, self.N_QUESTIONS + 1):
         nstr = str(i)
         q_a += tr_qa(
             self.wxstring(req, "wemwbs_q" + nstr),
             get_from_dict(main_dict, getattr(self, "q" + nstr)),
         )
     h = """
         <div class="{css_summary}">
             <table class="{css_summary}">
                 {tr_is_complete}
                 {tr_total_score}
             </table>
         </div>
         <div class="{css_explanation}">
             Ratings are over the last 2 weeks.
         </div>
         <table class="{css_taskdetail}">
             <tr>
                 <th width="60%">Question</th>
                 <th width="40%">Answer</th>
             </tr>
             {q_a}
         </table>
         <div class="{css_copyright}">
             WEMWBS: from Tennant et al. (2007), <i>Health and Quality of
             Life Outcomes</i> 5:63,
             <a href="http://www.hqlo.com/content/5/1/63">
                 http://www.hqlo.com/content/5/1/63</a>;
             © 2007 Tennant et al.; distributed under the terms of the
             Creative Commons Attribution License.
         </div>
     """.format(
         css_summary=CssClass.SUMMARY,
         tr_is_complete=self.get_is_complete_tr(req),
         tr_total_score=tr(
             req.sstring(SS.TOTAL_SCORE),
             answer(self.total_score())
             + f" (range {self.MINTOTALSCORE}–{self.MAXTOTALSCORE})",
         ),
         css_explanation=CssClass.EXPLANATION,
         css_taskdetail=CssClass.TASKDETAIL,
         q_a=q_a,
         css_copyright=CssClass.COPYRIGHT,
     )
     return h
Example #18
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        main_dict = {
            None: None,
            1: "1 — " + self.wxstring(req, "wemwbs_a1"),
            2: "2 — " + self.wxstring(req, "wemwbs_a2"),
            3: "3 — " + self.wxstring(req, "wemwbs_a3"),
            4: "4 — " + self.wxstring(req, "wemwbs_a4"),
            5: "5 — " + self.wxstring(req, "wemwbs_a5"),
        }
        q_a = ""
        for i in range(1, self.N_QUESTIONS + 1):
            nstr = str(i)
            q_a += tr_qa(
                self.wxstring(req, "swemwbs_q" + nstr),
                get_from_dict(main_dict, getattr(self, "q" + nstr)),
            )

        h = """
            <div class="{CssClass.SUMMARY}">
                <table class="{CssClass.SUMMARY}">
                    {tr_is_complete}
                    {total_score}
                </table>
            </div>
            <div class="{CssClass.EXPLANATION}">
                Ratings are over the last 2 weeks.
            </div>
            <table class="{CssClass.TASKDETAIL}">
                <tr>
                    <th width="60%">Question</th>
                    <th width="40%">Answer</th>
                </tr>
                {q_a}
            </table>
            <div class="{CssClass.COPYRIGHT}">
                SWEMWBS: from Stewart-Brown et al. (2009), <i>Health and
                Quality of Life Outcomes</i> 7:15,
                http://www.hqlo.com/content/7/1/15;
                © 2009 Stewart-Brown et al.; distributed under the terms of the
                Creative Commons Attribution License.
            </div>
        """.format(
            CssClass=CssClass,
            tr_is_complete=self.get_is_complete_tr(req),
            total_score=tr(
                req.sstring(SS.TOTAL_SCORE),
                answer(self.total_score())
                + f" (range {self.MINTOTALSCORE}–{self.MAXTOTALSCORE})",
            ),
            q_a=q_a,
        )
        return h
Example #19
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        main_dict = {
            None: None,
            0: "0 — " + self.wxstring(req, "old_option0"),
            1: "1 — " + self.wxstring(req, "old_option1"),
            2: "2 — " + self.wxstring(req, "old_option2"),
            3: "3 — " + self.wxstring(req, "old_option3"),
            4: "4 — " + self.wxstring(req, "old_option4"),
            5: "5 — " + self.wxstring(req, "old_option5"),
            6: "6 — " + self.wxstring(req, "old_option6"),
            7: "7 — " + self.wxstring(req, "old_option7"),
        }
        q19_dict = {
            None: None,
            1: self.wxstring(req, "q19_option1"),
            2: self.wxstring(req, "q19_option2"),
            3: self.wxstring(req, "q19_option3"),
            4: self.wxstring(req, "q19_option4"),
            5: self.wxstring(req, "q19_option5"),
            6: self.wxstring(req, "q19_option6"),
            7: self.wxstring(req, "q19_option7"),
        }
        q20_dict = {
            None: None,
            0: self.wxstring(req, "q20_option0"),
            1: self.wxstring(req, "q20_option1"),
            2: self.wxstring(req, "q20_option2"),
            3: self.wxstring(req, "q20_option3"),
            4: self.wxstring(req, "q20_option4"),
            5: self.wxstring(req, "q20_option5"),
            6: self.wxstring(req, "q20_option6"),
            7: self.wxstring(req, "q20_option7"),
        }

        q_a = ""
        for i in range(1, Bprs.NQUESTIONS - 1):  # only does 1-18
            q_a += tr_qa(
                self.wxstring(req, "q" + str(i) + "_title"),
                get_from_dict(main_dict, getattr(self, "q" + str(i))),
            )
        q_a += tr_qa(self.wxstring(req, "q19_title"),
                     get_from_dict(q19_dict, self.q19))
        q_a += tr_qa(self.wxstring(req, "q20_title"),
                     get_from_dict(q20_dict, self.q20))

        total_score = tr(
            req.sstring(SS.TOTAL_SCORE) +
            f" (0–{self.MAX_SCORE}; 18–{self.MAX_SCORE} if all rated) "
            "<sup>[1]</sup>",
            answer(self.total_score()),
        )
        return f"""
Example #20
0
 def get_description(self, req: CamcopsRequest) -> str:
     if self.meets_criteria_mania_psychotic_schizophrenic():
         return self.wxstring(req, "category_manic_psychotic_schizophrenic")
     elif self.meets_criteria_mania_psychotic_icd():
         return self.wxstring(req, "category_manic_psychotic")
     elif self.meets_criteria_mania_nonpsychotic():
         return self.wxstring(req, "category_manic_nonpsychotic")
     elif self.meets_criteria_hypomania():
         return self.wxstring(req, "category_hypomanic")
     elif self.meets_criteria_none():
         return self.wxstring(req, "category_none")
     else:
         return req.sstring(SS.UNKNOWN)
Example #21
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        score = self.total_score()
        severity = self.severity(req)
        answer_dicts = []
        for q in range(1, self.NQUESTIONS + 1):
            d = {None: None}
            for option in range(0, 5):
                if q == 6 and option > 2:
                    continue
                d[option] = self.wxstring(
                    req, "q" + str(q) + "_option" + str(option))
            answer_dicts.append(d)

        q_a = ""
        for q in range(1, self.NQUESTIONS + 1):
            q_a += tr_qa(
                self.wxstring(req, "q" + str(q) + "_s"),
                get_from_dict(answer_dicts[q - 1], getattr(self,
                                                           "q" + str(q))),
            )

        return """
            <div class="{CssClass.SUMMARY}">
                <table class="{CssClass.SUMMARY}">
                    {tr_is_complete}
                    {total_score}
                    {severity}
                </table>
            </div>
            <table class="{CssClass.TASKDETAIL}">
                <tr>
                    <th width="30%">Question</th>
                    <th width="70%">Answer</th>
                </tr>
                {q_a}
            </table>
            <div class="{CssClass.FOOTNOTES}">
                [1] ≥20 severe, ≥12 moderate, ≥4 mild, &lt;4 none.
            </div>
        """.format(
            CssClass=CssClass,
            tr_is_complete=self.get_is_complete_tr(req),
            total_score=tr(
                req.sstring(SS.TOTAL_SCORE),
                answer(score) + " / {}".format(self.MAX_SCORE),
            ),
            severity=tr_qa(
                self.wxstring(req, "severity") + " <sup>[1]</sup>", severity),
            q_a=q_a,
        )
Example #22
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        score_dict = {
            None: None,
            0: "0 — " + self.wxstring(req, "a0"),
            1: "1 — " + self.wxstring(req, "a1"),
            2: "2 — " + self.wxstring(req, "a2"),
            3: "3 — " + self.wxstring(req, "a3"),
        }

        rows = ""
        for i in range(1, self.N_SCORED_QUESTIONS + 1):
            q_field = "q" + str(i)
            question_cell = "{}. {}".format(i, self.wxstring(req, q_field))
            answer_cell = get_from_dict(score_dict, getattr(self, q_field))

            rows += tr_qa(question_cell, answer_cell)

        rows += tr_qa(
            "16. " + self.wxstring(req, "q16"), get_yes_no_unknown(req, "q16")
        )

        html = """
            <div class="{CssClass.SUMMARY}">
                <table class="{CssClass.SUMMARY}">
                    {tr_is_complete}
                    {total_score}
                </table>
            </div>
            <table class="{CssClass.TASKDETAIL}">
                <tr>
                    <th width="60%">Question</th>
                    <th width="40%">Answer</th>
                </tr>
                {rows}
            </table>
            <div class="{CssClass.FOOTNOTES}">
                [1] Sum for questions 1–15.
            </div>
        """.format(
            CssClass=CssClass,
            tr_is_complete=self.get_is_complete_tr(req),
            total_score=tr(
                req.sstring(SS.TOTAL_SCORE) + " <sup>[1]</sup>",
                answer(self.total_score()) + f" / {self.MAX_SCORE_MAIN}",
            ),
            rows=rows,
        )
        return html
Example #23
0
 def get_answer(self, req: CamcopsRequest, q: int) -> Optional[str]:
     qstr = str(q)
     value = getattr(self, "q" + qstr)
     if value is None:
         return None
     prefix = "q" + qstr + "_a_"
     if value == ALWAYS:
         return self.wxstring(req, prefix + "always")
     if value == SOMETIMES:
         return self.wxstring(req, prefix + "sometimes")
     if value == NEVER:
         return self.wxstring(req, prefix + "never")
     if value == NA:
         if q in SPECIAL_NA_TEXT_QUESTIONS:
             return self.wxstring(req, prefix + "na")
         return req.sstring(SS.NA)
     return None
Example #24
0
 def get_task_html(self, req: CamcopsRequest) -> str:
     return """
         {clinician_comments}
         <div class="{CssClass.SUMMARY}">
             <table class="{CssClass.SUMMARY}">
                 {tr_is_complete}
                 {date_pertains_to}
                 {meets_criteria}
             </table>
         </div>
         <div class="{CssClass.EXPLANATION}">
             {icd10_symptomatic_disclaimer}
         </div>
         <table class="{CssClass.TASKDETAIL}">
             <tr>
                 <th width="80%">Question</th>
                 <th width="20%">Answer</th>
             </tr>
             {mixture_or_rapid_alternation}
             {duration_at_least_2_weeks}
         </table>
         {ICD10_COPYRIGHT_DIV}
     """.format(
         clinician_comments=self.get_standard_clinician_comments_block(
             req, self.comments),
         CssClass=CssClass,
         tr_is_complete=self.get_is_complete_tr(req),
         date_pertains_to=tr_qa(
             req.wappstring(AS.DATE_PERTAINS_TO),
             format_datetime(self.date_pertains_to,
                             DateFormat.LONG_DATE,
                             default=None),
         ),
         meets_criteria=tr_qa(
             req.sstring(SS.MEETS_CRITERIA),
             get_true_false_none(req, self.meets_criteria()),
         ),
         icd10_symptomatic_disclaimer=req.wappstring(
             AS.ICD10_SYMPTOMATIC_DISCLAIMER),
         mixture_or_rapid_alternation=self.get_twocol_bool_row_true_false(
             req, "mixture_or_rapid_alternation", self.wxstring(req, "a")),
         duration_at_least_2_weeks=self.get_twocol_bool_row_true_false(
             req, "duration_at_least_2_weeks", self.wxstring(req, "b")),
         ICD10_COPYRIGHT_DIV=ICD10_COPYRIGHT_DIV,
     )
Example #25
0
 def get_task_html(self, req: CamcopsRequest) -> str:
     score = self.total_score()
     exceeds_cutoff = score >= 2
     q_a = ""
     for q in range(1, Cage.NQUESTIONS + 1):
         q_a += tr_qa(
             str(q) + " — " + self.wxstring(req, "q" + str(q)),
             getattr(self, "q" + str(q)),
         )  # answer is itself Y/N/NULL  # noqa
     total_score = tr(
         req.sstring(SS.TOTAL_SCORE),
         answer(score) + f" / {self.NQUESTIONS}",
     )
     over_threshold = tr_qa(
         self.wxstring(req, "over_threshold"),
         get_yes_no(req, exceeds_cutoff),
     )
     return f"""
 def get_task_html(self, req: CamcopsRequest) -> str:
     q_a = self.text_row(req, "a")
     for i in range(1, self.N_A + 1):
         q_a += self.get_twocol_bool_row_true_false(
             req, "a" + str(i), self.wxstring(req, "a" + str(i)))
     q_a += self.get_twocol_bool_row_true_false(req, "b",
                                                self.wxstring(req, "b"))
     h = """
         {clinician_comments}
         <div class="{CssClass.SUMMARY}">
             <table class="{CssClass.SUMMARY}">
                 {tr_is_complete}
                 {date_pertains_to}
                 {meets_criteria}
             </table>
         </div>
         <table class="{CssClass.TASKDETAIL}">
             <tr>
                 <th width="80%">Question</th>
                 <th width="20%">Answer</th>
             </tr>
             {q_a}
         </table>
         {ICD10_COPYRIGHT_DIV}
     """.format(
         clinician_comments=self.get_standard_clinician_comments_block(
             req, self.comments),
         CssClass=CssClass,
         tr_is_complete=self.get_is_complete_tr(req),
         date_pertains_to=tr_qa(
             req.wappstring(AS.DATE_PERTAINS_TO),
             format_datetime(self.date_pertains_to,
                             DateFormat.LONG_DATE,
                             default=None),
         ),
         meets_criteria=tr_qa(
             req.sstring(SS.MEETS_CRITERIA),
             get_yes_no_none(req, self.meets_criteria()),
         ),
         q_a=q_a,
         ICD10_COPYRIGHT_DIV=ICD10_COPYRIGHT_DIV,
     )
     return h
Example #27
0
    def get_main_description(self, req: CamcopsRequest) -> str:
        if self.meets_criteria_severe_psychotic_schizophrenic():
            return self.wxstring(req,
                                 "category_severe_psychotic_schizophrenic")

        elif self.meets_criteria_severe_psychotic_icd():
            return self.wxstring(req, "category_severe_psychotic")

        elif self.meets_criteria_severe_nonpsychotic():
            return self.wxstring(req, "category_severe_nonpsychotic")

        elif self.meets_criteria_moderate():
            return self.wxstring(req, "category_moderate")

        elif self.meets_criteria_mild():
            return self.wxstring(req, "category_mild")

        elif self.meets_criteria_none():
            return self.wxstring(req, "category_none")

        else:
            return req.sstring(SS.UNKNOWN)
Example #28
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        answers = {
            None: None,
            0: "0 — " + self.wxstring(req, "a0"),
            1: "1 — " + self.wxstring(req, "a1"),
            2: "2 — " + self.wxstring(req, "a2"),
            3: "3 — " + self.wxstring(req, "a3"),
            4: "4 — " + self.wxstring(req, "a4"),
        }
        subscore_html = ""
        answer_html = ""

        for info in self.GROUPS:
            heading = self.wxstring(req, info.heading_xstring_name)
            subscore = info.subscore(self)
            subscore_html += tr(
                heading,
                (answer(round(subscore, DISPLAY_DP)) + f" / {info.max_score}"),
            )
            answer_html += subheading_spanning_two_columns(heading)
            for q in info.fieldnames:
                if q == self.OPTIONAL_Q:
                    # insert additional row
                    answer_html += tr_qa(self.xstring(req, "prefer_no_answer"),
                                         self.ignore_s_q7)
                answer_val = getattr(self, q)
                answer_html += tr_qa(self.wxstring(req, q),
                                     get_from_dict(answers, answer_val))

        tscore = round(self.total_score(), DISPLAY_DP)

        tr_total_score = tr(
            req.sstring(SS.TOTAL_SCORE),
            answer(tscore) + f" / {self.MAX_SCORE_TOTAL}",
        )
        return f"""
Example #29
0
 def get_trackers(self, req: CamcopsRequest) -> List[TrackerInfo]:
     if self.highschooleducation == 1:
         hlines = [26.5, 20.5]
         y_upper = 28.25
         y_middle = 23.5
     else:
         hlines = [24.5, 19.5]
         y_upper = 27.25
         y_middle = 22
     return [
         TrackerInfo(
             value=self.total_score(),
             plot_label="SLUMS total score",
             axis_label=f"Total score (out of {self.MAX_SCORE})",
             axis_min=-0.5,
             axis_max=self.MAX_SCORE + 0.5,
             horizontal_lines=hlines,
             horizontal_labels=[
                 TrackerLabel(y_upper, req.sstring(SS.NORMAL)),
                 TrackerLabel(y_middle, self.wxstring(req, "category_mci")),
                 TrackerLabel(17, self.wxstring(req, "category_dementia")),
             ],
         )
     ]
Example #30
0
    def get_task_html(self, req: CamcopsRequest) -> str:
        def loadvalues(_dict: Dict[int, str], _first: int, _last: int,
                       _xstringprefix: str) -> None:
            for val in range(_first, _last + 1):
                _dict[
                    val] = f"{val} — {self.wxstring(req, f'{_xstringprefix}{val}')}"

        respondent_dict = {}  # type: Dict[int, str]
        loadvalues(
            respondent_dict,
            self.VAL_QA_PATIENT,
            self.VAL_QA_PARTNER_OTHER,
            "qa_a",
        )
        service_dict = {}  # type: Dict[int, str]
        loadvalues(service_dict, self.VAL_QB_INPATIENT, self.VAL_QB_COMMUNITY,
                   "qb_a")
        mh_dict = {}  # type: Dict[int, str]
        loadvalues(
            mh_dict,
            self.VAL_Q1_VERY_WELL,
            self.VAL_Q1_EXTREMELY_UNWELL,
            "q1_a",
        )
        agree_dict = {}  # type: Dict[int, str]
        loadvalues(
            agree_dict,
            self.VAL_STRONGLY_AGREE,
            self.VAL_STRONGLY_DISAGREE,
            "agreement_a",
        )

        q_a_list = []  # type: List[str]

        def addqa(_fieldname: str, _valuedict: Dict[int, str]) -> None:
            xstringname = _fieldname + "_q"
            q_a_list.append(
                tr_qa(
                    self.xstring(req, xstringname),  # not wxstring
                    get_from_dict(_valuedict, getattr(self, _fieldname)),
                ))

        def subheading(_xstringname: str) -> None:
            q_a_list.append(
                subheading_spanning_two_columns(
                    self.wxstring(req, _xstringname)))

        # Preamble
        addqa(self.FN_QA_RESPONDENT, respondent_dict)
        addqa(self.FN_QB_SERVICE_TYPE, service_dict)
        # The bulk
        subheading("q1_stem")
        for fieldname in self.Q1_FIELDS:
            addqa(fieldname, mh_dict)
        subheading("q2_stem")
        for fieldname in self.Q2_FIELDS:
            addqa(fieldname, agree_dict)
        if self.was_inpatient():
            subheading("q3_stem")
            for fieldname in self.Q3_FIELDS:
                addqa(fieldname, agree_dict)
        # General
        q_a_list.append(
            subheading_spanning_two_columns(req.sstring(SS.GENERAL)))
        q_a_list.append(
            tr_qa(self.wxstring(req, "general_comments_q"),
                  self.general_comments))
        q_a_list.append(
            tr_qa(
                self.wxstring(req, "participation_q"),
                get_yes_no_none(req, self.future_participation),
            ))
        if self.offering_participation():
            q_a_list.append(
                tr_qa(
                    self.wxstring(req, "contact_details_q"),
                    self.contact_details,
                ))

        q_a = "\n".join(q_a_list)
        return f"""