Skip to content

Commit b759122

Browse files
committed
Added link to agenda page to download drafts
- Legacy-Id: 2609
1 parent 53c0d22 commit b759122

4 files changed

Lines changed: 141 additions & 0 deletions

File tree

adam/ietf/meeting/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
(r'^agenda.txt$', views.text_agenda),
1111
(r'^(?P<num>\d+)/agenda(?:.html)?/?$', views.html_agenda),
1212
(r'^(?P<num>\d+)/agenda.txt$', views.text_agenda),
13+
(r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)-drafts.tgz$', views.session_draft_tarfile),
1314
(r'^(?P<num>\d+)/agenda/(?P<session>[A-Za-z0-9-]+)(?P<ext>\.[A-Za-z0-9]+)?$', views.session_agenda),
1415
(r'^$', views.current_materials),
1516
)

adam/ietf/meeting/views.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#import models
55
import datetime
66
import os
7+
import re
8+
import tarfile
79

810
from django.shortcuts import render_to_response, get_object_or_404
911
from ietf.idtracker.models import IETFWG, IRTF, Area
@@ -17,6 +19,8 @@
1719
from django.utils.decorators import decorator_from_middleware
1820
from django.middleware.gzip import GZipMiddleware
1921
from django.db.models import Count
22+
from ietf.idtracker.models import InternetDraft
23+
from ietf.idrfc.idrfc_wrapper import IdWrapper
2024

2125
from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, MeetingVenue, IESGHistory, Proceeding, Switches, WgProceedingsActivities
2226

@@ -148,3 +152,107 @@ def session_agenda(request, num, session, ext=None):
148152
raise Http404("No %s agenda for the %s session of IETF %s is available" % (ext, session, num))
149153
else:
150154
raise Http404("No agenda for the %s session of IETF %s is available" % (session, num))
155+
156+
def convert_to_pdf(doc_name):
157+
from tempfile import mkstemp
158+
from ietf.utils.pipe import pipe
159+
import subprocess
160+
inpath = os.path.join(settings.INTERNET_DRAFT_PATH, doc_name + ".txt")
161+
outpath = os.path.join(settings.INTERNET_DRAFT_PDF_PATH, doc_name + ".pdf")
162+
163+
try:
164+
infile = open(inpath, "r")
165+
except Exception, e:
166+
return
167+
168+
t,tempname = mkstemp()
169+
tempfile = open(tempname, "w")
170+
171+
pageend = 0;
172+
newpage = 0;
173+
formfeed = 0;
174+
for line in infile:
175+
line = re.sub("\r","",line)
176+
line = re.sub("[ \t]+$","",line)
177+
if re.search("\[?[Pp]age [0-9ivx]+\]?[ \t]*$",line):
178+
pageend=1
179+
tempfile.write(line)
180+
continue
181+
if re.search("^[ \t]*\f",line):
182+
formfeed=1
183+
tempfile.write(line)
184+
continue
185+
if re.search("^ *INTERNET.DRAFT.+[0-9]+ *$",line) or re.search("^ *Internet.Draft.+[0-9]+ *$",line) or re.search("^draft-[-a-z0-9_.]+.*[0-9][0-9][0-9][0-9]$",line) or re.search("^RFC.+[0-9]+$",line):
186+
newpage=1
187+
if re.search("^[ \t]*$",line) and pageend and not newpage:
188+
continue
189+
if pageend and newpage and not formfeed:
190+
tempfile.write("\f")
191+
pageend=0
192+
formfeed=0
193+
newpage=0
194+
tempfile.write(line)
195+
196+
infile.close()
197+
tempfile.close()
198+
t,psname = mkstemp()
199+
pipe("enscript --margins 76::76: -B -q -p "+psname + " " +tempname)
200+
os.unlink(tempname)
201+
pipe("ps2pdf "+psname+" "+outpath)
202+
os.unlink(psname)
203+
204+
205+
def session_draft_tarfile(request, num, session):
206+
from tempfile import mkstemp
207+
extensions = ["html", "htm", "txt", "HTML", "HTM", "TXT", ]
208+
found = False
209+
for wg in [session, session.upper(), session.lower()]:
210+
for e in extensions:
211+
path = settings.AGENDA_PATH_PATTERN % {"meeting":num, "wg":wg, "ext":e}
212+
if os.path.exists(path):
213+
file = open(path)
214+
agenda = file.read()
215+
file.close()
216+
found = True
217+
break
218+
if found:
219+
break
220+
else:
221+
raise Http404("No agenda for the %s session of IETF %s is available" % (session, num))
222+
223+
drafts = set(re.findall('(draft-[-a-z0-9]*)',agenda))
224+
225+
response = HttpResponse(mimetype='application/octet-stream')
226+
response['Content-Disposition'] = 'attachment; filename=%s-drafts.tgz'%(session)
227+
tarstream = tarfile.open('','w:gz',response)
228+
mfh, mfn = mkstemp()
229+
manifest = open(mfn, "w")
230+
231+
for draft in drafts:
232+
if (re.search('-[0-9]{2}$',draft)):
233+
doc_name = draft
234+
else:
235+
id = get_object_or_404(InternetDraft, filename=draft)
236+
doc = IdWrapper(id)
237+
doc_name = draft + "-" + id.revision
238+
239+
txt_path = os.path.join(settings.INTERNET_DRAFT_PATH, doc_name + ".txt")
240+
pdf_path = os.path.join(settings.INTERNET_DRAFT_PDF_PATH, doc_name + ".pdf")
241+
242+
if (not os.path.exists(pdf_path)):
243+
convert_to_pdf(doc_name)
244+
245+
if os.path.exists(pdf_path):
246+
try:
247+
tarstream.add(pdf_path, str(doc_name + ".pdf"))
248+
manifest.write("Included: "+pdf_path+"\n")
249+
except Exception, e:
250+
manifest.write(("Failed (%s): "%e)+pdf_path+"\n")
251+
else:
252+
manifest.write("Not found: "+pdf_path+"\n")
253+
254+
manifest.close()
255+
tarstream.add(mfn, "manifest.txt")
256+
tarstream.close()
257+
os.unlink(mfn)
258+
return response

