def test_generate_pdf(self): with self.app.app_context(): report = generate_report(options, mimetype=MIME_TYPES.PDF, base64=False, width='1200') # Report is a buffer of bytes with size > 0 self.assertTrue(type(report) == bytes) self.assertTrue(len(report) > 0) # PDF header/footer signature self.assertTrue(report.startswith(b'%PDF-')) self.assertTrue(report.endswith(b'%%EOF\n'))
def test_generate_svg(self): with self.app.app_context(): report = generate_report(options, mimetype=MIME_TYPES.SVG, base64=False) # Report is a buffer of bytes with size > 0 self.assertTrue(type(report) == bytes) self.assertTrue(len(report) > 0) # The bytes buffer represents an xml/svg file self.assertTrue(report.startswith(b'<?xml')) self.assertTrue(report.find(b'<svg') > -1) # The title and categories are found in the svg data self.assertTrue(report.find(b'Steep Chart') > -1) self.assertTrue(report.find(b'Jan') > -1) self.assertTrue(report.find(b'Feb') > -1) self.assertTrue(report.find(b'Mar') > -1)
def test_generate_jpg(self): with self.app.app_context(): report = generate_report(options, mimetype=MIME_TYPES.JPEG, base64=False, width='1200') # Report is a buffer of bytes with size > 0 self.assertTrue(type(report) == bytes) self.assertTrue(len(report) > 0) image = Image.open(BytesIO(report)) # Valid image file try: image.verify() except Exception as e: self.failureException('Exception raised: {}'.format(e)) # Image is JPEG with a width of 1200 self.assertEqual(image.format, 'JPEG') self.assertEqual(image.width, 1200)
def _gen_attachments(report): report_service = get_report_service(report.get('type')) if report_service is None: raise SuperdeskApiError.badRequestError( 'Unknown report type "{}"'.format(report.get('type'))) if report.get('mimetype') in [ MIME_TYPES.PNG, MIME_TYPES.JPEG, MIME_TYPES.GIF, MIME_TYPES.PDF, MIME_TYPES.SVG ]: # This mimetype is handled by highcharts, so generate the highcharts config return_type = 'highcharts_config' elif report.get('mimetype') == MIME_TYPES.CSV: return_type = MIME_TYPES.CSV else: return_type = 'aggregations' generated_report = list( report_service.get(req=None, params=report.get('params') or {}, translations=report.get('translations') or {}, return_type=return_type))[0] if return_type == 'highcharts_config': options = generated_report.get('highcharts') elif return_type == MIME_TYPES.CSV: options = [generated_report.get('csv')] else: options = [] attachments = [] i = 1 for option in options: mime_type = report.get('mimetype') report_width = report.get('width') or 800 if isinstance(option, dict) and option.get('type') == 'table': mime_type = MIME_TYPES.HTML try: attachments.append({ 'file': generate_report(option, mimetype=mime_type, base64=True, width=report_width), 'mimetype': mime_type, 'filename': 'chart_{}.{}'.format(i, get_mime_type_extension(mime_type)), 'width': report_width }) i += 1 except Exception as e: logger.error('Failed to generate chart.') logger.exception(e) return attachments