Compare commits

..

12 commits

Author SHA1 Message Date
Frederik Jaeckel
40bde467fe Version 6.0.3 2023-02-14 10:53:34 +01:00
Frederik Jaeckel
875946c793 setup 2nd 2023-02-14 10:51:48 +01:00
Frederik Jaeckel
7aef8e2fad setup.py 2023-01-23 13:18:48 +01:00
Frederik Jaeckel
411d7e52ae Etikett ver 6.0.2 zum Änderungssatz af0201b6924a hinzugefügt 2023-01-23 13:13:36 +01:00
Frederik Jaeckel
9d0001f262 Version 6.0.2 2023-01-23 13:13:29 +01:00
Frederik Jaeckel
a149f46dbb line: show image in tab 'image/pdf' 2023-01-23 13:11:54 +01:00
Frederik Jaeckel
3750a4b0f6 depends korrigiert 2022-12-30 23:02:04 +01:00
Frederik Jaeckel
89ad435e72 Etikett ver 6.0.1 zum Änderungssatz d6834c950d17 hinzugefügt 2022-11-29 10:37:14 +01:00
Frederik Jaeckel
51934f46bc Version 6.0.1 2022-11-29 10:37:05 +01:00
Frederik Jaeckel
fa526fa69e fix: exception beim hochladen eines unbekannten bildtypes 2022-11-29 10:30:39 +01:00
Frederik Jaeckel
6aa9bb5325 Etikett ver 6.0.0 zum Änderungssatz 0e8cb36121b5 hinzugefügt 2022-10-14 15:30:18 +02:00
Frederik Jaeckel
1286fa6f2f Version 6.0.0 2022-10-14 15:30:08 +02:00
8 changed files with 104 additions and 88 deletions

View file

@ -9,11 +9,24 @@ pip install mds-cashbook-media
Requires
========
- Tryton 7.0
- Tryton 6.0
Changes
=======
*7.0.0 - 01.12.2023*
*6.0.3 - 14.02.2023*
- updt: setup.py
*6.0.2 - 23.01.2023*
- add: show image in tab 'image/pdf'
*6.0.1 - 29.11.2022*
- fix: exception when image type unknown
*6.0.0 - 14.10.2022*
- init
- ported to Tryton 7.0

View file

