Browse Source

publish muk_converter - 11.0

pull/25/head
MuK IT GmbH 5 years ago
parent
commit
6045d6092c
  1. 3
      muk_converter/__manifest__.py
  2. 184
      muk_converter/models/converter.py
  3. 139
      muk_converter/views/convert.xml
  4. 219
      muk_converter/wizards/convert.py

3
muk_converter/__manifest__.py

@ -20,7 +20,7 @@
{
"name": "MuK Converter",
"summary": """Universal Converter""",
"version": '11.0.1.2.3',
"version": '11.0.1.2.4',
"category": 'Extra Tools',
"license": "AGPL-3",
"website": "https://www.mukit.at",
@ -28,6 +28,7 @@
"author": "MuK IT",
"contributors": [
"Mathias Markl <mathias.markl@mukit.at>",
"Kerrim Abd El-Hamed <kerrim.abdelhamed@mukit.at>",
],
"depends": [
"iap",

184
muk_converter/models/converter.py

@ -1,93 +1,93 @@
###################################################################################
#
# Copyright (C) 2018 MuK IT GmbH
#
# 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/>.
#
###################################################################################
import base64
import hashlib
import logging
from odoo import api, models, fields, SUPERUSER_ID
from odoo.addons.muk_converter.service.unoconv import UnoconvConverter
from odoo.addons.muk_converter.service.provider import RemoteConverter
_logger = logging.getLogger(__name__)
class Converter(models.AbstractModel):
_name = 'muk_converter.converter'
_description = 'Converter'
#----------------------------------------------------------
# Functions
#----------------------------------------------------------
@api.model
def formats(self):
return self._provider().formats
@api.model
def imports(self):
return self._provider().imports
@api.model
def convert(self, filename, content, format="pdf", recompute=False, store=True):
binary_content = base64.b64decode(content)
checksum = hashlib.sha1(binary_content).hexdigest()
stored = self._retrieve(checksum, format)
if not recompute and stored.exists():
return base64.b64encode(stored.content)
else:
name = "%s.%s" % (filename, format)
output = self._parse(filename, binary_content, format)
if store:
self._store(checksum, name, output, format, stored)
return base64.b64encode(output)
#----------------------------------------------------------
# Helper
#----------------------------------------------------------
@api.model
def _provider(self):
params = self.env['ir.config_parameter'].sudo()
service = params.get_param('muk_converter.service')
if service == 'unoconv':
return UnoconvConverter()
else:
return RemoteConverter(env=self.env)
@api.model
def _parse(self, filename, content, format):
return self._provider().convert(content, filename=filename, format=format)
@api.model
def _retrieve(self, checksum, format):
domain = [["checksum", "=", checksum], ["format", "=", format]]
return self.env['muk_converter.store'].sudo().search(domain, limit=1)
@api.model
def _store(self, checksum, filename, content, format, stored):
if stored and stored.exists():
stored.write({'used_date': fields.Datetime.now})
else:
self.env['muk_converter.store'].sudo().create({
'checksum': checksum,
'format': format,
'content_fname': filename,
###################################################################################
#
# Copyright (C) 2018 MuK IT GmbH
#
# 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/>.
#
###################################################################################
import base64
import hashlib
import logging
from odoo import api, models, fields, SUPERUSER_ID
from odoo.addons.muk_converter.service.unoconv import UnoconvConverter
from odoo.addons.muk_converter.service.provider import RemoteConverter
_logger = logging.getLogger(__name__)
class Converter(models.AbstractModel):
_name = 'muk_converter.converter'
_description = 'Converter'
#----------------------------------------------------------
# Functions
#----------------------------------------------------------
@api.model
def formats(self):
return self._provider().formats
@api.model
def imports(self):
return self._provider().imports
@api.model
def convert(self, filename, content, format="pdf", recompute=False, store=True):
binary_content = base64.b64decode(content)
checksum = hashlib.sha1(binary_content).hexdigest()
stored = self._retrieve(checksum, format)
if not recompute and stored.exists():
return base64.b64encode(stored.content)
else:
name = "%s.%s" % (filename, format)
output = self._parse(filename, binary_content, format)
if store:
self._store(checksum, name, output, format, stored)
return base64.b64encode(output)
#----------------------------------------------------------
# Helper
#----------------------------------------------------------
@api.model
def _provider(self):
params = self.env['ir.config_parameter'].sudo()
service = params.get_param('muk_converter.service')
if service == 'unoconv':
return UnoconvConverter()
else:
return RemoteConverter(env=self.env)
@api.model
def _parse(self, filename, content, format):
return self._provider().convert(content, filename=filename, format=format)
@api.model
def _retrieve(self, checksum, format):
domain = [["checksum", "=", checksum], ["format", "=", format]]
return self.env['muk_converter.store'].sudo().search(domain, limit=1)
@api.model
def _store(self, checksum, filename, content, format, stored):
if stored and stored.exists():
stored.write({'used_date': fields.Datetime.now})
else:
self.env['muk_converter.store'].sudo().create({
'checksum': checksum,
'format': format,
'content_fname': filename,
'content': content})

139
muk_converter/views/convert.xml

@ -1,69 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017 MuK IT GmbH
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/>.
-->
<odoo>
<record id="view_converter_convert_form" model="ir.ui.view">
<field name="name">muk_converter_convert.form</field>
<field name="model">muk_converter.convert</field>
<field name="arch" type="xml">
<form string="Convert File">
<group states="export">
<field invisible="1" name="state" />
<group>
<field name="input_name" invisible="1" />
<field name="input_binary" filename="input_name" />
</group>
<group>
<field name="format" />
</group>
</group>
<div states="download">
<field name="output_name" invisible="1" />
<h3>Conversion Complete</h3>
<p>The file has been successfully converted and can now be used.
You can download the file by clicking on the link below.
</p>
<p>
Here is the converted file:
<field name="output_binary" filename="output_name" options="{'no_export': True}"/>
</p>
</div>
<footer states="export">
<button name="convert" string="Convert" type="object" class="btn-primary" />
<button special="cancel" string="Cancel" type="object"
class="btn-default" />
</footer>
<footer states="download">
<button special="cancel" string="Close" type="object" class="btn-primary" />
</footer>
</form>
</field>
</record>
<record id="action_converter_convert" model="ir.actions.act_window">
<field name="name">Convert File</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">muk_converter.convert</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017 MuK IT GmbH
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/>.
-->
<odoo>
<record id="view_converter_convert_form" model="ir.ui.view">
<field name="name">muk_converter_convert.form</field>
<field name="model">muk_converter.convert</field>
<field name="arch" type="xml">
<form string="Convert File">
<group states="export">
<field invisible="1" name="state" />
<group>
<field name="input_name" invisible="1" />
<field name="input_url" attrs="{'invisible':[('input_url','=',False)]}" readonly="1" />
<field name="input_binary" filename="input_name" attrs="{'invisible':[('input_url','!=',False)]}" />
</group>
<group>
<field name="format" />
</group>
</group>
<div states="download">
<field name="output_name" invisible="1" />
<h3>Conversion Complete</h3>
<p>The file has been successfully converted and can now be used.
You can download the file by clicking on the link below.
</p>
<p>
Here is the converted file:
<field name="output_binary" filename="output_name" options="{'no_export': True}"/>
</p>
</div>
<footer states="export">
<button name="convert" string="Convert" type="object" class="btn-primary" />
<button special="cancel" string="Cancel" type="object"
class="btn-default" />
</footer>
<footer states="download">
<button special="cancel" string="Close" type="object" class="btn-primary" />
</footer>
</form>
</field>
</record>
<record id="action_converter_convert" model="ir.actions.act_window">
<field name="name">Convert File</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">muk_converter.convert</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>

219
muk_converter/wizards/convert.py

@ -1,103 +1,118 @@
###################################################################################
#
# Copyright (C) 2017 MuK IT GmbH
#
# 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/>.
#
###################################################################################
import os
import base64
import uuid
import logging
import mimetypes
from odoo import _, api, fields, models
# from odoo.addons.muk_utils.tools.http import get_response TODO
#from odoo.addons.muk_converter.tools import converter
_logger = logging.getLogger(__name__)
class ConverterWizard(models.TransientModel):
_name = "muk_converter.convert"
#----------------------------------------------------------
# Selections
#----------------------------------------------------------
def _format_selection(self):
formats = self.env['muk_converter.converter'].formats()
return list(map(lambda format: (format, format.upper()), formats))
#----------------------------------------------------------
# Database
#----------------------------------------------------------
state = fields.Selection(
selection=[
("export", "Export"),
("download", "Download")],
string="State",
required=True,
default="export")
input_name = fields.Char(
string="Filename",
states={'export': [('required', True)]})
input_binary = fields.Binary(
string="File",
states={'export': [('required', True)]})
format = fields.Selection(
selection=_format_selection,
string="Format",
default="pdf",
states={'export': [('required', True)]})
output_name = fields.Char(
string="Filename",
readonly=True,
states={'download': [('required', True)]})
output_binary = fields.Binary(
string="File",
readonly=True,
states={'download': [('required', True)]})
#----------------------------------------------------------
# Functions
#----------------------------------------------------------
@api.multi
def convert(self):
self.ensure_one()
name = "%s.%s" % (os.path.splitext(self.input_name)[0], self.format)
output = self.env['muk_converter.converter'].convert(self.input_name, self.input_binary)
self.write({
'state': 'download',
'output_name': name,
'output_binary': output})
return {
"name": _("Convert File"),
'type': 'ir.actions.act_window',
'res_model': 'muk_converter.convert',
'view_mode': 'form',
'view_type': 'form',
'res_id': self.id,
'views': [(False, 'form')],
'target': 'new',
###################################################################################
#
# Copyright (C) 2017 MuK IT GmbH
#
# 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/>.
#
###################################################################################
import os
import base64
import uuid
import logging
import mimetypes
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.addons.muk_utils.tools.http import get_response
_logger = logging.getLogger(__name__)
class ConverterWizard(models.TransientModel):
_name = "muk_converter.convert"
#----------------------------------------------------------
# Selections
#----------------------------------------------------------
def _format_selection(self):
formats = self.env['muk_converter.converter'].formats()
return list(map(lambda format: (format, format.upper()), formats))
#----------------------------------------------------------
# Database
#----------------------------------------------------------
state = fields.Selection(
selection=[
("export", "Export"),
("download", "Download")],
string="State",
required=True,
default="export")
input_name = fields.Char(
string="Filename",
states={'export': [('required', True)]})
input_url = fields.Char(
string="URL")
input_binary = fields.Binary(
string="File")
format = fields.Selection(
selection=_format_selection,
string="Format",
default="pdf",
states={'export': [('required', True)]})
output_name = fields.Char(
string="Filename",
readonly=True,
states={'download': [('required', True)]})
output_binary = fields.Binary(
string="File",
readonly=True,
states={'download': [('required', True)]})
#----------------------------------------------------------
# Functions
#----------------------------------------------------------
@api.multi
def convert(self):
self.ensure_one()
if not self.input_url and not self.input_binary:
raise UserError(_("Please choose a file to convert."))
if self.input_url:
status, headers, content = get_response(self.input_url)
if status != 200:
raise ValueError(_("Failed to retrieve the file from the url."))
else:
content = base64.b64encode(content)
else:
content = self.input_binary
name = "%s.%s" % (os.path.splitext(self.input_name)[0], self.format)
output = self.env['muk_converter.converter'].convert(self.input_name, content, format=self.format)
self.write({
'state': 'download',
'output_name': name,
'output_binary': output})
return {
"name": _("Convert File"),
'type': 'ir.actions.act_window',
'res_model': 'muk_converter.convert',
'view_mode': 'form',
'view_type': 'form',
'res_id': self.id,
'views': [(False, 'form')],
'target': 'new',
}
Loading…
Cancel
Save