Coverage for crateweb/config/constants.py: 100%
139 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-08-27 10:34 -0500
« prev ^ index » next coverage.py v7.8.0, created at 2025-08-27 10:34 -0500
1"""
2crate_anon/crateweb/config/constants.py
4===============================================================================
6 Copyright (C) 2015, University of Cambridge, Department of Psychiatry.
7 Created by Rudolf Cardinal (rnc1001@cam.ac.uk).
9 This file is part of CRATE.
11 CRATE is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 CRATE is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with CRATE. If not, see <https://www.gnu.org/licenses/>.
24===============================================================================
26**Configuration constants for the CRATE web interface.**
28"""
30CRATEWEB_CONFIG_ENV_VAR = "CRATE_WEB_LOCAL_SETTINGS"
31CHERRYPY_EXTRA_ARGS_ENV_VAR = "CRATE_CHERRYPY_ARGS"
32CRATEWEB_CELERY_APP_NAME = "crate_anon.crateweb.consent"
35class ResearchDbInfoKeys:
36 """
37 Keys for each dictionary within ``settings.RESEARCH_DB_INFO``, representing
38 a description of a research database that CRATE will provide a view on.
39 """
41 NAME = "name"
42 DESCRIPTION = "description"
44 DATABASE = "database"
45 SCHEMA = "schema"
47 PID_PSEUDO_FIELD = "pid_pseudo_field"
48 MPID_PSEUDO_FIELD = "mpid_pseudo_field"
49 TRID_FIELD = "trid_field"
50 RID_FIELD = "rid_field"
51 RID_FAMILY = "rid_family"
52 MRID_TABLE = "mrid_table"
53 MRID_FIELD = "mrid_field"
55 PID_DESCRIPTION = "pid_description"
56 MPID_DESCRIPTION = "mpid_description"
57 RID_DESCRIPTION = "rid_description"
58 MRID_DESCRIPTION = "mrid_description"
59 TRID_DESCRIPTION = "trid_description"
61 SECRET_LOOKUP_DB = "secret_lookup_db"
63 DATE_FIELDS_BY_TABLE = "date_fields_by_table"
64 DEFAULT_DATE_FIELDS = "default_date_fields"
65 UPDATE_DATE_FIELD = "update_date_field"
68SOURCE_DB_NAME_MAX_LENGTH = 20
71class ClinicalDatabaseType:
72 """
73 Possible source clinical database types that CRATE knows about, and can
74 look up patient details for the consent-to-contact system.
75 """
77 # NB the following strings mustn't be longer than SOURCE_DB_NAME_MAX_LENGTH
78 DUMMY_CLINICAL = "dummy_clinical"
79 CPFT_CRS = "cpft_crs"
80 CPFT_PCMIS = "cpft_pcmis"
81 CPFT_RIO_CRATE_PREPROCESSED = "cpft_rio_crate"
82 CPFT_RIO_DATAMART = "cpft_rio_datamart"
83 CPFT_RIO_RAW = "cpft_rio_raw"
84 CPFT_RIO_RCEP = "cpft_rio_rcep"
85 CPFT_SYSTMONE = "cpft_systmone"
87 # For Django fields, using the above:
88 DATABASE_CHOICES = (
89 # First key must match a database entry in Django local settings.
90 (DUMMY_CLINICAL, "Dummy clinical database for testing"),
91 # (ClinicalDatabaseType.CPFT_PCMIS,
92 # 'CPFT Psychological Wellbeing Service (IAPT) PC-MIS'),
93 (CPFT_CRS, "CPFT Care Records System (CRS) 2005-2012"),
94 (CPFT_RIO_RCEP, "CPFT RiO 2013- (preprocessed by Servelec RCEP tool)"),
95 (CPFT_RIO_RAW, "CPFT RiO 2013- (raw)"),
96 (
97 CPFT_RIO_CRATE_PREPROCESSED,
98 "CPFT RiO 2013- (preprocessed by CRATE)",
99 ),
100 (
101 CPFT_RIO_DATAMART,
102 "CPFT RiO 2013- (data warehouse processed version)",
103 ),
104 (CPFT_SYSTMONE, "SystmOne (CPFT Data Warehouse format)"),
105 )
108# Special URL for a situation not amenable to reverse():
109DOWNLOAD_PRIVATESTORAGE_URL_STEM = "download_privatestorage"
112class UrlNames:
113 r"""
114 Strings used as Django names for CRATE views; see
115 :mod:`crate_anon.crateweb.config.urls`.
117 We should use this lookup method throughout the Python code, e.g. for calls
118 to :func:`reverse` and :func:`redirect`.
120 We could also use them in the templates, rather than using hard-coded
121 strings. We can do that via our common context,
122 :func:`crate_anon.crateweb.core.context_processors.common_context`.
123 However, the (runtime) failure message then becomes e.g.
125 .. code-block:: none
127 Reverse for '' not found. '' is not a valid view function or pattern
128 name.
130 rather than the more informative
132 .. code-block:: none
134 Reverse for 'ridlookup2' not found. 'ridlookup2' is not a valid view
135 function or pattern name.
137 ... so probably best not to (there is also no PyCharm checking of the
138 Django context).
139 """
141 # Login, auth
142 LOGIN = "login"
143 LOGOUT = "logout"
144 PASSWORD_CHANGE = "password_change"
146 # Home, about
147 HOME = "home"
148 ABOUT = "about"
150 # Main query views
151 ACTIVATE_HIGHLIGHT = "activate_highlight"
152 ACTIVATE_QUERY = "activate_query"
153 BUILD_QUERY = "build_query"
154 COUNT = "count"
155 DEACTIVATE_HIGHLIGHT = "deactivate_highlight"
156 DELETE_HIGHLIGHT = "delete_highlight"
157 DELETE_QUERY = "delete_query"
158 DELETE_SITEWIDE_QUERY = "delete_sitewide_query"
159 EDIT_DISPLAY = "edit_display"
160 HIGHLIGHT = "highlight"
161 PROCESS_STANDARD_QUERY = "process_standard_query"
162 QUERY = "query"
163 QUERY_EXCEL = "query_excel"
164 RESULTS = "results"
165 RESULTS_RECORDWISE = "results_recordwise"
166 SAVE_DISPLAY = "save_display"
167 SHOW_QUERY = "show_query"
168 SITEWIDE_QUERIES = "sitewide_queries"
169 SRCINFO = "srcinfo"
170 STANDARD_QUERIES = "standard_queries"
171 TSV = "tsv"
173 # Patient Explorer views
174 PE_ACTIVATE = "pe_activate"
175 PE_BUILD = "pe_build"
176 PE_CHOOSE = "pe_choose"
177 PE_DELETE = "pe_delete"
178 PE_DF_EXCEL = "pe_df_excel"
179 PE_DF_RESULTS = "pe_df_results"
180 PE_EDIT = "pe_edit"
181 PE_EXCEL = "pe_excel"
182 PE_MONSTER_RESULTS = "pe_monster_results"
183 PE_ONE_TABLE = "pe_one_table"
184 PE_RESULTS = "pe_results"
185 PE_TABLE_BROWSER = "pe_table_browser"
187 # Structure
188 STRUCTURE_EXCEL = "structure_excel"
189 STRUCTURE_HELP = "structure_help"
190 STRUCTURE_TABLE_LONG = "structure_table_long"
191 STRUCTURE_TABLE_PAGINATED = "structure_table_paginated"
192 STRUCTURE_TREE = "structure_tree"
193 STRUCTURE_TSV = "structure_tsv"
195 # SQL helpers
196 SQLHELPER_DRUG_TYPE = "sqlhelper_drug_type"
197 SQLHELPER_DRUG_TYPE_WITH_DB = "sqlhelper_drug_type_with_db"
198 SQLHELPER_TEXT_ANYWHERE = "sqlhelper_text_anywhere"
199 SQLHELPER_TEXT_ANYWHERE_WITH_DB = "sqlhelper_text_anywhere_with_db"
201 # Consent for contact
202 SUBMIT_CONTACT_REQUEST = "submit_contact_request"
204 # Clinician views
205 ALL_TEXT_FROM_PID = "all_text_from_pid"
206 ALL_TEXT_FROM_PID_WITH_DB = "all_text_from_pid_with_db"
207 CLINICIAN_CONTACT_REQUEST = "clinician_contact_request"
209 # Archive views
210 ARCHIVE_ATTACHMENT = "archive_attachment"
211 ARCHIVE_STATIC = "archive_static"
212 ARCHIVE_TEMPLATE = "archive_template"
213 LAUNCH_ARCHIVE = "launch_archive"
215 # Look up PID/RID
216 PIDLOOKUP = "pidlookup"
217 PIDLOOKUP_WITH_DB = "pidlookup_with_db"
218 RIDLOOKUP = "ridlookup"
219 RIDLOOKUP_WITH_DB = "ridlookup_with_db"
221 # User profile
222 EDIT_PROFILE = "edit_profile"
224 # Superuser
225 CHARITY_REPORT = "charity_report"
226 DOWNLOAD_PRIVATESTORAGE = "download_privatestorage"
227 EXCLUSION_REPORT = "exclusion_report"
228 TEST_EMAIL_RDBM = "test_email_rdbm"
230 # Public views
231 LEAFLET = "leaflet"
232 STUDY_DETAILS = "study_details"
233 STUDY_FORM = "study_form"
234 STUDY_PACK = "study_pack"
236 # Restricted C4C views for clinicians
237 CLINICIAN_PACK = "clinician_pack"
238 CLINICIAN_RESPONSE = "clinician_response"
240 # Restricted views; superuser + researchers
241 LETTER = "letter"
242 VIEW_EMAIL_ATTACHMENT = "view_email_attachment"
243 VIEW_EMAIL_HTML = "view_email_html"
245 # Developer functions and test views
246 DECISION_FORM_TO_PT_RE_STUDY = "decision_form_to_pt_re_study"
247 DRAFT_APPROVAL_EMAIL = "draft_approval_email"
248 DRAFT_APPROVAL_LETTER = "draft_approval_letter"
249 DRAFT_CLINICIAN_EMAIL = "draft_clinician_email"
250 DRAFT_CONFIRM_TRAFFIC_LIGHT_LETTER = "draft_confirm_traffic_light_letter"
251 DRAFT_FIRST_TRAFFIC_LIGHT_LETTER = "draft_first_traffic_light_letter"
252 DRAFT_LETTER_CLINICIAN_TO_PT_RE_STUDY = (
253 "draft_letter_clinician_to_pt_re_study"
254 )
255 DRAFT_RESEARCHER_COVER_LETTER = "draft_researcher_cover_letter"
256 DRAFT_TRAFFIC_LIGHT_DECISION_FORM = "draft_traffic_light_decision_form"
257 DRAFT_TRAFFIC_LIGHT_DECISION_FORM_GENERIC = (
258 "draft_traffic_light_decision_form_generic"
259 )
260 DRAFT_WITHDRAWAL_EMAIL = "draft_withdrawal_email"
261 DRAFT_WITHDRAWAL_LETTER = "draft_withdrawal_letter"
262 GENERATE_RANDOM_NHS = "generate_random_nhs"
263 TEST_CONSENT_LOOKUP = "test_consent_lookup"
264 TEST_PATIENT_LOOKUP = "test_patient_lookup"
267class AdminSiteNames:
268 DEVADMIN = "devadmin"
269 MGRADMIN = "mgradmin"
270 RESADMIN = "resadmin"
273class UrlKeys:
274 """
275 Keys used in GET parameters as part of a query string:
276 ```...path?a=1&b=2``, etc.
277 """
279 # Generic
280 NEXT = "next"
281 # ... used for login redirectionmust match
282 # django.contrib.auth.REDIRECT_FIELD_NAME
284 # Archive system:
285 CONTENT_TYPE = "content_type" # used for attachments
286 FILENAME = "filename" # used for attachments and static files
287 GUESS_CONTENT_TYPE = "guess_content_type" # used for attachments; 0 or 1
288 MTIME = "mtime" # file modification time, from os.path.getmtime()
289 PATIENT_ID = "patient_id" # used for attachments and templates
290 OFFERED_FILENAME = "offered_filename" # used for attachments
291 TEMPLATE = "template" # used for templates