def preview_epub(request, document_id): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': form = EPUBForm(request.POST) if form.is_valid(): inputFile = document.latest_version().content.path outputFile = "/tmp/%s.epub" % document_id defaults = { "dctitle" : document.title, "dcidentifier" : document.identifier, "dclanguage" : document.language, "dccreator" : document.author, "dcpublisher" : document.publisher, "dcdate" : document.date} defaults.update(form.cleaned_data) DaisyPipeline.dtbook2epub(inputFile, outputFile, images=document.image_set.all(), **defaults) return render_to_mimetype_response('application/epub+zip', document.title.encode('utf-8'), outputFile) else: form = EPUBForm() return render_to_response('documents/todo_epub.html', locals(), context_instance=RequestContext(request))
def preview_xhtml(request, document_id): document = get_object_or_404(Document, pk=document_id) inputFile = document.latest_version().content.path outputFile = "/tmp/%s.xhtml" % document_id params = {} DaisyPipeline.dtbook2xhtml(inputFile, outputFile, **params) return render_to_mimetype_response('text/html', document.title.encode('utf-8'), outputFile)
def as_xhtml(request, document_id): form = XHTMLForm(request.POST) if not form.is_valid(): return HttpResponseRedirect(reverse('browse_detail', args=[document_id])) document = Document.objects.get(pk=document_id) inputFile = document.latest_version().content.path outputFile = "/tmp/%s.xhtml" % document_id DaisyPipeline.dtbook2xhtml(inputFile, outputFile, **form.cleaned_data) return render_to_mimetype_response('text/html', document.title.encode('utf-8'), outputFile)
def as_pdf(request, document_id): form = LargePrintProfileForm(request.POST) if not form.is_valid(): return HttpResponseRedirect(reverse('browse_detail', args=[document_id])) document = Document.objects.get(pk=document_id) inputFile = document.latest_version().content.path outputFile = "/tmp/%s.pdf" % document_id DaisyPipeline.dtbook2pdf(inputFile, outputFile, **form.cleaned_data) return render_to_mimetype_response('application/pdf', document.title.encode('utf-8'), outputFile)
def preview_rtf(request, document_id): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': form = RTFForm(request.POST) if form.is_valid(): inputFile = document.latest_version().content.path outputFile = "/tmp/%s.rtf" % document_id DaisyPipeline.dtbook2rtf(inputFile, outputFile, **form.cleaned_data) return render_to_mimetype_response('application/rtf', document.title.encode('utf-8'), outputFile) else: form = RTFForm() return render(request, 'documents/todo_rtf.html', locals())
def handle(self, *args, **options): if len(args) < 1: raise CommandError('No product numbers specified') output_dir = options['output_dir'] verbosity = int(options['verbosity']) products_exported = 0 for product in args: if verbosity >= 1: self.stdout.write('Exporting text only DTB for %s...\n' % product) try: document = Document.objects.get(product__identifier=product) except Document.DoesNotExist: self.stderr.write('Product %s does not exist\n' % product) continue inputFile = document.latest_version().content.path outputDir = tempfile.mkdtemp(prefix="daisyproducer-") transformationErrors = DaisyPipeline.dtbook2text_only_dtb(inputFile, outputDir) if transformationErrors: print transformationErrors zipFile = join(output_dir, product + ".zip") zipDirectory(outputDir, zipFile, document.title) shutil.rmtree(outputDir) products_exported += 1 if verbosity >= 1: self.stdout.write("%s products exported\n" % products_exported)
def preview_pdf(request, document_id): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': form = LargePrintProfileForm(request.POST) if form.is_valid(): inputFile = document.latest_version().content.path outputFile = "/tmp/%s.pdf" % document_id DaisyPipeline.dtbook2pdf(inputFile, outputFile, **form.cleaned_data) return render_to_mimetype_response('application/pdf', document.title.encode('utf-8'), outputFile) else: form = LargePrintProfileForm() return render_to_response('documents/todo_pdf.html', locals(), context_instance=RequestContext(request))
def as_dtb(request, document_id): form = DTBForm(request.POST) if not form.is_valid(): return HttpResponseRedirect(reverse('browse_detail', args=[document_id])) document = Document.objects.get(pk=document_id) inputFile = document.latest_version().content.path outputDir = tempfile.mkdtemp(prefix="daisyproducer-") DaisyPipeline.dtbook2dtb(inputFile, outputDir, **form.cleaned_data) ignore, zipFileName = tempfile.mkstemp(suffix='.zip', prefix=document_id) zipDirectory(outputDir, zipFileName, document.title) shutil.rmtree(outputDir) return render_to_mimetype_response('application/zip', document.title.encode('utf-8'), zipFileName)
def as_text_only_dtb(request, document_id): form = TextOnlyDTBForm(request.POST) if not form.is_valid(): return HttpResponseRedirect(reverse('browse_detail', args=[document_id])) document = Document.objects.get(pk=document_id) inputFile = document.latest_version().content.path outputDir = tempfile.mkdtemp(prefix="daisyproducer-") DaisyPipeline.dtbook2text_only_dtb(inputFile, outputDir, **form.cleaned_data) zipFile = tempfile.NamedTemporaryFile(suffix='.zip', prefix=document_id, delete=False) zipFile.close() # we are only interested in a unique filename zipDirectory(outputDir, zipFile.name, document.title) shutil.rmtree(outputDir) return render_to_mimetype_response('application/zip', document.title.encode('utf-8'), zipFile.name)
def as_epub(request, document_id): form = EPUBForm(request.POST) if not form.is_valid(): return HttpResponseRedirect(reverse('browse_detail', args=[document_id])) document = Document.objects.get(pk=document_id) inputFile = document.latest_version().content.path outputFile = "/tmp/%s.epub" % document_id defaults = { "dctitle" : document.title, "dcidentifier" : document.identifier, "dclanguage" : document.language, "dccreator" : document.author, "dcpublisher" : document.publisher, "dcdate" : document.date} defaults.update(form.cleaned_data) DaisyPipeline.dtbook2epub(inputFile, outputFile, **defaults) return render_to_mimetype_response('application/epub+zip', document.title.encode('utf-8'), outputFile)
def preview_dtb(request, document_id): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': form = DTBForm(request.POST) if form.is_valid(): inputFile = document.latest_version().content.path outputDir = tempfile.mkdtemp(prefix="daisyproducer-") DaisyPipeline.dtbook2dtb(inputFile, outputDir, **form.cleaned_data) ignore, zipFileName = tempfile.mkstemp(suffix='.zip', prefix=document_id) zipDirectory(outputDir, zipFileName, document.title) # shutil.rmtree(outputDir) return render_to_mimetype_response('application/zip', document.title.encode('utf-8'), zipFileName) else: form = DTBForm() return render_to_response('documents/todo_dtb.html', locals(), context_instance=RequestContext(request))
def preview_dtb(request, document_id): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': form = DTBForm(request.POST) if form.is_valid(): inputFile = document.latest_version().content.path outputDir = tempfile.mkdtemp(prefix="daisyproducer-") DaisyPipeline.dtbook2dtb(inputFile, outputDir, **form.cleaned_data) zipFile = tempfile.NamedTemporaryFile(suffix='.zip', prefix=document_id, delete=False) zipFile.close() # we are only interested in a unique filename zipDirectory(outputDir, zipFile.name, document.title) shutil.rmtree(outputDir) return render_to_mimetype_response('application/zip', document.title.encode('utf-8'), zipFile.name) else: form = DTBForm() return render(request, 'documents/todo_dtb.html', locals())
def validate_content(fileName, contentMetaData): # make sure the uploaded version is valid xml exitMessages = DaisyPipeline.validate(fileName) if exitMessages: return exitMessages # make sure the meta data of the uploaded version corresponds # to the meta data in the document xmlContent = XMLContent() try: errorList = xmlContent.validateContentMetaData(fileName , **contentMetaData) except etree.XMLSyntaxError as e: return "The uploaded file is not a valid DTBook XML document:" + e.message if errorList: return "; ".join( ("The meta data '%s' in the uploaded file does not correspond to the value in the document: '%s' instead of '%s'" % errorTuple for errorTuple in errorList))
def handle(self, *args, **options): outputPath = options['outputPath'] verbosity = int(options['verbosity']) fileNameMapping = options['fileNameMapping'] mapping ={} if fileNameMapping: reader = csv.reader(open(fileNameMapping)) for line in reader: source, dest = line[:2] mapping[source] = dest conversions = 0 for dtbook in options['dtbook_files']: if verbosity >= 1: self.stdout.write('Converting %s...\n' % dtbook) outputDir = tempfile.mkdtemp(prefix="daisyproducer-") result = DaisyPipeline.dtbook2text_only_dtb( dtbook, outputDir, # we assume that there are no images images=[]) if result: for error in result: self.stderr.write(error + "\n") continue if outputPath == None: outputPath = os.path.dirname(dtbook) fileName, ext = os.path.splitext(os.path.basename(dtbook)) if fileNameMapping: fileName = mapping[fileName] if verbosity >= 2: self.stdout.write('Mapping %s to %s\n' % (dtbook, fileName)) self.stdout.flush() zipFileName = os.path.join(outputPath, fileName + ".zip") zipDirectory(outputDir, zipFileName, fileName) shutil.rmtree(outputDir) conversions += 1 if verbosity >= 1: self.stdout.write('Converted %s %s of %s\n' % (conversions, "file" if conversions == 1 else "files", len(args)))
def validate_content(fileName, contentMetaData, removeFile=False): # make sure the uploaded version is valid xml exitMessages = DaisyPipeline.validate(fileName) if exitMessages: if removeFile: os.remove(fileName) raise forms.ValidationError( ["The uploaded file is not a valid DTBook XML document: "] + exitMessages) # make sure the meta data of the uploaded version corresponds # to the meta data in the document xmlContent = XMLContent() errorList = xmlContent.validateContentMetaData(fileName , **contentMetaData) if removeFile: os.remove(fileName) if errorList: raise forms.ValidationError( map(lambda errorTuple : "The meta data '%s' in the uploaded file does not correspond to the value in the document: '%s' instead of '%s'" % errorTuple, errorList))
def preview_text_only_dtb(request, document_id): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': form = TextOnlyDTBForm(request.POST) if form.is_valid(): inputFile = document.latest_version().content.path outputDir = tempfile.mkdtemp(prefix="daisyproducer-") ebookNumber = form.cleaned_data.pop('ebookNumber') transformationErrors = DaisyPipeline.dtbook2text_only_dtb( inputFile, outputDir, images=document.image_set.all(), **form.cleaned_data) if transformationErrors: return render_to_response('documents/todo_text_only_dtb.html', locals(), context_instance=RequestContext(request)) zipFile = tempfile.NamedTemporaryFile(suffix='.zip', prefix=document_id, delete=False) zipFile.close() # we are only interested in a unique filename zipDirectory(outputDir, zipFile.name, ebookNumber) shutil.rmtree(outputDir) # put a copy of the ebook to a shared folder where it is fetched by another process that # puts into the distribution system. This will change, as the distribution system should # fetch the ebook directly from the archive. See fhs for a rationale about the dest # folder (http://www.pathname.com/fhs/pub/fhs-2.3.html#VARSPOOLAPPLICATIONSPOOLDATA) shutil.copy2(zipFile.name, os.path.join('/var/spool/daisyproducer', ebookNumber + '.zip')) return render_to_mimetype_response('application/zip', document.title.encode('utf-8'), zipFile.name) else: ebook = Product.objects.filter(document=document, type=2) if ebook: form = TextOnlyDTBForm({'ebookNumber': ebook[0].identifier}) else: form = TextOnlyDTBForm() return render_to_response('documents/todo_text_only_dtb.html', locals(), context_instance=RequestContext(request))