From 9ea080478c84fe36f01078889607c7fe5590d612 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Fri, 15 Jan 2021 15:05:34 +0200 Subject: [PATCH 1/3] Ensure tasks have correct place --- indigo_app/views/tasks.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/indigo_app/views/tasks.py b/indigo_app/views/tasks.py index aca7d21ba..5b40ba7b6 100644 --- a/indigo_app/views/tasks.py +++ b/indigo_app/views/tasks.py @@ -48,6 +48,13 @@ def record_workflow_actions(self, task, new_workflows): target=workflow, place_code=task.place.place_code) +class SingleTaskViewBase(TaskViewBase): + model = Task + + def get_queryset(self): + return super().get_queryset().filter(country=self.country, locality=self.locality) + + class TaskListView(TaskViewBase, ListView): context_object_name = 'tasks' model = Task @@ -92,9 +99,8 @@ def get_context_data(self, **kwargs): return context -class TaskDetailView(TaskViewBase, DetailView): +class TaskDetailView(SingleTaskViewBase, DetailView): context_object_name = 'task' - model = Task def get_context_data(self, **kwargs): context = super(TaskDetailView, self).get_context_data(**kwargs) @@ -213,13 +219,12 @@ def get_success_url(self): return reverse('task_detail', kwargs={'place': self.kwargs['place'], 'pk': self.object.pk}) -class TaskEditView(TaskViewBase, UpdateView): +class TaskEditView(SingleTaskViewBase, UpdateView): # permissions permission_required = ('indigo_api.change_task',) context_object_name = 'task' form_class = TaskForm - model = Task def get_form_kwargs(self): kwargs = super().get_form_kwargs() @@ -273,13 +278,12 @@ def get_context_data(self, **kwargs): return context -class TaskChangeStateView(TaskViewBase, View, SingleObjectMixin): +class TaskChangeStateView(SingleTaskViewBase, View, SingleObjectMixin): # permissions permission_required = ('indigo_api.change_task',) change = None http_method_names = ['post'] - model = Task def post(self, request, *args, **kwargs): task = self.get_object() @@ -331,13 +335,12 @@ def get_redirect_url(self): return reverse('task_detail', kwargs={'place': self.kwargs['place'], 'pk': self.kwargs['pk']}) -class TaskAssignView(TaskViewBase, View, SingleObjectMixin): +class TaskAssignView(SingleTaskViewBase, View, SingleObjectMixin): # permissions permission_required = ('indigo_api.change_task',) unassign = False http_method_names = ['post'] - model = Task def post(self, request, *args, **kwargs): task = self.get_object() @@ -367,12 +370,11 @@ def get_redirect_url(self): return reverse('task_detail', kwargs={'place': self.kwargs['place'], 'pk': self.kwargs['pk']}) -class TaskChangeWorkflowsView(TaskViewBase, View, SingleObjectMixin): +class TaskChangeWorkflowsView(SingleTaskViewBase, View, SingleObjectMixin): # permissions permission_required = ('indigo_api.change_task',) http_method_names = ['post'] - model = Task def post(self, request, *args, **kwargs): task = self.get_object() From a1adb0e15b9bddb890522f279a0b822b2525cb59 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Fri, 15 Jan 2021 15:28:09 +0200 Subject: [PATCH 2/3] Don't assume all annotations will always have an entry in the TOC --- indigo/documents.py | 4 ++-- indigo_app/templates/indigo_api/_task_detail.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/indigo/documents.py b/indigo/documents.py index d49fcfde1..a58f09715 100644 --- a/indigo/documents.py +++ b/indigo/documents.py @@ -44,14 +44,14 @@ def resolve(self, exact): while anchor_id: escaped = anchor_id.replace("'", "\\'") elems = component.xpath(f".//a:*[@eId='{escaped}']", namespaces={'a': self.document.doc.namespace}) - if elems: + if elems is not None: self.resolve_element(elems[0]) break elif anchor_id in ['preface', 'preamble']: # HACK HACK HACK # We sometimes use 'preamble' and 'preface' even though they aren't IDs elems = component.xpath(f".//a:{escaped}", namespaces={'a': self.document.doc.namespace}) - if elems: + if elems is not None: self.resolve_element(elems[0]) break diff --git a/indigo_app/templates/indigo_api/_task_detail.html b/indigo_app/templates/indigo_api/_task_detail.html index 3efbc40ae..9f92fedb2 100644 --- a/indigo_app/templates/indigo_api/_task_detail.html +++ b/indigo_app/templates/indigo_api/_task_detail.html @@ -78,13 +78,13 @@
  • {% if anchor.element %} Here is - {{ anchor.toc_entry.title }} + {{ anchor.toc_entry.title|default:anchor.anchor_id }} as it appears currently {% if not anchor.exact_match %}({{ anchor.anchor_id }} may have been moved or removed){% endif %}
    -
    {{ anchor.toc_element_html|safe }}
    +
    {{ anchor.toc_element_html|default:anchor.element_html|safe }}
    {% else %} From 2d9b2451afd86ba10f2660f07c396a3e3e63a3a2 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Tue, 19 Jan 2021 14:12:49 +0200 Subject: [PATCH 3/3] Rectify xpath issue, add test --- indigo/documents.py | 6 +++--- indigo_api/tests/test_annotations_api.py | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/indigo/documents.py b/indigo/documents.py index a58f09715..a622a7ddf 100644 --- a/indigo/documents.py +++ b/indigo/documents.py @@ -31,7 +31,7 @@ def resolve(self, exact): escaped = prefix.replace("'", "\\'") # find the attachment with this id results = list(self.document.doc.main.xpath(f"./a:attachments/a:attachment[@eId='{escaped}']", namespaces={'a': self.document.doc.namespace})) - if results: + if len(results): component = results[0] else: component = self.document.doc.main @@ -44,14 +44,14 @@ def resolve(self, exact): while anchor_id: escaped = anchor_id.replace("'", "\\'") elems = component.xpath(f".//a:*[@eId='{escaped}']", namespaces={'a': self.document.doc.namespace}) - if elems is not None: + if len(elems): self.resolve_element(elems[0]) break elif anchor_id in ['preface', 'preamble']: # HACK HACK HACK # We sometimes use 'preamble' and 'preface' even though they aren't IDs elems = component.xpath(f".//a:{escaped}", namespaces={'a': self.document.doc.namespace}) - if elems is not None: + if len(elems): self.resolve_element(elems[0]) break diff --git a/indigo_api/tests/test_annotations_api.py b/indigo_api/tests/test_annotations_api.py index b98637ff1..6462e9ea2 100644 --- a/indigo_api/tests/test_annotations_api.py +++ b/indigo_api/tests/test_annotations_api.py @@ -112,7 +112,7 @@ def test_cant_change_logged_out(self): def test_create_annotation_task(self): response = self.client.post('/api/documents/10/annotations', { 'text': 'hello', - 'anchor_id': 'section.1', + 'anchor_id': 'sec_1', }) assert_equal(response.status_code, 201) @@ -120,6 +120,21 @@ def test_create_annotation_task(self): response = self.client.post('/api/documents/10/annotations/%s/task' % note_id) assert_equal(response.status_code, 201) - assert_equal(response.data['title'], '"section.1": hello') + assert_equal(response.data['title'], '"Section 1.": hello') + assert_equal(response.data['state'], 'open') + assert_is_none(response.data.get('anchor_id')) + + def test_create_annotation_task_anchor_missing(self): + response = self.client.post('/api/documents/10/annotations', { + 'text': 'hello', + # sec_99 doesn't exist + 'anchor_id': 'sec_99', + }) + assert_equal(response.status_code, 201) + note_id = response.data['id'] + + response = self.client.post('/api/documents/10/annotations/%s/task' % note_id) + assert_equal(response.status_code, 201) + assert_equal(response.data['title'], '"sec_99": hello') assert_equal(response.data['state'], 'open') assert_is_none(response.data.get('anchor_id'))