def generate_highcharts_config(self, docs, args):
        report = self.generate_report(docs, args)

        params = args.get('params') or {}
        chart_params = params.get('chart') or {}
        items = report.get('items') or []

        title = chart_params.get('title') or 'Changes to Featuremedia'
        subtitle = chart_params.get(
            'subtitle') or ChartConfig.gen_subtitle_for_dates(params)

        translations = ChartConfig.get_translations(['task.user', 'operation'])
        user_translations = (translations.get('task_user')
                             or {}).get('names') or {}
        operation_translations = (translations.get('operation')
                                  or {}).get('names') or {}
        rows = []

        def gen_date_str(date):
            return utc_to_local(app.config['DEFAULT_TIMEZONE'],
                                date).strftime('%d/%m/%Y %H:%M')

        for item in items:
            original_image = item.get('original_image') or {}
            updates = []

            for update in item.get('updates') or []:
                updates.append('{} - {} by {}'.format(
                    gen_date_str(parse_date(update.get('operation_created'))),
                    operation_translations.get(update.get('operation'))
                    or update.get('operation'),
                    user_translations.get(update.get('user')) or ''))

            rows.append([
                gen_date_str(item.get('versioncreated')),
                user_translations.get(item.get('original_creator')) or '',
                item.get('slugline') or '',
                original_image.get('headline')
                or original_image.get('alt_text') or '',
                '<ul><li>{}</li></ul>'.format('</li><li>'.join(updates))
            ])

        return {
            'highcharts': [{
                'id':
                'featuremedia_updates',
                'type':
                'table',
                'title':
                title,
                'subtitle':
                subtitle,
                'headers': [
                    'Date', 'Creator', 'Slugline', 'Original Image',
                    'Featuremedia History'
                ],
                'rows':
                rows
            }]
        }
    def generate_highcharts_config(self, docs, args):
        params = args.get('params') or {}
        chart_params = params.get('chart') or {}
        report = self.generate_report(docs, args)

        stats = params.get('stats') or {}
        desk_stats = report.get('desk_stats') or {}
        desk_ids = list(desk_stats.keys())
        stat_types = [
            stat
            for stat in ['sum', 'max', 'avg', 'min']
            if stats.get(stat)
        ]
        sort_order = chart_params.get('sort_order') or 'desc'

        def get_sum_stats(desk_id):
            return sum([
                value
                for stat, value in desk_stats[desk_id].items()
                if stat in stat_types
            ])

        sorted_desk_ids = [
            desk_id
            for desk_id in sorted(
                desk_ids,
                key=lambda kv: get_sum_stats(kv) if sort_order == 'asc'
                else -get_sum_stats(kv)
            )
        ]

        if chart_params.get('subtitle'):
            subtitle = chart_params['subtitle']
        else:
            subtitle = ChartConfig.gen_subtitle_for_dates(params)

        chart = SDChart.Chart(
            'production_time_report',
            chart_type='highcharts',
            title=chart_params.get('title') or 'Production Times',
            subtitle=subtitle,
            default_config=ChartConfig.defaultConfig,
            colour_by_point=False,
            data_labels=True,
            legend_title='Production Time',
            tooltip_header='{series.name}/{point.x}: {point.y}',
            translations=ChartConfig.get_translations(['task.desk'])
        )

        chart.set_translation('production_stats', 'Production Stats', {
            'min': 'Minimum',
            'sum': 'Sum',
            'avg': 'Average',
            'max': 'Maximum'
        })

        axis = chart.add_axis().set_options(
            type='category',
            default_chart_type=chart_params.get('type') or 'column',
            y_title='Seconds spent producing content',
            category_field='task.desk',
            categories=sorted_desk_ids,
            stack_labels=False
        )

        def gen_data_entry(stat):
            return {
                'dataLabels': {
                    'enabled': True,
                    'format': seconds_to_human_readable(stat)
                },
                'y': stat
            }

        for stat_type in stat_types:
            axis.add_series().set_options(
                field='production_stats',
                name=stat_type,
                stack=0,
                stack_type='normal',
                data=[
                    gen_data_entry((desk_stats.get(desk_id) or {}).get(stat_type) or 0)
                    for desk_id in sorted_desk_ids
                ]
            )

        report['highcharts'] = [chart.gen_config()]

        return report