|
4 | 4 | #import models |
5 | 5 | import datetime |
6 | 6 | import os |
| 7 | +import re |
| 8 | +import tarfile |
| 9 | + |
| 10 | +from tempfile import mkstemp |
7 | 11 |
|
8 | 12 | from django.shortcuts import render_to_response, get_object_or_404 |
9 | 13 | from ietf.idtracker.models import IETFWG, IRTF, Area |
|
17 | 21 | from django.utils.decorators import decorator_from_middleware |
18 | 22 | from django.middleware.gzip import GZipMiddleware |
19 | 23 | from django.db.models import Count |
| 24 | +from ietf.idtracker.models import InternetDraft |
| 25 | +from ietf.idrfc.idrfc_wrapper import IdWrapper |
| 26 | +from ietf.utils.pipe import pipe |
20 | 27 |
|
21 | 28 | from ietf.proceedings.models import Meeting, MeetingTime, WgMeetingSession, MeetingVenue, IESGHistory, Proceeding, Switches, WgProceedingsActivities |
22 | 29 |
|
@@ -148,3 +155,154 @@ def session_agenda(request, num, session, ext=None): |
148 | 155 | raise Http404("No %s agenda for the %s session of IETF %s is available" % (ext, session, num)) |
149 | 156 | else: |
150 | 157 | raise Http404("No agenda for the %s session of IETF %s is available" % (session, num)) |
| 158 | + |
| 159 | +def convert_to_pdf(doc_name): |
| 160 | + import subprocess |
| 161 | + inpath = os.path.join(settings.INTERNET_DRAFT_PATH, doc_name + ".txt") |
| 162 | + outpath = os.path.join(settings.INTERNET_DRAFT_PDF_PATH, doc_name + ".pdf") |
| 163 | + |
| 164 | + try: |
| 165 | + infile = open(inpath, "r") |
| 166 | + except Exception, e: |
| 167 | + return |
| 168 | + |
| 169 | + t,tempname = mkstemp() |
| 170 | + tempfile = open(tempname, "w") |
| 171 | + |
| 172 | + pageend = 0; |
| 173 | + newpage = 0; |
| 174 | + formfeed = 0; |
| 175 | + for line in infile: |
| 176 | + line = re.sub("\r","",line) |
| 177 | + line = re.sub("[ \t]+$","",line) |
| 178 | + if re.search("\[?[Pp]age [0-9ivx]+\]?[ \t]*$",line): |
| 179 | + pageend=1 |
| 180 | + tempfile.write(line) |
| 181 | + continue |
| 182 | + if re.search("^[ \t]*\f",line): |
| 183 | + formfeed=1 |
| 184 | + tempfile.write(line) |
| 185 | + continue |
| 186 | + 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): |
| 187 | + newpage=1 |
| 188 | + if re.search("^[ \t]*$",line) and pageend and not newpage: |
| 189 | + continue |
| 190 | + if pageend and newpage and not formfeed: |
| 191 | + tempfile.write("\f") |
| 192 | + pageend=0 |
| 193 | + formfeed=0 |
| 194 | + newpage=0 |
| 195 | + tempfile.write(line) |
| 196 | + |
| 197 | + infile.close() |
| 198 | + tempfile.close() |
| 199 | + t,psname = mkstemp() |
| 200 | + pipe("enscript --margins 76::76: -B -q -p "+psname + " " +tempname) |
| 201 | + os.unlink(tempname) |
| 202 | + pipe("ps2pdf "+psname+" "+outpath) |
| 203 | + os.unlink(psname) |
| 204 | + |
| 205 | + |
| 206 | +def session_draft_list(num, session): |
| 207 | + extensions = ["html", "htm", "txt", "HTML", "HTM", "TXT", ] |
| 208 | + result = [] |
| 209 | + found = False |
| 210 | + for wg in [session, session.upper(), session.lower()]: |
| 211 | + for e in extensions: |
| 212 | + path = settings.AGENDA_PATH_PATTERN % {"meeting":num, "wg":wg, "ext":e} |
| 213 | + if os.path.exists(path): |
| 214 | + file = open(path) |
| 215 | + agenda = file.read() |
| 216 | + file.close() |
| 217 | + found = True |
| 218 | + break |
| 219 | + if found: |
| 220 | + break |
| 221 | + else: |
| 222 | + raise Http404("No agenda for the %s session of IETF %s is available" % (session, num)) |
| 223 | + |
| 224 | + drafts = set(re.findall('(draft-[-a-z0-9]*)',agenda)) |
| 225 | + |
| 226 | + for draft in drafts: |
| 227 | + if (re.search('-[0-9]{2}$',draft)): |
| 228 | + doc_name = draft |
| 229 | + else: |
| 230 | + id = get_object_or_404(InternetDraft, filename=draft) |
| 231 | + doc = IdWrapper(id) |
| 232 | + doc_name = draft + "-" + id.revision |
| 233 | + result.append(doc_name) |
| 234 | + |
| 235 | + return sorted(list(set(result))) |
| 236 | + |
| 237 | + |
| 238 | +def session_draft_tarfile(request, num, session): |
| 239 | + drafts = session_draft_list(num, session); |
| 240 | + |
| 241 | + response = HttpResponse(mimetype='application/octet-stream') |
| 242 | + response['Content-Disposition'] = 'attachment; filename=%s-drafts.tgz'%(session) |
| 243 | + tarstream = tarfile.open('','w:gz',response) |
| 244 | + mfh, mfn = mkstemp() |
| 245 | + manifest = open(mfn, "w") |
| 246 | + |
| 247 | + for doc_name in drafts: |
| 248 | + pdf_path = os.path.join(settings.INTERNET_DRAFT_PDF_PATH, doc_name + ".pdf") |
| 249 | + |
| 250 | + if (not os.path.exists(pdf_path)): |
| 251 | + convert_to_pdf(doc_name) |
| 252 | + |
| 253 | + if os.path.exists(pdf_path): |
| 254 | + try: |
| 255 | + tarstream.add(pdf_path, str(doc_name + ".pdf")) |
| 256 | + manifest.write("Included: "+pdf_path+"\n") |
| 257 | + except Exception, e: |
| 258 | + manifest.write(("Failed (%s): "%e)+pdf_path+"\n") |
| 259 | + else: |
| 260 | + manifest.write("Not found: "+pdf_path+"\n") |
| 261 | + |
| 262 | + manifest.close() |
| 263 | + tarstream.add(mfn, "manifest.txt") |
| 264 | + tarstream.close() |
| 265 | + os.unlink(mfn) |
| 266 | + return response |
| 267 | + |
| 268 | +def pdf_pages(file): |
| 269 | + try: |
| 270 | + infile = open(file, "r") |
| 271 | + except Exception, e: |
| 272 | + return 0 |
| 273 | + for line in infile: |
| 274 | + m = re.match('\] /Count ([0-9]+)',line) |
| 275 | + if m: |
| 276 | + return int(m.group(1)) |
| 277 | + return 0 |
| 278 | + |
| 279 | + |
| 280 | +def session_draft_pdf(request, num, session): |
| 281 | + drafts = session_draft_list(num, session); |
| 282 | + curr_page = 1 |
| 283 | + pmh, pmn = mkstemp() |
| 284 | + pdfmarks = open(pmn, "w") |
| 285 | + pdf_list = "" |
| 286 | + |
| 287 | + for draft in drafts: |
| 288 | + pdf_path = os.path.join(settings.INTERNET_DRAFT_PDF_PATH, draft + ".pdf") |
| 289 | + if (not os.path.exists(pdf_path)): |
| 290 | + convert_to_pdf(draft) |
| 291 | + |
| 292 | + if (os.path.exists(pdf_path)): |
| 293 | + pages = pdf_pages(pdf_path) |
| 294 | + pdfmarks.write("[/Page "+str(curr_page)+" /View [/XYZ 0 792 1.0] /Title (" + draft + ") /OUT pdfmark\n") |
| 295 | + pdf_list = pdf_list + " " + pdf_path |
| 296 | + curr_page = curr_page + pages |
| 297 | + |
| 298 | + pdfmarks.close() |
| 299 | + pdfh, pdfn = mkstemp() |
| 300 | + pipe("gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=" + pdfn + " " + pdf_list + " " + pmn) |
| 301 | + |
| 302 | + pdf = open(pdfn,"r") |
| 303 | + pdf_contents = pdf.read() |
| 304 | + pdf.close() |
| 305 | + |
| 306 | + os.unlink(pmn) |
| 307 | + os.unlink(pdfn) |
| 308 | + return HttpResponse(pdf_contents, mimetype="application/pdf") |
0 commit comments