LiveSync: Remove legacy MARCXML code

This commit is contained in:
Adrian Moennich 2021-04-19 18:26:09 +02:00
parent 84381e8eea
commit 7479c36b01
4 changed files with 3 additions and 155 deletions

View File

@ -11,14 +11,13 @@ from indico.util.i18n import make_bound_gettext
_ = make_bound_gettext('livesync')
__all__ = ('LiveSyncPluginBase', 'LiveSyncBackendBase', 'AgentForm', 'SimpleChange', 'process_records',
'MARCXMLGenerator', 'Uploader', 'MARCXMLUploader')
'Uploader')
from .base import LiveSyncBackendBase, LiveSyncPluginBase # noqa: E402
from .forms import AgentForm # noqa: E402
from .marcxml import MARCXMLGenerator # noqa: E402
from .simplify import SimpleChange, process_records # noqa: E402
from .uploader import MARCXMLUploader, Uploader # noqa: E402
from .uploader import Uploader # noqa: E402
@signals.import_tasks.connect

View File

@ -1,107 +0,0 @@
# This file is part of the Indico plugins.
# Copyright (C) 2002 - 2021 CERN
#
# The Indico plugins are free software; you can redistribute
# them and/or modify them under the terms of the MIT License;
# see the LICENSE file for more details.
from flask_pluginengine import current_plugin
from indico.legacy.common.output import outputGenerator
from indico.legacy.common.xmlGen import XMLGen
from indico.modules.categories.models.categories import Category
from indico.modules.events.contributions.models.contributions import Contribution
from indico.modules.events.contributions.models.subcontributions import SubContribution
from indico.modules.events.models.events import Event
from indico.modules.users import User
from indico_livesync.simplify import SimpleChange
from indico_livesync.util import compound_id, obj_ref
class MARCXMLGenerator:
"""Generate MARCXML based on Indico objects."""
@classmethod
def records_to_xml(cls, records):
mg = MARCXMLGenerator()
for entry, change in records.items():
mg.safe_add_object(entry, bool(change & SimpleChange.deleted))
return mg.get_xml()
@classmethod
def objects_to_xml(cls, objs, change_type=SimpleChange.created):
mg = MARCXMLGenerator()
for obj in objs:
mg.safe_add_object(obj_ref(obj), bool(change_type & SimpleChange.deleted))
return mg.get_xml()
def __init__(self):
self.closed = False
self.xml_generator = XMLGen()
self.xml_generator.initXml()
self.xml_generator.openTag('collection', [['xmlns', 'http://www.loc.gov/MARC21/slim']])
# This is horrible. but refactoring all the code in the indico core would be just as bad.
admin = User.query.filter_by(is_admin=True).first()
self.output_generator = outputGenerator(admin, self.xml_generator)
def safe_add_object(self, obj, deleted=False):
try:
self.add_object(obj, deleted)
except Exception:
current_plugin.logger.exception('Could not process %s', obj)
def add_object(self, obj, deleted=False):
if self.closed:
raise RuntimeError('Cannot add object to closed xml generator')
if deleted:
xg = XMLGen(init=False)
xg.openTag('record')
xg.openTag('datafield', [['tag', '970'], ['ind1', ' '], ['ind2', ' ']])
xg.writeTag('subfield', f'INDICO.{compound_id(obj)}', [['code', 'a']])
xg.closeTag('datafield')
xg.openTag('datafield', [['tag', '980'], ['ind1', ' '], ['ind2', ' ']])
xg.writeTag('subfield', 'DELETED', [['code', 'c']])
xg.closeTag('datafield')
xg.closeTag('record')
self.xml_generator.xml += xg.xml
elif isinstance(obj, (Event, Contribution, SubContribution)):
if obj.is_deleted or obj.event.is_deleted:
pass
elif isinstance(obj, Event):
self.xml_generator.xml += self._event_to_marcxml(obj)
elif isinstance(obj, Contribution):
self.xml_generator.xml += self._contrib_to_marcxml(obj)
elif isinstance(obj, SubContribution):
self.xml_generator.xml += self._subcontrib_to_marcxml(obj)
elif isinstance(obj, Category):
pass # we don't send category updates
else:
raise ValueError(f'unknown object ref: {obj}')
return self.xml_generator.getXml()
def get_xml(self):
if not self.closed:
self.xml_generator.closeTag('collection')
return self.xml_generator.getXml()
def _event_to_marcxml(self, obj):
xg = XMLGen(init=False)
xg.openTag('record')
self.output_generator.confToXMLMarc21(obj, out=xg)
xg.closeTag('record')
return xg.xml
def _contrib_to_marcxml(self, obj):
xg = XMLGen(init=False)
xg.openTag('record')
self.output_generator.contribToXMLMarc21(obj, out=xg)
xg.closeTag('record')
return xg.xml
def _subcontrib_to_marcxml(self, obj):
xg = XMLGen(init=False)
xg.openTag('record')
self.output_generator.subContribToXMLMarc21(obj, out=xg)
xg.closeTag('record')
return xg.xml

