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

1""" 

2crate_anon/crateweb/config/constants.py 

3 

4=============================================================================== 

5 

6 Copyright (C) 2015, University of Cambridge, Department of Psychiatry. 

7 Created by Rudolf Cardinal (rnc1001@cam.ac.uk). 

8 

9 This file is part of CRATE. 

10 

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. 

15 

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. 

20 

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/>. 

23 

24=============================================================================== 

25 

26**Configuration constants for the CRATE web interface.** 

27 

28""" 

29 

30CRATEWEB_CONFIG_ENV_VAR = "CRATE_WEB_LOCAL_SETTINGS" 

31CHERRYPY_EXTRA_ARGS_ENV_VAR = "CRATE_CHERRYPY_ARGS" 

32CRATEWEB_CELERY_APP_NAME = "crate_anon.crateweb.consent" 

33 

34 

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 """ 

40 

41 NAME = "name" 

42 DESCRIPTION = "description" 

43 

44 DATABASE = "database" 

45 SCHEMA = "schema" 

46 

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" 

54 

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" 

60 

61 SECRET_LOOKUP_DB = "secret_lookup_db" 

62 

63 DATE_FIELDS_BY_TABLE = "date_fields_by_table" 

64 DEFAULT_DATE_FIELDS = "default_date_fields" 

65 UPDATE_DATE_FIELD = "update_date_field" 

66 

67 

68SOURCE_DB_NAME_MAX_LENGTH = 20 

69 

70 

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 """ 

76 

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" 

86 

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 ) 

106 

107 

108# Special URL for a situation not amenable to reverse(): 

109DOWNLOAD_PRIVATESTORAGE_URL_STEM = "download_privatestorage" 

110 

111 

112class UrlNames: 

113 r""" 

114 Strings used as Django names for CRATE views; see 

115 :mod:`crate_anon.crateweb.config.urls`. 

116 

117 We should use this lookup method throughout the Python code, e.g. for calls 

118 to :func:`reverse` and :func:`redirect`. 

119 

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. 

124 

125 .. code-block:: none 

126 

127 Reverse for '' not found. '' is not a valid view function or pattern 

128 name. 

129 

130 rather than the more informative 

131 

132 .. code-block:: none 

133 

134 Reverse for 'ridlookup2' not found. 'ridlookup2' is not a valid view 

135 function or pattern name. 

136 

137 ... so probably best not to (there is also no PyCharm checking of the 

138 Django context). 

139 """ 

140 

141 # Login, auth 

142 LOGIN = "login" 

143 LOGOUT = "logout" 

144 PASSWORD_CHANGE = "password_change" 

145 

146 # Home, about 

147 HOME = "home" 

148 ABOUT = "about" 

149 

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" 

172 

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" 

186 

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" 

194 

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" 

200 

201 # Consent for contact 

202 SUBMIT_CONTACT_REQUEST = "submit_contact_request" 

203 

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" 

208 

209 # Archive views 

210 ARCHIVE_ATTACHMENT = "archive_attachment" 

211 ARCHIVE_STATIC = "archive_static" 

212 ARCHIVE_TEMPLATE = "archive_template" 

213 LAUNCH_ARCHIVE = "launch_archive" 

214 

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" 

220 

221 # User profile 

222 EDIT_PROFILE = "edit_profile" 

223 

224 # Superuser 

225 CHARITY_REPORT = "charity_report" 

226 DOWNLOAD_PRIVATESTORAGE = "download_privatestorage" 

227 EXCLUSION_REPORT = "exclusion_report" 

228 TEST_EMAIL_RDBM = "test_email_rdbm" 

229 

230 # Public views 

231 LEAFLET = "leaflet" 

232 STUDY_DETAILS = "study_details" 

233 STUDY_FORM = "study_form" 

234 STUDY_PACK = "study_pack" 

235 

236 # Restricted C4C views for clinicians 

237 CLINICIAN_PACK = "clinician_pack" 

238 CLINICIAN_RESPONSE = "clinician_response" 

239 

240 # Restricted views; superuser + researchers 

241 LETTER = "letter" 

242 VIEW_EMAIL_ATTACHMENT = "view_email_attachment" 

243 VIEW_EMAIL_HTML = "view_email_html" 

244 

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" 

265 

266 

267class AdminSiteNames: 

268 DEVADMIN = "devadmin" 

269 MGRADMIN = "mgradmin" 

270 RESADMIN = "resadmin" 

271 

272 

273class UrlKeys: 

274 """ 

275 Keys used in GET parameters as part of a query string: 

276 ```...path?a=1&b=2``, etc. 

277 """ 

278 

279 # Generic 

280 NEXT = "next" 

281 # ... used for login redirectionmust match 

282 # django.contrib.auth.REDIRECT_FIELD_NAME 

283 

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