From 804d91f2ad4791d564fca270bdd28d0a5ed8cbea Mon Sep 17 00:00:00 2001 From: rokfordchez Date: Sat, 8 Feb 2020 22:57:45 +0700 Subject: [PATCH] fix valuerror of wrapper in get_save_path --- .../migrations/0005_auto_20160523_2240.py | 6 ++-- .../migrations/0009_auto_20200208_0953.py | 20 ++++++++++++ django_mailbox/models.py | 31 ++++++++++--------- django_mailbox/utils.py | 21 ++++++------- 4 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 django_mailbox/migrations/0009_auto_20200208_0953.py diff --git a/django_mailbox/migrations/0005_auto_20160523_2240.py b/django_mailbox/migrations/0005_auto_20160523_2240.py index 525d2c0..b2a7774 100644 --- a/django_mailbox/migrations/0005_auto_20160523_2240.py +++ b/django_mailbox/migrations/0005_auto_20160523_2240.py @@ -1,9 +1,9 @@ from django.db import migrations, models +from functools import partial import django_mailbox.utils class Migration(migrations.Migration): - dependencies = [ ('django_mailbox', '0004_bytestring_to_unicode'), ] @@ -12,6 +12,8 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='messageattachment', name='document', - field=models.FileField(upload_to=django_mailbox.utils.get_save_path(setting='attachment_upload_to'), verbose_name='Document'), + field=models.FileField( + upload_to=partial(django_mailbox.utils.get_save_path, setting='attachment_upload_to'), + verbose_name='Document'), ), ] diff --git a/django_mailbox/migrations/0009_auto_20200208_0953.py b/django_mailbox/migrations/0009_auto_20200208_0953.py new file mode 100644 index 0000000..ae04b74 --- /dev/null +++ b/django_mailbox/migrations/0009_auto_20200208_0953.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.4 on 2020-02-08 09:53 + +from django.db import migrations, models +import django_mailbox.utils +import functools + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_mailbox', '0008_auto_20190219_1553'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='eml', + field=models.FileField(help_text='Original full content of message', null=True, upload_to=functools.partial(django_mailbox.utils.get_save_path, *(), **{'setting': 'message_upload_to'}), verbose_name='Raw message contents'), + ), + ] diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 379b779..2793336 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -10,6 +10,7 @@ from email.utils import formatdate, parseaddr from urllib.parse import parse_qs, unquote, urlparse from quopri import encode as encode_quopri from io import BytesIO +from functools import partial import base64 import email import logging @@ -254,8 +255,8 @@ class Mailbox(models.Model): self._get_dehydrated_message(part, record) ) elif ( - settings['strip_unallowed_mimetypes'] - and not msg.get_content_type() in settings['allowed_mimetypes'] + settings['strip_unallowed_mimetypes'] + and not msg.get_content_type() in settings['allowed_mimetypes'] ): for header, value in msg.items(): new[header] = value @@ -263,16 +264,16 @@ class Mailbox(models.Model): # payload, it will be expecting a body for this. del new['Content-Transfer-Encoding'] new[settings['altered_message_header']] = ( - 'Stripped; Content type %s not allowed' % ( - msg.get_content_type() - ) + 'Stripped; Content type %s not allowed' % ( + msg.get_content_type() + ) ) new.set_payload('') elif ( - ( - msg.get_content_type() not in settings['text_stored_mimetypes'] - ) or - ('attachment' in msg.get('Content-Disposition', '')) + ( + msg.get_content_type() not in settings['text_stored_mimetypes'] + ) or + ('attachment' in msg.get('Content-Disposition', '')) ): filename = None raw_filename = msg.get_filename() @@ -368,7 +369,7 @@ class Mailbox(models.Model): except KeyError as exc: # email.message.replace_header may raise 'KeyError' if the header # 'content-transfer-encoding' is missing - logger.warning("Failed to parse message: %s", exc,) + logger.warning("Failed to parse message: %s", exc, ) return None msg.set_body(body) if message['in-reply-to']: @@ -512,7 +513,7 @@ class Message(models.Model): eml = models.FileField( _('Raw message contents'), null=True, - upload_to=utils.get_save_path(setting='message_upload_to'), + upload_to=partial(utils.get_save_path, setting='message_upload_to'), help_text=_('Original full content of message') ) objects = models.Manager() @@ -651,9 +652,9 @@ class Message(models.Model): encode_base64(new) except MessageAttachment.DoesNotExist: new[settings['altered_message_header']] = ( - 'Missing; Attachment %s not found' % ( - msg[settings['attachment_interpolation_header']] - ) + 'Missing; Attachment %s not found' % ( + msg[settings['attachment_interpolation_header']] + ) ) new.set_payload('') else: @@ -752,7 +753,7 @@ class MessageAttachment(models.Model): document = models.FileField( _('Document'), - upload_to=utils.get_save_path(setting='attachment_upload_to'), + upload_to=partial(utils.get_save_path, setting='attachment_upload_to'), ) def delete(self, *args, **kwargs): diff --git a/django_mailbox/utils.py b/django_mailbox/utils.py index 51204ed..df1f648 100644 --- a/django_mailbox/utils.py +++ b/django_mailbox/utils.py @@ -3,6 +3,7 @@ import email.header import logging import os +from django.utils.deconstruct import deconstructible from django.conf import settings logger = logging.getLogger(__name__) @@ -143,16 +144,14 @@ def get_body_from_message(message, maintype, subtype): return body -def get_save_path(setting): - def _tmp(instance, filename): - settings = get_settings() +def get_save_path(instance, filename, setting): + settings = get_settings() - path = settings[setting] - if '%' in path: - path = datetime.datetime.utcnow().strftime(path) + path = settings[setting] + if '%' in path: + path = datetime.datetime.utcnow().strftime(path) - return os.path.join( - path, - filename, - ) - return _tmp + return os.path.join( + path, + filename, + )