From a50b09b152fb2280ee66ec7fa9823738fb5ddc95 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Sat, 25 Mar 2017 21:52:11 +0000 Subject: [PATCH] Add REST API endpoint to notify Datatracker that new recording files are available. Commit ready for merge. - Legacy-Id: 13125 --- ietf/api/tests.py | 12 ++++++++++++ ietf/meeting/api_urls.py | 9 +++++++++ ietf/meeting/views.py | 16 ++++++++++++++-- ietf/urls.py | 5 +++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 ietf/meeting/api_urls.py diff --git a/ietf/api/tests.py b/ietf/api/tests.py index 0d0d28208..fa877433e 100644 --- a/ietf/api/tests.py +++ b/ietf/api/tests.py @@ -13,6 +13,7 @@ from tastypie.test import ResourceTestCaseMixin import debug # pyflakes:ignore from ietf.utils.test_utils import TestCase +from ietf.meeting.test_data import make_meeting_test_data OMITTED_APPS = ( 'ietf.secr.meetings', @@ -20,6 +21,17 @@ OMITTED_APPS = ( 'ietf.ipr', ) +class CustomApiTestCase(TestCase): + def test_notify_meeting_import_audio_files(self): + meeting = make_meeting_test_data() + client = Client(Accept='application/json') + # try invalid method GET + r = client.get("/api/notify/v1/meeting/import_recordings/{}".format(meeting.number)) + self.assertEqual(r.status_code, 405) + # try valid method POST + r = client.post("/api/notify/v1/meeting/import_recordings/{}".format(meeting.number)) + self.assertEqual(r.status_code, 201) + class TastypieApiTestCase(ResourceTestCaseMixin, TestCase): def __init__(self, *args, **kwargs): self.apps = {} diff --git a/ietf/meeting/api_urls.py b/ietf/meeting/api_urls.py new file mode 100644 index 000000000..bf4cdbf7b --- /dev/null +++ b/ietf/meeting/api_urls.py @@ -0,0 +1,9 @@ +# Copyright The IETF Trust 2007, All Rights Reserved + +from ietf.meeting import views +from ietf.utils.urls import url + + +urlpatterns = [ + url(r'^import_recordings/(?P[A-Za-z0-9._+-]+)/?$', views.api_import_recordings), +] diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 46b23d63e..6eaae4e24 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -31,7 +31,7 @@ from django.template.loader import render_to_string from django.utils.functional import curry from django.views.decorators.cache import cache_page from django.utils.text import slugify -from django.views.decorators.csrf import ensure_csrf_cookie +from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt from django.views.generic import RedirectView from django.template.defaultfilters import filesizeformat @@ -58,7 +58,7 @@ from ietf.meeting.helpers import send_interim_approval_request from ietf.meeting.helpers import send_interim_announcement_request from ietf.meeting.utils import finalize from ietf.secr.proceedings.utils import handle_upload_file -from ietf.secr.proceedings.proc_utils import get_progress_stats, post_process +from ietf.secr.proceedings.proc_utils import get_progress_stats, post_process, import_audio_files from ietf.utils import log from ietf.utils.mail import send_mail_message from ietf.utils.pipe import pipe @@ -2162,3 +2162,15 @@ def proceedings_progress_report(request, num=None): class OldUploadRedirect(RedirectView): def get_redirect_url(self, **kwargs): return reverse_lazy('ietf.meeting.views.session_details',kwargs=self.kwargs) + +@csrf_exempt +def api_import_recordings(request, number): + '''REST API to check for recording files and import''' + if request.method == 'POST': + meeting = get_meeting(number) + import_audio_files(meeting) + return HttpResponse(status=201) + else: + return HttpResponse(status=405) + + diff --git a/ietf/urls.py b/ietf/urls.py index c56e771c7..b32b84760 100644 --- a/ietf/urls.py +++ b/ietf/urls.py @@ -82,6 +82,11 @@ for n,a in api._api_list: url(r'^api/v1/', include(a.urls)), ] +# Custom API endpoints +urlpatterns += [ + url(r'^api/notify/v1/meeting/', include('ietf.meeting.api_urls')), +] + # This is needed to serve files during testing if settings.SERVER_MODE in ('development', 'test'): save_debug = settings.DEBUG