Skip to content

Commit 3d6e08a

Browse files
authored
Merge pull request #2330 from laws-africa/provision-level-pit-comparison
Provision-level PiT comparison
2 parents 7faf6b8 + 2de2e2c commit 3d6e08a

File tree

5 files changed

+31
-26
lines changed

5 files changed

+31
-26
lines changed

indigo_api/models/documents.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,14 +548,14 @@ def change_date(self, new_date, user, comment=None):
548548
self.expression_date = new_date
549549
self.save_with_revision(user, comment=comment)
550550

551-
def get_provision_element(self, provision_eid):
551+
def get_portion(self, provision_eid):
552552
provision_xml = self.doc.get_portion_element(provision_eid)
553553
if provision_xml is None:
554554
return None
555555
portion = StructuredDocument.for_document_type('portion')()
556556
portion.frbr_uri = self.frbr_uri
557557
portion.main_content.append(provision_xml)
558-
return portion.main
558+
return portion
559559

560560
def update_provision_xml(self, provision_eid, provision_xml):
561561
xml = etree.fromstring(provision_xml)

indigo_api/serializers.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ class DocumentAPISerializer(serializers.Serializer):
439439
xml = serializers.CharField()
440440
language = serializers.CharField(min_length=3, max_length=3)
441441
provision_eid = serializers.CharField(allow_blank=True)
442+
element_id = serializers.CharField(required=False, allow_null=True, allow_blank=True)
442443

443444
def validate_xml(self, xml):
444445
""" mostly copied from DocumentSerializer.validate()
@@ -488,7 +489,7 @@ def updated_xml(self):
488489
return document.document_xml
489490
# otherwise, return only the provision being edited (NOT including the outer akn tag)
490491
# if we used the full XML for the analysis, grab only the appropriate provision as a portion
491-
xml = document.get_provision_element(provision_eid) if self.use_full_xml else document.doc.portion
492+
xml = document.get_portion(provision_eid).main if self.use_full_xml else document.doc.portion
492493
return etree.tostring(xml, encoding='unicode')
493494

494495

@@ -714,14 +715,3 @@ def get_url(self, instance):
714715
'work_id': instance.amended_work.pk,
715716
'pk': instance.pk,
716717
})
717-
718-
719-
class DocumentDiffSerializer(serializers.Serializer):
720-
""" Helper to handle input elements for the /document/xxx/diff API
721-
"""
722-
document = DocumentSerializer(required=True)
723-
element_id = serializers.CharField(required=False, allow_null=True)
724-
725-
def __init__(self, *args, **kwargs):
726-
super().__init__(*args, **kwargs)
727-
self.fields['document'].instance = self.instance

indigo_api/views/documents.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@
2424
from django_filters.rest_framework import DjangoFilterBackend
2525
from cobalt import StructuredDocument
2626

27+
from lxml import etree
2728
import lxml.html.diff
2829

2930
from indigo.analysis.differ import AKNHTMLDiffer
3031
from indigo.analysis.refs.base import markup_document_refs
3132
from indigo.plugins import plugins
3233
from indigo.xmlutils import parse_html_str
33-
from ..models import Document, Annotation, DocumentActivity, Task, Language, Work
34-
from ..serializers import DocumentSerializer, RenderSerializer, ParseSerializer, DocumentAPISerializer, VersionSerializer, AnnotationSerializer, DocumentActivitySerializer, TaskSerializer, DocumentDiffSerializer
34+
from ..models import Document, Annotation, DocumentActivity, Task
35+
from ..serializers import DocumentSerializer, RenderSerializer, ParseSerializer, DocumentAPISerializer, VersionSerializer, AnnotationSerializer, DocumentActivitySerializer, TaskSerializer
3536
from ..renderers import AkomaNtosoRenderer, PDFRenderer, EPUBRenderer, HTMLRenderer, ZIPRenderer
3637
from indigo_api.exporters import HTMLExporter
3738
from ..authz import DocumentPermissions, AnnotationPermissions, ModelPermissions, RelatedDocumentPermissions, \
@@ -424,7 +425,8 @@ def manipulate_xml(self):
424425

425426
class DocumentDiffView(DocumentResourceView, APIView):
426427
def post(self, request, document_id):
427-
serializer = DocumentDiffSerializer(instance=self.document, data=self.request.data)
428+
serializer = DocumentAPISerializer(instance=self.document, data=self.request.data)
429+
serializer.use_full_xml = False
428430
serializer.is_valid(raise_exception=True)
429431

430432
differ = AKNHTMLDiffer()
@@ -433,10 +435,23 @@ def post(self, request, document_id):
433435

434436
# set this up to be the modified document
435437
remote_doc = Document.objects.get(pk=local_doc.pk)
436-
serializer.fields['document'].update_document(local_doc, serializer.validated_data['document'])
437438

438-
local_doc.content = differ.preprocess_xml_str(local_doc.document_xml).decode('utf-8')
439-
remote_doc.content = differ.preprocess_xml_str(remote_doc.document_xml).decode('utf-8')
439+
# this will set the local_doc's content as the <portion> in provision mode,
440+
# and update it with the latest unsaved changes regardless
441+
serializer.set_content()
442+
local_doc.content = differ.preprocess_xml_str(local_doc.document_xml)
443+
444+
provision_eid = serializer.validated_data.get('provision_eid')
445+
if provision_eid:
446+
portion = remote_doc.get_portion(provision_eid)
447+
# the same structure as the 'xml' we're getting from the browser: akn/portion/portionBody/element
448+
remote_xml = etree.tostring(portion.root, encoding='unicode')
449+
remote_doc.work.work_uri.doctype = 'portion'
450+
remote_doc.content = differ.preprocess_xml_str(remote_xml)
451+
452+
else:
453+
# full document mode
454+
remote_doc.content = differ.preprocess_xml_str(remote_doc.document_xml)
440455

441456
element_id = serializer.validated_data.get('element_id')
442457
if element_id:

indigo_app/static/javascript/indigo/views/document_editor.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,12 @@
262262
},
263263

264264
renderComparisonDiff: function() {
265-
var self = this,
266-
data = {};
265+
let self = this;
267266

268267
if (!this.comparisonDocumentId) return;
269268

270-
data.document = this.document.toJSON();
271-
data.document.content = this.document.content.toXml();
269+
const data = this.document.content.toSimplifiedJSON();
270+
// slight difference to provision_eid -- doesn't treat the document XML as a portion
272271
data.element_id = this.xmlElement.getAttribute('eId');
273272

274273
if (!data.element_id && this.xmlElement.tagName !== "akomaNtoso") {

indigo_app/views/documents.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,11 @@ class DocumentProvisionDetailView(DocumentDetailView):
130130
def get(self, request, *args, **kwargs):
131131
document = self.get_object()
132132
self.eid = self.kwargs.get('eid')
133-
self.provision_xml = document.get_provision_element(self.eid)
134-
if self.provision_xml is None:
133+
provision_xml = document.get_portion(self.eid)
134+
if provision_xml is None:
135135
messages.error(request, _("No provision with this id found: '%(eid)s'") % {"eid": self.eid})
136136
return redirect('choose_document_provision', doc_id=document.id)
137+
self.provision_xml = provision_xml.main
137138
return super().get(request, *args, **kwargs)
138139

139140
def get_context_data(self, **kwargs):

0 commit comments

Comments
 (0)