@ -6,7 +6,6 @@
from trytond.pool import Pool
from .line import Line
def register():
Pool.register(
Line,

53
line.py
View file

@ -3,13 +3,13 @@
# The COPYRIGHT file at the top level of this repository contains the
# full copyright notices and license terms.
import mimetypes
import magic
import mimetypes, magic
from io import BytesIO
from PIL import Image, UnidentifiedImageError
from trytond.model import fields
from trytond.pool import PoolMeta
from trytond.pool import Pool, PoolMeta
from trytond.config import config
from trytond.transaction import Transaction
from trytond.exceptions import UserError
from trytond.i18n import gettext
from trytond.pyson import Eval, Bool
@ -18,13 +18,13 @@ from trytond.modules.cashbook.line import STATES, DEPENDS
store_prefix = config.get('cashbook', 'store_prefix', default='cashbook')
image_limit = config.get('cashbook', 'image_max_pixel', default='2000')
try:
try :
image_limit = int(image_limit)
if image_limit < 100:
image_limit = 100
if image_limit > 10000:
image_limit = 10000
except Exception:
except :
image_limit = 2000
@ -37,11 +37,10 @@ DEPENDS2.extend(DEPENDS)
class Line(metaclass=PoolMeta):
__name__ = 'cashbook.line'
media = fields.Binary(
string='Image of PDF', filename='media_name', file_id='media_id',
store_prefix=store_prefix, states=STATES2, depends=DEPENDS2)
media_name = fields.Char(
string='File name',
media = fields.Binary(string='Image of PDF', filename='media_name',
file_id='media_id', store_prefix=store_prefix,
states=STATES2, depends=DEPENDS2)
media_name = fields.Char(string='File name',
states={
'required': Bool(Eval('media')),
'readonly': STATES2['readonly'],
@ -49,12 +48,11 @@ class Line(metaclass=PoolMeta):
media_id = fields.Char(string='File ID', readonly=True)
media_mime = fields.Char(string='MIME', readonly=True)
media_size = fields.Integer(string='File size', readonly=True)
media_image = fields.Function(fields.Binary(
string='Image', readonly=True,
media_image = fields.Function(fields.Binary(string='Image', readonly=True,
states={
'invisible': ~Eval('media_mime', '').in_([
'image/png', 'image/jpg', 'image/jpeg']),
}, depends=['media_mime']), 'on_change_with_media_image')
'invisible': ~Eval('media_mime', '').in_(['image/png', 'image/jpg', 'image/jpeg']),
}, depends=['media_mime']),
'on_change_with_media_image')
@fields.depends('media', 'media_mime')
def on_change_with_media_image(self, name=True):
@ -85,7 +83,7 @@ class Line(metaclass=PoolMeta):
"""
image_data2 = None
with BytesIO(image_data) as fhdl:
try:
try :
image = Image.open(fhdl, 'r')
except UnidentifiedImageError:
raise UserError(gettext('cashbook_media.msg_file_unknown_type'))
@ -95,7 +93,7 @@ class Line(metaclass=PoolMeta):
if width > height:
new_size = (image_limit, int(height * image_limit / width))
else:
else :
new_size = (int(width * image_limit / height), image_limit)
# resize - fit in (image_limit x image_limit)
@ -118,17 +116,15 @@ class Line(metaclass=PoolMeta):
values['media_mime'] = None
values['media_size'] = None
values['media_name'] = None
else:
else :
values['media_mime'] = cls._identify_file(values['media'][:1024])
# if its a image, resize it to fit
# in (image_limit x image_limit) pixel
# if its a image, resize it to fit in (image_limit x image_limit) pixel
if values['media_mime'].startswith('image'):
new_image = cls.resize_image_file(values['media'])
if new_image is not None:
values['media'] = new_image
values['media_mime'] = cls._identify_file(
values['media'][:1024])
values['media_mime'] = cls._identify_file(values['media'][:1024])
values['media_size'] = len(values['media'])
file_ext = mimetypes.guess_extension(values['media_mime'])
@ -151,14 +147,15 @@ class Line(metaclass=PoolMeta):
if line.media_size > 1024*1024*5:
raise UserError(gettext(
'cashbook_media.msg_file_too_big',
recname=line.rec_name))
if line.media_mime not in [
'application/pdf',
'image/png', 'image/jpg', 'image/jpeg']:
recname = line.rec_name,
))
if not line.media_mime in ['application/pdf',
'image/png', 'image/jpg', 'image/jpeg']:
raise UserError(gettext(
'cashbook_media.msg_file_invalid_mime',
recname=line.rec_name,
fmime=line.media_mime))
recname = line.rec_name,
fmime = line.media_mime,
))
@classmethod
def create(cls, vlist):

View file

@ -2,7 +2,7 @@
"""
# Always prefer setuptools over distutils
from setuptools import setup
from setuptools import setup, find_packages
# To use a consistent encoding
from codecs import open
from os import path
@ -36,10 +36,10 @@ with open(path.join(here, 'versiondep.txt'), encoding='utf-8') as f:
l2 = i.strip().split(';')
if len(l2) < 4:
continue
modversion[l2[0]] = {'min': l2[1], 'max': l2[2], 'prefix': l2[3]}
modversion[l2[0]] = {'min':l2[1], 'max':l2[2], 'prefix':l2[3]}
# tryton-version
major_version = 7
major_version = 6
minor_version = 0
requires = ['python-magic>=0.4.24', 'Pillow']
@ -51,26 +51,19 @@ for dep in info.get('depends', []):
prefix = modversion[dep]['prefix']
if len(modversion[dep]['max']) > 0:
requires.append(
'%s_%s >= %s, <= %s' %
(prefix, dep,
modversion[dep]['min'],
modversion[dep]['max']))
else:
requires.append(
'%s_%s >= %s' %
requires.append('%s_%s >= %s, <= %s' %
(prefix, dep, modversion[dep]['min'], modversion[dep]['max']))
else :
requires.append('%s_%s >= %s' %
(prefix, dep, modversion[dep]['min']))
else:
requires.append(
'%s_%s >= %s.%s, < %s.%s' % (
'trytond', dep, major_version, minor_version,
major_version, minor_version + 1))
requires.append(
'trytond >= %s.%s, < %s.%s' % (
major_version, minor_version, major_version, minor_version + 1))
else :
requires.append('%s_%s >= %s.%s, < %s.%s' %
('trytond', dep, major_version, minor_version,
major_version, minor_version + 1))
requires.append('trytond >= %s.%s, < %s.%s' %
(major_version, minor_version, major_version, minor_version + 1))
setup(
name='%s_%s' % (PREFIX, MODULE),
setup(name='%s_%s' % (PREFIX, MODULE),
version=info.get('version', '0.0.1'),
description='Tryton module to add a file-field to cashbook.',
long_description=long_description,
@ -81,22 +74,21 @@ setup(
author_email='service@m-ds.de',
license='GPL-3',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
'Framework :: Tryton',
'Intended Audience :: Developers',
'Intended Audience :: Customer Service',
'Intended Audience :: Information Technology',
'Intended Audience :: Financial and Insurance Industry',
'Topic :: Office/Business',
'Topic :: Office/Business :: Financial :: Accounting',
'Natural Language :: German',
'Natural Language :: English',
'Operating System :: OS Independent',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
'Framework :: Tryton',
'Intended Audience :: Developers',
'Intended Audience :: Customer Service',
'Intended Audience :: Information Technology',
'Intended Audience :: Financial and Insurance Industry',
'Topic :: Office/Business',
'Topic :: Office/Business :: Financial :: Accounting',
'Natural Language :: German',
'Natural Language :: English',
'Operating System :: OS Independent',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
],
keywords='tryton cashbook pdf png image file',
@ -105,8 +97,7 @@ setup(
'trytond.modules.%s' % MODULE,
],
package_data={
'trytond.modules.%s' % MODULE: (
info.get('xml', [])
'trytond.modules.%s' % MODULE: (info.get('xml', [])
+ ['tryton.cfg', 'locale/*.po', 'tests/*.py',
'view/*.xml', 'versiondep.txt', 'README.rst']),
},

View file

@ -1,2 +1,24 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import trytond.tests.test_tryton
import unittest
from trytond.modules.cashbook_media.tests.test_line import LineTestCase
__all__ = ['suite']
class CashbookTestCase(\
LineTestCase,
):
'Test cashbook module'
module = 'cashbook_media'
# end CashbookTestCase
def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CashbookTestCase))
return suite

View file

@ -5,10 +5,11 @@
from io import BytesIO
from PIL import Image
from trytond.tests.test_tryton import with_transaction
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.exceptions import UserError
from trytond.modules.cashbook.tests.test_module import CashbookTestCase
from trytond.modules.cashbook.tests import CashbookTestCase
from datetime import date
from decimal import Decimal
from .img_data import img_data_png, dok_data_pdf, text_data
@ -125,11 +126,8 @@ class LineTestCase(CashbookTestCase):
self.assertEqual(book.state, 'open')
# add invalid file
self.assertRaisesRegex(
UserError,
"The file type 'text/plain' of the record " +
"'05/02/2022|Rev|1.00 usd|Text 2 [Cat1]' is not allowed. " +
"(allowed: PNG, JPG, PDF)",
self.assertRaisesRegex(UserError,
"The file type 'text/plain' of the record '05/02/2022|Rev|1.00 usd|Text 2 [Cat1]' is not allowed. (allowed: PNG, JPG, PDF)",
Book.write,
*[
[book],
@ -148,11 +146,8 @@ class LineTestCase(CashbookTestCase):
])
# replace image at line-1 by invalid file
self.assertRaisesRegex(
UserError,
"The file type 'text/plain' of the record " +
"'05/02/2022|Rev|1.00 usd|Text 2 [Cat1]' is not allowed. " +
"(allowed: PNG, JPG, PDF)",
self.assertRaisesRegex(UserError,
"The file type 'text/plain' of the record '05/02/2022|Rev|1.00 usd|Text 2 [Cat1]' is not allowed. (allowed: PNG, JPG, PDF)",
Lines.write,
*[
[book.lines[0]],
@ -168,6 +163,7 @@ class LineTestCase(CashbookTestCase):
"""
pool = Pool()
Book = pool.get('cashbook.book')
Lines = pool.get('cashbook.line')
types = self.prep_type()
category = self.prep_category(cattype='in')
@ -230,6 +226,3 @@ class LineTestCase(CashbookTestCase):
self.assertEqual(img2.size, (2000, 837))
# end LineTestCase
del CashbookTestCase

View file

@ -1,7 +1,8 @@
[tryton]
version=7.0.0
version=6.0.3
depends:
cashbook
xml:
message.xml
line.xml

View file

@ -1 +1 @@
cashbook;7.0.31;7.0.999;mds
cashbook;6.0.25;6.0.999;mds