Skip to content

Commit 5c9ca17

Browse files
authored
Merge pull request doccano#318 from CatalystCode/enhancement/collaborative-annotation
Enhancement/Add option to share annotations across users
2 parents 7a8655b + 4a0134f commit 5c9ca17

File tree

6 files changed

+64
-5
lines changed

6 files changed

+64
-5
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 2.1.7 on 2019-08-01 18:12
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('api', '0003_support_sql_server'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='project',
15+
name='collaborative_annotation',
16+
field=models.BooleanField(default=False),
17+
),
18+
]

app/api/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class Project(PolymorphicModel):
2828
users = models.ManyToManyField(User, related_name='projects')
2929
project_type = models.CharField(max_length=30, choices=PROJECT_CHOICES)
3030
randomize_document_order = models.BooleanField(default=False)
31+
collaborative_annotation = models.BooleanField(default=False)
3132

3233
def get_absolute_url(self):
3334
return reverse('upload', args=[self.id])

app/api/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def get_annotations(self, instance):
6262
model = project.get_annotation_class()
6363
serializer = project.get_annotation_serializer()
6464
annotations = model.objects.filter(document=instance.id)
65-
if request:
65+
if request and not project.collaborative_annotation:
6666
annotations = annotations.filter(user=request.user)
6767
serializer = serializer(annotations, many=True)
6868
return serializer.data
@@ -82,7 +82,7 @@ class ProjectSerializer(serializers.ModelSerializer):
8282
class Meta:
8383
model = Project
8484
fields = ('id', 'name', 'description', 'guideline', 'users', 'project_type', 'image', 'updated_at',
85-
'randomize_document_order')
85+
'randomize_document_order', 'collaborative_annotation')
8686
read_only_fields = ('image', 'updated_at')
8787

8888

app/api/tests/test_api.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,10 @@ def setUpTestData(cls):
491491
cls.post_data = {'start_offset': 0, 'end_offset': 1, 'label': main_project_label.id}
492492
cls.num_entity_of_project_member = SequenceAnnotation.objects.filter(document=main_project_doc,
493493
user=project_member).count()
494+
cls.num_entity_of_another_project_member = SequenceAnnotation.objects.filter(
495+
document=main_project_doc,
496+
user=another_project_member).count()
497+
cls.main_project = main_project
494498

495499
def test_returns_annotations_to_project_member(self):
496500
self.client.login(username=self.project_member_name,
@@ -510,6 +514,15 @@ def test_do_not_return_annotations_of_another_project_member(self):
510514
response = self.client.get(self.url, format='json')
511515
self.assertEqual(len(response.data), self.num_entity_of_project_member)
512516

517+
def test_returns_annotations_of_another_project_member_if_collaborative_project(self):
518+
self._patch_project(self.main_project, 'collaborative_annotation', True)
519+
520+
self.client.login(username=self.project_member_name,
521+
password=self.project_member_pass)
522+
response = self.client.get(self.url, format='json')
523+
self.assertEqual(len(response.data),
524+
self.num_entity_of_project_member + self.num_entity_of_another_project_member)
525+
513526
def test_allows_project_member_to_create_annotation(self):
514527
self.client.login(username=self.project_member_name,
515528
password=self.project_member_pass)
@@ -522,6 +535,17 @@ def test_disallows_non_project_member_to_create_annotation(self):
522535
response = self.client.post(self.url, format='json', data=self.post_data)
523536
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
524537

538+
def _patch_project(self, project, attribute, value):
539+
old_value = getattr(project, attribute, None)
540+
setattr(project, attribute, value)
541+
project.save()
542+
543+
def cleanup_project():
544+
setattr(project, attribute, old_value)
545+
project.save()
546+
547+
self.addCleanup(cleanup_project)
548+
525549

526550
class TestAnnotationDetailAPI(APITestCase):
527551

app/api/views.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,12 @@ def get_serializer_class(self):
162162
def get_queryset(self):
163163
project = get_object_or_404(Project, pk=self.kwargs['project_id'])
164164
model = project.get_annotation_class()
165-
self.queryset = model.objects.filter(document=self.kwargs['doc_id'],
166-
user=self.request.user)
167-
return self.queryset
165+
166+
queryset = model.objects.filter(document=self.kwargs['doc_id'])
167+
if not project.collaborative_annotation:
168+
queryset = queryset.filter(user=self.request.user)
169+
170+
return queryset
168171

169172
def create(self, request, *args, **kwargs):
170173
request.data['document'] = self.kwargs['doc_id']

app/server/static/components/projects.vue

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@
5353
)
5454
| Randomize document order per user
5555

56+
div.field
57+
label.checkbox
58+
input(
59+
v-model="collaborativeAnnotation"
60+
name="collaborative_annotation"
61+
type="checkbox"
62+
style="margin-right: 0.25em;"
63+
required
64+
)
65+
| Share annotations across all users
66+
5667
footer.modal-card-foot.pt20.pb20.pr20.pl20.has-background-white-ter
5768
button.button.is-primary(v-on:click="create()") Create
5869
button.button(v-on:click="isActive = !isActive") Cancel
@@ -140,6 +151,7 @@ export default {
140151
username: '',
141152
isSuperuser: false,
142153
randomizeDocumentOrder: false,
154+
collaborativeAnnotation: false,
143155
}),
144156
145157
computed: {
@@ -192,6 +204,7 @@ export default {
192204
description: this.description,
193205
project_type: this.projectType,
194206
randomize_document_order: this.randomizeDocumentOrder,
207+
collaborative_annotation: this.collaborativeAnnotation,
195208
guideline: 'Please write annotation guideline.',
196209
resourcetype: this.resourceType(),
197210
};

0 commit comments

Comments
 (0)