feat: point to Zulip chat rather than jabber. (#4218)

* feat: point to Zulip chat rather than jabber.

* fix: Address review comments from Jennifer and Nick
This commit is contained in:
Robert Sparks 2022-07-15 13:48:54 -05:00 committed by GitHub
parent 470adb97a3
commit 6ed4ea0f93
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 150 additions and 83 deletions

View file

@ -278,12 +278,12 @@ const meetingEvents = computed(() => {
}
if (item.adjustedEnd > current) {
// -> Pre/live event
// -> Jabber logs
// -> Chat room
links.push({
id: `lnk-${item.id}-logs`,
label: `Chat logs for ${item.acronym}`,
id: `lnk-${item.id}-room`,
label: `Chat room for ${item.acronym}`,
icon: 'chat-left-text',
href: `xmpp:${item.type === 'plenary' ? 'plenary' : item.acronym}@jabber.ietf.org?join`,
href: item.links.chat,
color: 'green'
})
// -> Video stream
@ -339,12 +339,12 @@ const meetingEvents = computed(() => {
} else {
// -> Post event
if (meetingNumberInt >= 60) {
// -> Jabber logs
// -> Chat logs
links.push({
id: `lnk-${item.id}-logs`,
label: `Chat logs for ${item.acronym}`,
icon: 'chat-left-text',
href: `https://www.ietf.org/jabber/logs/${item.type === 'plenary' ? 'plenary' : item.acronym}?C=M;O=D`,
href: item.links.chatArchive,
color: 'green'
})
}

View file

@ -107,12 +107,11 @@ export const useAgendaStore = defineStore('agenda', {
adjustedStartDateTime: eventStartDate.toISO(),
adjustedEndDateTime: eventEndDate.toISO(),
links: {
recordings: s.links.recordings,
...s.links,
videoStream: formatLinkUrl(s.links.videoStream, s, state.meeting.number),
onsiteTool: formatLinkUrl(s.links.onsiteTool, s, state.meeting.number),
audioStream: formatLinkUrl(s.links.audioStream, s, state.meeting.number),
remoteCallIn: remoteCallInUrl,
calendar: s.links.calendar
remoteCallIn: remoteCallInUrl
},
sessionKeyword: s.sessionToken ? `${s.groupAcronym}-${s.sessionToken}` : s.groupAcronym
}

View file

@ -729,7 +729,7 @@ def is_special_agenda_item(assignment):
@register.filter
def should_show_agenda_session_buttons(assignment):
"""Should this agenda item show the session buttons (jabber link, etc)?
"""Should this agenda item show the session buttons (chat link, etc)?
In IETF-112 and earlier, office hours sessions were designated by a name ending
with ' office hours' and belonged to the IESG or some other group. This led to

View file

@ -200,7 +200,7 @@ class GroupFeaturesAdmin(admin.ModelAdmin):
'has_nonsession_materials',
'has_meetings',
'has_reviews',
'has_default_jabber',
'has_default_chat',
'acts_like_wg',
'create_wiki',
'custom_group_roles',

View file

@ -0,0 +1,19 @@
# Copyright The IETF Trust 2022, All Rights Reserved
# Generated by Django 2.2.28 on 2022-07-14 09:09
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('group', '0056_dir_chair_groupman_role'),
]
operations = [
migrations.RenameField(
model_name='groupfeatures',
old_name='has_default_jabber',
new_name='has_default_chat',
),
]

View file

@ -205,6 +205,16 @@ class Group(GroupInfo):
desc = [ p for p in re.split(r'\r?\n\s*\r?\n\s*', text) if p.strip() ][0]
return desc
def chat_room_url(self):
return settings.CHAT_URL_PATTERN.format(chat_room_name=self.acronym)
def chat_archive_url(self):
# Zulip has no separate archive
if 'CHAT_ARCHIVE_URL_PATTERN' in settings:
return settings.CHAT_ARCHIVE_URL_PATTERN.format(chat_room_name=self.acronym)
else:
return self.chat_room_url()
validate_comma_separated_materials = RegexValidator(
regex=r"[a-z0-9_-]+(,[a-z0-9_-]+)*",
@ -237,7 +247,7 @@ class GroupFeatures(models.Model):
has_nonsession_materials= models.BooleanField("Other Matrl.", default=False)
has_meetings = models.BooleanField("Meetings", default=False)
has_reviews = models.BooleanField("Reviews", default=False)
has_default_jabber = models.BooleanField("Jabber", default=False)
has_default_chat = models.BooleanField("Chat", default=False)
#
acts_like_wg = models.BooleanField("WG-Like", default=False)
create_wiki = models.BooleanField("Wiki", default=False)

View file

@ -302,7 +302,7 @@ class GroupFeaturesResource(ModelResource):
"has_nonsession_materials": ALL,
"has_meetings": ALL,
"has_reviews": ALL,
"has_default_jabber": ALL,
"has_default_chat": ALL,
"customize_workflow": ALL,
"about_page": ALL,
"default_tab": ALL,

View file

@ -1254,14 +1254,24 @@ class Session(models.Model):
return self._agenda_file
def jabber_room_name(self):
def chat_room_name(self):
if self.type_id=='plenary':
return 'plenary'
elif self.historic_group:
elif hasattr(self, 'historic_group'):
return self.historic_group.acronym
else:
return self.group.acronym
def chat_room_url(self):
return settings.CHAT_URL_PATTERN.format(chat_room_name=self.chat_room_name())
def chat_archive_url(self):
# Zulip has no separate archive
if hasattr(settings,'CHAT_ARCHIVE_URL_PATTERN'):
return settings.CHAT_ARCHIVE_URL_PATTERN.format(chat_room_name=self.chat_room_name())
else:
return self.chat_room_url()
def notes_id(self):
note_id_fragment = 'plenary' if self.type.slug == 'plenary' else self.group.acronym
return f'notes-ietf-{self.meeting.number}-{note_id_fragment}'

View file

@ -1639,7 +1639,7 @@ def agenda_neue(request, num=None, name=None, base=None, ext=None, owner=None, u
"categories": filter_organizer.get_filter_categories(),
"isCurrentMeeting": is_current_meeting,
"useHedgeDoc": True if meeting.date>=settings.MEETING_USES_CODIMD_DATE else False,
"schedule": list(map(agenda_extract_shedule, filtered_assignments)),
"schedule": list(map(agenda_extract_schedule, filtered_assignments)),
"floors": list(map(agenda_extract_floorplan, floors))
},
"schedule": {
@ -1651,7 +1651,7 @@ def agenda_neue(request, num=None, name=None, base=None, ext=None, owner=None, u
return rendered_page
def agenda_extract_shedule (item):
def agenda_extract_schedule (item):
return {
"id": item.id,
"room": item.room_name,
@ -1689,7 +1689,8 @@ def agenda_extract_shedule (item):
"short": item.session.short if item.session.short else item.session.short_name,
"sessionToken": item.session.docname_token_only_for_multiple(),
"links": {
# "jabber": item.session.jabber_room_name
"chat" : item.session.chat_room_url(),
"chatArchive" : item.session.chat_archive_url(),
"recordings": list(map(agenda_extract_recording, item.session.recordings())),
"videoStream": item.timeslot.location.video_stream_url() if item.timeslot.location else "",
"audioStream": item.timeslot.location.audio_stream_url() if item.timeslot.location else "",

View file

@ -2604,7 +2604,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\",\n \"lead\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": true,
"has_default_chat": true,
"has_documents": false,
"has_meetings": true,
"has_milestones": false,
@ -2643,7 +2643,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -2680,7 +2680,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"Area Director\"\n]",
"groupman_roles": "[\n \"ad\",\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": true,
"has_meetings": true,
"has_milestones": false,
@ -2720,7 +2720,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"ad\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -2759,7 +2759,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"ad\",\n \"secr\",\n \"delegate\",\n \"chair\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": true,
"has_milestones": false,
@ -2798,7 +2798,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -2835,7 +2835,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": true,
"has_milestones": false,
@ -2874,7 +2874,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"IAB\"\n]",
"groupman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": true,
"has_meetings": true,
"has_milestones": true,
@ -2913,7 +2913,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -2950,7 +2950,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -2987,7 +2987,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": true,
"has_milestones": false,
@ -3003,7 +3003,7 @@
],
"req_subm_approval": true,
"role_order": "[\n \"chair\",\n \"secr\"\n]",
"session_purposes": "[\n \"admin\",\n \"plenary\",\n \"presentation\",\n \"social\"\n]",
"session_purposes": "[\n \"admin\",\n \"plenary\",\n \"presentation\",\n \"social\",\n \"officehours\"\n]",
"show_on_agenda": false
},
"model": "group.groupfeatures",
@ -3026,7 +3026,7 @@
"groupman_authroles": "[]",
"groupman_roles": "[]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -3065,7 +3065,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -3104,7 +3104,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": true,
"has_meetings": false,
"has_milestones": false,
@ -3141,7 +3141,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -3180,7 +3180,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"chair\",\n \"advisor\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -3219,7 +3219,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"IAB\"\n]",
"groupman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": true,
"has_meetings": true,
"has_milestones": true,
@ -3258,7 +3258,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"IRTF Chair\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": true,
"has_meetings": true,
"has_milestones": false,
@ -3297,7 +3297,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"ad\",\n \"secr\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": true,
"has_milestones": false,
@ -3324,8 +3324,8 @@
"about_page": "ietf.group.views.group_about",
"acts_like_wg": false,
"admin_roles": "[\n \"chair\"\n]",
"agenda_filter_type": "none",
"agenda_type": "side",
"agenda_filter_type": "normal",
"agenda_type": "ietf",
"create_wiki": false,
"custom_group_roles": true,
"customize_workflow": false,
@ -3334,11 +3334,11 @@
"default_used_roles": "[\n \"auth\",\n \"chair\"\n]",
"docman_roles": "[]",
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[]",
"groupman_roles": "[\n \"chair\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_meetings": true,
"has_milestones": false,
"has_nonsession_materials": false,
"has_reviews": false,
@ -3350,7 +3350,7 @@
"parent_types": [],
"req_subm_approval": true,
"role_order": "[\n \"chair\",\n \"secr\"\n]",
"session_purposes": "[\n \"officehours\"\n]",
"session_purposes": "[\n \"officehours\",\n \"regular\"\n]",
"show_on_agenda": false
},
"model": "group.groupfeatures",
@ -3373,7 +3373,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"IRTF Chair\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": true,
"has_default_jabber": true,
"has_default_chat": true,
"has_documents": true,
"has_meetings": true,
"has_milestones": true,
@ -3412,7 +3412,7 @@
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": false,
"has_milestones": false,
@ -3452,7 +3452,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"Area Director\"\n]",
"groupman_roles": "[\n \"chair\",\n \"delegate\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_default_chat": false,
"has_documents": false,
"has_meetings": true,
"has_milestones": false,
@ -3491,7 +3491,7 @@
"groupman_authroles": "[\n \"Secretariat\",\n \"Area Director\"\n]",
"groupman_roles": "[\n \"ad\",\n \"chair\",\n \"delegate\",\n \"secr\"\n]",
"has_chartering_process": true,
"has_default_jabber": true,
"has_default_chat": true,
"has_documents": true,
"has_meetings": true,
"has_milestones": true,
@ -12744,6 +12744,26 @@
"model": "name.rolename",
"pk": "trac-editor"
},
{
"fields": {
"desc": "Has group \"Administrator\" permissions in public wikijs instances. Can alter the wiki configuration and manage users.",
"name": "Wikijs administrator",
"order": 15,
"used": true
},
"model": "name.rolename",
"pk": "wikiadmin"
},
{
"fields": {
"desc": "Has group \"Manager\" in public wikijs instances.",
"name": "Wiki Manager",
"order": 16,
"used": true
},
"model": "name.rolename",
"pk": "wikiman"
},
{
"fields": {
"desc": "Can operate the YangCatalog, change its configuration, and edit its data",
@ -15964,7 +15984,7 @@
"fields": {
"command": "xym",
"switch": "--version",
"time": "2022-05-25T00:09:36.388",
"time": "2022-07-13T00:09:29.108",
"used": true,
"version": "xym 0.5"
},
@ -15975,7 +15995,7 @@
"fields": {
"command": "pyang",
"switch": "--version",
"time": "2022-05-25T00:09:36.720",
"time": "2022-07-13T00:09:29.475",
"used": true,
"version": "pyang 2.5.3"
},
@ -15986,7 +16006,7 @@
"fields": {
"command": "yanglint",
"switch": "--version",
"time": "2022-05-25T00:09:36.733",
"time": "2022-07-13T00:09:29.497",
"used": true,
"version": "yanglint SO 1.9.2"
},
@ -15997,9 +16017,9 @@
"fields": {
"command": "xml2rfc",
"switch": "--version",
"time": "2022-05-25T00:09:37.756",
"time": "2022-07-13T00:09:30.513",
"used": true,
"version": "xml2rfc 3.12.7"
"version": "xml2rfc 3.13.0"
},
"model": "utils.versioninfo",
"pk": 4

View file

@ -50,7 +50,7 @@ class SessionRequestTestCase(TestCase):
sched = r.context['scheduled_groups']
self.assertEqual(len(sched), 2)
unsched = r.context['unscheduled_groups']
self.assertEqual(len(unsched), 8)
self.assertEqual(len(unsched), 11)
def test_approve(self):
meeting = MeetingFactory(type_id='ietf', date=datetime.date.today())
@ -1095,4 +1095,4 @@ class SessionFormTest(TestCase):
form_data = dict(self.valid_form_data, **new_form_data)
form = SessionForm(data=form_data, group=self.group1, meeting=self.meeting)
self.assertFalse(form.is_valid())
return form
return form

View file

@ -1031,6 +1031,12 @@ YOUTUBE_API_VERSION = 'v3'
YOUTUBE_BASE_URL = 'https://www.youtube.com/watch'
YOUTUBE_IETF_CHANNEL_ID = 'UC8dtK9njBLdFnBahHFp0eZQ'
# If we need to revert to xmpp, change this to 'xmpp:{chat_room_name}@jabber.ietf.org?join'
CHAT_URL_PATTERN = 'https://zulip.ietf.org/#narrow/stream/{chat_room_name}'
# If we need to revert to xmpp
# CHAT_ARCHIVE_URL_PATTERN = 'https://www.ietf.org/jabber/logs/{chat_room_name}?C=M;O=D'
PRODUCTION_TIMEZONE = "America/Los_Angeles"
PYFLAKES_DEFAULT_ARGS= ["ietf", ]

View file

@ -255,11 +255,11 @@
</tr>
</tbody>
{% endif %}
{% if group.state_id != "conclude" and group.features.has_default_jabber %}
{% if group.state_id != "conclude" and group.features.has_default_chat %}
<tbody class="meta border-top">
<tr>
<th scope="row">
Jabber chat
Chat
</th>
<th scope="row">
Room address
@ -267,11 +267,12 @@
<td class="edit">
</td>
<td>
<a href="xmpp:{{ group.acronym }}@jabber.ietf.org?join">
xmpp:{{ group.acronym }}@jabber.ietf.org?join
<a href="{{ group.chat_room_url }}">
chat_room_url
</a>
</td>
</tr>
{% if group.chat_room_url != group.chat_archive_url %}
<tr>
<td>
</td>
@ -281,11 +282,12 @@
<td class="edit">
</td>
<td>
<a href="https://jabber.ietf.org/jabber/logs/{{ group.acronym }}/">
https://jabber.ietf.org/jabber/logs/{{ group.acronym }}/
<a href="{{ group.chat_archive_url }}">
{{ group.chat_archive_url }}
</a>
</td>
</tr>
{% endif %}
</tbody>
{% endif %}
</table>

View file

@ -2,8 +2,8 @@
Please note that we have not yet received minutes from the
{{ group.name }} ({{ group.acronym }}) interim meeting held
on {{ meeting.date|date:"Y-m-d"}}. As per the IESG Guidence on Interim Meetings,
Conference Calls and Jabber Sessions [1], detailed minutes must
on {{ meeting.date|date:"Y-m-d"}}. As per the IESG Guidance on Interim Meetings,
Conference Calls and Chat Sessions [1], detailed minutes must
be provided within 10 days of the event.
At your earliest convenience, please upload meeting minutes, as

View file

@ -42,11 +42,11 @@
{% endif %}
{# show stream buttons up till end of session, then show archive buttons #}
{% if now < item.timeslot.end_time %}
{# Jabber #}
{# Chat #}
<a class="btn btn-outline-primary"
href="xmpp:{{ session.jabber_room_name }}@jabber.ietf.org?join"
aria-label="Jabber room for {{ session.jabber_room_name }}"
title="Jabber room for {{ session.jabber_room_name }}">
href="{{ session.chat_room_url }}"
aria-label="Chat for {{ session.chat_room_name }}"
title="Chat for {{ session.chat_room_name }}">
<i class="bi bi-lightbulb"></i>
</a>
{# Remote call-in #}
@ -95,11 +95,11 @@
<i class="bi bi-calendar"></i>
</a>
{% else %}
{# Jabber #}
{# Chat logs #}
<a class="btn btn-outline-primary"
href="https://www.ietf.org/jabber/logs/{{ session.jabber_room_name }}?C=M;O=D"
aria-label="Jabber logs for {{ session.jabber_room_name }}"
title="Jabber logs for {{ session.jabber_room_name }}">
href="{{ session.chat_archive_url }}"
aria-label="Chat logs for {{ session.chat_room_name }}"
title="Chat logs for {{ session.chat_room_name }}">
<i class="bi bi-file-text"></i>
</a>
{% with session.recordings as recordings %}

View file

@ -55,12 +55,12 @@
{% endif %}
{# show stream buttons up till end of session, then show archive buttons #}
{% if now < timeslot.utc_end_time %}
{# Jabber #}
{# Chat #}
<a class="btn btn-outline-primary"
role="button"
href="xmpp:{{ session.jabber_room_name }}@jabber.ietf.org?join"
aria-label="Chat room for {{ session.jabber_room_name }}"
title="Chat room for {{ session.jabber_room_name }}">
href="{{ session.chat_room_url }}"
aria-label="Chat room for {{ session.chat_room_name }}"
title="Chat room for {{ session.chat_room_name }}">
<i class="bi bi-chat"></i>
</a>
{# Video stream (meetecho) #}
@ -128,13 +128,13 @@
<i class="bi bi-calendar"></i>
</a>
{% else %}
{# Jabber logs #}
{# Chat logs #}
{% if meeting.number|add:"0" >= 60 %}
<a class="btn btn-outline-primary"
role="button"
href="https://www.ietf.org/jabber/logs/{{ session.jabber_room_name }}?C=M;O=D"
aria-label="Chat logs for {{ session.jabber_room_name }}"
title="Chat logs for {{ session.jabber_room_name }}">
href="{{ session.chat_archive_url }}"
aria-label="Chat logs for {{ session.chat_room_name }}"
title="Chat logs for {{ session.chat_room_name }}">
<i class="bi bi-file-text"></i>
</a>
{% endif %}
@ -241,10 +241,10 @@
{% endif %}
{# show stream buttons up till end of session, then show archive buttons #}
{% if now < timeslot.utc_end_time %}
{# Jabber #}
{# Chat #}
<li>
<a class="dropdown-item"
href="xmpp:{{ session.jabber_room_name }}@jabber.ietf.org?join">
href="{{ session.chat_room_url }}">
<i class="bi bi-chat"></i> Chat room
</a>
</li>
@ -305,11 +305,11 @@
</a>
</li>
{% else %}
{# Jabber logs #}
{# Chat logs #}
{% if meeting.number|add:"0" >= 60 %}
<li>
<a class="dropdown-item"
href="https://www.ietf.org/jabber/logs/{{ session.jabber_room_name }}?C=M;O=D">
href="{{ session.chat_archive_url }}">
<i class="bi bi-file-text"></i> Chat logs
</a>
</li>