Skip to content

Commit 9aae9a4

Browse files
Merge pull request #75 from CentreForDigitalHumanities/fix/backend-permission-update
Refactor: permission checks in view
2 parents 1e999be + fb1a294 commit 9aae9a4

6 files changed

Lines changed: 343 additions & 317 deletions

File tree

README.md

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,25 @@ The matrix below shows the permissions for each role. Not all permissions are cu
3636

3737
(Last updated: November 14th, 2025)
3838

39-
| | Visitor | Annotator | Master Annotator |
40-
| -------------------------- | ------- | --------- | ---------------- |
41-
| Browse gold problems | Yes | Yes | Yes |
42-
| Browse silver problems | No | Yes | Yes |
43-
| Edit KB items | No | Yes | Yes |
44-
| Add labels | No | Yes | Yes |
45-
| Remove own labels | No | Yes | Yes |
46-
| Remove other users' labels | No | No | Yes |
47-
| Add problems | No | No | Yes |
48-
| Copy problems | No | No | Yes |
49-
| Update user problems | No | No | Yes |
50-
| Delete problems | No | No | Yes |
51-
| Edit existing problems | No | No | Yes |
52-
| See hidden problems | No | No | Yes |
53-
| Silver/gold problems | No | No | Yes |
54-
| Hide/unhide problems | No | No | Yes |
55-
| Manage users | No | No | Yes |
39+
| | Unregistered users | Registered Users | Annotators | Master Annotators |
40+
| ------------------------ | ------------------ | ---------------- | ---------- | ----------------- |
41+
| Browse gold problems | Yes | Yes | Yes | Yes |
42+
| Browse silver problems | No | Yes | Yes | Yes |
43+
| Browse bronze problems | No | Yes | Yes | Yes |
44+
| Add/edit/remove KB items | No | No | Yes | Yes |
45+
| Add labels | No | No | Yes | Yes |
46+
| Remove own labels | No | No | Yes | Yes |
47+
| Remove others' labels | No | No | No | Yes |
48+
| Copy problems | No | No | No | Yes |
49+
| See hidden problems | No | No | No | Yes |
50+
| Gold/ungold problems | No | No | No | Yes |
51+
| Hide/unhide problems | No | No | No | Yes |
52+
| Manage users | No | No | No | Yes |
53+
54+
NB:
55+
- 'Bronze' problems are problems that are 'untouched' (i.e., non-annotated) problems. These do not have knowledge base items or labels, and have no edits made to their syntactic parses and tableaus.
56+
- 'Silver' problems are problems that have been annotated with labels and/or knowledge base items, but have not been marked as 'gold'.
57+
- 'Gold' problems are problems that have been marked as 'gold' by a Master Annotator.
5658

5759
## Licence
5860

backend/problem/serializers.py

Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
)
99
from problem.services import FracasData, SNLIData, SickData
1010
from problem.models import Problem, Sentence
11+
from user.models import User
1112

1213

1314
class ProblemSerializer(serializers.ModelSerializer):
@@ -98,32 +99,10 @@ def validate_base(self, value):
9899
def create(self, validated_data: dict) -> Problem:
99100
"""
100101
Create a new Problem instance from validated input data.
101-
Handles creation of related Sentence and KnowledgeBase objects.
102102
"""
103-
premise_sentences = [
104-
Sentence.objects.get_or_create(text=premise)[0]
105-
for premise in validated_data["premises"]
106-
]
107-
108-
hypothesis_sentence = Sentence.objects.get_or_create(
109-
text=validated_data["hypothesis"]
110-
)[0]
111-
112-
problem = Problem.objects.create(
113-
base_id=validated_data.get("base", None),
114-
hypothesis=hypothesis_sentence,
115-
dataset=Problem.Dataset.USER,
116-
# TODO: Determine entailment label based on LangPro parser output.
117-
entailment_label=Problem.EntailmentLabel.UNKNOWN,
118-
extra_data={},
119-
)
120-
121-
problem.premises.set(premise_sentences)
103+
new_user_problem = Problem(dataset=Problem.Dataset.USER, extra_data={})
122104

123-
kb_items = validated_data.get("kbItems", [])
124-
self._handle_kb_annotations(problem, kb_items)
125-
126-
return problem
105+
return self._update_core_problem_fields(new_user_problem, validated_data)
127106

128107
def _create_update_kb_annotation(
129108
self, kb_item: dict, problem: Problem, session: AnnotationSession
@@ -164,11 +143,12 @@ def _mark_kb_not_in_input_as_removed(
164143
Marks KnowledgeBase annotations for a problem that are not included in
165144
the provided list of kb_items as removed.
166145
"""
167-
kb_item_ids = {kb_item.get("id") for kb_item in kb_items if kb_item.get("id") is not None}
146+
kb_item_ids = {
147+
kb_item.get("id") for kb_item in kb_items if kb_item.get("id") is not None
148+
}
168149

169150
annotations_to_delete = KnowledgeBaseAnnotation.objects.filter(
170-
problem=problem,
171-
removed_at__isnull=True
151+
problem=problem, removed_at__isnull=True
172152
).exclude(id__in=kb_item_ids)
173153

174154
current_time = timezone.now()
@@ -178,18 +158,14 @@ def _mark_kb_not_in_input_as_removed(
178158
annotation.removed_by = session.user
179159
annotation.save()
180160

181-
def _handle_kb_annotations(
182-
self, problem: Problem, kb_items: list[dict]
161+
def handle_kb_annotations(
162+
self, problem: Problem, kb_items: list[dict], user: User
183163
) -> None:
184164
"""
185165
Creates, updates and deletes KnowledgeBase annotations for a problem.
186166
Creates an annotation session if it does not exist.
187167
"""
188-
request = self.context.get("request", None)
189-
if not request or not request.user.is_authenticated or not request.user.can_edit_kb:
190-
return
191-
192-
session = AnnotationSession.objects.create(user=request.user)
168+
session = AnnotationSession.objects.create(user=user)
193169

194170
self._mark_kb_not_in_input_as_removed(problem, kb_items, session)
195171

@@ -198,18 +174,19 @@ def _handle_kb_annotations(
198174

199175
def update(self, instance: Problem, validated_data: dict) -> Problem:
200176
"""
201-
Update an existing Problem instance from validated input data.
202-
Handles updating of related Sentence and KnowledgeBase objects.
177+
Updates Problem core fields from validated input data.
203178
"""
204-
205-
# KB annotations can be made for all problems.
206-
kb_items = validated_data.get("kbItems", [])
207-
self._handle_kb_annotations(instance, kb_items)
208-
209-
# Other fields can only be updated for user-created problems.
179+
# Only USER-problems can be updated.
210180
if instance.dataset != Problem.Dataset.USER:
211181
return instance
212182

183+
return self._update_core_problem_fields(instance, validated_data)
184+
185+
def _update_core_problem_fields(self, instance: Problem, validated_data: dict) -> Problem:
186+
"""
187+
Updates core Problem fields (premises, hypothesis, base) from validated
188+
input data.
189+
"""
213190
instance.hypothesis = Sentence.objects.get_or_create(
214191
text=validated_data["hypothesis"],
215192
)[0]

0 commit comments

Comments
 (0)