def test_resize_iamge_too_heigh(self): too_heigh = MagicMock() too_heigh.width = 800 too_heigh.height = 1600 DataUriImageEncodeService.resize(too_heigh, 800) too_heigh.resize.assert_called_with(size=(400, 800), resample=Image.LANCZOS)
def test_resize_image_too_wide(self): too_wide = MagicMock() too_wide.width = 1600 too_wide.height = 800 DataUriImageEncodeService.resize(too_wide, 800) too_wide.resize.assert_called_with(size=(800, 400), resample=Image.LANCZOS)
def _render_html(signal: Signal): """Render given `Signal` with HTML template used for PDF generation. :param signal: Signal object :returns: HTML str """ rd_coordinates = signal.location.get_rd_coordinates() bbox = '{},{},{},{}'.format( rd_coordinates.x - 340.00, rd_coordinates.y - 125.00, rd_coordinates.x + 340.00, rd_coordinates.y + 125.00, ) # HOTFIX for SIG-1473 jpg_data_uris = DataUriImageEncodeService.get_context_data_images( signal, 800) context = { 'signal': signal, 'now': timezone.datetime.now(), 'bbox': bbox, 'user': None, 'jpg_data_uris': jpg_data_uris, } return render_to_string('api/pdf/print_signal.html', context=context)
def _get_context_data(signal, user, include_contact_details): """ Context data for the PDF HTML template. """ logo_src = _get_data_uri(settings.API_PDF_LOGO_STATIC_FILE) bbox, img_data_uri = PDFSummaryService._get_map_data(signal) jpg_data_uris, att_filenames, user_emails, att_created_ats = \ DataUriImageEncodeService.get_context_data_images(signal, PDFSummaryService.max_size) reporter_email, reporter_phone = PDFSummaryService._get_contact_details( signal, user, include_contact_details) return { 'signal': signal, 'bbox': bbox, 'img_data_uri': img_data_uri, 'attachment_images': zip(jpg_data_uris, att_filenames, user_emails, att_created_ats), 'user': user if user else AnonymousUser(), 'logo_src': logo_src, 'now': timezone.now(), 'reporter_email': reporter_email, 'reporter_phone': reporter_phone, }
def test_get_context_data_invalid_images(self): AttachmentFactory.create(_signal=self.signal, file__filename='blah.jpg', file__data=b'blah', is_image=True) jpg_data_uris, att_filenames, user_emails, att_created_ats = \ DataUriImageEncodeService.get_context_data_images(self.signal, 800) self.assertEqual(len(jpg_data_uris), 0) self.assertEqual(len(att_filenames), 0) self.assertEqual(len(user_emails), 0) self.assertEqual(len(att_created_ats), 0)
def test_get_context_data_no_images(self): AttachmentFactory(_signal=self.signal, file__filename='blah.txt', file__data=b'blah', is_image=False) jpg_data_uris = DataUriImageEncodeService.get_context_data_images( self.signal, 800) self.assertEqual(len(jpg_data_uris), 0)
def test_get_context_data_valid_image(self): image = Image.new("RGB", (100, 100), (0, 0, 0)) buffer = BytesIO() image.save(buffer, format='JPEG') AttachmentFactory.create(_signal=self.signal, file__filename='blah.jpg', file__data=buffer.getvalue()) jpg_data_uris = DataUriImageEncodeService.get_context_data_images( self.signal, 80) self.assertEqual(len(jpg_data_uris), 1) self.assertEqual(jpg_data_uris[0][:22], 'data:image/jpg;base64,') self.assertGreater(len(jpg_data_uris[0]), 22)
def test_get_context_data_images_for_rgba(self): # Reproduce problem reported in SIG-3972, RGBA PNG image attachment causes a failure to create PDFs image = Image.new("RGBA", (100, 100), (0, 0, 0, 0)) buffer = BytesIO() image.save(buffer, format='PNG') AttachmentFactory.create(_signal=self.signal, file__filename='blah.png', file__data=buffer.getvalue()) jpg_data_uris, att_filenames, user_emails, att_created_ats = \ DataUriImageEncodeService.get_context_data_images(self.signal, 800) self.assertEqual(len(jpg_data_uris), 1) self.assertEqual(len(att_filenames), 1) self.assertEqual(len(user_emails), 1) self.assertEqual(len(att_created_ats), 1) self.assertEqual(jpg_data_uris[0][:22], 'data:image/jpg;base64,') self.assertGreater(len(jpg_data_uris[0]), 22)
def get_context_data(self, **kwargs): self.object = self.get_object() logo_src = _get_data_uri(settings.API_PDF_LOGO_STATIC_FILE) img_data_uri = None bbox = None if settings.DEFAULT_MAP_TILE_SERVER: map_img = self.map_generator.make_map( url_template=settings.DEFAULT_MAP_TILE_SERVER, lat=self.object.location.geometrie.coords[1], lon=self.object.location.geometrie.coords[0], zoom=17, img_size=[680, 250]) # transform image to png -> bytes -> data uri png_array = io.BytesIO() map_img.save(png_array, format='png') encoded = base64.b64encode(png_array.getvalue()).decode() img_data_uri = 'data:image/png;base64,{}'.format(encoded) else: rd_coordinates = self.object.location.get_rd_coordinates() bbox = '{},{},{},{}'.format( rd_coordinates.x - 340.00, rd_coordinates.y - 125.00, rd_coordinates.x + 340.00, rd_coordinates.y + 125.00, ) jpg_data_uris = DataUriImageEncodeService.get_context_data_images( self.object, self.max_size) return super().get_context_data( bbox=bbox, img_data_uri=img_data_uri, jpg_data_uris=jpg_data_uris, user=self.request.user, logo_src=logo_src, )