From 52a707628fe2b5f8c9a0b8afd4ffcd8bafd8b3e7 Mon Sep 17 00:00:00 2001
From: Paul Selkirk <paul@painless-security.com>
Date: Tue, 20 Feb 2024 10:40:31 -0500
Subject: [PATCH] feat: Links to chatlogs and session recordings on proceedings
 page (#7042)

* feat: Links to chatlogs and session recordings on proceedings page (#6791)

* refactor: Add a url template and convenience function for session_recording url

* refactor: Avoid using the walrus operator
---
 ietf/meeting/models.py                        | 33 ++++++++++---------
 ietf/meeting/views.py                         |  3 +-
 ietf/settings.py                              |  1 +
 ietf/templates/meeting/group_proceedings.html | 20 ++++++++++-
 .../meeting/interim_session_buttons.html      |  2 +-
 .../meeting/session_buttons_include.html      |  4 +--
 .../meeting/session_details_panel.html        |  2 +-
 7 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py
index ca137fc0d..52a851576 100644
--- a/ietf/meeting/models.py
+++ b/ietf/meeting/models.py
@@ -1,4 +1,4 @@
-# Copyright The IETF Trust 2007-2022, All Rights Reserved
+# Copyright The IETF Trust 2007-2024, All Rights Reserved
 # -*- coding: utf-8 -*-
 
 
@@ -1070,6 +1070,9 @@ class Session(models.Model):
     def bluesheets(self):
         return list(self.get_material("bluesheets", only_one=False))
 
+    def chatlogs(self):
+        return list(self.get_material("chatlog", only_one=False))
+
     def slides(self):
         if not hasattr(self, "_slides_cache"):
             self._slides_cache = list(self.get_material("slides", only_one=False))
@@ -1267,29 +1270,27 @@ class Session(models.Model):
             return self.meeting.group_at_the_time(self.group_at_the_time().parent)
 
     def audio_stream_url(self):
-        if (
-            self.meeting.type.slug == "ietf"
-            and self.has_onsite_tool
-            and (url := getattr(settings, "MEETECHO_AUDIO_STREAM_URL", ""))
-        ):
+        url = getattr(settings, "MEETECHO_AUDIO_STREAM_URL", "")
+        if self.meeting.type.slug == "ietf" and self.has_onsite_tool and url:
             return url.format(session=self)
         return None
 
     def video_stream_url(self):
-        if (
-            self.meeting.type.slug == "ietf"
-            and self.has_onsite_tool
-            and (url := getattr(settings, "MEETECHO_VIDEO_STREAM_URL", ""))
-        ):
+        url = getattr(settings, "MEETECHO_VIDEO_STREAM_URL", "")
+        if self.meeting.type.slug == "ietf" and self.has_onsite_tool and url:
             return url.format(session=self)
         return None
 
     def onsite_tool_url(self):
-        if (
-            self.meeting.type.slug == "ietf"
-            and self.has_onsite_tool
-            and (url := getattr(settings, "MEETECHO_ONSITE_TOOL_URL", ""))
-        ):
+        url = getattr(settings, "MEETECHO_ONSITE_TOOL_URL", "")
+        if self.meeting.type.slug == "ietf" and self.has_onsite_tool and url:
+            return url.format(session=self)
+        return None
+
+    def session_recording_url(self):
+        url = getattr(settings, "MEETECHO_SESSION_RECORDING_URL", "")
+        if self.meeting.type.slug == "ietf" and self.has_onsite_tool and url:
+            self.group.acronym_upper = self.group.acronym.upper()
             return url.format(session=self)
         return None
 
diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py
index eae9b145e..db4eed0eb 100644
--- a/ietf/meeting/views.py
+++ b/ietf/meeting/views.py
@@ -1,4 +1,4 @@
-# Copyright The IETF Trust 2007-2023, All Rights Reserved
+# Copyright The IETF Trust 2007-2024, All Rights Reserved
 # -*- coding: utf-8 -*-
 
 
@@ -3786,6 +3786,7 @@ def organize_proceedings_sessions(sessions):
                 'minutes': _format_materials((s, s.minutes()) for s in ss),
                 'bluesheets': _format_materials((s, s.bluesheets()) for s in ss),
                 'recordings': _format_materials((s, s.recordings()) for s in ss),
+                'chatlogs': _format_materials((s, s.chatlogs()) for s in ss),
                 'slides': _format_materials((s, s.slides()) for s in ss),
                 'drafts': _format_materials((s, s.drafts()) for s in ss),
                 'last_update': session.last_update if hasattr(session, 'last_update') else None
diff --git a/ietf/settings.py b/ietf/settings.py
index 17ed58d6f..7fa4ebbe6 100644
--- a/ietf/settings.py
+++ b/ietf/settings.py
@@ -1174,6 +1174,7 @@ CELERY_TASK_IGNORE_RESULT = True  # ignore results unless specifically enabled f
 MEETECHO_ONSITE_TOOL_URL = "https://meetings.conf.meetecho.com/onsite{session.meeting.number}/?session={session.pk}"
 MEETECHO_VIDEO_STREAM_URL = "https://meetings.conf.meetecho.com/ietf{session.meeting.number}/?session={session.pk}"
 MEETECHO_AUDIO_STREAM_URL = "https://mp3.conf.meetecho.com/ietf{session.meeting.number}/{session.pk}.m3u"
+MEETECHO_SESSION_RECORDING_URL = "https://www.meetecho.com/ietf{session.meeting.number}/recordings#{session.group.acronym_upper}"
 
 # Put the production SECRET_KEY in settings_local.py, and also any other
 # sensitive or site-specific changes.  DO NOT commit settings_local.py to svn.
diff --git a/ietf/templates/meeting/group_proceedings.html b/ietf/templates/meeting/group_proceedings.html
index 618c28164..666685000 100644
--- a/ietf/templates/meeting/group_proceedings.html
+++ b/ietf/templates/meeting/group_proceedings.html
@@ -1,4 +1,4 @@
-{# Copyright The IETF Trust 2015, All Rights Reserved #}
+{# Copyright The IETF Trust 2015-2024, All Rights Reserved #}
 {% load origin %}
 {% origin %}
 {% load ietf_filters %}
@@ -54,6 +54,18 @@
                 </a>
                 <br>
             {% endfor %}
+            {% for chatlog in entry.chatlogs %}
+                <a href="{{ chatlog.material|meeting_href:meeting }}">
+                    Chatlog
+                    {% if chatlog.time %}{{chatlog.time|date:"D G:i"}}{% endif %}
+                </a>
+                <br>
+            {% empty %}
+                <a href="{{ entry.session.chat_archive_url }}">
+                    Chatlog
+                </a>
+                <br>
+            {% endfor %}
         </td>
         {# recordings #}
         <td>
@@ -64,6 +76,12 @@
               </a>
               <br>
           {% endfor %}
+            {% if entry.session.video_stream_url %}
+                <a href="{{ entry.session.session_recording_url }}">
+                    Session recording
+                </a>
+                <br>
+            {% endif %}
         </td>
         {# slides #}
         <td>
diff --git a/ietf/templates/meeting/interim_session_buttons.html b/ietf/templates/meeting/interim_session_buttons.html
index 2334ec9e8..2f0951338 100644
--- a/ietf/templates/meeting/interim_session_buttons.html
+++ b/ietf/templates/meeting/interim_session_buttons.html
@@ -148,7 +148,7 @@
                     {% endfor %}
                 {% elif session.video_stream_url %}
                     <a class="btn btn-outline-primary"
-                       href="http://www.meetecho.com/ietf{{ meeting.number }}/recordings#{{ acronym.upper }}"
+                       href="{{ session.session_recording_url }}"
                        aria-label="Meetecho session recording"
                        title="Meetecho session recording">
                         <i class="bi bi-file-slides"></i>
diff --git a/ietf/templates/meeting/session_buttons_include.html b/ietf/templates/meeting/session_buttons_include.html
index b69413238..3dc9c45dc 100644
--- a/ietf/templates/meeting/session_buttons_include.html
+++ b/ietf/templates/meeting/session_buttons_include.html
@@ -181,7 +181,7 @@
                         {% if session.video_stream_url %}
                             <a class="btn btn-outline-primary"
                                 role="button"
-                                href="https://www.meetecho.com/ietf{{ meeting.number }}/recordings#{{ acronym.upper }}"
+                                href="{{ session.session_recording_url }}"
                                 aria-label="Session recording"
                                 title="Session recording">
                                 <i class="bi bi-file-slides"></i>
@@ -351,7 +351,7 @@
                             {% if session.video_stream_url %}
                                 <li>
                                     <a class="dropdown-item"
-                                        href="https://www.meetecho.com/ietf{{ meeting.number }}/recordings#{{ acronym.upper }}">
+                                        href="{{ session.session_recording_url }}">
                                         <i class="bi bi-file-slides"></i> Session recording
                                     </a>
                                 </li>
diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html
index 3ff09fc33..0e3005018 100644
--- a/ietf/templates/meeting/session_details_panel.html
+++ b/ietf/templates/meeting/session_details_panel.html
@@ -344,7 +344,7 @@
                 {% if session.video_stream_url %}
                     <tr>
                         <td>
-                            <a href="https://www.meetecho.com/ietf{{ meeting.number }}/recordings#{{ group.acronym.upper }}">
+                            <a href="{{ session.session_recording_url }}">
                                 <i class="bi bi-file-slides"></i> Session recording
                             </a>
                         </td>