Example #1
0
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))
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #7
0
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))
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)
Example #11
0
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))
Example #12
0
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())
Example #13
0
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)))
Example #15
0
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))
Example #16
0
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))