From 6d0bde5af556ffce8b4056cdaf449e078927b0a5 Mon Sep 17 00:00:00 2001 From: Matthew Holloway Date: Fri, 25 Oct 2024 21:42:22 +1300 Subject: [PATCH] feat: Session adding notes and recordings --- ietf/meeting/urls.py | 1 + ietf/meeting/views.py | 51 +++++++++++++- .../add_session_notes_and_recordings.html | 70 +++++++++++++++++++ .../meeting/session_details_panel.html | 68 ++++++++++++++++++ 4 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 ietf/templates/meeting/add_session_notes_and_recordings.html diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index f2e65578ec..633aa431df 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -16,6 +16,7 @@ def get_redirect_url(self, *args, **kwargs): safe_for_all_meeting_types = [ url(r'^session/(?P[-a-z0-9]+)/?$', views.session_details), url(r'^session/(?P\d+)/drafts$', views.add_session_drafts), + url(r'^session/(?P\d+)/notes_and_recordings$', views.add_session_notes_and_recordings), url(r'^session/(?P\d+)/attendance$', views.session_attendance), url(r'^session/(?P\d+)/bluesheets$', views.upload_session_bluesheets), url(r'^session/(?P\d+)/minutes$', views.upload_session_minutes), diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index bce6ccd1bf..262f0604fe 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -20,7 +20,7 @@ from collections import OrderedDict, Counter, deque, defaultdict, namedtuple from functools import partialmethod import jsonschema -from urllib.parse import parse_qs, unquote, urlencode, urlsplit, urlunsplit +from urllib.parse import parse_qs, unquote, urlencode, urlsplit, urlunsplit, urlparse from tempfile import mkstemp from wsgiref.handlers import format_date_time @@ -2538,6 +2538,55 @@ def add_session_drafts(request, session_id, num): 'form': form, }) +class SessionNotesAndRecordingsForm(forms.Form): + title = forms.CharField(max_length=255) + url = forms.URLField(label="Link to recording (YouTube only)") + + def __init__(self, *args, **kwargs): + self.already_linked = kwargs.pop('already_linked') + super(self.__class__, self).__init__(*args, **kwargs) + + def clean(self): + url = self.cleaned_data['url'] + parsed_url = urlparse(url) + if parsed_url.hostname not in ['www.youtube.com', 'youtube.com', 'youtu.be', 'm.youtube.com', 'youtube-nocookie.com', 'www.youtube-nocookie.com']: + raise forms.ValidationError("Must be a YouTube URL") + problems = set(url).intersection(set(self.already_linked)) + if problems: + raise forms.ValidationError("Already linked: %s" % ', '.join([d.name for d in problems])) + return self.cleaned_data + +def add_session_notes_and_recordings(request, session_id, num): + # num is redundant, but we're dragging it along an artifact of where we are in the current URL structure + session = get_object_or_404(Session,pk=session_id) + if not session.can_manage_materials(request.user): + raise Http404 + if session.is_material_submission_cutoff() and not has_role(request.user, "Secretariat"): + raise Http404 + + already_linked = [material.external_url for material in session.materials.filter(type="recording").exclude(states__type="recording", states__slug='deleted').order_by('presentations__order')] + + session_number = None + sessions = get_sessions(session.meeting.number,session.group.acronym) + if len(sessions) > 1: + session_number = 1 + sessions.index(session) + + if request.method == 'POST': + form = SessionNotesAndRecordingsForm(request.POST,already_linked=already_linked) + if form.is_valid(): + title = form.cleaned_data['title'] + url = form.cleaned_data['url'] + create_recording(session, url, title=title, user=request.user.person) + return redirect('ietf.meeting.views.session_details', num=session.meeting.number, acronym=session.group.acronym) + else: + form = SessionNotesAndRecordingsForm(already_linked=already_linked) + + return render(request, "meeting/add_session_notes_and_recordings.html", + { 'session': session, + 'session_number': session_number, + 'already_linked': session.materials.filter(type="recording").exclude(states__type="recording", states__slug='deleted').order_by('presentations__order'), + 'form': form, + }) def session_attendance(request, session_id, num): """Session attendance view diff --git a/ietf/templates/meeting/add_session_notes_and_recordings.html b/ietf/templates/meeting/add_session_notes_and_recordings.html new file mode 100644 index 0000000000..d7d8e933dc --- /dev/null +++ b/ietf/templates/meeting/add_session_notes_and_recordings.html @@ -0,0 +1,70 @@ +{% extends "base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin static django_bootstrap5 %} +{% block title %}Add I-Ds to {{ session.meeting }} : {{ session.group.acronym }}{% endblock %} +{% block pagehead %}{{ form.media.css }}{% endblock %} +{% block content %} + {% origin %} +

+ Add Notes and Recordings to {{ session.meeting }} + {% if session_number %}: Session {{ session_number }}{% endif %} +
+ {{ session.group.acronym }} + {% if session.name %}: {{ session.name }}{% endif %} + +

+ {% comment %} TODO: put the session name here or calculate the number at the meeting {% endcomment %} + {% if session.is_material_submission_cutoff %} +
+ The deadline for submission corrections has passed. This may affect published proceedings. +
+ {% endif %} +
+ This form will link additional Notes and Recordings to this session with a revision of "Current at time of presentation". For more fine grained control of versions, or to remove Notes and Recordings from a session, adjust the sessions associated with an Internet-Draft from the Internet-Draft's main page. +
+

Notes and Recordings already linked to this session

+ + + + + + + + {% if already_linked %} + + {% for sp in already_linked %} + + + + + {% endfor %} + + {% else %} + + + + + + {% endif %} +
RevisionDocument
+ {% if sp.rev %} + -{{ sp.rev }} + {% else %} + (current) + {% endif %} + {{ sp.title }}
(none)
+

Add additional Notes and Recordings to this session

+
+ {% csrf_token %} + {% bootstrap_form form %} + + + Back + +
+{% endblock %} +{% block js %}{{ form.media.js }}{% endblock %} \ No newline at end of file diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html index 52aeaaa8c1..186ba8bba8 100644 --- a/ietf/templates/meeting/session_details_panel.html +++ b/ietf/templates/meeting/session_details_panel.html @@ -366,8 +366,76 @@

Notes and recordings

{% endif %} {% endif %} + + {% with session.recordings as recordings %} + {% if recordings %} + {# There's no guaranteed order, so this is a bit messy: #} + {# Audio #} + {% for r in recordings %} + {% with href=r.get_href %} + {% if 'audio' in href %} + + + + {{ r.title }} + + + + {% endif %} + {% endwith %} + {% endfor %} + {# YouTube #} + {% for r in recordings %} + {% with href=r.get_href %} + {% if 'youtu' in href %} + + + + {{ r.title }} + + + + {% endif %} + {% endwith %} + {% endfor %} + {# Any other recordings #} + {% for r in recordings %} + {% with href=r.get_href %} + {% if not 'audio' in href and not 'youtu' in href %} + + + + {{ r.title }} + + + + {% endif %} + {% endwith %} + {% endfor %} + {% elif show_empty %} + {# #} + {% endif %} + {% if session.session_recording_url %} + + + + Meetecho session recording + + + + {% endif %} + {% endwith %} + + + {% if can_manage_materials %} + + Link additional notes and recordings to session + + {% endif %} + {% endif %} {% endwith %}{% endwith %} {% endfor %}