mirror of https://github.com/muk-it/muk_base
MuK IT GmbH
6 years ago
4 changed files with 224 additions and 0 deletions
-
20muk_fields_file/__init__.py
-
48muk_fields_file/__manifest__.py
-
20muk_fields_file/fields/__init__.py
-
136muk_fields_file/fields/file.py
@ -0,0 +1,20 @@ |
|||
################################################################################### |
|||
# |
|||
# 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/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import fields |
@ -0,0 +1,48 @@ |
|||
################################################################################### |
|||
# |
|||
# 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/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
{ |
|||
"name": "MuK Large Objects", |
|||
"summary": """PGSQL Large Objects Support""", |
|||
"version": '12.0.2.2.4', |
|||
"category": 'Extra Tools', |
|||
"license": "AGPL-3", |
|||
"website": "https://www.mukit.at", |
|||
'live_test_url': 'https://mukit.at/r/SgN', |
|||
"author": "MuK IT", |
|||
"contributors": [ |
|||
"Mathias Markl <mathias.markl@mukit.at>", |
|||
], |
|||
"depends": [ |
|||
"muk_utils", |
|||
], |
|||
"qweb": [ |
|||
"static/src/xml/*.xml", |
|||
], |
|||
"images": [ |
|||
'static/description/banner.png' |
|||
], |
|||
"external_dependencies": { |
|||
"python": [], |
|||
"bin": [], |
|||
}, |
|||
"auto_install": False, |
|||
"application": False, |
|||
"installable": True, |
|||
} |
@ -0,0 +1,20 @@ |
|||
################################################################################### |
|||
# |
|||
# 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/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
from . import file |
@ -0,0 +1,136 @@ |
|||
################################################################################### |
|||
# |
|||
# 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 os |
|||
import re |
|||
import base64 |
|||
import hashlib |
|||
import logging |
|||
import binascii |
|||
import tempfile |
|||
|
|||
from odoo import fields, tools |
|||
from odoo.tools import human_size, config |
|||
|
|||
from odoo.addons.muk_utils.tools.file import ensure_path_directories |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
class File(fields.Field): |
|||
|
|||
type = 'file' |
|||
column_type = ('varchar', 'varchar') |
|||
_slots = { |
|||
'prefetch': False, |
|||
'context_dependent': True, |
|||
} |
|||
|
|||
def _get_store_path(self, dbname): |
|||
return os.path.join(config.get('data_dir'), 'files', dbname) |
|||
|
|||
def _get_file_path(self, checksume, dbname): |
|||
name = "%s/%s" % (checksume[:2], checksume) |
|||
name = re.sub('[.]', '', name).strip('/\\') |
|||
filestore = self._get_store_path(dbname) |
|||
path = os.path.join(filestore, name) |
|||
ensure_path_directories(path) |
|||
return path |
|||
|
|||
def _get_checksum(self, value): |
|||
if isinstance(value, bytes): |
|||
return hashlib.sha1(value).hexdigest() |
|||
else: |
|||
checksum = hashlib.sha1() |
|||
while True: |
|||
chunk = value.read(4096) |
|||
if not chunk: |
|||
return checksum.hexdigest() |
|||
checksum.update(chunk) |
|||
|
|||
def _add_to_checklist(self, path): |
|||
print(path) |
|||
pass |
|||
|
|||
def convert_to_column(self, value, record, values=None, validate=True): |
|||
current_path = record.with_context({'path': True})[self.name] |
|||
if current_path: |
|||
self._add_to_checklist(current_path) |
|||
if not value: |
|||
return None |
|||
binary = None |
|||
if isinstance(value, bytes): |
|||
binary = value |
|||
elif isinstance(value, str): |
|||
binary = base64.b64decode(value) |
|||
if binary: |
|||
checksume = self._get_checksum(binary) |
|||
path = self._get_file_path(checksume, record.env.cr.dbname) |
|||
with open(path, 'wb') as file: |
|||
file.write(binary) |
|||
self._add_to_checklist(path) |
|||
else: |
|||
checksume = self._get_checksum(value) |
|||
path = self._get_file_path(checksume, record.env.cr.dbname) |
|||
value.seek(0, 0) |
|||
with open(path, 'wb') as file: |
|||
while True: |
|||
chunk = value.read(4096) |
|||
if not chunk: |
|||
break |
|||
file.write(chunk) |
|||
self._add_to_checklist(path) |
|||
return path |
|||
|
|||
def convert_to_record(self, value, record): |
|||
if value and isinstance(value, str) and os.path.exists(value): |
|||
with open(value, 'rb') as file: |
|||
if record._context.get('human_size'): |
|||
return human_size(file.seek(0, 2)) |
|||
elif record._context.get('bin_size'): |
|||
return file.seek(0, 2) |
|||
elif record._context.get('path'): |
|||
return value |
|||
elif record._context.get('base64'): |
|||
return base64.b64encode(file.read()) |
|||
elif record._context.get('stream'): |
|||
temp = tempfile.TemporaryFile() |
|||
while True: |
|||
chunk = file.read(4096) |
|||
if not chunk: |
|||
temp.seek(0) |
|||
return file |
|||
temp.write(chunk) |
|||
elif record._context.get('checksum'): |
|||
checksum = hashlib.sha1() |
|||
while True: |
|||
chunk = file.read(4096) |
|||
if not chunk: |
|||
return checksum.hexdigest() |
|||
checksum.update(chunk) |
|||
else: |
|||
return file.read() |
|||
return value |
|||
|
|||
def convert_to_export(self, value, record): |
|||
if value: |
|||
with open(value, 'rb') as file: |
|||
if record._context.get('export_raw_data'): |
|||
return file.read() |
|||
return base64.b64encode(file.read()) |
|||
return '' |
Write
Preview
Loading…
Cancel
Save
Reference in new issue