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
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