Exemple #1
0
    def _convert(self, doc):
        from emeraldtree import ElementTree as ET
        from moin.converters import default_registry as reg

        doc = self._expand_document(doc)

        # We convert the internal representation of the document
        # into a DocBook document
        conv = reg.get(type_moin_document, Type('application/docbook+xml'))

        doc = conv(doc)

        # We determine the different namespaces of the output form
        output_namespaces = {
            docbook.namespace: '',
            xlink.namespace: 'xlink',
        }

        # We convert the result into a BytesIO object
        # With the appropriate namespace
        # TODO: Some other operation should probably be done here too
        # like adding a doctype
        file_to_send = BytesIO()
        tree = ET.ElementTree(doc)
        tree.write(file_to_send, namespaces=output_namespaces)

        # We determine the different parameters for the reply
        mt = MimeType(mimestr='application/docbook+xml;charset=utf-8')
        content_type = mt.content_type()
        as_attachment = mt.as_attachment(app.cfg)
        # After creation of the BytesIO, we are at the end of the file
        # so position is the size the file.
        # and then we should move it back at the beginning of the file
        content_length = file_to_send.tell()
        file_to_send.seek(0)
        # Important: empty filename keeps flask from trying to autodetect filename,
        # as this would not work for us, because our file's are not necessarily fs files.
        return send_file(
            file=file_to_send,
            mimetype=content_type,
            as_attachment=as_attachment,
            attachment_filename=None,
            cache_timeout=10,  # wiki data can change rapidly
            add_etags=False,
            etag=None,
            conditional=True)
Exemple #2
0
 def _do_get(self,
             hash,
             member=None,
             force_attachment=False,
             mimetype=None):
     if member:  # content = file contained within a archive item revision
         path, filename = os.path.split(member)
         mt = MimeType(filename=filename)
         content_length = None
         file_to_send = self.get_member(member)
         # force attachment download, so it uses attachment_filename
         # otherwise it will use the itemname from the URL for saving
         force_attachment = True
     else:  # content = item revision
         rev = self.rev
         filename = get_download_file_name(rev.item.fqname)
         try:
             mimestr = rev.meta[CONTENTTYPE]
         except KeyError:
             mt = MimeType(filename=filename)
         else:
             mt = MimeType(mimestr=mimestr)
         content_length = rev.meta[SIZE]
         file_to_send = rev.data
     if mimetype:
         content_type = mimetype
     else:
         content_type = mt.content_type()
     as_attachment = force_attachment or mt.as_attachment(app.cfg)
     return send_file(
         file=file_to_send,
         mimetype=content_type,
         as_attachment=as_attachment,
         attachment_filename=filename,
         cache_timeout=10,  # wiki data can change rapidly
         add_etags=True,
         etag=hash,
         conditional=True)