~replaceafill/schooltool/trunk_fixes

« back to all changes in this revision

Viewing changes to src/schooltool/report/report.py

  • Committer: Justas Sadzevicius
  • Date: 2013-05-28 12:12:34 UTC
  • mfrom: (3585.1.4 flourish_trunk)
  • Revision ID: justas@pov.lt-20130528121234-uzr7ke5pz1ihn101
Merge file archive reprorts and minor report tweaks and fixes

Show diffs side-by-side

added added

removed removed

Lines of Context:
323
323
        if locale_id is not None:
324
324
            self.locale = zope.i18n.locales.Locale(locale_id)
325
325
 
 
326
    def clone(self):
 
327
        clone = self.__class__(params=self.form, task=self.task)
 
328
        if self.locale is not None:
 
329
            clone.locale = zope.i18n.locales.Locale(self.locale.id)
 
330
        return clone
 
331
 
326
332
    @property
327
333
    def task_id(self):
328
334
        if self.task is None:
345
351
        return ''
346
352
 
347
353
 
 
354
class NoReportException(Exception):
 
355
    pass
 
356
 
 
357
 
348
358
class AbstractReportTask(RemoteTask):
349
359
    implements(IReportTask)
350
360
 
351
361
    routing_key = "zodb.report"
 
362
    default_mimetype = None
 
363
    default_filename = 'report'
352
364
    report = None
353
365
 
354
366
    abstract = True
444
456
                (context, request), name=self.view_name)
445
457
        return renderer
446
458
 
447
 
    def renderToFile(self, renderer, *args, **kwargs):
448
 
        raise NotImplemented()
449
 
 
450
 
    def makeReportFile(self, filename, data):
451
 
        raise NotImplemented()
 
459
    def renderReport(self, renderer, stream, *args, **kw):
 
460
        data = renderer()
 
461
        stream.write(data)
 
462
 
 
463
    def updateReport(self, renderer, report):
 
464
        if not report.mimeType:
 
465
            report.mimeType = getattr(renderer, 'mimetype', None)
 
466
        if not report.mimeType:
 
467
            report.mimeType = self.default_mimetype
 
468
        if not report.__name__ or not report.__name__.strip():
 
469
            report.__name__ = getattr(renderer, 'filename', None)
 
470
        if not report.__name__ or not report.__name__.strip():
 
471
            report.__name__ = self.default_filename
 
472
 
 
473
    def renderToFile(self, renderer, *args, **kw):
 
474
        report = ReportFile()
 
475
        stream = report.open('w')
 
476
        try:
 
477
            self.renderReport(renderer, stream, *args, **kw)
 
478
        except NoReportException:
 
479
            return None
 
480
        finally:
 
481
            stream.close()
 
482
        self.updateReport(renderer, report)
 
483
        return report
452
484
 
453
485
    @property
454
486
    def factory(self):
479
511
 
480
512
class ReportTask(AbstractReportTask):
481
513
 
482
 
    def renderToFile(self, renderer, *args, **kwargs):
483
 
        # XXX:
484
 
        #if not schooltool.app.pdf.isEnabled():
485
 
        #    return translate(renderer.pdf_disabled_text,
486
 
        #                     context=renderer.request)
 
514
    default_filename = 'report.pdf'
 
515
    default_mimetype = 'application/pdf'
 
516
 
 
517
    def renderReport(self, renderer, stream, *args, **kw):
487
518
        renderer.update()
488
519
        rml = renderer.render()
489
520
        filename = renderer.filename
490
 
        stream = rml2pdf.parseString(rml, filename=filename or None)
491
 
        data = stream.getvalue()
492
 
        pdf = self.makeReportFile(filename, data)
493
 
        return pdf
494
 
 
495
 
    def makeReportFile(self, filename, data):
496
 
        if not filename or not filename.strip():
497
 
            filename = 'report.pdf'
498
 
        pdf = ReportFile()
499
 
        pdf.mimeType = 'application/pdf'
500
 
        pdf.__name__ = filename
501
 
        stream = pdf.open('w')
502
 
        stream.write(data)
503
 
        stream.close()
504
 
        return pdf
 
521
        pdf = rml2pdf.parseString(rml, filename=filename or None)
 
522
        stream.write(pdf.getvalue())
505
523
 
506
524
 
507
525
class OldReportTask(ReportTask):
508
526
 
509
 
    def renderToFile(self, renderer, *args, **kwargs):
510
 
        # XXX:
511
 
        #if not schooltool.app.pdf.isEnabled():
512
 
        #    return translate(renderer.pdf_disabled_text,
513
 
        #                     context=renderer.request)
 
527
    filename = None
 
528
 
 
529
    def renderReport(self, renderer, stream, *args, **kw):
514
530
        filename, data = renderer.renderToFile()
515
531
        if data is None:
516
 
            return None
517
 
        pdf = self.makeReportFile(filename, data)
518
 
        return pdf
 
532
            raise NoReportException()
 
533
        self.filename = filename
 
534
        stream.write(data)
 
535
 
 
536
    def updateReport(self, renderer, report):
 
537
        if not report.__name__ or not report.__name__.strip():
 
538
            report.__name__ = self.filename
 
539
        if not report.__name__ or not report.__name__.strip():
 
540
            report.__name__ = self.default_filename
 
541
        return ReportTask.updateReport(renderer, report)
 
542
 
 
543
 
 
544
class ArchiveReportTask(AbstractReportTask):
 
545
 
 
546
    default_filename = 'report.zip'
 
547
    default_mimetype = 'application/zip'
 
548
 
 
549
    def renderReport(self, renderer, stream, *args, **kw):
 
550
        renderer.update()
 
551
        written = renderer.render(stream, *args, **kw)
 
552
        if not written:
 
553
            raise NoReportException()
519
554
 
520
555
 
521
556
class ReportDetails(object):
606
641
        msg.send(sender=task, recipients=[self.task.creator])
607
642
 
608
643
 
 
644
class OnReportArchiveScheduled(OnPDFReportScheduled):
 
645
    pass
 
646
 
 
647
 
609
648
class GeneratedReportMessage(ReportMessage):
610
649
 
611
650
    def __init__(self, *args, **kw):