adam/ietf/templates/meeting/agenda.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,11 @@ <h2 class="ietf-divider">{{ slot.meeting_date|date:"l"|upper }}, {{ slot.meeting
277277
<td>{{ session.info.area|upper}}</td>
278278
<td>{% if session.info.isWG %}<a href="/wg/{{ session.info.acronym|lower }}/">{{ session.info.acronym|lower }}</a>{% else %}{{ session.info.acronym|lower }}{% endif %}</td>
279279
<td>
280+
<table width="100%"><tr><td>
280281
<img src="/images/color-palette-4x4.gif" alt="" onclick="pickAgendaColor('{{meeting.num}}-{{slot.meeting_date|date:"D"|lower}}-{{slot.time_desc|slice:":4"}}-{{session.info.area|upper}}-{{session.info.acronym|lower}}',this);" title="color tag this line"/ class="noprint">
281282
{% if session.info.agenda_file %}<a href="http://www.ietf.org/proceedings/{{ session.info.agenda_file }}" title="session agenda">{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}</a>{% else %}{{ session.info.acronym_name|escape }} {{ session.info.group_type_str }}{% endif %}
282283
{% if session.info.special_agenda_note %}<br/> - {{ session.info.special_agenda_note }}{% endif %}
284+
</td><td align="right"><a href="/meeting/79/agenda/{{session.info.acronym}}-drafts.tgz">{{session.info.acronym}} drafts</a></td></tr></table>
283285
</td>
284286
{% endif %}
285287
</tr>

adam/ietf/utils/pipe.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Simplified interface to os.popen3()
2+
3+
def pipe(cmd, str=None):
4+
from popen2 import Popen3 as Popen
5+
bufsize = 4096
6+
MAX = 65536*16
7+
8+
if str and len(str) > 4096: # XXX: Hardcoded Linux 2.4, 2.6 pipe buffer size
9+
bufsize = len(str)
10+
11+
pipe = Popen(cmd, True, bufsize)
12+
if str:
13+
pipe.tochild.write(str)
14+
pipe.tochild.close()
15+
16+
out = ""
17+
err = ""
18+
while True:
19+
str = pipe.fromchild.read()
20+
if str:
21+
out += str
22+
code = pipe.poll()
23+
if code > -1:
24+
err = pipe.childerr.read()
25+
break
26+
if len(out) >= MAX:
27+
err = "Output exceeds %s bytes and has been truncated"
28+
break
29+
30+
return (code, out, err)

0 commit comments

Comments
 (0)