from decimal import Decimal from importlib import import_module from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.db.models import Sum from django.dispatch import receiver from django.shortcuts import render from django.template.loader import get_template from django.utils import formats from django.utils.formats import date_format from django.utils.translation import ugettext_lazy as _ from pretix.base.models import ( Event, Item, Order, OrderPosition, Voucher, WaitingListEntry, ) from pretix.control.signals import ( event_dashboard_widgets, user_dashboard_widgets, ) from ..logdisplay import OVERVIEW_BLACKLIST SessionStore = import_module(settings.SESSION_ENGINE).SessionStore NUM_WIDGET = '
' @receiver(signal=event_dashboard_widgets) def base_widgets(sender, **kwargs): prodc = Item.objects.filter( event=sender, active=True, ).count() tickc = OrderPosition.objects.filter( order__event=sender, item__admission=True, order__status__in=(Order.STATUS_PAID, Order.STATUS_PENDING) ).count() paidc = OrderPosition.objects.filter( order__event=sender, item__admission=True, order__status=Order.STATUS_PAID, ).count() rev = Order.objects.filter( event=sender, status=Order.STATUS_PAID ).aggregate(sum=Sum('total'))['sum'] or Decimal('0.00') return [ { 'content': NUM_WIDGET.format(num=tickc, text=_('Attendees (ordered)')), 'display_size': 'small', 'priority': 100, 'url': reverse('control:event.orders', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug }) }, { 'content': NUM_WIDGET.format(num=paidc, text=_('Attendees (paid)')), 'display_size': 'small', 'priority': 100, 'url': reverse('control:event.orders.overview', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug }) }, { 'content': NUM_WIDGET.format( num=formats.localize(rev), text=_('Total revenue ({currency})').format(currency=sender.currency)), 'display_size': 'small', 'priority': 100, 'url': reverse('control:event.orders.overview', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug }) }, { 'content': NUM_WIDGET.format(num=prodc, text=_('Active products')), 'display_size': 'small', 'priority': 100, 'url': reverse('control:event.items', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug }) }, ] @receiver(signal=event_dashboard_widgets) def waitinglist_widgets(sender, **kwargs): widgets = [] wles = WaitingListEntry.objects.filter(event=sender) if wles.count(): quota_cache = {} itemvar_cache = {} happy = 0 for wle in wles: if (wle.item, wle.variation) not in itemvar_cache: itemvar_cache[(wle.item, wle.variation)] = ( wle.variation.check_quotas(count_waitinglist=False, _cache=quota_cache) if wle.variation else wle.item.check_quotas(count_waitinglist=False, _cache=quota_cache) ) row = itemvar_cache.get((wle.item, wle.variation)) if row[1] > 0: itemvar_cache[(wle.item, wle.variation)] = (row[0], row[1] - 1) happy += 1 widgets.append({ 'content': NUM_WIDGET.format(num=str(happy), text=_('available to give to people on waiting list')), 'priority': 50, 'url': reverse('control:event.orders.waitinglist', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug, }) }) widgets.append({ 'content': NUM_WIDGET.format(num=str(wles.count()), text=_('total waiting list length')), 'display_size': 'small', 'priority': 50, 'url': reverse('control:event.orders.waitinglist', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug, }) }) return widgets @receiver(signal=event_dashboard_widgets) def quota_widgets(sender, **kwargs): widgets = [] for q in sender.quotas.all(): status, left = q.availability() widgets.append({ 'content': NUM_WIDGET.format(num='{}/{}'.format(left, q.size) if q.size is not None else '\u221e', text=_('{quota} left').format(quota=q.name)), 'display_size': 'small', 'priority': 50, 'url': reverse('control:event.items.quotas.show', kwargs={ 'event': sender.slug, 'organizer': sender.organizer.slug, 'quota': q.id }) }) return widgets @receiver(signal=event_dashboard_widgets) def shop_state_widget(sender, **kwargs): return [{ 'display_size': 'small', 'priority': 1000, 'content': '