Example #1
0
    def test_has_current_pdf_is_true_when_conversion_is_ok_and_checksum_is_not_changed(self):
        pdfadapter = IPdf(self.file)

        storage = IPdfStorage(self.file)
        storage.status = STATE_OK

        self.assertTrue(pdfadapter.has_current_pdf())
Example #2
0
    def test_post_request_is_handled_as_put_pdf(self, browser):
        browser.webdav('POST', self.file, view='pdfify',
                       data={'token':self.token, 'data':'__PDF_DATA__'})

        transaction.begin()

        blob = IPdfStorage(self.file).retrieve()
        _blob = blob.open('r')

        self.assertEquals('__PDF_DATA__', _blob.read())

        _blob.close()
Example #3
0
    def test_has_current_pdf_is_false_when_conversion_is_running(self):
        storage = IPdfStorage(self.file)
        storage.status = STATE_CONVERTING

        self.assertFalse(IPdf(self.file).has_current_pdf())
Example #4
0
 def __init__(self, context):
     self.context = context
     self.storage = IPdfStorage(self.context)
Example #5
0
class Pdf(object):
    implements(IPdf)
    adapts(IPdfifyable)

    def __init__(self, context):
        self.context = context
        self.storage = IPdfStorage(self.context)

    @property
    def primary_value(self):
        if safe_hasattr(self.context, 'getPrimaryField'):
            return self.context.getPrimaryField().get(self.context)
        else:
            return IPrimaryFieldInfo(self.context).value

    @property
    def primary_download(self):
        if safe_hasattr(self.context, 'getPrimaryField'):
            field = self.context.getPrimaryField()
            return field.index_html(self.context, disposition='attachment')
        else:
            value = IPrimaryFieldInfo(self.context).value
            set_headers(value, self.request.response, filename=value.filename)
            return stream_data(value)

    @property
    def status(self):
        return self.storage.status

    @property
    def current_hash(self):
        return hashlib.md5(self.primary_value.data).hexdigest()

    def generate_url(self):
        self.storage.token = self.generate_token()

        return '%s/pdfify?token=%s' % (
            self.context.absolute_url(), self.storage.token)
        self.context

    def generate_token(self):
        # TODO improve security
        return hashlib.md5(
            '%s%f' % (self.context.Title(), time.time())).hexdigest()

    def verify_token(self, token):
        return self.storage.token == token

    def has_current_pdf(self):
        if self.storage.status == STATE_OK:
            return self.current_hash == self.storage.checksum

        return False

    def convert_to_pdf(self):
        if not self.has_current_pdf():
            self.storage.checksum = self.current_hash
            self.storage.status = STATE_CONVERTING

            ASYNC_CONVERT_JOB.delay(self.generate_url(),
                                    IUUID(self.context),
                                    self.primary_value.filename,
                                    self.primary_value.content_type)

    def store_pdf(self, data):
        self.storage.store(data)
        self.storage.status = STATE_OK
        self.storage.store(data)
        notify(PdfReadyEvent(self.context))

    def pdf_filename(self):
        base, ext = os.path.splitext(self.primary_value.filename)
        return base + os.path.extsep + 'pdf'

    def pdf_download(self):
        blob = self.storage.retrieve()
        filename = blob._p_blob_uncommitted or blob.committed()

        response = self.context.REQUEST.RESPONSE
        response.setHeader("Content-Type", 'application/pdf')
        response.setHeader("Content-Length", self.storage.size)
        response.setHeader("Content-disposition",
                           'attachment; filename=%s' % self.pdf_filename())

        return filestream_iterator(filename, 'rb')