mirror of
https://github.com/lucaspalomodevelop/indico-plugins.git
synced 2026-03-20 10:36:13 +00:00
LiveSync: Remove legacy MARCXML code
This commit is contained in:
parent
84381e8eea
commit
7479c36b01
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user