forked from botswana-harvard/edc-visit-tracking
-
Notifications
You must be signed in to change notification settings - Fork 1
/
visit_model_admin_mixin.py
155 lines (132 loc) · 5.04 KB
/
visit_model_admin_mixin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from __future__ import annotations
from typing import TYPE_CHECKING
from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist
from django_audit_fields.admin import audit_fieldset_tuple
from edc_appointment.utils import get_appointment_model_cls
from edc_constants.constants import OTHER
from edc_document_status.fieldsets import document_status_fieldset_tuple
from edc_document_status.modeladmin_mixins import DocumentStatusModelAdminMixin
from edc_visit_schedule.fieldsets import (
visit_schedule_fields,
visit_schedule_fieldset_tuple,
)
from ..constants import SCHEDULED, UNSCHEDULED
if TYPE_CHECKING:
from django.core.handlers.wsgi import WSGIRequest
class VisitModelAdminMixin(DocumentStatusModelAdminMixin):
"""ModelAdmin subclass for models with a ForeignKey to
'appointment', such as your visit model(s).
In the child ModelAdmin class set the following attributes,
for example:
visit_attr = 'maternal_visit'
dashboard_type = 'maternal'
"""
date_hierarchy = "report_datetime"
fieldsets = (
(
None,
{
"fields": [
"appointment",
"report_datetime",
"reason",
"reason_missed",
"reason_unscheduled",
"reason_unscheduled_other",
"info_source",
"info_source_other",
"comments",
]
},
),
visit_schedule_fieldset_tuple,
document_status_fieldset_tuple,
audit_fieldset_tuple,
)
radio_fields = {
"reason": admin.VERTICAL,
"reason_unscheduled": admin.VERTICAL,
"reason_missed": admin.VERTICAL,
"info_source": admin.VERTICAL,
"require_crfs": admin.VERTICAL,
}
search_fields = (
"id",
"reason",
"visit_code",
"subject_identifier",
)
@staticmethod
def subject_identifier(obj=None) -> str:
return obj.appointment.subject_identifier
@staticmethod
def visit_reason(obj=None) -> str:
if obj.reason != UNSCHEDULED:
visit_reason = obj.get_reason_display()
else:
if obj.reason_unscheduled == OTHER:
visit_reason = obj.reason_unscheduled_other
else:
visit_reason = obj.get_reason_unscheduled_display()
return visit_reason
@staticmethod
def status(obj=None) -> str:
return obj.study_status
@staticmethod
def scheduled_data(obj=None) -> str:
return obj.get_require_crfs_display()
def formfield_for_foreignkey(self, db_field, request: WSGIRequest, **kwargs):
db = kwargs.get("using")
if db_field.name == "appointment" and request.GET.get("appointment"):
kwargs["queryset"] = db_field.related_model._default_manager.using(db).filter(
pk=request.GET.get("appointment")
)
else:
kwargs["queryset"] = db_field.related_model._default_manager.none()
return super().formfield_for_foreignkey(db_field, request, **kwargs)
def get_list_display(self, request: WSGIRequest) -> tuple[str, ...]:
list_display = super().get_list_display(request)
custom_fields = (
"appointment",
"subject_identifier",
"report_datetime",
"visit_reason",
"status",
"scheduled_data",
)
return custom_fields + tuple(f for f in list_display if f not in custom_fields)
def get_list_filter(self, request: WSGIRequest) -> tuple[str, ...]:
list_filter = super().get_list_filter(request)
custom_fields = (
"report_datetime",
"visit_code",
"visit_code_sequence",
"reason",
"require_crfs",
)
return custom_fields + tuple(f for f in list_filter if f not in custom_fields)
def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]:
readonly_fields = super().get_readonly_fields(request, obj=obj)
return tuple(set(readonly_fields + visit_schedule_fields))
def get_changeform_initial_data(self, request: WSGIRequest) -> dict:
"""Sets initial data for the form.
Inherit from this add additional fields to set.
Gets report_datetime from the appointment.appt_datetime
and reason from the appointment.visit_code_sequence.
"""
initial_data = super().get_changeform_initial_data(request)
appointment_id = request.GET.get("appointment")
try:
appointment = get_appointment_model_cls().objects.get(id=appointment_id)
except ObjectDoesNotExist:
initial_data.update(
report_datetime=None,
reason=None,
)
else:
initial_data.update(
report_datetime=appointment.appt_datetime,
reason=SCHEDULED if appointment.visit_code_sequence == 0 else UNSCHEDULED,
)
return initial_data