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