Merge branch 'api_transpose_service_item_format' into 'master'

Adding ability to return transposed item with service_item format to avoid duplicate calls on remote

See merge request openlp/openlp!561
This commit is contained in:
Raoul Snyman 2023-01-31 17:24:56 +00:00
commit a9b9a4201d
3 changed files with 54 additions and 11 deletions

View File

@ -59,6 +59,8 @@ def system_information():
data = {}
data['websocket_port'] = Registry().get('settings_thread').value('api/websocket port')
data['login_required'] = Registry().get('settings_thread').value('api/authentication enabled')
data['api_version'] = 2
data['api_revision'] = 2
return jsonify(data)

View File

@ -21,11 +21,13 @@
##########################################################################
import logging
import json
import re
from flask import abort, request, Blueprint, jsonify
from flask import abort, request, Blueprint, jsonify, Response
from openlp.core.api.lib import login_required, extract_request, old_success_response, old_auth
from openlp.core.lib.plugin import PluginStatus
from openlp.core.common.json import OpenLPJSONEncoder
from openlp.core.common.registry import Registry
from openlp.plugins.songs.lib import transpose_lyrics
@ -143,6 +145,8 @@ def set_search_option(plugin):
@plugins.route('/songs/transpose-live-item/<transpose_value>', methods=['GET'])
def transpose(transpose_value):
log.debug('songs/transpose-live-item called')
response_format = request.args.get('response_format', None, type=str)
return_service_item = response_format == 'service_item'
if transpose_value:
try:
transpose_value = int(transpose_value)
@ -169,9 +173,19 @@ def transpose(transpose_value):
verse_list = re.split(r'---\[Verse:(.+?)\]---', transposed_lyrics)
# remove first blank entry
verse_list = verse_list[1:]
j = 0
for i in range(0, len(verse_list), 2):
chord_slides.append({'chords': verse_list[i + 1].strip(), 'verse': verse_list[i]})
return jsonify(chord_slides), 200
if return_service_item:
live_item['slides'][j]['chords'] = verse_list[i + 1].strip()
j += 1
else:
chord_slides.append({'chords': verse_list[i + 1].strip(), 'verse': verse_list[i]})
if return_service_item:
live_item['chords_transposed'] = True
json_live_item = json.dumps(live_item, cls=OpenLPJSONEncoder)
return Response(json_live_item, mimetype='application/json')
else:
return jsonify(chord_slides), 200
abort(400)

View File

@ -18,6 +18,7 @@
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
##########################################################################
from collections import namedtuple
from pathlib import Path
from unittest.mock import MagicMock
@ -102,14 +103,10 @@ def test_plugin_songs_transpose_returns_plugin_exception(flask_client, settings)
assert res.status_code == 400
def test_plugin_songs_transpose_wont_call_renderer(flask_client, settings):
"""
Tests whether the transpose endpoint won't tries to use any Renderer method; the endpoint needs to operate using
already-primed caches (as that's what the /live-item endpoint does); also using Renderer from outside the Qt loop
causes it to crash.
TransposeMockReturn = namedtuple('TransposeMockReturn', ['renderer_mock_any_attr'])
See https://gitlab.com/openlp/openlp/-/merge_requests/516 for some background on this.
"""
def _init_transpose_mocks():
# GIVEN: A mocked plugin_manager, live_controller, renderer and a real service item with the internal slide cache
# filled
Registry().register('plugin_manager', MagicMock())
@ -139,8 +136,38 @@ def test_plugin_songs_transpose_wont_call_renderer(flask_client, settings):
renderer_mock_any_attr.reset_mock()
renderer_mock.format_slides.reset_mock()
return TransposeMockReturn(renderer_mock_any_attr=renderer_mock_any_attr)
def test_plugin_songs_transpose_wont_call_renderer(flask_client, settings):
"""
Tests whether the transpose endpoint won't tries to use any Renderer method; the endpoint needs to operate using
already-primed caches (as that's what the /live-item endpoint does); also using Renderer from outside the Qt loop
causes it to crash.
See https://gitlab.com/openlp/openlp/-/merge_requests/516 for some background on this.
"""
# GIVEN: The default mocks for Transpose API
mocks = _init_transpose_mocks()
# WHEN: The endpoint is called
flask_client.get('/api/v2/plugins/songs/transpose-live-item/-1')
# THEN: The renderer should not be called
renderer_mock_any_attr.assert_not_called()
mocks.renderer_mock_any_attr.assert_not_called()
def test_plugin_songs_transpose_accepts_response_format_service_item(flask_client, settings):
"""
Tests whether the transpose's return_service_item parameter works
"""
# GIVEN: The default mocks for Transpose API and the default response
_init_transpose_mocks()
# WHEN: The transpose action returning service_item is called
service_item_res = flask_client.get('/api/v2/plugins/songs/transpose-live-item/-1?response_format=service_item')
# THEN: The service item response shouldn't match normal response and should be a service_item response
response = service_item_res.json
assert 'capabilities' in response