Coverage for postrfp/authorisation/roles.py: 100%
10 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-22 21:34 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-22 21:34 +0000
1from collections import defaultdict
4from postrfp.authorisation import perms
6_builtin_roles = {
7 "Administrator": {
8 perms.ALLOCATE_QUESTIONS,
9 perms.ANSWER_QUESTIONS_ALLOCATED_TO_ANYONE,
10 perms.APPROVE_ANSWERS,
11 perms.ISSUE_ACCEPT,
12 perms.ISSUE_ADD_ANSWER_COMMENT,
13 perms.ISSUE_CREATE,
14 perms.ISSUE_DECLINE,
15 perms.ISSUE_DELETE,
16 perms.ISSUE_MANAGE_ISSUER_ATTACHMENTS,
17 perms.ISSUE_MANAGE_RESPONDENT_ATTACHMENTS,
18 perms.ISSUE_PUBLISH,
19 perms.ISSUE_RETRACT,
20 perms.ISSUE_SAVE_AGREED_SCORES,
21 perms.ISSUE_SAVE_QUESTION_RESPONSE,
22 perms.ISSUE_SAVE_SCORES,
23 perms.ISSUE_SELF_ISSUE,
24 perms.ISSUE_SET_AWARD_STATUS,
25 perms.ISSUE_SUBMIT,
26 perms.ISSUE_UPDATE,
27 perms.ISSUE_UPDATE_WORKFLOW,
28 perms.ISSUE_VIEW_ANSWERS,
29 perms.ISSUE_VIEW_AGREED_SCORES,
30 perms.ISSUE_VIEW_SCORES,
31 perms.ISSUE_VIEW_WINLOSS,
32 perms.LIST_AUDIT_EVENTS,
33 perms.MANAGE_ORGANISATION,
34 perms.MANAGE_PRIVATE_ADDRESS_BOOK,
35 perms.MANAGE_ROLES,
36 perms.MANAGE_USERS,
37 perms.PROJECT_ACCESS,
38 perms.PROJECT_ADD_NOTE,
39 perms.PROJECT_ADD_RESPONDENT_NOTE,
40 perms.PROJECT_APPROVE,
41 perms.PROJECT_CLOSE,
42 perms.PROJECT_CREATE,
43 perms.PROJECT_CREATE_ON_BEHALF,
44 perms.PROJECT_DELETE,
45 perms.PROJECT_EDIT,
46 perms.PROJECT_EDIT_COSMETIC,
47 perms.PROJECT_EDIT_WEIGHTING,
48 perms.PROJECT_EXPORT_COMPLETE,
49 perms.PROJECT_IMPORT_COMPLETE,
50 perms.PROJECT_LOCK_QUESTIONNAIRE,
51 perms.PROJECT_MANAGE_ROLES,
52 perms.PROJECT_PUBLISH,
53 perms.PROJECT_REVERT_TO_DRAFT,
54 perms.PROJECT_SAVE_QUESTIONNAIRE,
55 perms.PROJECT_VIEW_QUESTIONNAIRE,
56 perms.PROJECT_VIEW_WEIGHTING,
57 perms.REF_CONTENT_SAVE,
58 perms.REF_MANAGE_PERMISSIONS,
59 perms.REF_SPEC_SAVE,
60 },
61 "Project Scorer": {
62 perms.ISSUE_SAVE_AGREED_SCORES,
63 perms.ISSUE_SAVE_SCORES,
64 perms.ISSUE_VIEW_AGREED_SCORES,
65 perms.ISSUE_VIEW_SCORES,
66 perms.ISSUE_VIEW_ANSWERS,
67 perms.PROJECT_ACCESS,
68 perms.PROJECT_ADD_NOTE,
69 perms.PROJECT_VIEW_QUESTIONNAIRE,
70 perms.PROJECT_VIEW_WEIGHTING,
71 },
72 "Restricted Scorer": {
73 perms.ISSUE_SAVE_AGREED_SCORES,
74 perms.ISSUE_SAVE_SCORES,
75 perms.ISSUE_VIEW_AGREED_SCORES,
76 perms.ISSUE_VIEW_SCORES,
77 perms.ISSUE_VIEW_ANSWERS,
78 perms.PROJECT_ACCESS,
79 perms.PROJECT_ADD_NOTE,
80 perms.PROJECT_VIEW_QUESTIONNAIRE,
81 },
82 "Respondent": {
83 perms.ISSUE_SAVE_QUESTION_RESPONSE,
84 perms.ISSUE_VIEW_ANSWERS,
85 perms.PROJECT_ADD_RESPONDENT_NOTE,
86 },
87 "Response Reviewer": {
88 perms.ALLOCATE_QUESTIONS,
89 perms.ANSWER_QUESTIONS_ALLOCATED_TO_ANYONE,
90 perms.APPROVE_ANSWERS,
91 perms.ISSUE_MANAGE_RESPONDENT_ATTACHMENTS,
92 perms.ISSUE_SAVE_QUESTION_RESPONSE,
93 perms.ISSUE_VIEW_ANSWERS,
94 perms.ISSUE_UPDATE,
95 perms.LIST_AUDIT_EVENTS,
96 perms.PROJECT_ADD_RESPONDENT_NOTE,
97 },
98 "Response Manager": {
99 perms.ALLOCATE_QUESTIONS,
100 perms.ANSWER_QUESTIONS_ALLOCATED_TO_ANYONE,
101 perms.APPROVE_ANSWERS,
102 perms.ISSUE_ACCEPT,
103 perms.ISSUE_ADD_ANSWER_COMMENT,
104 perms.ISSUE_DECLINE,
105 perms.ISSUE_VIEW_ANSWERS,
106 perms.ISSUE_MANAGE_RESPONDENT_ATTACHMENTS,
107 perms.ISSUE_SAVE_QUESTION_RESPONSE,
108 perms.ISSUE_SELF_ISSUE,
109 perms.ISSUE_SUBMIT,
110 perms.ISSUE_UPDATE,
111 perms.ISSUE_UPDATE_WORKFLOW,
112 perms.LIST_AUDIT_EVENTS,
113 perms.PROJECT_ADD_NOTE,
114 perms.PROJECT_ADD_RESPONDENT_NOTE,
115 perms.PROJECT_VIEW_QUESTIONNAIRE,
116 perms.PROJECT_VIEW_WEIGHTING,
117 },
118 "Winloss Reviewer": {perms.ISSUE_VIEW_WINLOSS},
119 "Project Author": {
120 perms.ISSUE_CREATE,
121 perms.ISSUE_DELETE,
122 perms.ISSUE_RETRACT,
123 perms.ISSUE_SET_AWARD_STATUS,
124 perms.ISSUE_UPDATE,
125 perms.ISSUE_VIEW_SCORES,
126 perms.ISSUE_VIEW_ANSWERS,
127 perms.PROJECT_ACCESS,
128 perms.PROJECT_ADD_NOTE,
129 perms.PROJECT_CLOSE,
130 perms.PROJECT_CREATE,
131 perms.PROJECT_CREATE_ON_BEHALF,
132 perms.PROJECT_DELETE,
133 perms.PROJECT_EDIT,
134 perms.PROJECT_EDIT_COSMETIC,
135 perms.PROJECT_EDIT_WEIGHTING,
136 perms.PROJECT_LOCK_QUESTIONNAIRE,
137 perms.PROJECT_REVERT_TO_DRAFT,
138 perms.PROJECT_SAVE_QUESTIONNAIRE,
139 perms.PROJECT_VIEW_QUESTIONNAIRE,
140 perms.PROJECT_VIEW_WEIGHTING,
141 },
142 "Project Publisher": {
143 perms.ISSUE_CREATE,
144 perms.ISSUE_DELETE,
145 perms.ISSUE_PUBLISH,
146 perms.ISSUE_RETRACT,
147 perms.ISSUE_SET_AWARD_STATUS,
148 perms.ISSUE_UPDATE,
149 perms.ISSUE_VIEW_SCORES,
150 perms.ISSUE_VIEW_ANSWERS,
151 perms.PROJECT_ACCESS,
152 perms.PROJECT_ADD_NOTE,
153 perms.PROJECT_APPROVE,
154 perms.PROJECT_CLOSE,
155 perms.PROJECT_CREATE,
156 perms.PROJECT_CREATE_ON_BEHALF,
157 perms.PROJECT_DELETE,
158 perms.PROJECT_EDIT,
159 perms.PROJECT_EDIT_COSMETIC,
160 perms.PROJECT_EDIT_WEIGHTING,
161 perms.PROJECT_LOCK_QUESTIONNAIRE,
162 perms.PROJECT_PUBLISH,
163 perms.PROJECT_REVERT_TO_DRAFT,
164 perms.PROJECT_SAVE_QUESTIONNAIRE,
165 perms.PROJECT_VIEW_QUESTIONNAIRE,
166 perms.PROJECT_VIEW_WEIGHTING,
167 },
168 "Project Owner": {
169 perms.PROJECT_ACCESS,
170 perms.PROJECT_ADD_NOTE,
171 perms.PROJECT_APPROVE,
172 perms.PROJECT_EDIT,
173 perms.PROJECT_EDIT_COSMETIC,
174 perms.PROJECT_EDIT_WEIGHTING,
175 perms.PROJECT_SAVE_QUESTIONNAIRE,
176 perms.PROJECT_VIEW_QUESTIONNAIRE,
177 perms.PROJECT_VIEW_WEIGHTING,
178 },
179 "Score Reviewer": {
180 perms.ISSUE_VIEW_AGREED_SCORES,
181 perms.ISSUE_VIEW_ANSWERS,
182 perms.ISSUE_VIEW_SCORES,
183 perms.PROJECT_ACCESS,
184 perms.PROJECT_VIEW_QUESTIONNAIRE,
185 },
186 "Contracts Manager": {perms.PROJECT_UNLOCK_ISSUES},
187}
190class CheckingSet(set):
191 def add(self, permission):
192 if permission not in perms.ALL_PERMISSIONS:
193 raise ValueError(
194 "Permission %s not found in %s" % (permission, perms.ALL_PERMISSIONS)
195 )
196 super(CheckingSet, self).add(permission)
199ROLES: dict[str, set] = defaultdict(CheckingSet)
201ROLES.update(_builtin_roles)