* refactor: replace datetime.now with timezone.now * refactor: migrate model fields to use timezone.now as default * refactor: replace datetime.today with timezone.now datetime.datetime.today() is equivalent to datetime.datetime.now(); both return a naive datetime with the current local time. * refactor: rephrase datetime.now(tz) as timezone.now().astimezone(tz) This is effectively the same, but is less likely to encourage accidental use of naive datetimes. * refactor: revert datetime.today() change to old migrations * refactor: change a missed datetime.now to timezone.now * chore: renumber timezone_now migration * chore: add migration to change timestamps to UTC * refactor: move tz instantiation/caching from TimeSlot to Meeting * fix: assume utc if meeting.time_zone is blank * chore: make datetime.combine() calls tz aware in the meeting app * ci: correctly use meeting.tz in TimeSlotFactory * chore: compute TimeSlot utc / local times assuming tz-aware times * chore: use tzaware math for agenda editor timeslot layout * chore: fill in Meeting.time_zone where it is blank Nearly all interim meetings on or before 2016-07-01 have blank time_zone values. This migration fills these in with PST8PDT. * chore: disallow blank Meeting.time_zone value * refactor: no need to handle blank time_zone case in TZ migration * refactor: remove now-unnecessary checks that meeting has time_zone * chore: fix timezone handling in agenda.ics and Meeting.updated() * chore: fix tz handling in interim_request_details, exercise in tests * chore: fix timezone handling for test_interim_send_announcement * chore: fix timezone handling in agenda_json() * chore: fix timezone handling in old agenda * chore: fix timezone handling for EditTimeslotsTests * refactor: refactor a few fixes for more consistent timezone handling * chore: add timezone info to timestamps in fixtures * chore: remove naive datetime warnings found in meetings.tests_views * chore: fix a few more test failures in meetings.tests_views All tests in meetings.tests_views now passing * chore: remove unused import * chore: fix timezone handling in test_schedule_generator.py * chore: fix timezone handling affecting meeting.tests_js * chore: fix timeslot test bug when local date != UTC date * test: fix a few failing tests, all meetings tests now pass (for me, anyway) * chore: renumber migrations * chore: update timestamp conversion migration The django-celery-beat package introduces tables with timestamp columns. These columns are stored in CELERY_TIMEZONE. Because we run with this set to UTC, the migration ignores these columns. * chore: fix pytz-related change in migration * chore: remove duplicate migrations * chore: remove CELERY_BEAT_TZ_AWARE setting now that USE_TZ is True * test: avoid failure in test with bogus timezone
155 lines
8.2 KiB
HTML
155 lines
8.2 KiB
HTML
{% extends "base.html" %}
|
|
{# Copyright The IETF Trust 2015, 2020, All Rights Reserved #}
|
|
{% load origin %}
|
|
{% load cache %}
|
|
{% load ietf_filters static classname tz %}
|
|
{% block pagehead %}
|
|
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
|
|
<link rel="stylesheet" href="{% static "ietf/js/fullcalendar.css" %}">
|
|
{% endblock %}
|
|
{% block title %}Upcoming Meetings{% endblock %}
|
|
{% block content %}
|
|
{% origin %}
|
|
<h1>Upcoming Meetings</h1>
|
|
{% include 'meeting/interim_nav.html' %}
|
|
<div class="alert alert-info my-3">
|
|
For more on regular IETF meetings, see
|
|
<a href="https://www.ietf.org/meeting/upcoming.html">here</a>.
|
|
<hr>
|
|
Meeting important dates are not included in upcoming meeting calendars. They have
|
|
<a href="{% url 'ietf.meeting.views.important_dates' %}">their own calendar</a>.
|
|
</div>
|
|
{% if menu_actions %}
|
|
<div id="menu-actions" class="buttonlist my-3">
|
|
{% for action in menu_actions %}
|
|
<a class="btn btn-primary {% if action.append_filter %}agenda-link filterable{% endif %}"
|
|
href="{{ action.url }}">
|
|
{{ action.label }}
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% include 'meeting/tz-display.html' with id_suffix="" meeting_timezone=None only %}
|
|
{% include 'meeting/agenda_filter.html' with filter_categories=filter_categories customize_button_text="Customize the meeting list..." only %}
|
|
{% cache 600 upcoming-meetings entries.count %}
|
|
{% if entries %}
|
|
<table id="upcoming-meeting-table"
|
|
class="table table-sm table-striped tablesorter">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" data-sort="date">Date</th>
|
|
<th scope="col" data-sort="group">Group</th>
|
|
<th scope="col" data-sort="meeting">Meeting</th>
|
|
<th scope="col"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for entry in entries %}
|
|
<tr class="entry"
|
|
{% if entry|classname == 'Session' %}data-filter-keywords="{{ entry.filter_keywords|join:',' }}"{% endif %}>
|
|
{% if entry|classname == 'Meeting' %}
|
|
{% with meeting=entry %}
|
|
<td class="meeting-time"
|
|
data-start-date="{{ meeting.date }}"
|
|
data-end-date="{{ meeting.end }}"
|
|
data-time-zone="{{ meeting.time_zone }}">
|
|
{{ meeting.date }} to {{ meeting.end }}
|
|
</td>
|
|
<td>ietf</td>
|
|
<td>
|
|
<a class="ietf-meeting-link"
|
|
href="{% url 'ietf.meeting.views.agenda' num=meeting.number %}">
|
|
IETF {{ meeting.number }}
|
|
</a>
|
|
</td>
|
|
<td></td>
|
|
{% endwith %}
|
|
{% elif entry|classname == 'Session' %}
|
|
{% with session=entry group=entry.group meeting=entry.meeting %}
|
|
<td class="session-time"
|
|
data-start-utc="{{ session.official_timeslotassignment.timeslot.time | utc | date:'Y-m-d H:i' }}Z"
|
|
data-end-utc="{{ session.official_timeslotassignment.timeslot.end_time | utc | date:'Y-m-d H:i' }}Z">
|
|
{{ session.official_timeslotassignment.timeslot.time | utc | date:"Y-m-d H:i" }}-{{ session.official_timeslotassignment.timeslot.end_time | utc | date:"H:i" }}
|
|
</td>
|
|
<td>
|
|
<a href="{% url 'ietf.group.views.group_home' acronym=group.acronym %}">{{ group.acronym }}</a>
|
|
</td>
|
|
<td>
|
|
<a class="interim-meeting-link"
|
|
href="{% url 'ietf.meeting.views.session_details' num=meeting.number acronym=group.acronym %}">
|
|
{% firstof session.name meeting.number %}
|
|
</a>
|
|
</td>
|
|
{% if session.current_status == 'canceled' %}
|
|
<td class="text-end">
|
|
<span class="badge rounded-pill bg-warning">Cancelled</span>
|
|
</td>
|
|
{% else %}
|
|
<td class="text-end">{% include "meeting/interim_session_buttons.html" with show_agenda=True %}</td>
|
|
{% endif %}
|
|
{% endwith %}
|
|
{% else %}
|
|
<td>
|
|
<span class="badge rounded-pill bg-warning">Unexpected entry type: {{ entry|classname }}</span>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
{% endif %}
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<h3 class="my-3">No upcoming meetings</h3>
|
|
{% endif %}
|
|
{% endcache %}
|
|
{% include 'meeting/tz-display.html' with id_suffix="-bottom" meeting_timezone=None only %}
|
|
<div id="calendar">
|
|
</div>
|
|
{% endblock %}
|
|
{% block js %}
|
|
<script src="{% static 'ietf/js/list.js' %}"></script>
|
|
<script src="{% static 'ietf/js/fullcalendar.js' %}"></script>
|
|
<script src="{% static 'ietf/js/moment.js' %}"></script>
|
|
<script src="{% static 'ietf/js/agenda_filter.js' %}"></script>
|
|
<script src="{% static 'ietf/js/agenda_materials.js' %}"></script>
|
|
<script src="{% static 'ietf/js/timezone.js' %}"></script>
|
|
<script src="{% static 'ietf/js/upcoming.js' %}"></script>
|
|
<script>
|
|
var all_event_list = [{% for entry in entries %}
|
|
{% if entry|classname == 'Meeting' %}
|
|
{% with meeting=entry %}
|
|
{
|
|
ietf_meeting_number: '{{ meeting.number }}',
|
|
start_moment: moment.tz('{{meeting.date}}', '{{ meeting.time_zone }}').startOf('day'),
|
|
end_moment: moment.tz('{{meeting.end}}', '{{ meeting.time_zone }}').endOf('day'),
|
|
url: '{% url 'ietf.meeting.views.agenda' num=meeting.number %}'
|
|
}{% if not forloop.last %}, {% endif %}
|
|
{% endwith %}
|
|
{% else %} {# if it's not a Meeting, it's a Session #}
|
|
{% with session=entry %}
|
|
{
|
|
group: '{% if session.group %}{{session.group.acronym}}{% endif %}{% if session.name %} - {{session.name}}{% endif %}',
|
|
filter_keywords: ["{{ session.filter_keywords|join:'","' }}"],
|
|
start_moment: moment.utc('{{session.official_timeslotassignment.timeslot.time | utc | date:"Y-m-d H:i"}}'),
|
|
end_moment: moment.utc('{{session.official_timeslotassignment.timeslot.end_time | utc | date:"Y-m-d H:i"}}'),
|
|
url: '{% url 'ietf.meeting.views.session_details' num=session.meeting.number acronym=session.group.acronym %}'
|
|
}
|
|
{% endwith %}
|
|
{% if not forloop.last %}, {% endif %}
|
|
{% endif %}
|
|
{% endfor %}];
|
|
|
|
$(function () {
|
|
// Init with best guess at local timezone.
|
|
ietf_timezone.set_tz_change_callback(timezone_changed);
|
|
ietf_timezone.initialize('local');
|
|
|
|
// Set up the filtering - the callback will be called when the page loads and on any filter changes
|
|
agenda_filter.set_update_callback(update_view);
|
|
agenda_filter.enable();
|
|
});
|
|
</script>
|
|
{% endblock %}
|