Skip to content

Commit 79a36c7

Browse files
committed
Set the moderation status on annotation creation and edit
This only initializes non private annotations to approved, it doesn't consider any status transitions.
1 parent ff0d8a8 commit 79a36c7

File tree

4 files changed

+28
-2
lines changed

4 files changed

+28
-2
lines changed

h/services/annotation_moderation.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,18 @@ def set_status(
3232
annotation_id=annotation.id,
3333
old_moderation_status=annotation.moderation_status,
3434
new_moderation_status=status.value,
35-
user_id=user.id,
35+
moderator_id=user.id,
3636
)
3737
)
3838
annotation.moderation_status = status
3939

40+
def update_status(self, annotation: Annotation) -> None:
41+
if not annotation.moderation_status and annotation.shared:
42+
# If an annotation is not private but doesn't have a moderation status
43+
# it means that the moderation status hasn't been migrated yet.
44+
# Set the default `APPROVED` status
45+
annotation.moderation_status = ModerationStatus.APPROVED
46+
4047

4148
def annotation_moderation_service_factory(_context, request):
4249
return AnnotationModerationService(request.db)

h/services/annotation_write.py

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def create_annotation(self, data: dict) -> Annotation:
8080
created=annotation.created,
8181
updated=annotation.updated,
8282
)
83+
self._moderation_service.update_status(annotation)
8384

8485
self._db.add(annotation)
8586
self.upsert_annotation_slim(annotation)
@@ -143,6 +144,7 @@ def update_annotation(
143144
document.get("document_uri_dicts", {}),
144145
updated=annotation.updated,
145146
)
147+
self._moderation_service.update_status(annotation)
146148
self.upsert_annotation_slim(annotation)
147149

148150
if annotation_metadata:

tests/unit/h/services/annotation_moderation_test.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_set_status(self, svc, annotation, user):
4242

4343
assert annotation.moderation_status is ModerationStatus.DENIED
4444
assert annotation.moderation_log[0].annotation_id == annotation.id
45-
assert annotation.moderation_log[0].user_id == user.id
45+
assert annotation.moderation_log[0].moderator_id == user.id
4646
assert (
4747
annotation.moderation_log[0].old_moderation_status
4848
== ModerationStatus.APPROVED
@@ -52,6 +52,21 @@ def test_set_status(self, svc, annotation, user):
5252
== ModerationStatus.DENIED
5353
)
5454

55+
@pytest.mark.parametrize("moderation_status", [None, ModerationStatus.APPROVED])
56+
@pytest.mark.parametrize("shared", [False, True])
57+
def test_update_status_initializes_moderation_status(
58+
self, svc, annotation, moderation_status, shared
59+
):
60+
annotation.moderation_status = moderation_status
61+
annotation.shared = shared
62+
63+
svc.update_status(annotation)
64+
65+
if not moderation_status and shared:
66+
assert annotation.moderation_status == ModerationStatus.APPROVED
67+
else:
68+
assert annotation.moderation_status == moderation_status
69+
5570
@pytest.fixture(autouse=True)
5671
def mods(self, factories):
5772
return factories.AnnotationModeration.create_batch(3)

tests/unit/h/services/annotation_write_test.py

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def test_create_annotation(
2323
mention_service,
2424
_validate_group, # noqa: PT019
2525
db_session,
26+
moderation_service,
2627
):
2728
root_annotation = factories.Annotation()
2829
annotation_read_service.get_annotation_by_id.return_value = root_annotation
@@ -43,6 +44,7 @@ def test_create_annotation(
4344
schedule_in=60,
4445
)
4546
mention_service.update_mentions.assert_called_once_with(anno)
47+
moderation_service.update_status.assert_called_once_with(anno)
4648

4749
assert anno == Any.instance_of(Annotation).with_attrs(
4850
{

0 commit comments

Comments
 (0)