def get_context_data(self, **kwargs): all_drops = get_drop_querysets(self.get_queryset()) recent_drops = { 'items': all_drops['items'].values( 'item', name=F('item__name'), icon=F('item__icon'), ).annotate( count=Sum('quantity') ).order_by('-count') if 'items' in all_drops else [], 'monsters': replace_value_with_choice( list(all_drops['monsters'].values( name=F('monster__name'), icon=F('monster__image_filename'), element=F('monster__element'), stars=F('grade'), is_awakened=F('monster__is_awakened'), can_awaken=F('monster__can_awaken'), ).annotate( count=Count('pk') ).order_by('-count')), {'element': Monster.ELEMENT_CHOICES}) if 'monsters' in all_drops else [], 'runes': replace_value_with_choice( list(all_drops['runes'].values( 'type', 'quality', 'stars', ).annotate( count=Count('pk') ).order_by('-count') if 'runes' in all_drops else []), { 'type': RuneInstance.TYPE_CHOICES, 'quality': RuneInstance.QUALITY_CHOICES, } ), } if self.get_log_count(): bin_width = 50000 damage_stats = self.get_queryset().aggregate(min=Min('damage'), max=Max('damage')) bin_start = floor_to_nearest(damage_stats['min'], bin_width) bin_end = ceil_to_nearest(damage_stats['max'], bin_width) damage_histogram = { 'type': 'histogram', 'width': bin_width, 'data': histogram(self.get_queryset(), 'damage', range(bin_start, bin_end, bin_width)), } else: damage_histogram = None context = { 'dashboard': { 'recent_drops': recent_drops, }, 'report': drop_report(self.get_queryset(), min_count=0), 'damage_histogram': damage_histogram } context.update(kwargs) return super().get_context_data(**context)
def get_context_data(self, **kwargs): all_drops = get_drop_querysets(self.get_queryset()) recent_drops = { 'items': all_drops['items'].values( 'item', name=F('item__name'), icon=F('item__icon'), ).annotate(count=Sum('quantity')).order_by('-count') if 'items' in all_drops else [], 'monsters': replace_value_with_choice( list(all_drops['monsters'].values( name=F('monster__name'), icon=F('monster__image_filename'), element=F('monster__element'), stars=F('grade'), is_awakened=F('monster__is_awakened'), can_awaken=F('monster__can_awaken'), ).annotate(count=Count('pk')).order_by('-count')), {'element': Monster.ELEMENT_CHOICES}) if 'monsters' in all_drops else [], 'runes': replace_value_with_choice( list(all_drops['runes'].values( 'type', 'quality', 'stars', ).annotate(count=Count('pk')).order_by('-count') if 'runes' in all_drops else []), { 'type': RuneInstance.TYPE_CHOICES, 'quality': RuneInstance.QUALITY_CHOICES, }), } dashboard_data = { 'energy_spent': { 'type': 'occurrences', 'total': self.get_log_count(), 'data': transform_to_dict( list(self.get_queryset( ).values('level__dungeon__name').annotate( count=Sum('level__energy_cost'), ).order_by('-count')), name_key='level__dungeon__name', ), }, 'recent_drops': recent_drops, } level_list = Level.objects.filter( pk__in=set(self.get_queryset().values_list('level', flat=True))) kwargs['dashboard'] = dashboard_data kwargs['level_list'] = level_list return super().get_context_data(**kwargs)
def get_context_data(self, **kwargs): all_drops = get_drop_querysets(self.get_queryset()) recent_drops = { 'items': all_drops['items'].values( 'item', name=F('item__name'), icon=F('item__icon'), ).annotate( count=Sum('quantity') ).order_by('-count') if 'items' in all_drops else [], 'monsters': replace_value_with_choice( list(all_drops['monsters'].values( name=F('monster__name'), icon=F('monster__image_filename'), element=F('monster__element'), stars=F('grade'), is_awakened=F('monster__is_awakened'), can_awaken=F('monster__can_awaken'), ).annotate( count=Count('pk') ).order_by('-count')), {'element': Monster.ELEMENT_CHOICES} ) if 'monsters' in all_drops else [], 'rune_crafts': replace_value_with_choice( list(all_drops['rune_crafts'].values( 'type', 'quality', 'rune', ).annotate( count=Count('pk') ).order_by('-count') if 'rune_crafts' in all_drops else []), { 'type': RuneCraft.CRAFT_CHOICES, 'quality': RuneCraft.QUALITY_CHOICES, 'rune': RuneCraft.TYPE_CHOICES, } ) } level_list = Level.objects.filter( pk__in=set(self.get_queryset().values_list('level', flat=True)) ).order_by('-floor').prefetch_related('dungeon') kwargs['dashboard'] = { 'recent_drops': recent_drops, } kwargs['level_list'] = level_list return super().get_context_data(**kwargs)
def get_context_data(self, **kwargs): all_drops = get_drop_querysets(self.get_queryset()) recent_drops = { 'items': all_drops['items'].values( 'item', name=F('item__name'), icon=F('item__icon'), ).annotate( count=Sum('quantity') ).order_by('-count') if 'items' in all_drops else [], 'monsters': replace_value_with_choice( list(all_drops['monsters'].values( name=F('monster__name'), icon=F('monster__image_filename'), element=F('monster__element'), stars=F('grade'), is_awakened=F('monster__is_awakened'), can_awaken=F('monster__can_awaken'), ).annotate( count=Count('pk') ).order_by('-count')), {'element': Monster.ELEMENT_CHOICES}) if 'monsters' in all_drops else [], # 'monster_pieces': 'insert_data_here' if 'monster_pieces' in all_drops else [], 'runes': replace_value_with_choice( list(all_drops['runes'].values( 'type', 'quality', 'stars', ).annotate( count=Count('pk') ).order_by('-count') if 'runes' in all_drops else []), { 'type': RuneInstance.TYPE_CHOICES, 'quality': RuneInstance.QUALITY_CHOICES, } ), # 'secret_dungeons': 'insert_data_here' if 'runes' in all_drops else [], } dashboard_data = { 'energy_spent': { 'type': 'occurrences', 'total': self.get_log_count(), 'data': transform_to_dict( list( self.get_queryset().values( 'level' ).annotate( dungeon_name=Concat( F('level__dungeon__name'), Value(' B'), F('level__floor'), output_field=CharField() ), count=Sum('level__energy_cost'), ).order_by('-count') ), name_key='dungeon_name', ), }, 'recent_drops': recent_drops, } level_order = self.get_queryset().values('level').annotate( energy_spent=Sum('level__energy_cost') ).order_by('-energy_spent').values_list('level', flat=True) preserved_order = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(level_order)]) level_list = Level.objects.filter( pk__in=set(self.get_queryset().values_list('level', flat=True)) ).order_by(preserved_order).prefetch_related('dungeon')[:20] kwargs['dashboard'] = dashboard_data kwargs['level_list'] = level_list return super().get_context_data(**kwargs)