Based on [17694] from mark@painless-security.com, this merges in a set of changes that provides agenda-like details on session meeting view, and fixes issue #2751. It also aligns the styling of materials and resources link lists on the upcoming meetings and ietf agenda pages, and adds calendar symbols with links and recordings symbols with links to interim meeting pages.

- Legacy-Id: 17782
Note: SVN reference [17694] has been migrated to Git commit 4df7e5531f8273892c71a363cf328bb324585204
This commit is contained in:
Henrik Levkowetz 2020-05-12 13:35:57 +00:00
commit 4f4c3fd980
25 changed files with 588 additions and 264 deletions

View file

@ -793,7 +793,7 @@ class SchedTimeSessAssignment(models.Model):
if not self.timeslot:
components.append("unknown")
if not self.session or not (getattr(self.session, "historic_group") or self.session.group):
if not self.session or not (getattr(self.session, "historic_group", None) or self.session.group):
components.append("unknown")
else:
components.append(self.timeslot.time.strftime("%Y-%m-%d-%a-%H%M"))

View file

@ -1243,6 +1243,12 @@ class SessionDetailsTests(TestCase):
self.assertTrue(all([x in unicontent(r) for x in ('slides','agenda','minutes','draft')]))
self.assertNotContains(r, 'deleted')
q = PyQuery(r.content)
self.assertTrue(q('h2#session_%s div#session-buttons-%s' % (session.id, session.id)),
'Session detail page does not contain session tool buttons')
self.assertFalse(q('h2#session_%s div#session-buttons-%s span.fa-arrows-alt' % (session.id, session.id)),
'The session detail page is incorrectly showing the "Show meeting materials" button')
def test_session_details_past_interim(self):
group = GroupFactory.create(type_id='wg',state_id='active')
chair = RoleFactory(name_id='chair',group=group)
@ -1492,8 +1498,7 @@ class InterimTests(TestCase):
self.assertContains(r, 'IETF 72')
# cancelled session
q = PyQuery(r.content)
# self.assertIn('CANCELLED', q('[id*="-ames"]').text())
self.assertIn('CANCELLED', q('tr>td>a>span').text())
self.assertIn('CANCELLED', q('tr>td.text-right>span').text())
self.check_interim_tabs(url)
def test_upcoming_ical(self):

View file

@ -82,6 +82,7 @@ from ietf.secr.proceedings.utils import handle_upload_file
from ietf.secr.proceedings.proc_utils import (get_progress_stats, post_process, import_audio_files,
create_recording)
from ietf.utils.decorators import require_api_key
from ietf.utils.history import find_history_replacements_active_at
from ietf.utils.log import assertion
from ietf.utils.mail import send_mail_message, send_mail_text
from ietf.utils.pipe import pipe
@ -1532,9 +1533,22 @@ def session_details(request, num, acronym):
if not sessions:
raise Http404
# Find the time of the meeting, so that we can look back historically
# for what the group was called at the time.
meeting_time = datetime.datetime.combine(meeting.date, datetime.time())
groups = list(set([ s.group for s in sessions ]))
group_replacements = find_history_replacements_active_at(groups, meeting_time)
status_names = {n.slug: n.name for n in SessionStatusName.objects.all()}
for session in sessions:
session.historic_group = None
if session.group:
session.historic_group = group_replacements.get(session.group_id)
if session.historic_group:
session.historic_group.historic_parent = None
session.type_counter = Counter()
ss = session.timeslotassignments.filter(schedule=meeting.schedule).order_by('timeslot__time')
if ss:
@ -1587,6 +1601,7 @@ def session_details(request, num, acronym):
'can_manage_materials' : can_manage,
'can_view_request': can_view_request,
'thisweek': datetime.date.today()-datetime.timedelta(days=7),
'now': datetime.datetime.now(),
})
class SessionDraftsForm(forms.Form):
@ -2656,7 +2671,7 @@ def past(request):
def upcoming(request):
'''List of upcoming meetings'''
today = datetime.date.today()
today = datetime.date.today()-datetime.timedelta(days=7)
# Get ietf meetings starting 7 days ago, and interim meetings starting today
ietf_meetings = Meeting.objects.filter(type_id='ietf', date__gte=today-datetime.timedelta(days=7))
@ -2695,6 +2710,7 @@ def upcoming(request):
'menu_actions': actions,
'menu_entries': menu_entries,
'selected_menu_entry': selected_menu_entry,
'now': datetime.datetime.now()
})

View file

