diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 13db30b92..69c50f6a9 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -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")) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 7d560e419..7f90e295f 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -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): diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 74fae12f9..154afb1b2 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -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() }) diff --git a/ietf/static/ietf/css/ietf.css b/ietf/static/ietf/css/ietf.css index 251cadb83..e11b8a34c 100644 --- a/ietf/static/ietf/css/ietf.css +++ b/ietf/static/ietf/css/ietf.css @@ -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; +} /* ========================================================================== */ diff --git a/ietf/static/ietf/font-datatracker/README.txt b/ietf/static/ietf/font-datatracker/README.txt new file mode 100755 index 000000000..beaab3366 --- /dev/null +++ b/ietf/static/ietf/font-datatracker/README.txt @@ -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 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, .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 + + +Copyright (C) 2020 by original authors @ fontello.com + + + + + + + + \ No newline at end of file diff --git a/ietf/static/ietf/font-datatracker/font/datatracker.ttf b/ietf/static/ietf/font-datatracker/font/datatracker.ttf new file mode 100755 index 000000000..d7ab48679 Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/datatracker.ttf differ diff --git a/ietf/static/ietf/font-datatracker/font/datatracker.woff b/ietf/static/ietf/font-datatracker/font/datatracker.woff new file mode 100755 index 000000000..dc0d089a1 Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/datatracker.woff differ diff --git a/ietf/static/ietf/font-datatracker/font/datatracker.woff2 b/ietf/static/ietf/font-datatracker/font/datatracker.woff2 new file mode 100755 index 000000000..239ca87fd Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/datatracker.woff2 differ diff --git a/ietf/static/ietf/font-datatracker/font/font-datatracker.eot b/ietf/static/ietf/font-datatracker/font/font-datatracker.eot new file mode 100755 index 000000000..b0f35e502 Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/font-datatracker.eot differ diff --git a/ietf/static/ietf/font-datatracker/font/font-datatracker.svg b/ietf/static/ietf/font-datatracker/font/font-datatracker.svg new file mode 100755 index 000000000..cbd2186a6 --- /dev/null +++ b/ietf/static/ietf/font-datatracker/font/font-datatracker.svg @@ -0,0 +1,12 @@ + + + +Copyright (C) 2020 by original authors @ fontello.com + + + + + + + + \ No newline at end of file diff --git a/ietf/static/ietf/font-datatracker/font/font-datatracker.ttf b/ietf/static/ietf/font-datatracker/font/font-datatracker.ttf new file mode 100755 index 000000000..d7ab48679 Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/font-datatracker.ttf differ diff --git a/ietf/static/ietf/font-datatracker/font/font-datatracker.woff b/ietf/static/ietf/font-datatracker/font/font-datatracker.woff new file mode 100755 index 000000000..dc0d089a1 Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/font-datatracker.woff differ diff --git a/ietf/static/ietf/font-datatracker/font/font-datatracker.woff2 b/ietf/static/ietf/font-datatracker/font/font-datatracker.woff2 new file mode 100755 index 000000000..239ca87fd Binary files /dev/null and b/ietf/static/ietf/font-datatracker/font/font-datatracker.woff2 differ diff --git a/ietf/templates/base.html b/ietf/templates/base.html index 9cbf25784..bdefe9d63 100644 --- a/ietf/templates/base.html +++ b/ietf/templates/base.html @@ -19,6 +19,7 @@ {% endcomment %} + diff --git a/ietf/templates/meeting/agenda.html b/ietf/templates/meeting/agenda.html index 9e85116d2..8897ae8e0 100644 --- a/ietf/templates/meeting/agenda.html +++ b/ietf/templates/meeting/agenda.html @@ -229,15 +229,12 @@ CANCELLED {% endif %} - {% if item.session.agenda %} - {% include "meeting/session_agenda_include.html" %} - {% endif %} - + {% endif %} + {% else %} + + + + + {% with session.recordings as recordings %} + {% if recordings %} + {# There's no guaranteed order, so this is a bit messy: #} + + {% for r in recordings %}{% with href=r.get_href %} + {% if 'audio' in href %} + + {% endif %} + {% endwith %}{% endfor %} + + {% for r in recordings %}{% with href=r.get_href %} + {% if 'youtu' in href %} + + {% endif %} + {% endwith %}{% endfor %} + + {% for r in recordings %}{% with href=r.get_href %} + {% if not 'audio' in href and not 'youtu' in href %} + + {% endif %} + {% endwith %}{% endfor %} + {% elif item.timeslot.location.video_stream_url %} + + {% elif show_empty %} + + {% endif %} + {% endwith %} + {% endif %} + + \ No newline at end of file diff --git a/ietf/templates/meeting/session_buttons_include.html b/ietf/templates/meeting/session_buttons_include.html index 6570556dd..8e5389345 100644 --- a/ietf/templates/meeting/session_buttons_include.html +++ b/ietf/templates/meeting/session_buttons_include.html @@ -2,112 +2,95 @@ {% load origin %} {% load staticfiles %} {% load textfilters %} - {% origin %} -{% if item.session.agenda %} - - - -{% endif %} +
+ {% if session.agenda and show_agenda %} + {% include "meeting/session_agenda_include.html" %} + + + + + + + {% endif %} -{% if item.timeslot.type.slug == 'plenary' %} - -{% else %} - -{% endif %} + + {% if item.timeslot.type.slug == 'plenary' %} + + {% else %} + + {% endif %} -{# show stream buttons up till end of session, then show archive buttons #} -{% if now < item.timeslot.end_time %} - - - - - - {% if item.timeslot.location.video_stream_url %} - - - {% endif %} - - {% if item.timeslot.location.audio_stream_url %} - - - {% endif %} - - {% if "https://ietf.webex.com" in item.session.agenda_note|first_url %} - - - {% else %} - {% if item.timeslot.location.webex_url %} - - - {% endif %} - {% endif %} - -{% else %} - - - {% if schedule.meeting.number|add:"0" >= 60 %} - - - - - - - {% endif %} - - - {% if schedule.meeting.number|add:"0" >= 80 %} - {% with item.session.recordings as recordings %} - {% if recordings %} - - - {% for r in recordings %} - {% if r.get_href and 'audio' in r.get_href %} - - - - {% endif %} - {% endfor %} - - {% for r in recordings %} - {% if r.get_href and 'youtu' in r.get_href %} - - - - {% endif %} - {% endfor %} - - {% for r in recordings %} - {% if r.get_href and not 'audio' in r.get_href and not 'youtu' in r.get_href %} - - - - {% endif %} - {% endfor %} - {% endif %} - {% if item.timeslot.location.video_stream_url %} - Meetecho Stream - + {# show stream buttons up till end of session, then show archive buttons #} + {% if now < item.timeslot.end_time %} + + + + {% if item.timeslot.location.video_stream_url %} + + + {% endif %} + + {% if item.timeslot.location.audio_stream_url %} + + + {% endif %} + + {% if "webex.com/" in session.agenda_note|first_url %} + + + {% elif item.timeslot.location.webex_url %} + + + {% endif %} + {% else %} + + {% if meeting.number|add:"0" >= 60 %} + + + + {% endif %} + + {% if meeting.number|add:"0" >= 80 %} + {% with session.recordings as recordings %} + {% if recordings %} + {# There's no guaranteed order, so this is a bit messy: #} + + {% for r in recordings %} + {% if r.get_href and 'audio' in r.get_href %} + {% endif %} - - {% endwith %} - {% endif %} - - - {# #} -{% endif %} + {% endfor %} + + {% for r in recordings %} + {% if r.get_href and 'youtu' in r.get_href %} + + {% endif %} + {% endfor %} + + {% for r in recordings %} + {% if r.get_href and not 'audio' in r.get_href and not 'youtu' in r.get_href %} + + {% endif %} + {% endfor %} + {% endif %} + {% endwith %} + {% if item.timeslot.location.video_stream_url %} + + {% endif %} + {% endif %} + {% endif %} +
\ No newline at end of file diff --git a/ietf/templates/meeting/session_details.html b/ietf/templates/meeting/session_details.html index 0415f0b84..d8b821929 100644 --- a/ietf/templates/meeting/session_details.html +++ b/ietf/templates/meeting/session_details.html @@ -17,7 +17,7 @@

{{ meeting }} : {{ acronym }} {% if meeting.date >= thisweek %} - + {% endif %}

diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html index 99dc7cb62..3a87dff7f 100644 --- a/ietf/templates/meeting/session_details_panel.html +++ b/ietf/templates/meeting/session_details_panel.html @@ -1,144 +1,158 @@ {% load origin ietf_filters textfilters tz dateformat %}{% origin %} {% for session in sessions %} -

{% 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" %}({{time|utc|dateformat:"H:i T"}}){% endif %}{% endfor %} - {% if session.cancelled %}CANCELLED{% else %}{{ session.status }}{% endif %} - {% if session.name %} : {{ session.name }}{% endif %} - {% if meeting.date >= thisweek %} - - {% endif %} -

- {% if session.agenda_note %}

{{session.agenda_note}}

{% endif %} + {% with item=session.official_timeslotassignment %} +

{% 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" %}({{time|utc|dateformat:"H:i T"}}){% endif %}{% endfor %} + {% if session.cancelled %}CANCELLED{% else %}{{ session.status }}{% endif %} + {% if session.name %} : {{ session.name }}{% endif %} + {% if not session.cancelled %} + + {% 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 %} + + {% if now < item.timeslot.end_time %} + + {% endif %} + + {% endif %} +

+ {% if session.agenda_note %}

{{session.agenda_note}}

{% endif %} - {% if can_manage_materials %} - {% if session.current_status == 'sched' or session.current_status == 'schedw' %} -
- {% if can_view_request %} - Meeting Details + {% if can_manage_materials %} + {% if session.current_status == 'sched' or session.current_status == 'schedw' %} +
+ {% if can_view_request %} + Meeting Details + {% endif %} +
+ {% if not session.type_counter.agenda %} + This session does not yet have an agenda + {% endif %} + {% endif %} + {% endif %} + + {% if meeting.type.slug == 'interim' and session.remote_instructions %} +
+ Remote instructions: + {% if "https://ietf.webex.com" in session.agenda_note|first_url %} + + + {% elif "https://ietf.webex.com" in session.remote_instructions|first_url %} + + + {% endif %} + {{ session.remote_instructions }} +
+ {% endif %} + +
+
Agenda, Minutes, and Bluesheets
+
+ + {% for pres in session.filtered_artifacts %} + + {% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %} + + {% if user|has_role:"Secretariat" or can_manage_materials %} + + {% endif %} + + {% endfor %} +
+ {{pres.document.title}} + ({{ pres.document.name }}) + + {% 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 %} + Upload Revision + {% endif %} +
+ {% if can_manage_materials %} + {% if not session.type_counter.agenda %} + Upload Agenda + {% endif %} + {% if not session.type_counter.minutes %} + Upload Minutes + {% 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 %} + Upload Bluesheets {% endif %}
- {% if not session.type_counter.agenda %} - This session does not yet have an agenda - {% endif %} - {% endif %} - {% endif %} - - {% if meeting.type.slug == 'interim' and session.remote_instructions %} -
- Remote instructions: - {% if "https://ietf.webex.com" in session.agenda_note|first_url %} - - - {% elif "https://ietf.webex.com" in session.remote_instructions|first_url %} - - - {% endif %} - {{ session.remote_instructions }} -
- {% endif %} - -
-
Agenda, Minutes, and Bluesheets
-
- - {% for pres in session.filtered_artifacts %} - - {% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %} - - {% if user|has_role:"Secretariat" or can_manage_materials %} - - {% endif %} - - {% endfor %} -
- {{pres.document.title}} - ({{ pres.document.name }}) - - {% 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 %} - Upload Revision - {% endif %} -
- {% if can_manage_materials %} - {% if not session.type_counter.agenda %} - Upload Agenda - {% endif %} - {% if not session.type_counter.minutes %} - Upload Minutes - {% 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 %} - Upload Bluesheets - {% endif %}
-
-
-
Slides
-
- - - {% for pres in session.filtered_slides %} - - {% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %} - - {% if can_manage_materials %} - - {% endif %} - - {% endfor %} - -
- {{pres.document.title}} - ({{ pres.document.name }}) - - Upload Revision - Remove -
- {% if can_manage_materials %} - Upload New Slides - {% elif request.user.is_authenticated and not session.is_material_submission_cutoff %} - Propose Slides - {% endif %} -
- {% if can_manage_materials %} - - {% endif %} -
-
-
Drafts -
-
- - {% for pres in session.filtered_drafts %} - - + {% endif %} + + {% endfor %} + +
+
+
Slides
+
+ + + {% for pres in session.filtered_slides %} + {% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %} - {{pres.document.title}} ({{ pres.document.name }}) {% if pres.rev %}Version {{pres.rev}}{% endif %} - - {% if can_manage_materials %} - - {% endif %} - - {% endfor %} -
- Remove + + {{pres.document.title}} + ({{ pres.document.name }})
+ {% if can_manage_materials %} +
+ Upload Revision + Remove +
+ {% if can_manage_materials %} + Upload New Slides + {% elif request.user.is_authenticated and not session.is_material_submission_cutoff %} + Propose Slides + {% endif %} +
{% if can_manage_materials %} - - Link additional drafts to session - + {% endif %}
-
+
+
Drafts +
+
+ + {% for pres in session.filtered_drafts %} + + + {% if can_manage_materials %} + + {% endif %} + + {% endfor %} +
+ {% url 'ietf.doc.views_doc.document_main' name=pres.document.name as url %} + {{pres.document.title}} ({{ pres.document.name }}) {% if pres.rev %}Version {{pres.rev}}{% endif %} + + Remove +
+ {% if can_manage_materials %} + + Link additional drafts to session + + {% endif %} +
+
+ {% endwith %} {% endfor %} diff --git a/ietf/templates/meeting/upcoming.html b/ietf/templates/meeting/upcoming.html index 57f04ce64..bb32da7de 100644 --- a/ietf/templates/meeting/upcoming.html +++ b/ietf/templates/meeting/upcoming.html @@ -20,7 +20,14 @@
-

Upcoming Meetings

+

Upcoming Meetings + + + + + + +

For more on regular IETF meetings see here

@@ -68,11 +75,17 @@ {{ session.official_timeslotassignment.timeslot.utc_start_time | date:"Y-m-d H:i"}} - {{ session.official_timeslotassignment.timeslot.utc_end_time | date:"H:i e" }} {{ session.group.acronym }} - {{ session.meeting.number }}{% if session.current_status == 'canceled' %}  CANCELLED{% endif %} - - - {% include "meeting/interim_session_buttons.html" %} + {{ session.meeting.number }} + {% if session.current_status == 'canceled' %} + + CANCELLED + + {% else %} + + {% include "meeting/interim_session_buttons.html" with show_agenda=True %} + + {% endif %} {% endwith %} {% else %} Unexpected entry type: {{entry|classname}}