meta-edc 1.1.19__py3-none-any.whl → 1.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of meta-edc might be problematic. Click here for more details.

Files changed (30) hide show
  1. meta_analytics/dataframes/get_glucose_df.py +10 -11
  2. meta_consent/admin/__init__.py +0 -1
  3. meta_consent/forms/__init__.py +0 -2
  4. meta_consent/migrations/0034_remove_subjectconsentspfq_site_and_more.py +23 -0
  5. meta_consent/models/__init__.py +0 -2
  6. meta_consent/models/signals.py +13 -16
  7. meta_edc/settings/defaults.py +14 -10
  8. meta_edc/urls.py +1 -0
  9. {meta_edc-1.1.19.dist-info → meta_edc-1.2.1.dist-info}/METADATA +6 -5
  10. {meta_edc-1.1.19.dist-info → meta_edc-1.2.1.dist-info}/RECORD +23 -26
  11. meta_prn/baker_recipes.py +6 -6
  12. meta_prn/migrations/0069_alter_historicaloffstudymedication_singleton_field_and_more.py +37 -0
  13. meta_rando/migrations/0008_delete_spfqlist.py +16 -0
  14. meta_rando/models/__init__.py +0 -1
  15. meta_subject/admin/__init__.py +0 -2
  16. meta_subject/choices.py +0 -37
  17. meta_subject/constants.py +0 -14
  18. meta_subject/forms/__init__.py +0 -2
  19. meta_subject/migrations/0234_remove_spfq_site_remove_spfq_subject_visit_and_more.py +27 -0
  20. meta_subject/models/__init__.py +0 -2
  21. meta_subject/models/health_economics/health_economics_simple.py +2 -2
  22. meta_consent/admin/subject_consent_spfq_admin.py +0 -58
  23. meta_consent/forms/subject_consent_spfq_form.py +0 -55
  24. meta_consent/models/subject_consent_spfq.py +0 -103
  25. meta_rando/models/spfq_list.py +0 -26
  26. meta_subject/admin/spfg_admin.py +0 -103
  27. meta_subject/forms/spfq_form.py +0 -65
  28. meta_subject/models/spfq.py +0 -190
  29. {meta_edc-1.1.19.dist-info → meta_edc-1.2.1.dist-info}/WHEEL +0 -0
  30. {meta_edc-1.1.19.dist-info → meta_edc-1.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,27 @@
1
+ # Generated by Django 5.2.6 on 2025-09-30 22:50
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("meta_subject", "0233_historicalspfq_spfq"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name="spfq",
15
+ name="site",
16
+ ),
17
+ migrations.RemoveField(
18
+ model_name="spfq",
19
+ name="subject_visit",
20
+ ),
21
+ migrations.DeleteModel(
22
+ name="HistoricalSpfq",
23
+ ),
24
+ migrations.DeleteModel(
25
+ name="Spfq",
26
+ ),
27
+ ]
@@ -42,7 +42,6 @@ from .signals import (
42
42
  update_pregnancy_notification_on_delivery_post_save,
43
43
  update_schedule_on_delivery_post_save,
44
44
  )
45
- from .spfq import Spfq
46
45
  from .study_medication import StudyMedication
47
46
  from .subject_requisition import SubjectRequisition
48
47
  from .subject_visit import SubjectVisit
