consider all images to attach as remote (#13450)

This commit is contained in:
Serghei Mihai 2017-03-03 12:23:15 +01:00
parent a501ee7c56
commit b56be82b22
2 changed files with 12 additions and 20 deletions

View File

@ -33,12 +33,7 @@ logger = logging.getLogger(__name__)
def transform_image_src(src, **kwargs):
basename = os.path.basename(src)
if basename == src:
return src
name, ext = os.path.splitext(src)
hash = hashlib.sha256(name)
return '%s_%s%s' % (os.path.basename(name), hash.hexdigest()[:8], ext)
return urlparse.urljoin(settings.SITE_BASE_URL, src)
class Category(models.Model):
@ -184,17 +179,10 @@ class Broadcast(models.Model):
html=template.render(
Context({'content': self.announce.text,
'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER})))
html_tree = etree.HTML(self.announce.text)
storage = DefaultStorage()
for img in html_tree.xpath('//img/@src'):
img_path = img.replace(storage.base_url, '')
message.attach(filename=transform_image_src(img), data=storage.open(img_path))
message.transformer.apply_to_images(func=transform_image_src)
# perform transformations in message html, like inline css parsing
message.transformer.load_and_transform()
# mark all attached images as inline
message.transformer.make_all_images_inline()
message.transformer.apply_to_images(func=transform_image_src)
message.transformer.load_and_transform(images_inline=True)
message.transformer.save()
for s in subscriptions:
if not s.identifier:

View File

@ -11,7 +11,8 @@ from django.utils import timezone
from django.core.files.storage import DefaultStorage
from django.utils.text import slugify
from corbo.models import Category, Announce, Subscription, Broadcast, transform_image_src
from corbo.models import Category, Announce, Subscription, Broadcast
from corbo.models import channel_choices
pytestmark = pytest.mark.django_db
@ -95,14 +96,17 @@ def test_check_inline_images(mocked_get, app, categories, announces, mailoutbox)
Subscription.objects.create(category=announce.category,
identifier='%s@example.net' % uuid, uuid=uuid)
broadcast = Broadcast.objects.get(announce=announce)
mocked_get.return_value = mock.Mock(status_code=200,
headers={'content-type': 'image/png'},
content=storage.open(image_name).read())
broadcast.send()
assert broadcast.result
assert len(mailoutbox) == total_sent + broadcast.result
transformed_image_src = transform_image_src(img_src)
assert transformed_image_src in mailoutbox[i].attachments.keys()
assert 'cid:%s' % transformed_image_src in mailoutbox[i].html_body
assert 'cid:%s' % transformed_image_src in mailoutbox[i].text_body
attachments = [a['filename'] for a in mailoutbox[0].attachments.as_dict()]
assert image_name in attachments
assert 'cid:%s' % image_name in mail.outbox[0].html_body
assert 'cid:%s' % image_name in mail.outbox[0].text_body
total_sent += broadcast.result
storage.delete(image_name)