Example #1
0
    def versions(self):
        versions = cache.get('document_%s_versions' % self.id)
        if versions is None:
            versions = list(
                        self._blob.derived_documents.all().exclude(
                        file_type='png')
            )
            versions.append(self)
            for version in versions:
                version.original_document = self
                version.priority = type_to_priorty(version.type)

            versions = sorted(versions, key=lambda doc:doc.priority, reverse=True)
            #cache.set('document_%s_versions' % self.id, versions, 60 * 20)
        return versions
Example #2
0
def create_pdf(doc):
    log.info('PDF Conversion start')
    blob = doc._blob
    orig_file = blob.file

    log.info('Starting conversion of %s to PDF' % blob)

    # Check for derived files of PDF type
    if blob.documents.filter(file_type='pdf'):
        log.info('%s is a PDF, no need to convert' % blob)
        return False
    elif blob.derived_documents.filter(file_type='pdf'):
        log.info('%s has derived PDF, no need to convert' % blob)
        return False

    tempd_loc = tempfile.mkdtemp()
    temp_file, tempf_loc = tempfile.mkstemp(dir=tempd_loc)

    temp_file = os.fdopen(temp_file, "wb")

    for chunk in orig_file.chunks():
        temp_file.write(chunk)
    temp_file.close()

    try:
        port = get_free_port()

        log.info("Launching unoconv with port %s" % port)

        proc = subprocess.Popen(UNOCONV_CALL % (port, tempd_loc, tempf_loc),
                                #stderr=subprocess.PIPE,
                                #stdout=subprocess.PIPE,
                                shell=True)

        # Create and start a watchdog thread
        t = threading.Timer(TIMEOUT, timeout, [proc, port])
        t.start()

        stderr, stdout = None, None#proc.communicate()
        proc.wait()

        t.cancel()

        if proc.returncode != 0:
            error = subprocess.CalledProcessError(proc.returncode,
                                                  UNOCONV_CALL % (
                                                  port, tempd_loc, tempf_loc))
            error.output = "%s %s" % (stderr, stdout)
            raise error

        log.info("unoconv (port %s) output: %s %s" % (port, stderr, stdout))

    except subprocess.CalledProcessError as e:
        log.error('unoconv (port %s) returned a non-zero exit status: %s' % (port, e.output))

    os.unlink(tempf_loc)

    files = os.listdir(tempd_loc)

    for pdf in files:
        if pdf.lower().endswith('.pdf'):
            break
    else:
        shutil.rmtree(tempd_loc, True)
        raise ConversionError('Unable to find PDF file')

    pdf = os.path.abspath(os.path.join(tempd_loc, pdf))
    pdf = open(pdf, 'rb')
    filename = os.path.basename(orig_file.name)
    filename = os.path.splitext(filename)[0] + '.pdf'

    doc = DerivedDocument(derived_from=blob)
    doc.file = UploadedFile(pdf, filename, 'application/pdf', 0, None)
    doc.index = type_to_priorty('pdf')

    # # Do one last check before saving the blob, just incase this task got fired
    # # twice in quick succession.

    if blob.derived_documents.filter(file_type='pdf'):
        return False
    else:
        doc.save()

    pdf.close()

    shutil.rmtree(tempd_loc, True)

    log.info("Convertion of %s complete" % blob)

    return True