Skip to content
Snippets Groups Projects
formats.py 4.49 KiB
Newer Older
##############################################################################
#
#    Redner Odoo module
#    Copyright (C) 2016 XCG Consulting <https://xcg-consulting.fr>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Affero General Public License as
#    published by the Free Software Foundation, either version 3 of the
#    License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

DEFAULT_MIMETYPE = "application/octet-stream"

FORMAT_WORD97 = "doc"
FORMAT_WORD2003 = "wordml"
FORMAT_PDF = "pdf"
FORMAT_DOCBOOK = "docbook"
FORMAT_HTML = "html"
FORMAT_ODT = "odt"
FORMAT_ODS = "ods"
FORMAT_XLS = "xls"
FORMAT_DOCX = "docx"


class UnkownFormatException(Exception):
    pass


Vincent Hatakeyama's avatar
Vincent Hatakeyama committed
class Format:
    """A format representation that contains:
Houzefa Abbasbhay's avatar
Houzefa Abbasbhay committed
    a name we use in our applications
    an ODF name (like: 'MS Word 2003 XML') which is the name you must
    use as a filter to call a renderserver or a LibreOffice server
    a mimetype that corresponds to the mimetype of the produced file
    if you ask LibreOffice to convert to the corresponding format
    and a simple flag that indicates if the format is Native or if it is
    produced by calling a LibreOffice filter to convert the native
    document to an "external format"
    """

    def __init__(self, name, odfname, mimetype=DEFAULT_MIMETYPE, native=False):
        self.name = name
        self.odfname = odfname
        self.mimetype = mimetype
        self.native = native


Vincent Hatakeyama's avatar
Vincent Hatakeyama committed
class Formats:
    def __init__(self):

        self._formats = {
            FORMAT_WORD97: Format(
                FORMAT_WORD97, "MS Word 97", "application/msword"
            ),
            FORMAT_WORD2003: Format(
                FORMAT_WORD2003,
                "MS Word 2003 XML",
                "application/vnd.openxmlformats-officedocument"
                ".wordprocessingml.document",
            ),
            FORMAT_PDF: Format(
                FORMAT_PDF, "writer_pdf_Export", "application/pdf"
            ),
            FORMAT_DOCBOOK: Format(
                FORMAT_DOCBOOK, "DocBook File", "application/xml"
            ),
            FORMAT_HTML: Format(FORMAT_HTML, "HTML", "text/html"),
            FORMAT_ODT: Format(
                FORMAT_ODT,
                "writer8",
                "application/vnd.oasis.opendocument.text",
                native=True,
            ),
            FORMAT_ODS: Format(
                FORMAT_ODS,
                "calc8",
                "application/vnd.oasis.opendocument.spreadsheet",
                native=True,
            ),
            FORMAT_XLS: Format(
                FORMAT_XLS, "MS Excel 97", "application/msexcel"
            ),
            FORMAT_DOCX: Format(
                FORMAT_DOCX,
                "Office Open XML Text",
                "application/vnd.openxmlformats-officedocument"
                ".wordprocessingml.document",
            ),
        }

    def get_format(self, name):
        """an accessor that will return a redner.formats.Format instance that
        can be used to know the LibreOffice filter name, the mimetype etc.
        :param name: the name of the LibreOffice filter (ie: format) you want
        to obtain
        :type name: string
        :returns: a redner.formats.Format instance.
        :raises: redner.formats.UnkownFormatException if the provided name does
        not correspond to a known format named
        """
        f = self._formats.get(name)

        if not f:
            raise UnkownFormatException("Format {} is unkown".format(name))

        return f

    def get_known_format_names(self, nativeonly=False):
        """return the a list of names that can be used as format names in
        redner.template.
        :param nativeonly: a boolean flag. If set to True will only return
        native formats.
        :type nativeonly: bool
        :return: list of chars
        :returntype: list
        :raises: nothing
        """
        if nativeonly:
            return [f for f in self._formats if self.get_format(f).native]
Vincent Hatakeyama's avatar
Vincent Hatakeyama committed
        return list(self._formats)