|
1 | | -# Copyright The IETF Trust 2007, All Rights Reserved |
| 1 | +# Copyright The IETF Trust 2007-2018, All Rights Reserved |
2 | 2 |
|
3 | 3 | import csv |
4 | 4 | import datetime |
|
23 | 23 | from django.conf import settings |
24 | 24 | from django.contrib import messages |
25 | 25 | from django.contrib.auth.decorators import login_required |
| 26 | +from django.core.exceptions import ValidationError |
| 27 | +from django.core.validators import URLValidator |
26 | 28 | from django.urls import reverse,reverse_lazy |
27 | 29 | from django.db.models import Min, Max, Q |
28 | 30 | from django.forms.models import modelform_factory, inlineformset_factory |
|
59 | 61 | from ietf.meeting.utils import finalize |
60 | 62 | from ietf.secr.proceedings.utils import handle_upload_file |
61 | 63 | from ietf.secr.proceedings.proc_utils import (get_progress_stats, post_process, import_audio_files, |
62 | | - import_youtube_video_urls) |
| 64 | + import_youtube_video_urls, create_recording) |
| 65 | +from ietf.utils.decorators import require_api_key |
63 | 66 | from ietf.utils.mail import send_mail_message |
64 | 67 | from ietf.utils.pipe import pipe |
65 | 68 | from ietf.utils.pdf import pdf_pages |
@@ -2178,6 +2181,62 @@ def api_import_recordings(request, number): |
2178 | 2181 | else: |
2179 | 2182 | return HttpResponse(status=405) |
2180 | 2183 |
|
| 2184 | +@require_api_key |
| 2185 | +@role_required('Recording Manager') |
| 2186 | +@csrf_exempt |
| 2187 | +def api_set_session_video_url(request): |
| 2188 | + def err(code, text): |
| 2189 | + return HttpResponse(text, status=code, content_type='text/plain') |
| 2190 | + if request.method == 'POST': |
| 2191 | + # parameters: |
| 2192 | + # apikey: the poster's personal API key |
| 2193 | + # meeting: '101', or 'interim-2018-quic-02' |
| 2194 | + # group: 'quic' or 'plenary' |
| 2195 | + # item: '1', '2', '3' (the group's first, second, third etc. |
| 2196 | + # session during the week) |
| 2197 | + # url: The recording url (on YouTube, or whatever) |
| 2198 | + user = request.user.person |
| 2199 | + for item in ['meeting', 'group', 'item', 'url',]: |
| 2200 | + value = request.POST.get(item) |
| 2201 | + if not value: |
| 2202 | + return err(400, "Missing %s parameter" % item) |
| 2203 | + number = request.POST.get('meeting') |
| 2204 | + sessions = Session.objects.filter(meeting__number=number) |
| 2205 | + if not sessions.exists(): |
| 2206 | + return err(404, "No sessions found for meeting '%s'" % (number, )) |
| 2207 | + acronym = request.POST.get('group') |
| 2208 | + sessions = sessions.filter(group__acronym=acronym) |
| 2209 | + if not sessions.exists(): |
| 2210 | + return err(404, "No sessions found in meeting '%s' for group '%s'" % (number, acronym)) |
| 2211 | + session_times = [ (s.official_timeslotassignment().timeslot.time, s) for s in sessions ] |
| 2212 | + session_times.sort() |
| 2213 | + item = request.POST.get('item') |
| 2214 | + if not item.isdigit(): |
| 2215 | + return err(400, "Expected a numeric value for 'item', found '%s'" % (item, )) |
| 2216 | + n = int(item)-1 # change 1-based to 0-based |
| 2217 | + try: |
| 2218 | + time, session = session_times[n] |
| 2219 | + except IndexError: |
| 2220 | + return err(400, "No item '%s' found in list of sessions for group" % (item, )) |
| 2221 | + url = request.POST.get('url') |
| 2222 | + try: |
| 2223 | + URLValidator()(url) |
| 2224 | + except ValidationError: |
| 2225 | + return err(400, "Invalid url value: '%s'" % (url, )) |
| 2226 | + recordings = [ (r.name, r.title, r) for r in session.recordings() if 'video' in r.title.lower() ] |
| 2227 | + if recordings: |
| 2228 | + r = recordings[-1][-1] |
| 2229 | + r.external_url = url |
| 2230 | + else: |
| 2231 | + time = session.official_timeslotassignment().timeslot.time |
| 2232 | + title = 'Video recording for %s on %s at %s' % (acronym, time.date(), time.time()) |
| 2233 | + create_recording(session, url, title=title, user=user) |
| 2234 | + else: |
| 2235 | + return err(405, "Method not allowed") |
| 2236 | + |
| 2237 | + return HttpResponse("Done", status=200, content_type='text/plain') |
| 2238 | + |
| 2239 | + |
2181 | 2240 | def important_dates(request, num=None): |
2182 | 2241 | assert num is None or num.isdigit() |
2183 | 2242 | preview_roles = ['Area Director', 'Secretariat', 'IETF Chair', 'IAD', ] |
|
0 commit comments