mirror of https://gitlab.com/openlp/openlp.git
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:
commit
a9b9a4201d
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue