Complete Meeting Materials page
* Tested with IETF 67 and 68 data. * For testing, c_sub_cut_off_date should set to future date, otherwise a Closed page will show. - Legacy-Id: 228
This commit is contained in:
parent
8ff20e3127
commit
b73efa811a
|
@ -1 +1,11 @@
|
||||||
|
from django.db import models
|
||||||
|
#from django.db import models
|
||||||
|
|
||||||
|
from ietf.proceedings import models
|
||||||
|
#from ietf.proceedings.models import Meeting, MeetingVenue, WgMeetingSession, WgAgenda
|
||||||
|
#from ietf.proceedings.models import NonSession, NonSessionRef,SessionName
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
|
|
@ -2,23 +2,7 @@ from django.conf.urls.defaults import *
|
||||||
from ietf.meeting import models, views
|
from ietf.meeting import models, views
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
(r'^$', views.showlist),
|
(r'^(?P<meeting_num>\d+)/agenda.(?P<html_or_txt>\S+)$', views.show_html_agenda),
|
||||||
|
(r'^(?P<meeting_num>\d+)/materials.html$', views.show_html_materials),
|
||||||
(r'^(?P<meeting_num>\d+)/$', views.show),
|
|
||||||
(r'^(?P<meeting_num>\d+)/agenda.(?P<html_or_txt>\S+)$', views.show_html_agenda),
|
|
||||||
(r'^(?P<meeting_num>\d+)/materials.html$', views.show_html_materials),
|
|
||||||
|
|
||||||
|
|
||||||
# (r'^update/(?P<meeting_id>\d+)/$', views.update),
|
|
||||||
# (r'^new-(?P<type>(specific|generic|thirdpty))/$', views.new),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
#queryset = models.IprDetail.objects.all()
|
|
||||||
#archive = {'queryset':queryset, 'date_field': 'submitted_date', 'allow_empty':True }
|
|
||||||
|
|
||||||
#urlpatterns += patterns('django.views.generic.date_based',
|
|
||||||
# (r'^(?P<year>\d{4})/$', 'archive_year', archive),
|
|
||||||
# (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'archive_month', archive),
|
|
||||||
#)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,39 +1,32 @@
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
import models
|
import models
|
||||||
from django.shortcuts import render_to_response as render
|
from django.shortcuts import render_to_response as render
|
||||||
import django.newforms as forms
|
from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, SessionName, NonSession, MeetingVenue, IESGHistory, WgAgenda, Minute, Proceeding
|
||||||
from django.utils.html import escape, linebreaks
|
|
||||||
import ietf.utils
|
|
||||||
from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, SessionName, NonSession, MeetingVenue, IESGHistory
|
|
||||||
from django.views.generic.list_detail import object_list
|
from django.views.generic.list_detail import object_list
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
import datetime
|
||||||
def default(request):
|
|
||||||
"""Default page, with links to sub-pages"""
|
|
||||||
return render("meeting/list.html", {})
|
|
||||||
|
|
||||||
def showlist(request):
|
|
||||||
"""Display a list of existing disclosures"""
|
|
||||||
return meeting_list(request, 'meeting/list.html')
|
|
||||||
|
|
||||||
|
|
||||||
# don't hide Python's builtin list creation -- call this something else than 'list()'
|
|
||||||
def meeting_list(request, template):
|
|
||||||
""" Get A List of All Meetings That are in the system """
|
|
||||||
meetings = Meeting.objects.all()
|
|
||||||
|
|
||||||
return render(template,
|
|
||||||
{
|
|
||||||
'meetings' : meetings.order_by(* ['-start_date', ] ),
|
|
||||||
} )
|
|
||||||
|
|
||||||
# Details views
|
|
||||||
|
|
||||||
def show_html_materials(request, meeting_num=None):
|
def show_html_materials(request, meeting_num=None):
|
||||||
|
begin_date = Proceeding.objects.get(meeting_num=meeting_num).sub_begin_date
|
||||||
|
cut_off_date = Proceeding.objects.get(meeting_num=meeting_num).sub_cut_off_date
|
||||||
|
cor_cut_off_date = Proceeding.objects.get(meeting_num=meeting_num).c_sub_cut_off_date
|
||||||
|
now = datetime.date.today()
|
||||||
|
if now > cor_cut_off_date:
|
||||||
|
return render("meeting/list_closed.html",{'meeting_num':meeting_num,'begin_date':begin_date, 'cut_off_date':cut_off_date, 'cor_cut_off_date':cor_cut_off_date})
|
||||||
# List of WG sessions and Plenary sessions
|
# List of WG sessions and Plenary sessions
|
||||||
queryset_list = WgMeetingSession.objects.filter(Q(meeting=meeting_num, group_acronym_id__gte = -2, status_id=4), Q(irtf__isnull=True) | Q(irtf=0))
|
queryset_list = WgMeetingSession.objects.filter(Q(meeting=meeting_num, group_acronym_id__gte = -2, status_id=4), Q(irtf__isnull=True) | Q(irtf=0))
|
||||||
return object_list(request,queryset=queryset_list, template_name="meeting/list.html",allow_empty=True, extra_context={'meeting_num':meeting_num})
|
queryset_irtf = WgMeetingSession.objects.filter(meeting=meeting_num, group_acronym_id__gte = -2, status_id=4, irtf__gt=0)
|
||||||
|
queryset_interim = []
|
||||||
|
queryset_training = []
|
||||||
|
for item in list(WgMeetingSession.objects.filter(meeting=meeting_num)):
|
||||||
|
if item.interim_meeting():
|
||||||
|
item.interim=1
|
||||||
|
queryset_interim.append(item)
|
||||||
|
if item.group_acronym_id < -2:
|
||||||
|
if item.slides():
|
||||||
|
queryset_training.append(item)
|
||||||
|
return object_list(request,queryset=queryset_list, template_name="meeting/list.html",allow_empty=True, extra_context={'meeting_num':meeting_num,'irtf_list':queryset_irtf, 'interim_list':queryset_interim, 'training_list':queryset_training, 'begin_date':begin_date, 'cut_off_date':cut_off_date, 'cor_cut_off_date':cor_cut_off_date})
|
||||||
|
|
||||||
def show_html_agenda(request, meeting_num=None, html_or_txt=None):
|
def show_html_agenda(request, meeting_num=None, html_or_txt=None):
|
||||||
try:
|
try:
|
||||||
|
@ -78,5 +71,3 @@ def show_html_agenda(request, meeting_num=None, html_or_txt=None):
|
||||||
queryset_list_ads.sort(key=(lambda item: item.area.area_acronym.acronym))
|
queryset_list_ads.sort(key=(lambda item: item.area.area_acronym.acronym))
|
||||||
return object_list(request,queryset=queryset_list, template_name=template_file,allow_empty=True, extra_context={'qs_sun':queryset_list_sun, 'meeting_info':meeting_info, 'meeting_num':meeting_num, 'nonsession_info':nonsession_info, 'meetingvenue_info':meetingvenue_info, 'plenaryw_agenda':plenaryw_agenda, 'plenaryt_agenda':plenaryt_agenda, 'qs_ads':queryset_list_ads})
|
return object_list(request,queryset=queryset_list, template_name=template_file,allow_empty=True, extra_context={'qs_sun':queryset_list_sun, 'meeting_info':meeting_info, 'meeting_num':meeting_num, 'nonsession_info':nonsession_info, 'meetingvenue_info':meetingvenue_info, 'plenaryw_agenda':plenaryw_agenda, 'plenaryt_agenda':plenaryt_agenda, 'qs_ads':queryset_list_ads})
|
||||||
|
|
||||||
def show(request):
|
|
||||||
return 0
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ class ResolveAcronym(object):
|
||||||
else:
|
else:
|
||||||
acronym_name = Acronym.objects.get(pk=self.group_acronym_id).name
|
acronym_name = Acronym.objects.get(pk=self.group_acronym_id).name
|
||||||
if interim:
|
if interim:
|
||||||
return acronym_name + " (interim)"
|
return "i" + acronym
|
||||||
return acronym_name
|
return acronym_name
|
||||||
def area(self):
|
def area(self):
|
||||||
if self.irtf:
|
if self.irtf:
|
||||||
|
@ -164,7 +164,6 @@ class SessionName(models.Model):
|
||||||
db_table = 'session_names'
|
db_table = 'session_names'
|
||||||
class Admin:
|
class Admin:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class IESGHistory(models.Model):
|
class IESGHistory(models.Model):
|
||||||
meeting = models.ForeignKey(Meeting, db_column='meeting_num', core=True)
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num', core=True)
|
||||||
area = models.ForeignKey(Area, db_column='area_acronym_id', core=True)
|
area = models.ForeignKey(Area, db_column='area_acronym_id', core=True)
|
||||||
|
@ -228,7 +227,7 @@ class MeetingTime(models.Model):
|
||||||
an_br2_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=5)
|
an_br2_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=5)
|
||||||
return "%s %s" % (an_br2_info.time_desc, an_br2_info.non_session_ref)
|
return "%s %s" % (an_br2_info.time_desc, an_br2_info.non_session_ref)
|
||||||
def fbreak_info(self):
|
def fbreak_info(self):
|
||||||
fbreak_info = NonSession.objects.get(meeting=self.meeting, day_id=5, non_session_ref=6)
|
fbreak_info = NonSession.objects.get(meeting-self.meeting, day_id=5, non_session_ref=6)
|
||||||
return "%s %s" % (fbreak_info.time_desc, fbreak_info.non_session_ref)
|
return "%s %s" % (fbreak_info.time_desc, fbreak_info.non_session_ref)
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'meeting_times'
|
db_table = 'meeting_times'
|
||||||
|
@ -289,7 +288,13 @@ class WgMeetingSession(models.Model, ResolveAcronym):
|
||||||
def agenda_file(self,interimvar=0):
|
def agenda_file(self,interimvar=0):
|
||||||
irtfvar = 0
|
irtfvar = 0
|
||||||
if self.irtf:
|
if self.irtf:
|
||||||
irtfvar = self.irtf
|
irtfvar = self.group_acronym_id
|
||||||
|
if interimvar == 0:
|
||||||
|
try:
|
||||||
|
if self.interim:
|
||||||
|
interimvar = 1
|
||||||
|
except AttributeError:
|
||||||
|
interimvar = 0
|
||||||
try:
|
try:
|
||||||
filename = WgAgenda.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
|
filename = WgAgenda.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
|
||||||
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
||||||
|
@ -300,12 +305,18 @@ class WgMeetingSession(models.Model, ResolveAcronym):
|
||||||
def minute_file(self,interimvar=0):
|
def minute_file(self,interimvar=0):
|
||||||
irtfvar = 0
|
irtfvar = 0
|
||||||
if self.irtf:
|
if self.irtf:
|
||||||
irtfvar = self.irtf
|
irtfvar = self.group_acronym_id
|
||||||
|
if interimvar == 0:
|
||||||
|
try:
|
||||||
|
if self.interim:
|
||||||
|
interimvar = 1
|
||||||
|
except AttributeError:
|
||||||
|
interimvar = 0
|
||||||
try:
|
try:
|
||||||
filename = Minute.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
|
filename = Minute.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
|
||||||
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
||||||
retvar = "%s/minutes/%s" % (dir,filename)
|
retvar = "%s/minutes/%s" % (dir,filename)
|
||||||
except WgAgenda.DoesNotExist:
|
except Minute.DoesNotExist:
|
||||||
retvar = ""
|
retvar = ""
|
||||||
return retvar
|
return retvar
|
||||||
def slides(self,interimvar=0):
|
def slides(self,interimvar=0):
|
||||||
|
@ -314,9 +325,24 @@ class WgMeetingSession(models.Model, ResolveAcronym):
|
||||||
"""
|
"""
|
||||||
irtfvar = 0
|
irtfvar = 0
|
||||||
if self.irtf:
|
if self.irtf:
|
||||||
irtfvar = self.irtf
|
irtfvar = self.group_acronym_id
|
||||||
|
if interimvar == 0:
|
||||||
|
try:
|
||||||
|
if self.interim:
|
||||||
|
interimvar = 1
|
||||||
|
except AttributeError:
|
||||||
|
interimvar = 0
|
||||||
slides = Slide.objects.filter(meeting=self.meeting,group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).order_by("order_num")
|
slides = Slide.objects.filter(meeting=self.meeting,group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).order_by("order_num")
|
||||||
return slides
|
return slides
|
||||||
|
def interim_meeting (self):
|
||||||
|
if self.minute_file(1):
|
||||||
|
return True
|
||||||
|
elif self.agenda_file(1):
|
||||||
|
return True
|
||||||
|
elif self.slides(1):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'wg_meeting_sessions'
|
db_table = 'wg_meeting_sessions'
|
||||||
class Admin:
|
class Admin:
|
||||||
|
@ -396,7 +422,7 @@ class Slide(models.Model, ResolveAcronym):
|
||||||
def file_loc(self):
|
def file_loc(self):
|
||||||
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
||||||
if self.slide_type_id==1:
|
if self.slide_type_id==1:
|
||||||
return "%s/slides/%s-%s/sld1.htm" % (dir,self.acronym(),self.order_num)
|
return "%s/slides/%s-%s/sld1.htm" % (dir,self.acronym(),self.slide_num)
|
||||||
else:
|
else:
|
||||||
if self.slide_type_id == 2:
|
if self.slide_type_id == 2:
|
||||||
ext = ".pdf"
|
ext = ".pdf"
|
||||||
|
@ -408,7 +434,7 @@ class Slide(models.Model, ResolveAcronym):
|
||||||
ext = ".doc"
|
ext = ".doc"
|
||||||
else:
|
else:
|
||||||
ext = ""
|
ext = ""
|
||||||
return "%s/slides/%s-%s%s" % (dir,self.acronym(),self.order_num,ext)
|
return "%s/slides/%s-%s%s" % (dir,self.acronym(),self.slide_num,ext)
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'slides'
|
db_table = 'slides'
|
||||||
class Admin:
|
class Admin:
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
<link rel="stylesheet" type="text/css" href="https://www.ietf.org/css/base.css" />
|
<link rel="stylesheet" type="text/css" href="https://www.ietf.org/css/base.css" />
|
||||||
<center>
|
<center>
|
||||||
<h2>IETF {{ meeting_num }} Preliminary & Interim Materials</h2>
|
<h2>IETF {{ meeting_num }} Preliminary & Interim Materials</h2>
|
||||||
<h4>Submission begin </h4>
|
<h4>Submission began {{ begin_date|date:"F j, Y" }} </h4>
|
||||||
<h4>Submission cutoff odate: </h4>
|
<h4>Submission cutoff odate: {{ cut_off_date|date:"F j, Y" }}</h4>
|
||||||
<h4>Corrections to submissions cutoff date: </h4>
|
<h4>Corrections to submissions cutoff date:{{ cor_cut_off_date|date:"F j, Y" }} </h4>
|
||||||
<br>
|
<br>
|
||||||
Updated as of {% now "r" %}
|
Updated as of {% now "r" %}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
@ -15,7 +15,7 @@ Updated as of {% now "r" %}
|
||||||
{% for wgs in areas %}
|
{% for wgs in areas %}
|
||||||
<table cellpadding="0" cellspacing="0" border="2" width="80%">
|
<table cellpadding="0" cellspacing="0" border="2" width="80%">
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan=2 bgcolor="#0911DC" valign="center"><font color="#FFFFFF"><center><br><h3><img src="https://www1.ietf.org/images/ib2.gif" width="100%" height=21><br>{{ wgs.grouper }}</h3></center></font>
|
<td colspan=2 bgcolor="#0911DC" valign="center"><font color="#FFFFFF"><center><br><h3><img src="https://www.ietf.org/images/ib2.gif" width="100%" height=21><br>{{ wgs.grouper }}</h3></center></font>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -37,6 +37,69 @@ Updated as of {% now "r" %}
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
<!--- Training Sessions --->
|
||||||
|
<table cellpadding="0" cellspacing="0" border="2" width="80%">
|
||||||
|
<tr>
|
||||||
|
<td colspan=2 bgcolor="#0911DC" valign="center"><font color="#FFFFFF"><center><br><h3><img src="https://www.ietf.org/images/ib2.gif" width="100%" height=21><br>Training</h3></center></font>
|
||||||
|
</td> </tr> </table>
|
||||||
|
{% for wg in training_list|dictsort:"acronym" %}
|
||||||
|
<table cellpadding="0" cellspacing="0" border="2" width="80%"> <tr><a name="wg-{{ wg.acronym }}"></a>
|
||||||
|
<td align="center" bgcolor="#DDFFDD" width="20%"><b>{{ wg.acronym|upper }}</b></td>
|
||||||
|
<td><table border="1" width="100%">
|
||||||
|
{% include "meeting/submission_status_snippet.html" %}
|
||||||
|
{% for slide in wg.slides %}
|
||||||
|
<tr><td><a href="http://www3.ietf.org/proceedings/{{ slide.file_loc }}">{{ slide.slide_name }}</a></td> </tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% endfor %}
|
||||||
|
<!--- End of Training Sessions --->
|
||||||
|
<!--- IRTF Sessions --->
|
||||||
|
<table cellpadding="0" cellspacing="0" border="2" width="80%">
|
||||||
|
<tr>
|
||||||
|
<td colspan=2 bgcolor="#0911DC" valign="center"><font color="#FFFFFF"><center><br><h3><img src="https://www.ietf.org/images/ib2.gif" width="100%" height=21><br>IRTF</h3></center></font>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% for wg in irtf_list|dictsort:"acronym" %}
|
||||||
|
<table cellpadding="0" cellspacing="0" border="2" width="80%">
|
||||||
|
<tr><a name="wg-{{ wg.acronym }}"></a>
|
||||||
|
<td align="center" bgcolor="#DDFFDD" width="20%"><b>{{ wg.acronym|upper }}</b><br>
|
||||||
|
{% if wg.agenda_file %}<a href="http://www3..ietf.org/proceedings/{{ wg.agenda_file }}">[Agenda]</a>{% endif %}{% if wg.minute_file %} <a href="http://www3.ietf.org/proceedings/{{ wg.minute_file }}">[Minutes]</a>{% endif %}</td>
|
||||||
|
<td><table border="1" width="100%">
|
||||||
|
{% include "meeting/submission_status_snippet.html" %}
|
||||||
|
{% for slide in wg.slides %}
|
||||||
|
<tr><td><a href="http://www3.ietf.org/proceedings/{{ slide.file_loc }}">{{ slide.slide_name }}</a></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% endfor %}
|
||||||
|
<!--- End of IRTF Sessions --->
|
||||||
|
<!--- Interim Meetings --->
|
||||||
|
<table cellpadding="0" cellspacing="0" border="2" width="80%">
|
||||||
|
<tr>
|
||||||
|
<td colspan=2 bgcolor="#0911DC" valign="center"><font color="#FFFFFF"><center><br><h3><img src="https://www.ietf.org/images/ib2.gif" width="100%" height=21><br>Interim Meetings</h3></center></font>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% for wg in interim_list|dictsort:"acronym" %}
|
||||||
|
<table cellpadding="0" cellspacing="0" border="2" width="80%"> <tr><a name="wg-{{ wg.acronym }}"></a>
|
||||||
|
<td align="center" bgcolor="#DDFFDD" width="20%"><b>{{ wg.acronym|upper }}</b><br> {% if wg.agenda_file %}<a href="http://www3..ietf.org/proceedings/{{ wg.agenda_file }}">[Agenda]</a>{% endif %}{% if wg.minute_file %} <a href="http://www3.ietf.org/proceedings/{{ wg.minute_file }}">[Minutes]</a>{% endif %}</td>
|
||||||
|
<td><table border="1" width="100%">
|
||||||
|
{% include "meeting/submission_status_snippet.html" %}
|
||||||
|
{% for slide in wg.slides %}
|
||||||
|
<tr><td><a href="http://www3.ietf.org/proceedings/{{ slide.file_loc }}">{{ slide.slide_name }}</a></td> </tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
{% endfor %}
|
||||||
|
<!--- End of Imterim Meetings --->
|
||||||
</center>
|
</center>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
16
ietf/templates/meeting/list_closed.html
Normal file
16
ietf/templates/meeting/list_closed.html
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% block title %} IETF {{ meeting_num }} Preliminary & Interim Materials {% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://www.ietf.org/css/base.css" />
|
||||||
|
<center>
|
||||||
|
<h2>IETF {{ meeting_num }} Preliminary & Interim Materials</h2>
|
||||||
|
<h4>Submission began {{ begin_date|date:"F j, Y" }} </h4>
|
||||||
|
<h4>Submission cutoff odate: {{ cut_off_date|date:"F j, Y" }}</h4>
|
||||||
|
<h4>Corrections to submissions cutoff date:{{ cor_cut_off_date|date:"F j, Y" }} </h4>
|
||||||
|
</center>
|
||||||
|
<br>
|
||||||
|
<i>
|
||||||
|
The IETF {{ meeting_num }} Preliminary & Interim Materials page is now closed.<br>
|
||||||
|
You should be able to access the final version of IETF {{ meeting_num }} Proceedings via <a href="http://www.ietf.org/proceedings_directory.html">IETF Online Proceedings page</a>.<br>
|
||||||
|
</i>
|
||||||
|
{% endblock %}
|
Loading…
Reference in a new issue