@ -771,6 +771,25 @@ ul.progress-section {
.btn .fa-stack { width: 1em; height: 1em; }
.btn .fa-stack .fa-stack-1x { line-height: 80%; }
.fa-stack-1 {
position: relative;
display: inline-block;
width: 1.28571429em;
height: 1em;
vertical-align: inherit;
}
.fa-stack-sm {
width: 100%;
text-align: center;
font-size: 0.7172em;
line-height: inherit;
}
.fa-stack-xs {
width: 100%;
text-align: center;
font-size: 0.5em;
line-height: inherit;
}
/* ========================================================================== */

View file

@ -0,0 +1,75 @@
This webfont is generated by http://fontello.com open source project.
================================================================================
Please, note, that you should obey original font licenses, used to make this
webfont pack. Details available in LICENSE.txt file.
- Usually, it's enough to publish content of LICENSE.txt file somewhere on your
site in "About" section.
- If your project is open-source, usually, it will be ok to make LICENSE.txt
file publicly available in your repository.
- Fonts, used in Fontello, don't require a clickable link on your site.
But any kind of additional authors crediting is welcome.
================================================================================
Comments on archive content
---------------------------
- /font/* - fonts in different formats
- /css/* - different kinds of css, for all situations. Should be ok with
twitter bootstrap. Also, you can skip <i> style and assign icon classes
directly to text elements, if you don't mind about IE7.
- demo.html - demo file, to show your webfont content
- LICENSE.txt - license info about source fonts, used to build your one.
- config.json - keeps your settings. You can import it back into fontello
anytime, to continue your work
Why so many CSS files ?
-----------------------
Because we like to fit all your needs :)
- basic file, <your_font_name>.css - is usually enough, it contains @font-face
and character code definitions
- *-ie7.css - if you need IE7 support, but still don't wish to put char codes
directly into html
- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face
rules, but still wish to benefit from css generation. That can be very
convenient for automated asset build systems. When you need to update font -
no need to manually edit files, just override old version with archive
content. See fontello source code for examples.
- *-embedded.css - basic css file, but with embedded WOFF font, to avoid
CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain.
We strongly recommend to resolve this issue by `Access-Control-Allow-Origin`
server headers. But if you ok with dirty hack - this file is for you. Note,
that data url moved to separate @font-face to avoid problems with <IE9, when
string is too long.
- animate.css - use it to get ideas about spinner rotation animation.
Attention for server setup
--------------------------
You MUST setup server to reply with proper `mime-types` for font files -
otherwise some browsers will fail to show fonts.
Usually, `apache` already has necessary settings, but `nginx` and other
webservers should be tuned. Here is list of mime types for our file extensions:
- `application/vnd.ms-fontobject` - eot
- `application/x-font-woff` - woff
- `application/x-font-ttf` - ttf
- `image/svg+xml` - svg

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,58 @@
@font-face {
font-family: 'datatracker';
src: url('../font/datatracker.eot?60587374');
src: url('../font/datatracker.eot?60587374#iefix') format('embedded-opentype'),
url('../font/datatracker.woff2?60587374') format('woff2'),
url('../font/datatracker.woff?60587374') format('woff'),
url('../font/datatracker.ttf?60587374') format('truetype'),
url('../font/datatracker.svg?60587374#datatracker') format('svg');
font-weight: normal;
font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'datatracker';
src: url('../font/datatracker.svg?60587374#datatracker') format('svg');
}
}
*/
.dt {
font-family: "datatracker";
font-style: normal;
font-weight: normal;
speak: none;
display: inline-block;
text-decoration: inherit;
width: 1em;
margin-right: .2em;
text-align: center;
/* opacity: .8; */
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* fix buttons height, for twitter bootstrap */
line-height: 1em;
/* Animation center compensation - margins should be symmetric */
/* remove if not needed */
margin-left: .2em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
/* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.fd-meetecho:before { content: '\e800'; } /* '' */

View file

@ -0,0 +1,48 @@
@font-face {
font-family: 'font-datatracker';
src: url('../font/font-datatracker.eot?60587374');
src: url('../font/font-datatracker.eot?60587374#iefix') format('embedded-opentype'),
url('../font/font-datatracker.woff2?60587374') format('woff2'),
url('../font/font-datatracker.woff?60587374') format('woff'),
url('../font/font-datatracker.ttf?60587374') format('truetype'),
url('../font/font-datatracker.svg?60587374#font-datatracker') format('svg');
font-weight: normal;
font-style: normal;
}
.fd {
font-family: "font-datatracker";
font-style: normal;
font-weight: normal;
speak: none;
display: inline-block;
text-decoration: inherit;
width: 1em;
margin-right: .2em;
text-align: center;
/* opacity: .8; */
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* fix buttons height, for twitter bootstrap */
line-height: 1em;
/* Animation center compensation - margins should be symmetric */
/* remove if not needed */
margin-left: .2em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
/* Font smoothing. That was taken from TWBS */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.fd-meetecho:before { content: '\e800'; } /* '' */

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Binary file not shown.

View file

@ -19,6 +19,7 @@
{% endcomment %}
<link rel="stylesheet" href="{% static 'font-awesome/css/font-awesome.min.css' %}">
<link rel="stylesheet" href="{% static 'ietf/font-datatracker/css/font-datatracker.css' %}">
<link rel="stylesheet" href="{% static 'ietf/bootstrap/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'ietf/bootstrap/css/bootstrap-theme.min.css' %}">
<link rel="stylesheet" href="{% static 'ietf/css/ietf.css' %}">

View file

@ -229,15 +229,12 @@
<span class="label label-danger pull-right">CANCELLED</span>
{% endif %}
{% if item.session.agenda %}
{% include "meeting/session_agenda_include.html" %}
{% endif %}
</td>
<td class="col-md-2">
<td class="col-md-2 text-right">
<span class="hidden-xs">
{% if item.timeslot.type.slug == 'other' %}
{% if item.session.agenda %}
{% include "meeting/session_buttons_include.html" %}
{% include "meeting/session_buttons_include.html" with show_agenda=True session=item.session meeting=schedule.meeting %}
{% else %}
{% for slide in item.session.slides %}
<a href="{{slide.get_href}}">{{ slide.title|clean_whitespace }}</a>
@ -332,12 +329,10 @@
<br><span class="text-danger">{{item.session.agenda_note}}</span>
{% endif %}
{% include "meeting/session_agenda_include.html" %}
</td>
<td class="text-nowrap text-right">
<span class="hidden-xs">
{% include "meeting/session_buttons_include.html" %}
{% include "meeting/session_buttons_include.html" with show_agenda=True session=item.session meeting=schedule.meeting %}
</span>
</td>
</tr>

View file

@ -1,20 +1,26 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load textfilters %}
{% load origin %}
{% origin %}
{% if session.agenda %}
{% with session.official_timeslotassignment as item %}
{% load staticfiles %}
{% load textfilters %}
{% origin %}
{% if session.agenda and show_agenda %}
{% include "meeting/session_agenda_include.html" %}
<!-- agenda pop-up button -->
<a class="" data-toggle="modal" data-target="#modal-{{item.slug}}" title="Show meeting materials"><span class="fa fa-fw fa-arrows-alt"></span></a>
<!-- materials tar file -->
<a class="" href="/meeting/{{meeting.number}}/agenda/{{session.group.acronym}}-drafts.tgz" title="Download meeting materials as .tar archive"><span class="fa fa-fw fa-file-archive-o"></span></a>
<a class="" href="/meeting/{{meeting.number}}/agenda/{{session.historic_group.acronym}}-drafts.tgz" title="Download meeting materials as .tar archive"><span class="fa fa-fw fa-file-archive-o"></span></a>
<!-- materials PDF file -->
<a class="" href="/meeting/{{ meeting.number }}/agenda/{{session.group.acronym}}-drafts.pdf" title="Download meeting materials as PDF file"><span class="fa fa-fw fa-file-pdf-o"></span></a>
{% endwith %}
{% endif %}
<a class="" href="/meeting/{{ meeting.number }}/agenda/{{session.historic_group.acronym}}-drafts.pdf" title="Download meeting materials as PDF file"><span class="fa fa-fw fa-file-pdf-o"></span></a>
{% endif %}
<!-- etherpad -->
<a class="" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ meeting.number }}?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-fw fa-edit"></span></a>
{% if item.timeslot.type.slug == 'plenary' %}
<a class="" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ meeting.number }}-plenary?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-fw fa-edit"></span></a>
{% else %}
<a class="" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ meeting.number }}-{{session.historic_group.acronym}}?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-fw fa-edit"></span></a>
{% endif %}
{# show stream buttons up till end of session, then show archive buttons #}
{% if now < item.timeslot.end_time %}
<!-- Jabber -->
<a class="" href="xmpp:{{session.jabber_room_name}}@jabber.ietf.org?join" title="Jabber room for {{session.jabber_room_name}}"><span class="fa fa-fw fa-lightbulb-o"></span></a>
<!-- webex -->
@ -26,17 +32,60 @@
{% elif session.remote_instructions|first_url %}
<a class=""
href="{{ session.remote_instructions|first_url }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
title="Session call-in"><span class="fa fa-fw fa-phone"></span>
</a>
{% elif item.timeslot.location.webex_url %}
<a class=""
href="{{item.timeslot.location.webex_url|format:session }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
<!-- Video stream (meetecho) -->
{% elif item.timeslot.location.video_stream_url %}
<a class=""
href="{{item.timeslot.location.video_stream_url|format:session }}"
title="Meetecho video stream"><span class="fa fa-fw fa-video-camera"></span>
</a>
{% else %}
<span class="">
<span class="fa fa-fw fa-phone" style="color: #ddd;"
title="No webex info found in remote instructions or agenda note"></span>
title="No webex or meetecho info found in remote instructions or agenda note"></span>
</span>
{% endif %}
{% else %}
<!-- Jabber -->
<a class="" href="https://www.ietf.org/jabber/logs/{{session.jabber_room_name}}?C=M;O=D" title="Jabber logs for {{session.jabber_room_name}}">
<span class="fa-stack-1"><i class="fa fa-fw fa-file-o fa-stack-1x"></i><i class="fa fa-fw fa-lightbulb-o fa-stack-sm"></i></span>
</a>
{% 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 %}
<a class="" href="{{ href }}" title="{{ r.title }}"><span class="fa fa-fw fa-file-audio-o"></span></a>
{% endif %}
{% endwith %}{% endfor %}
<!-- YouTube -->
{% for r in recordings %}{% with href=r.get_href %}
{% if 'youtu' in href %}
<a class="" href="{{ href }}" title="{{ r.title }}"><span class="fa fa-fw fa-file-video-o"></span></a>
{% 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 %}
<a class="" href="{{ href }}" title="{{ r.title }}"><span class="fa fa-fw fa-file-o"></span></a>
{% endif %}
{% endwith %}{% endfor %}
{% elif item.timeslot.location.video_stream_url %}
<a class=""
href="http://www.meetecho.com/ietf{{meeting.number}}/recordings#{{session.historic_group.acronym.upper}}"
title="Meetecho session recording"><span class="fd fa-fw fd-meetecho"></span></a>
{% elif show_empty %}
<span class="fa fa-fw"></span>
{% endif %}
{% endwith %}
{% endif %}

View file

@ -2,112 +2,95 @@
{% load origin %}
{% load staticfiles %}
{% load textfilters %}
{% origin %}
{% if item.session.agenda %}
<button class="btn btn-default btn-xs" data-toggle="modal" data-target="#modal-{{item.slug}}" title="Show meeting materials"><span class="fa fa-arrows-alt"></span></button>
<a class="btn btn-default btn-xs" href="/meeting/{{schedule.meeting.number}}/agenda/{{item.session.historic_group.acronym}}-drafts.tgz" title="Download meeting materials as .tar archive"><span class="fa fa-file-archive-o"></span></a>
<a class="btn btn-default btn-xs" href="/meeting/{{ schedule.meeting.number }}/agenda/{{item.session.historic_group.acronym}}-drafts.pdf" title="Download meeting materials as PDF file"><span class="fa fa-file-pdf-o"></span></a>
{% endif %}
<div id="session-buttons-{{session.pk}}">
{% if session.agenda and show_agenda %}
{% include "meeting/session_agenda_include.html" %}
<!-- agenda pop-up button -->
<a class="" data-toggle="modal" data-target="#modal-{{item.slug}}" title="Show meeting materials"><span class="fa fa-fw fa-arrows-alt"></span></a>
<!-- materials tar file -->
<a class="" href="/meeting/{{meeting.number}}/agenda/{{session.historic_group.acronym}}-drafts.tgz" title="Download meeting materials as .tar archive"><span class="fa fa-fw fa-file-archive-o"></span></a>
<!-- materials PDF file -->
<a class="" href="/meeting/{{ meeting.number }}/agenda/{{session.historic_group.acronym}}-drafts.pdf" title="Download meeting materials as PDF file"><span class="fa fa-fw fa-file-pdf-o"></span></a>
{% endif %}
{% if item.timeslot.type.slug == 'plenary' %}
<a class="btn btn-default btn-xs" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ schedule.meeting.number }}-plenary?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-edit"></span></a>
{% else %}
<a class="btn btn-default btn-xs" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ schedule.meeting.number }}-{{item.session.historic_group.acronym}}?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-edit"></span></a>
{% endif %}
<!-- etherpad -->
{% if item.timeslot.type.slug == 'plenary' %}
<a class="" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ meeting.number }}-plenary?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-fw fa-edit"></span></a>
{% else %}
<a class="" href="https://etherpad.ietf.org:9009/p/notes-ietf-{{ meeting.number }}-{{session.historic_group.acronym}}?useMonospaceFont=true" title="Etherpad for note-takers"><span class="fa fa-fw fa-edit"></span></a>
{% endif %}
{# show stream buttons up till end of session, then show archive buttons #}
{% if now < item.timeslot.end_time %}
<!-- Jabber -->
<a class="btn btn-default btn-xs"
href="xmpp:{{item.session.jabber_room_name}}@jabber.ietf.org?join"
title="Jabber room for {{item.session.jabber_room_name}}"><span class="fa fa-lightbulb-o"></span>
</a>
<!-- Video stream (meetecho) -->
{% if item.timeslot.location.video_stream_url %}
<a class="btn btn-default btn-xs"
href="{{ item.timeslot.location.video_stream_url|format:item.session }}"
title="Meetecho video stream"><span class="fa fa-video-camera"></span>
</a>
{% endif %}
<!-- Audio stream -->
{% if item.timeslot.location.audio_stream_url %}
<a class="btn btn-default btn-xs"
href="{{item.timeslot.location.audio_stream_url|format:item.session }}"
title="Audio stream"><span class="glyphicon glyphicon-headphones"></span>
</a>
{% endif %}
<!-- WebEx -->
{% if "https://ietf.webex.com" in item.session.agenda_note|first_url %}
<a class="btn btn-default btn-xs"
href="{{ item.session.agenda_note|first_url }}"
title="Webex session"><span class="fa fa-phone"></span>
</a>
{% else %}
{% if item.timeslot.location.webex_url %}
<a class="btn btn-default btn-xs"
href="{{item.timeslot.location.webex_url|format:item.session }}"
title="Webex session"><span class="fa fa-phone"></span>
</a>
{% endif %}
{% endif %}
{% else %}
<!-- Jabber logs -->
{% if schedule.meeting.number|add:"0" >= 60 %}
<a class="btn btn-default btn-xs"
href="https://www.ietf.org/jabber/logs/{{item.session.jabber_room_name}}"
title="Jabber logs for {{item.session.jabber_room_name}}">
<span class="fa fa-stack">
<i class="fa fa-file-o fa-stack-1x"></i>
<i class="fa fa-lightbulb-o fa-stack-1x"></i>
</span>
</a>
{% endif %}
<!-- Video recording -->
{% if schedule.meeting.number|add:"0" >= 80 %}
{% with item.session.recordings as recordings %}
{% if recordings %}
<!-- There's no guaranteed order, so this is a bit messy: -->
<!-- First, the audio recordings, if any -->
{% for r in recordings %}
{% if r.get_href and 'audio' in r.get_href %}
<a class="btn btn-default btn-xs" href="{{ r.get_href }}" title="{{ r.title}}">
<span class="fa fa-file-audio-o"></span>
</a>
{% endif %}
{% endfor %}
<!-- Then the youtube recordings -->
{% for r in recordings %}
{% if r.get_href and 'youtu' in r.get_href %}
<a class="btn btn-default btn-xs" href="{{ r.get_href }}" title="{{ r.title }}">
<span class="fa fa-file-video-o"></span>
</a>
{% endif %}
{% endfor %}
<!-- Finally, any other recordings -->
{% for r in recordings %}
{% if r.get_href and not 'audio' in r.get_href and not 'youtu' in r.get_href %}
<a class="btn btn-default btn-xs" href="{{ r.get_href }}" title="{{ r.title }}">
<span class="fa fa-file-o"></span>
</a>
{% endif %}
{% endfor %}
{% endif %}
{% if item.timeslot.location.video_stream_url %}
<a class="btn btn-default btn-xs"
href="http://www.meetecho.com/ietf{{schedule.meeting.number}}/recordings#{{item.session.historic_group.acronym.upper}}"
title="Meetecho session recording"><img src="{% static 'ietf/images/meetecho-icon.svg' %}" alt="Meetecho Stream" width="12px">
</a>
{# show stream buttons up till end of session, then show archive buttons #}
{% if now < item.timeslot.end_time %}
<!-- Jabber -->
<a class=""
href="xmpp:{{session.jabber_room_name}}@jabber.ietf.org?join"
title="Jabber room for {{session.jabber_room_name}}"><span class="fa fa-fw fa-lightbulb-o"></span></a>
<!-- Video stream (meetecho) -->
{% if item.timeslot.location.video_stream_url %}
<a class=""
href="{{item.timeslot.location.video_stream_url|format:session }}"
title="Meetecho video stream"><span class="fa fa-fw fa-video-camera"></span>
</a>
{% endif %}
<!-- Audio stream -->
{% if item.timeslot.location.audio_stream_url %}
<a class=""
href="{{item.timeslot.location.audio_stream_url|format:session }}"
title="Audio stream"><span class="glyphicon glyphicon-headphones"></span>
</a>
{% endif %}
<!-- WebEx -->
{% if "webex.com/" in session.agenda_note|first_url %}
<a class=""
href="{{ session.agenda_note|first_url }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
{% elif item.timeslot.location.webex_url %}
<a class=""
href="{{item.timeslot.location.webex_url|format:session }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
{% endif %}
{% else %}
<!-- Jabber logs -->
{% if meeting.number|add:"0" >= 60 %}
<a class="" href="https://www.ietf.org/jabber/logs/{{session.jabber_room_name}}?C=M;O=D" title="Jabber logs for {{session.jabber_room_name}}">
<span class="fa-stack-1"><i class="fa fa-fw fa-file-o fa-stack-1x"></i><i class="fa fa-fw fa-lightbulb-o fa-stack-sm"></i></span>
</a>
{% endif %}
<!-- Recordings -->
{% if meeting.number|add:"0" >= 80 %}
{% with session.recordings as recordings %}
{% if recordings %}
{# There's no guaranteed order, so this is a bit messy: #}
<!-- First, the audio recordings, if any -->
{% for r in recordings %}
{% if r.get_href and 'audio' in r.get_href %}
<a class="" href="{{ r.get_href }}" title="{{ r.title}}"><span class="fa fa-fw fa-file-audio-o"></span></a>
{% endif %}
{% endwith %}
{% endif %}
<!-- Audio recording -->
{# <a class="btn btn-default btn-xs" href="" title="Audio recording"><span class="fa fa-file-audio-o"></span></a>#}
{% endif %}
{% endfor %}
<!-- Then the youtube recordings -->
{% for r in recordings %}
{% if r.get_href and 'youtu' in r.get_href %}
<a class="" href="{{ r.get_href }}" title="{{ r.title }}"><span class="fa fa-fw fa-file-video-o"></span></a>
{% endif %}
{% endfor %}
<!-- Finally, any other recordings -->
{% for r in recordings %}
{% if r.get_href and not 'audio' in r.get_href and not 'youtu' in r.get_href %}
<a class="" href="{{ r.get_href }}" title="{{ r.title }}"><span class="fa fa-fw fa-file-o"></span></a>
{% endif %}
{% endfor %}
{% endif %}
{% endwith %}
{% if item.timeslot.location.video_stream_url %}
<a class=""
href="http://www.meetecho.com/ietf{{meeting.number}}/recordings#{{session.historic_group.acronym.upper}}"
title="Meetecho session recording"><span class="fd fa-fw fd-meetecho"></span></a>
{% endif %}
{% endif %}
{% endif %}
</div>

View file

@ -17,7 +17,7 @@
<h1>{{ meeting }} : {{ acronym }}
{% if meeting.date >= thisweek %}
<a class="regular pull-right" title="icalendar entry for {{acronym}}@{{meeting.number}}" href="{% url 'ietf.meeting.views.ical_agenda' num=meeting.number acronym=acronym %}"><span class="fa fa-calendar"></span></a>
<a class="regular pull-right" title="icalendar entry for {{acronym}}@{{meeting.number}}" href="{% url 'ietf.meeting.views.ical_agenda' num=meeting.number acronym=acronym %}"><span class="fa fa-fw fa-calendar"></span> </a>
{% endif %}
</h1>

View file

@ -1,144 +1,158 @@
{% load origin ietf_filters textfilters tz dateformat %}{% origin %}
{% for session in sessions %}
<h2 class="anchor-target" id="session_{{session.pk}}">{% if sessions|length > 1 %}Session {{ forloop.counter }} : {% endif %}
{% for time in session.times %}{% if not forloop.first %}, {% endif %} {{time|dateformat:"l Y-m-d H:i T"}} {% if time.tzinfo.zone != "UTC" %}<span class="small">({{time|utc|dateformat:"H:i T"}})</span>{% endif %}{% endfor %}
{% if session.cancelled %}<small class="label label-warning">CANCELLED</small>{% else %}{{ session.status }}{% endif %}
{% if session.name %} : {{ session.name }}{% endif %}
{% if meeting.date >= thisweek %}
<a class="regular pull-right" title="icalendar entry for {{acronym}} session {{ forloop.counter }}" href="{% url 'ietf.meeting.views.ical_agenda' num=meeting.number session_id=session.id %}"><span class="fa fa-calendar"></span></a>
{% endif %}
</h2>
{% if session.agenda_note %}<h3>{{session.agenda_note}}</h3>{% endif %}
{% with item=session.official_timeslotassignment %}
<h2 class="anchor-target" id="session_{{session.pk}}">{% if sessions|length > 1 %}Session {{ forloop.counter }} : {% endif %}
{% for time in session.times %}{% if not forloop.first %}, {% endif %} {{time|dateformat:"l Y-m-d H:i T"}} {% if time.tzinfo.zone != "UTC" %}<span class="small">({{time|utc|dateformat:"H:i T"}})</span>{% endif %}{% endfor %}
{% if session.cancelled %}<small class="label label-warning">CANCELLED</small>{% else %}{{ session.status }}{% endif %}
{% if session.name %} : {{ session.name }}{% endif %}
{% if not session.cancelled %}
<span class="regular pull-right">
{% if meeting.type.slug == 'interim' %}
{% include "meeting/interim_session_buttons.html" with show_agenda=False show_empty=False %}
{% else %}
{% with schedule=meeting.schedule %}
{% include "meeting/session_buttons_include.html" %}
{% endwith %}
{% endif %}
<!-- iCalendar item -->
{% if now < item.timeslot.end_time %}
<a title="icalendar entry for {{acronym}} session {{ forloop.counter }}" href="{% url 'ietf.meeting.views.ical_agenda' num=meeting.number session_id=session.id %}"><span class="fa fa-fw fa-calendar-o"></span> </a>
{% endif %}
</span>
{% endif %}
</h2>
{% if session.agenda_note %}<h3>{{session.agenda_note}}</h3>{% endif %}
{% if can_manage_materials %}
{% if session.current_status == 'sched' or session.current_status == 'schedw' %}
<div class="buttonlist">
{% if can_view_request %}
<a class="btn btn-default" href="{% url 'ietf.meeting.views.interim_request_details' number=meeting.number %}">Meeting Details</a>
{% if can_manage_materials %}
{% if session.current_status == 'sched' or session.current_status == 'schedw' %}
<div class="buttonlist">
{% if can_view_request %}
<a class="btn btn-default" href="{% url 'ietf.meeting.views.interim_request_details' number=meeting.number %}">Meeting Details</a>
{% endif %}
</div>
{% if not session.type_counter.agenda %}
<span class="label label-warning">This session does not yet have an agenda</span>
{% endif %}
{% endif %}
{% endif %}
{% if meeting.type.slug == 'interim' and session.remote_instructions %}
<div>
<b>Remote instructions:</b>
{% if "https://ietf.webex.com" in session.agenda_note|first_url %}
<a class=""
href="{{ session.agenda_note|first_url }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
{% elif "https://ietf.webex.com" in session.remote_instructions|first_url %}
<a class=""
href="{{ session.remote_instructions|first_url }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
{% endif %}
{{ session.remote_instructions }}
</div>
{% endif %}
<div class="panel panel-default">
<div class="panel-heading">Agenda, Minutes, and Bluesheets</div>
<div class="panel-body">
<table class="table table-condensed table-striped">
{% for pres in session.filtered_artifacts %}
<tr>
{% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %}
<td>
<a href="{{pres.document.get_href}}">{{pres.document.title}}</a>
<a href="{{url}}">({{ pres.document.name }})</a>
</td>
{% if user|has_role:"Secretariat" or can_manage_materials %}
<td class="col-md-2">
{% if pres.document.type.slug == 'minutes' %}
{% url 'ietf.meeting.views.upload_session_minutes' session_id=session.pk num=session.meeting.number as upload_url %}
{% elif pres.document.type.slug == 'agenda' %}
{% url 'ietf.meeting.views.upload_session_agenda' session_id=session.pk num=session.meeting.number as upload_url %}
{% else %}
{% url 'ietf.meeting.views.upload_session_bluesheets' session_id=session.pk num=session.meeting.number as upload_url %}
{% endif %}
{% if pres.document.type.slug != 'bluesheets' or user|has_role:"Secretariat" or meeting.type.slug == 'interim' and can_manage_materials %}
<a class="btn btn-default btn-sm pull-right" href="{{upload_url}}">Upload Revision</a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% if can_manage_materials %}
{% if not session.type_counter.agenda %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_agenda' session_id=session.pk num=session.meeting.number %}">Upload Agenda</a>
{% endif %}
{% if not session.type_counter.minutes %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_minutes' session_id=session.pk num=session.meeting.number %}">Upload Minutes</a>
{% endif %}
{% endif %}
{% if user|has_role:"Secretariat" and not session.type_counter.bluesheets or meeting.type.slug == 'interim' and can_manage_materials and not session.type_counter.bluesheets %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_bluesheets' session_id=session.pk num=session.meeting.number %}">Upload Bluesheets</a>
{% endif %}
</div>
{% if not session.type_counter.agenda %}
<span class="label label-warning">This session does not yet have an agenda</span>
{% endif %}
{% endif %}
{% endif %}
{% if meeting.type.slug == 'interim' and session.remote_instructions %}
<div>
<b>Remote instructions:</b>
{% if "https://ietf.webex.com" in session.agenda_note|first_url %}
<a class=""
href="{{ session.agenda_note|first_url }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
{% elif "https://ietf.webex.com" in session.remote_instructions|first_url %}
<a class=""
href="{{ session.remote_instructions|first_url }}"
title="Webex session"><span class="fa fa-fw fa-phone"></span>
</a>
{% endif %}
{{ session.remote_instructions }}
</div>
{% endif %}
<div class="panel panel-default">
<div class="panel-heading">Agenda, Minutes, and Bluesheets</div>
<div class="panel-body">
<table class="table table-condensed table-striped">
{% for pres in session.filtered_artifacts %}
<tr>
{% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %}
<td>
<a href="{{pres.document.get_href}}">{{pres.document.title}}</a>
<a href="{{url}}">({{ pres.document.name }})</a>
</td>
{% if user|has_role:"Secretariat" or can_manage_materials %}
<td class="col-md-2">
{% if pres.document.type.slug == 'minutes' %}
{% url 'ietf.meeting.views.upload_session_minutes' session_id=session.pk num=session.meeting.number as upload_url %}
{% elif pres.document.type.slug == 'agenda' %}
{% url 'ietf.meeting.views.upload_session_agenda' session_id=session.pk num=session.meeting.number as upload_url %}
{% else %}
{% url 'ietf.meeting.views.upload_session_bluesheets' session_id=session.pk num=session.meeting.number as upload_url %}
{% endif %}
{% if pres.document.type.slug != 'bluesheets' or user|has_role:"Secretariat" or meeting.type.slug == 'interim' and can_manage_materials %}
<a class="btn btn-default btn-sm pull-right" href="{{upload_url}}">Upload Revision</a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% if can_manage_materials %}
{% if not session.type_counter.agenda %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_agenda' session_id=session.pk num=session.meeting.number %}">Upload Agenda</a>
{% endif %}
{% if not session.type_counter.minutes %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_minutes' session_id=session.pk num=session.meeting.number %}">Upload Minutes</a>
{% endif %}
{% endif %}
{% if user|has_role:"Secretariat" and not session.type_counter.bluesheets or meeting.type.slug == 'interim' and can_manage_materials and not session.type_counter.bluesheets %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_bluesheets' session_id=session.pk num=session.meeting.number %}">Upload Bluesheets</a>
{% endif %}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading" data-toggle="tooltip" title="Drag and drop to reorder slides">Slides</div>
<div class="panel-body">
<table class="table table-condensed table-striped slides" id="slides_{{session.pk}}">
<tbody session="{{session.pk}}" addToSession="{% url 'ietf.meeting.views.ajax_add_slides_to_session' session_id=session.pk num=session.meeting.number %}" removeFromSession="{% url 'ietf.meeting.views.ajax_remove_slides_from_session' session_id=session.pk num=session.meeting.number %}" reorderInSession="{% url 'ietf.meeting.views.ajax_reorder_slides_in_session' session_id=session.pk num=session.meeting.number %}">
{% for pres in session.filtered_slides %}
<tr name="{{pres.document.name}}">
{% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %}
<td>
<a href="{{pres.document.get_href}}">{{pres.document.title}} </a>
<a href="{{url}}">({{ pres.document.name }}) </a>
</td>
{% if can_manage_materials %}
<td class="col-md-2">
<a class="btn btn-default btn-sm pull-right" href="{% url 'ietf.meeting.views.upload_session_slides' session_id=session.pk num=session.meeting.number name=pres.document.name %}">Upload Revision</a>
<a class="btn btn-default btn-sm pull-right" href="{% url 'ietf.meeting.views.remove_sessionpresentation' session_id=session.pk num=session.meeting.number name=pres.document.name %}">Remove</a>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% if can_manage_materials %}
<a id="uploadslides" class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_slides' session_id=session.pk num=session.meeting.number %}">Upload New Slides</a>
{% elif request.user.is_authenticated and not session.is_material_submission_cutoff %}
<a id="proposeslides" class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.propose_session_slides' session_id=session.pk num=session.meeting.number %}">Propose Slides</a>
{% endif %}
</div>
{% if can_manage_materials %}
<div class="panel-footer small">Drag-and-drop to reorder slides</div>
{% endif %}
</div>
<div class="panel panel-default">
<div class="panel-heading">Drafts
</div>
<div class="panel-body">
<table class="table table-condensed table-striped">
{% for pres in session.filtered_drafts %}
<tr>
<td>
<div class="panel panel-default">
<div class="panel-heading" data-toggle="tooltip" title="Drag and drop to reorder slides">Slides</div>
<div class="panel-body">
<table class="table table-condensed table-striped slides" id="slides_{{session.pk}}">
<tbody session="{{session.pk}}" addToSession="{% url 'ietf.meeting.views.ajax_add_slides_to_session' session_id=session.pk num=session.meeting.number %}" removeFromSession="{% url 'ietf.meeting.views.ajax_remove_slides_from_session' session_id=session.pk num=session.meeting.number %}" reorderInSession="{% url 'ietf.meeting.views.ajax_reorder_slides_in_session' session_id=session.pk num=session.meeting.number %}">
{% for pres in session.filtered_slides %}
<tr name="{{pres.document.name}}">
{% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %}
<a href="{{url}}">{{pres.document.title}} ({{ pres.document.name }}) {% if pres.rev %}Version {{pres.rev}}{% endif %}</a>
</td>
{% if can_manage_materials %}
<td class="col-md-2">
<a class="btn btn-default btn-sm pull-right" href="{% url 'ietf.meeting.views.remove_sessionpresentation' session_id=session.pk num=session.meeting.number name=pres.document.name %}">Remove</a>
<td>
<a href="{{pres.document.get_href}}">{{pres.document.title}} </a>
<a href="{{url}}">({{ pres.document.name }}) </a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% if can_manage_materials %}
<td class="col-md-2">
<a class="btn btn-default btn-sm pull-right" href="{% url 'ietf.meeting.views.upload_session_slides' session_id=session.pk num=session.meeting.number name=pres.document.name %}">Upload Revision</a>
<a class="btn btn-default btn-sm pull-right" href="{% url 'ietf.meeting.views.remove_sessionpresentation' session_id=session.pk num=session.meeting.number name=pres.document.name %}">Remove</a>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% if can_manage_materials %}
<a id="uploadslides" class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.upload_session_slides' session_id=session.pk num=session.meeting.number %}">Upload New Slides</a>
{% elif request.user.is_authenticated and not session.is_material_submission_cutoff %}
<a id="proposeslides" class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.propose_session_slides' session_id=session.pk num=session.meeting.number %}">Propose Slides</a>
{% endif %}
</div>
{% if can_manage_materials %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.add_session_drafts' session_id=session.pk num=session.meeting.number %}">
Link additional drafts to session
</a>
<div class="panel-footer small">Drag-and-drop to reorder slides</div>
{% endif %}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">Drafts
</div>
<div class="panel-body">
<table class="table table-condensed table-striped">
{% for pres in session.filtered_drafts %}
<tr>
<td>
{% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %}
<a href="{{url}}">{{pres.document.title}} ({{ pres.document.name }}) {% if pres.rev %}Version {{pres.rev}}{% endif %}</a>
</td>
{% if can_manage_materials %}
<td class="col-md-2">
<a class="btn btn-default btn-sm pull-right" href="{% url 'ietf.meeting.views.remove_sessionpresentation' session_id=session.pk num=session.meeting.number name=pres.document.name %}">Remove</a>
</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% if can_manage_materials %}
<a class="btn btn-default pull-right" href="{% url 'ietf.meeting.views.add_session_drafts' session_id=session.pk num=session.meeting.number %}">
Link additional drafts to session
</a>
{% endif %}
</div>
</div>
{% endwith %}
{% endfor %}

View file

@ -20,7 +20,14 @@
<div class="row">
<div class="col-md-10">
<h1>Upcoming Meetings</h1>
<h1>Upcoming Meetings
<span class="regular pull-right">
<a title="iCalendar subscription for upcoming meetings" href="webcal://{{request.get_host}}{% url 'ietf.meeting.views.upcoming_ical' %}">
<span class="fa fa-stack-1"><i class="fa fa-fw fa-calendar-o fa-stack-1x"></i><i class="fa fa-fw fa-repeat fa-stack-xs"></i></span>
</a>
<a title="iCalendar entry for upcoming meetings" href="{% url 'ietf.meeting.views.upcoming_ical' %}"><span class="fa fa-calendar"></span></a>
</span>
</h1>
<p>For more on regular IETF meetings see <a href="https://www.ietf.org/meeting/upcoming.html">here</a></p>
@ -68,11 +75,17 @@
<td>{{ session.official_timeslotassignment.timeslot.utc_start_time | date:"Y-m-d H:i"}} - {{ session.official_timeslotassignment.timeslot.utc_end_time | date:"H:i e" }}</td>
<td><a href="{% url 'ietf.group.views.group_home' acronym=session.group.acronym %}">{{ session.group.acronym }}</a></td>
<td>
<a class="interim-meeting-link" href="{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}">{{ session.meeting.number }}{% if session.current_status == 'canceled' %}&nbsp;&nbsp;<span class="label label-warning">CANCELLED</span>{% endif %}</a>
</td>
<td class='text-right'>
{% include "meeting/interim_session_buttons.html" %}
<a class="interim-meeting-link" href="{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}">{{ session.meeting.number }}</a>
</td>
{% if session.current_status == 'canceled' %}
<td class='text-right'>
<span class="label label-warning">CANCELLED</span>
</td>
{% else %}
<td class='text-right'>
{% include "meeting/interim_session_buttons.html" with show_agenda=True %}
</td>
{% endif %}
{% endwith %}
{% else %}
<td><span class="label-warning">Unexpected entry type: {{entry|classname}}</span></td>