View File

@ -12,7 +12,6 @@ from indico.util.console import verbose_iterator
from indico.util.iterables import grouper
from indico.util.string import str_to_ascii
from indico_livesync.marcxml import MARCXMLGenerator
from indico_livesync.simplify import process_records
@ -80,14 +79,3 @@ class Uploader:
self.logger.debug('Marking as processed: %s', record)
record.processed = True
db.session.commit()
class MARCXMLUploader(Uploader):
def upload_records(self, records, from_queue):
xml = MARCXMLGenerator.records_to_xml(records) if from_queue else MARCXMLGenerator.objects_to_xml(records)
if xml is not None:
self.upload_xml(xml)
def upload_xml(self, xml):
"""Receives MARCXML strings to be uploaded"""
raise NotImplementedError # pragma: no cover

View File

@ -11,7 +11,7 @@ from indico.modules.events import Event
from indico_livesync.models.queue import ChangeType, EntryType, LiveSyncQueueEntry
from indico_livesync.simplify import SimpleChange
from indico_livesync.uploader import MARCXMLUploader, Uploader
from indico_livesync.uploader import Uploader
class RecordingUploader(Uploader):
@ -112,35 +112,3 @@ def test_run_failing(mocker, db, create_event, dummy_agent):
assert not any(record.processed for record in records[3:])
# Only the first uccessful batch should have triggered a commit
assert db_mock.session.commit.call_count == 1
def test_marcxml_run(mocker, db, dummy_event, dummy_agent):
"""Text if the MARCXML uploader uses the correct function"""
mocker.patch('indico_livesync.uploader.db')
mocker.patch.object(MARCXMLUploader, 'upload_xml', autospec=True)
mxg = mocker.patch('indico_livesync.uploader.MARCXMLGenerator')
entry = LiveSyncQueueEntry(change=ChangeType.created, type=EntryType.event, event=dummy_event,
agent=dummy_agent)
db.session.add(entry)
db.session.flush()
uploader = MARCXMLUploader(MagicMock())
uploader.run([entry])
assert mxg.records_to_xml.called
assert not mxg.objects_to_xml.called
assert uploader.upload_xml.called
mxg.reset_mock()
uploader.run_initial([1], 1, False)
assert not mxg.records_to_xml.called
assert mxg.objects_to_xml.called
assert uploader.upload_xml.called
def test_marcxml_empty_result(mocker):
"""Test if the MARCXML uploader doesn't upload empty records"""
mocker.patch('indico_livesync.uploader.MARCXMLGenerator.objects_to_xml', return_value=None)
mocker.patch.object(MARCXMLUploader, 'upload_xml', autospec=True)
uploader = MARCXMLUploader(MagicMock())
uploader.run_initial([1], 1, False)
assert not uploader.upload_xml.called