def get_chart_and_text(event):
cache = event.get_cache()
cache_key = get_cache_key(event)
chart_data = cache.get(cache_key)
if chart_data:
return chart_data
result = {}
include_pending = event.settings.stretchgoals_include_pending or False
avg_chart = event.settings.stretchgoals_chart_averages or False
total_chart = event.settings.stretchgoals_chart_totals or False
event.settings._h.add_type(
QuerySet,
lambda queryset: ','.join([str(element.pk) for element in queryset]),
lambda pk_list: [Item.objects.get(pk=element) for element in pk_list.split(',') if element]
)
items = event.settings.get('stretchgoals_items', as_type=QuerySet) or []
start_date = get_start_date(event, items, include_pending)
end_date = get_end_date(event, items, include_pending)
goals = get_goals(event)
data = {
'avg_data': {
'data': [{
'date': date.strftime('%Y-%m-%d'),
'price': get_average_price(event, start_date, date, items, include_pending) or 0,
} for date in get_date_range(start_date, end_date)] if avg_chart else None,
'target': [goal.get('avg', 0) for goal in goals],
'label': 'avg',
},
'total_data': {
'data': [{
'date': date.strftime('%Y-%m-%d'),
'price': get_total_price(event, start_date, date, items, include_pending) or 0,
} for date in get_date_range(start_date, end_date)] if total_chart else None,
'target': [goal['total'] for goal in goals],
'label': 'total',
},
}
result['data'] = {key: json.dumps(value, cls=ChartJSONEncoder) for key, value in data.items()}
try:
result['avg_now'] = data['avg_data']['data'][-1]['price']
result['total_now'] = data['total_data']['data'][-1]['price']
except (TypeError, IndexError): # no data, data[-1] does not exist
result['avg_now'] = 0
result['total_now'] = 0
for goal in goals:
goal['avg_required'] = get_required_average_price(event, items, include_pending, goal['total'], goal['amount'], result['total_now'])
goal['total_left'] = goal['total'] - result['total_now']
result['goals'] = goals
result['significant'] = (
not event.settings.stretchgoals_min_orders
or get_base_queryset(event, items, include_pending).count() >= event.settings.get('stretchgoals_min_orders', as_type=int)
)
result['public_text'] = get_public_text(event, items, include_pending, data=result)
cache.set(cache_key, result, timeout=3600)
return result
评论列表
文章目录