@@ -86,7 +85,6 @@ __all__ = [
86
85
  "PhysicalExam",
87
86
  "PregnancyUpdate",
88
87
  "Sf12",
89
- "Spfq",
90
88
  "StudyMedication",
91
89
  "SubjectRequisition",
92
90
  "SubjectVisit",
@@ -1,12 +1,12 @@
1
1
  from django.db import models
2
2
  from edc_constants.choices import MARITAL_STATUS
3
- from edc_he.model_mixins import HealthEconomicsEducationModelMixin
3
+ from edc_he.model_mixins import EducationModelMixin
4
4
  from edc_model.models import BaseUuidModel
5
5
 
6
6
  from ...model_mixins import CrfModelMixin
7
7
 
8
8
 
9
- class HealthEconomicsSimple(HealthEconomicsEducationModelMixin, CrfModelMixin, BaseUuidModel):
9
+ class HealthEconomicsSimple(EducationModelMixin, CrfModelMixin, BaseUuidModel):
10
10
  occupation = models.CharField(
11
11
  verbose_name="What is your occupation/profession?", max_length=50
12
12
  )
@@ -1,58 +0,0 @@
1
- from django.contrib import admin
2
- from django.utils.translation import gettext as _
3
- from django_audit_fields import audit_fieldset_tuple
4
- from edc_model_admin.dashboard import ModelAdminSubjectDashboardMixin
5
- from edc_model_admin.history import SimpleHistoryAdmin
6
-
7
- from ..admin_site import meta_consent_admin
8
- from ..forms import SubjectConsentSpfqForm
9
- from ..models import SubjectConsentSpfq
10
-
11
-
12
- @admin.register(SubjectConsentSpfq, site=meta_consent_admin)
13
- class SubjectConsentSpfqAdmin(
14
- ModelAdminSubjectDashboardMixin,
15
- SimpleHistoryAdmin,
16
- ):
17
- form = SubjectConsentSpfqForm
18
-
19
- fieldsets = (
20
- (
21
- None,
22
- {
23
- "fields": (
24
- "subject_identifier",
25
- "initials",
26
- "gender",
27
- "language",
28
- "consent_datetime",
29
- )
30
- },
31
- ),
32
- (
33
- "Review Questions",
34
- {
35
- "fields": (
36
- "consent_reviewed",
37
- "study_questions",
38
- "assessment_score",
39
- "consent_signature",
40
- "consent_copy",
41
- ),
42
- "description": _("The following questions are directed to the interviewer."),
43
- },
44
- ),
45
- audit_fieldset_tuple,
46
- )
47
-
48
- search_fields = ("subject_identifier",)
49
-
50
- radio_fields = { # noqa: RUF012
51
- "gender": admin.VERTICAL,
52
- "assessment_score": admin.VERTICAL,
53
- "consent_copy": admin.VERTICAL,
54
- "consent_reviewed": admin.VERTICAL,
55
- "consent_signature": admin.VERTICAL,
56
- "language": admin.VERTICAL,
57
- "study_questions": admin.VERTICAL,
58
- }
@@ -1,55 +0,0 @@
1
- from django import forms
2
- from django.core.exceptions import ObjectDoesNotExist
3
- from edc_action_item.forms import ActionItemFormMixin
4
- from edc_form_validators import FormValidatorMixin
5
- from edc_registration.models import RegisteredSubject
6
- from edc_sites.modelform_mixins import SiteModelFormMixin
7
-
8
- from meta_consent.models import SubjectConsentSpfq
9
- from meta_rando.models import SpfqList
10
-
11
-
12
- class SubjectConsentSpfqForm(
13
- SiteModelFormMixin, ActionItemFormMixin, FormValidatorMixin, forms.ModelForm
14
- ):
15
- def clean(self):
16
- cleaned_data = super().clean()
17
-
18
- try:
19
- RegisteredSubject.objects.get(
20
- subject_identifier=cleaned_data.get("subject_identifier"),
21
- initials=cleaned_data.get("initials"),
22
- gender=cleaned_data.get("gender"),
23
- )
24
- except ObjectDoesNotExist as e:
25
- raise forms.ValidationError(
26
- {
27
- "__all__": (
28
- "Subject not known to the META trial. "
29
- "Check that the identifier, initials and gender match the patient "
30
- "register from the main META trial."
31
- )
32
- }
33
- ) from e
34
- try:
35
- SpfqList.objects.get(
36
- subject_identifier=cleaned_data.get("subject_identifier"),
37
- )
38
- except ObjectDoesNotExist as e:
39
- raise forms.ValidationError(
40
- {
41
- "__all__": (
42
- "Subject not found .A subject with this identifier "
43
- "has not been selected for the sub-study."
44
- )
45
- }
46
- ) from e
47
- return cleaned_data
48
-
49
- class Meta:
50
- model = SubjectConsentSpfq
51
- fields = "__all__"
52
- widgets = { # noqa: RUF012
53
- "action_identifier": forms.TextInput(attrs={"readonly": "readonly"}),
54
- "subject_identifier": forms.TextInput(attrs={"readonly": "readonly"}),
55
- }
@@ -1,103 +0,0 @@
1
- from django.conf import settings
2
- from django.contrib.sites.managers import CurrentSiteManager
3
- from django.core.validators import RegexValidator
4
- from django.db import models
5
- from django.utils import timezone
6
- from django.utils.translation import gettext_lazy as _
7
- from django_crypto_fields.fields import EncryptedCharField
8
- from edc_consent.field_mixins import (
9
- ReviewFieldsMixin,
10
- )
11
- from edc_consent.managers import ConsentObjectsManager
12
- from edc_constants.choices import GENDER
13
- from edc_constants.constants import NULL_STRING
14
- from edc_model.models import BaseUuidModel, HistoricalRecords
15
- from edc_sites.model_mixins import SiteModelMixin
16
-
17
- from .model_mixins import SearchSlugModelMixin
18
-
19
-
20
- class SubjectConsentSpfq(
21
- SiteModelMixin,
22
- ReviewFieldsMixin,
23
- SearchSlugModelMixin,
24
- BaseUuidModel,
25
- ):
26
- """A model completed by the user that captures the ICF for SPFQ."""
27
-
28
- subject_identifier = models.CharField(
29
- verbose_name=_("Subject identifier"), max_length=50, unique=True
30
- )
31
-
32
- initials = EncryptedCharField(
33
- validators=[
34
- RegexValidator(
35
- regex=r"^[A-Z]{2,3}$",
36
- message="Ensure initials consist of letters only in upper case, no spaces.",
37
- )
38
- ],
39
- default=NULL_STRING,
40
- )
41
-
42
- gender = models.CharField(
43
- verbose_name="Gender",
44
- choices=GENDER,
45
- max_length=1,
46
- )
47
-
48
- consent_datetime = models.DateTimeField(
49
- verbose_name=_("Consent datetime"), default=timezone.now
50
- )
51
-
52
- report_datetime = models.DateTimeField(null=True, editable=False)
53
-
54
- language = models.CharField(
55
- verbose_name=_("Language of consent"),
56
- max_length=25,
57
- choices=settings.LANGUAGES,
58
- help_text=_(
59
- "The language used for the consent process will "
60
- "also be used during data collection."
61
- ),
62
- )
63
-
64
- model_name = models.CharField(
65
- verbose_name="model",
66
- max_length=50,
67
- help_text=(
68
- "label_lower of this model class. Will be different if "
69
- "instance has been added/edited via a proxy model"
70
- ),
71
- default=NULL_STRING,
72
- editable=False,
73
- )
74
-
75
- version = models.CharField(
76
- verbose_name="Consent version",
77
- max_length=10,
78
- default="1.0",
79
- help_text="See 'consent definition' for consent versions by period.",
80
- editable=False,
81
- )
82
-
83
- on_site = CurrentSiteManager()
84
-
85
- objects = ConsentObjectsManager()
86
-
87
- history = HistoricalRecords()
88
-
89
- def __str__(self):
90
- return f"{self.subject_identifier} V{self.version}"
91
-
92
- def save(self, *args, **kwargs):
93
- if not self.id:
94
- self.model_name = self._meta.label_lower
95
- self.report_datetime = self.consent_datetime
96
- super().save(*args, **kwargs)
97
-
98
- def natural_key(self):
99
- return self.subject_identifier, self.version
100
-
101
- class Meta(BaseUuidModel.Meta):
102
- verbose_name = "Subject Consent for SPFQ"
103
- verbose_name_plural = "Subject Consents for SPFQ"
@@ -1,26 +0,0 @@
1
- from django.db import models
2
- from edc_constants.choices import GENDER
3
- from edc_identifier.model_mixins import UniqueSubjectIdentifierFieldMixin
4
- from edc_model.models import BaseUuidModel
5
- from edc_sites.model_mixins import SiteModelMixin
6
-
7
-
8
- class SpfqList(SiteModelMixin, UniqueSubjectIdentifierFieldMixin, BaseUuidModel):
9
- sid = models.IntegerField(unique=True)
10
-
11
- last_visit_code = models.CharField(max_length=25)
12
-
13
- last_appt_datetime = models.DateTimeField()
14
-
15
- gender = models.CharField(max_length=10, choices=GENDER)
16
-
17
- weight_bin = models.CharField(
18
- max_length=25,
19
- choices=(("lt_35", "<35"), ("gte_35__lte_49", "35-49"), ("gte_50", ">=50")),
20
- )
21
-
22
- date_generated = models.DateTimeField()
23
-
24
- class Meta(BaseUuidModel.Meta):
25
- verbose_name = "SPFQ List"
26
- verbose_name_plural = "SPFQ List"
@@ -1,103 +0,0 @@
1
- from django.contrib import admin
2
- from django.utils.safestring import mark_safe
3
- from django_audit_fields import audit_fieldset_tuple
4
- from edc_crf.fieldset import crf_status_fieldset
5
- from edc_model_admin.history import SimpleHistoryAdmin
6
-
7
- from ..admin_site import meta_subject_admin
8
- from ..forms import SpfqForm
9
- from ..models import Spfq
10
- from .modeladmin import CrfModelAdminMixin
11
-
12
-
13
- @admin.register(Spfq, site=meta_subject_admin)
14
- class SpfqAdmin(CrfModelAdminMixin, SimpleHistoryAdmin):
15
- additional_instructions = mark_safe(
16
- "The Study Participant Feedback Questionnaire Toolkit (SPFQ) is a set of three "
17
- "brief validated patient questionnaires designed to capture patients’ experiences "
18
- "at the beginning, during, and end of each clinical study, independent of disease "
19
- "and treatment.<BR>"
20
- "<B><font color='orange'>Interviewer to read</font></B>: Thank you for your "
21
- "participation. Your experiences in this trial are important to us and we "
22
- "would like to hear about them. Your answers will help us improve future trials. "
23
- "There are no right or wrong answers. Your answers will be kept anonymous and "
24
- "will not impact your participation in this trial."
25
- )
26
-
27
- form = SpfqForm
28
-
29
- fieldsets = (
30
- (None, {"fields": ("subject_visit", "report_datetime")}),
31
- (
32
- "Section A: Your experience before you started the study",
33
- {
34
- "description": "Please select one response for each of the following items.",
35
- "fields": ("a01", "a02", "a03", "a04"),
36
- },
37
- ),
38
- (
39
- "Section B: Your experience during the trial",
40
- {
41
- "description": "Please select one response for each of the following items.",
42
- "fields": (
43
- "b01",
44
- "b02",
45
- "b03",
46
- "b04",
47
- "b05",
48
- "b06",
49
- "b07",
50
- "b08",
51
- "b09",
52
- "b10",
53
- ),
54
- },
55
- ),
56
- (
57
- "Section C: Your experience at the end of the trial",
58
- {
59
- "description": "Please select one response for each of the following items.",
60
- "fields": (
61
- "c01",
62
- "c02",
63
- "c03",
64
- "c04",
65
- "c05",
66
- "c06",
67
- "c07",
68
- "c08",
69
- "c09",
70
- "c10",
71
- ),
72
- },
73
- ),
74
- crf_status_fieldset,
75
- audit_fieldset_tuple,
76
- )
77
-
78
- radio_fields = { # noqa: RUF012
79
- "a01": admin.VERTICAL,
80
- "a02": admin.VERTICAL,
81
- "a03": admin.VERTICAL,
82
- "a04": admin.VERTICAL,
83
- "b01": admin.VERTICAL,
84
- "b02": admin.VERTICAL,
85
- "b03": admin.VERTICAL,
86
- "b04": admin.VERTICAL,
87
- "b05": admin.VERTICAL,
88
- "b06": admin.VERTICAL,
89
- "b07": admin.VERTICAL,
90
- "b08": admin.VERTICAL,
91
- "b09": admin.VERTICAL,
92
- "b10": admin.VERTICAL,
93
- "c01": admin.VERTICAL,
94
- "c02": admin.VERTICAL,
95
- "c03": admin.VERTICAL,
96
- "c04": admin.VERTICAL,
97
- "c05": admin.VERTICAL,
98
- "c06": admin.VERTICAL,
99
- "c07": admin.VERTICAL,
100
- "c08": admin.VERTICAL,
101
- "c09": admin.VERTICAL,
102
- "c10": admin.VERTICAL,
103
- }
@@ -1,65 +0,0 @@
1
- from django import forms
2
- from django.core.exceptions import ObjectDoesNotExist
3
- from edc_crf.crf_form_validator import CrfFormValidator
4
- from edc_crf.modelform_mixins import CrfModelFormMixin
5
- from edc_registration.models import RegisteredSubject
6
-
7
- from meta_consent.models import SubjectConsentSpfq
8
- from meta_rando.models import SpfqList
9
-
10
- from ..models import Spfq
11
-
12
-
13
- class SpfqFormValidator(CrfFormValidator):
14
- pass
15
-
16
-
17
- class SpfqForm(CrfModelFormMixin, forms.ModelForm):
18
- form_validator_cls = SpfqFormValidator
19
-
20
- def clean(self):
21
- cleaned_data = super().clean()
22
-
23
- try:
24
- RegisteredSubject.objects.get(
25
- subject_identifier=cleaned_data.get("subject_identifier"),
26
- initials=cleaned_data.get("initials"),
27
- gender=cleaned_data.get("gender"),
28
- )
29
- except ObjectDoesNotExist as e:
30
- raise forms.ValidationError(
31
- {
32
- "__all__": (
33
- "Subject not known to the META trial. "
34
- "Check that the identifier, initials and gender match the patient "
35
- "register from the main META trial."
36
- )
37
- }
38
- ) from e
39
- try:
40
- SpfqList.objects.get(
41
- subject_identifier=cleaned_data.get("subject_identifier"),
42
- )
43
- except ObjectDoesNotExist as e:
44
- raise forms.ValidationError(
45
- {
46
- "__all__": (
47
- "Subject not found. A subject with this identifier "
48
- "has not been selected for the sub-study."
49
- )
50
- }
51
- ) from e
52
-
53
- try:
54
- SubjectConsentSpfq.objects.get(
55
- subject_identifier=cleaned_data.get("subject_identifier"),
56
- )
57
- except ObjectDoesNotExist as e:
58
- raise forms.ValidationError(
59
- {"__all__": "Subject not consented for the sub-study."}
60
- ) from e
61
- return cleaned_data
62
-
63
- class Meta:
64
- model = Spfq
65
- fields = "__all__"
@@ -1,190 +0,0 @@
1
- from django.db import models
2
- from edc_constants.choices import DIFFICULT_TO_EASY_CHOICE, DISAGREE_TO_AGREE_CHOICE, YES_NO
3
- from edc_model.models import BaseUuidModel
4
-
5
- from ..choices import (
6
- LESS_EXPECTED_TO_MORE_EXPECTED_CHOICE,
7
- NOT_AT_ALL_TO_HIGHLY_CHOICE,
8
- NOT_AT_ALL_TO_SEVERE_CHOICE,
9
- )
10
- from ..model_mixins import CrfModelMixin
11
-
12
-
13
- class Spfq(CrfModelMixin, BaseUuidModel):
14
- a01 = models.CharField(
15
- verbose_name="I understood the treatment process in this trial",
16
- max_length=25,
17
- choices=DISAGREE_TO_AGREE_CHOICE,
18
- help_text="for example: when and how to take or use a treatment",
19
- )
20
- a02 = models.CharField(
21
- verbose_name=(
22
- "The information given to me before "
23
- "I joined the trial was everything I wanted to know"
24
- ),
25
- max_length=25,
26
- choices=DISAGREE_TO_AGREE_CHOICE,
27
- help_text=(
28
- "for example: visits and procedures, "
29
- "time commitment, who to contact with questions"
30
- ),
31
- )
32
- a03 = models.CharField(
33
- verbose_name=(
34
- "The information given to me before I "
35
- "joined the trial was easy for me to understand"
36
- ),
37
- max_length=25,
38
- choices=DISAGREE_TO_AGREE_CHOICE,
39
- help_text=(
40
- "for example: visits and procedures, "
41
- "time commitment, who to contact with questions"
42
- ),
43
- )
44
- a04 = models.CharField(
45
- verbose_name=(
46
- "I felt comfortable that I could ask any questions before I joined the trial"
47
- ),
48
- max_length=25,
49
- choices=DISAGREE_TO_AGREE_CHOICE,
50
- )
51
- b01 = models.CharField(
52
- verbose_name="Overall I was satisfied with the trial site",
53
- max_length=25,
54
- choices=DISAGREE_TO_AGREE_CHOICE,
55
- help_text=(
56
- "for example: comfort and privacy of treatment area, "
57
- "waiting area, parking, ease of access to the site"
58
- ),
59
- )
60
- b02 = models.CharField(
61
- verbose_name="My trial visits were well organized",
62
- max_length=25,
63
- choices=DISAGREE_TO_AGREE_CHOICE,
64
- )
65
- b03 = models.CharField(
66
- verbose_name="My trial visits were scheduled at a convenient time for me",
67
- max_length=25,
68
- choices=DISAGREE_TO_AGREE_CHOICE,
69
- )
70
- b04 = models.CharField(
71
- verbose_name="The staff treated me with respect",
72
- max_length=25,
73
- choices=DISAGREE_TO_AGREE_CHOICE,
74
- )
75
- b05 = models.CharField(
76
- verbose_name="I felt comfortable that I could ask questions during the trial",
77
- max_length=25,
78
- choices=DISAGREE_TO_AGREE_CHOICE,
79
- )
80
- b06 = models.CharField(
81
- verbose_name=(
82
- "I was satisfied with the answers I have received to my questions during the trial"
83
- ),
84
- max_length=25,
85
- choices=DISAGREE_TO_AGREE_CHOICE,
86
- )
87
- b07 = models.CharField(
88
- verbose_name="The time taken to collect data was acceptable to me",
89
- max_length=25,
90
- choices=YES_NO,
91
- help_text="for example: in person visits, questionnaires, forms",
92
- )
93
- b08 = models.CharField(
94
- verbose_name="The impact the trial has had on my daily activities is acceptable",
95
- max_length=25,
96
- choices=YES_NO,
97
- help_text="for example: household chores, work commitments, eating",
98
- )
99
- b09 = models.CharField(
100
- verbose_name="The way in which trial data is being collected is acceptable to me",
101
- max_length=25,
102
- choices=YES_NO,
103
- help_text=(
104
- "for example: in person, online questionnaire, "
105
- "diary, wearable sensors, monitoring machines, technology"
106
- ),
107
- )
108
- b10 = models.CharField(
109
- verbose_name=(
110
- "Optional: I am being kept informed of the results of "
111
- "my medical tests done during the trial, including during screening"
112
- ),
113
- max_length=25,
114
- choices=DISAGREE_TO_AGREE_CHOICE,
115
- help_text="for example: blood tests, scans etc.",
116
- )
117
-
118
- c01 = models.CharField(
119
- verbose_name="I was informed when I had completed the trial",
120
- max_length=25,
121
- choices=YES_NO,
122
- )
123
-
124
- c02 = models.CharField(
125
- verbose_name=(
126
- "I was informed of any future opportunities to "
127
- "access the overall trial results if I wanted to"
128
- ),
129
- max_length=25,
130
- choices=YES_NO,
131
- )
132
-
133
- c03 = models.CharField(
134
- verbose_name="How easy was it to take the medication?",
135
- max_length=25,
136
- choices=DIFFICULT_TO_EASY_CHOICE,
137
- )
138
-
139
- c04 = models.CharField(
140
- verbose_name="Did you experience any burden or side effects?",
141
- max_length=25,
142
- choices=NOT_AT_ALL_TO_SEVERE_CHOICE,
143
- )
144
-
145
- c05 = models.CharField(
146
- verbose_name="How acceptable was it to take the drug?",
147
- max_length=25,
148
- choices=NOT_AT_ALL_TO_HIGHLY_CHOICE,
149
- )
150
-
151
- c06 = models.CharField(
152
- verbose_name="How easy was it to fit the medication into your routine?",
153
- max_length=25,
154
- choices=DIFFICULT_TO_EASY_CHOICE,
155
- )
156
-
157
- c07 = models.CharField(
158
- verbose_name="How burdensome was taking part in the trial?",
159
- max_length=25,
160
- choices=NOT_AT_ALL_TO_SEVERE_CHOICE,
161
- )
162
-
163
- c08 = models.CharField(
164
- verbose_name=(
165
- "Overall, I was satisfied with the information "
166
- "I received about future support after the trial"
167
- ),
168
- max_length=25,
169
- choices=DISAGREE_TO_AGREE_CHOICE,
170
- help_text="for example: future treatment, follow-up contact details",
171
- )
172
-
173
- c09 = models.CharField(
174
- verbose_name="Overall, I was satisfied with my trial experience",
175
- max_length=25,
176
- choices=DISAGREE_TO_AGREE_CHOICE,
177
- )
178
-
179
- c10 = models.CharField(
180
- verbose_name=(
181
- "Compared to when the trial started, the overall "
182
- "commitment required was similar to what I expected"
183
- ),
184
- max_length=25,
185
- choices=LESS_EXPECTED_TO_MORE_EXPECTED_CHOICE,
186
- )
187
-
188
- class Meta(CrfModelMixin.Meta, BaseUuidModel.Meta):
189
- verbose_name = "Feedback Questionnaire (SPFQ)"
190
- verbose_name_plural = "Feedback Questionnaires (SPFQ)"