def monsters(request, profile_name): try: summoner = Summoner.objects.select_related('user').get( user__username=profile_name) except Summoner.DoesNotExist: return render(request, 'herders/profile/not_found.html') # Determine if the person logged in is the one requesting the view is_owner = (request.user.is_authenticated and summoner.user == request.user) monster_filter_form = FilterMonsterInstanceForm(auto_id='id_filter_%s') monster_filter_form.helper.form_action = reverse( 'herders:monster_inventory', kwargs={'profile_name': profile_name}) context = { 'profile_name': profile_name, 'summoner': summoner, 'is_owner': is_owner, 'monster_filter_form': monster_filter_form, 'view': 'profile', } if is_owner or summoner.public: return render(request, 'herders/profile/monster_inventory/base.html', context) else: return render(request, 'herders/profile/not_public.html')
def monster_inventory(request, profile_name, view_mode=None, box_grouping=None): # If we passed in view mode or sort method, set the session variable and redirect back to ourself without the view mode or box grouping if view_mode: request.session['profile_view_mode'] = view_mode.lower() if box_grouping: request.session['profile_group_method'] = box_grouping.lower() if request.session.modified: return HttpResponse("Profile view mode cookie set") view_mode = request.session.get('profile_view_mode', DEFAULT_VIEW_MODE).lower() box_grouping = request.session.get('profile_group_method', 'grade').lower() try: summoner = Summoner.objects.select_related('user').get( user__username=profile_name) except Summoner.DoesNotExist: return render(request, 'herders/profile/not_found.html') monster_queryset = MonsterInstance.objects.filter( owner=summoner).select_related('monster', 'monster__awakens_from') total_monsters = monster_queryset.count() is_owner = (request.user.is_authenticated and summoner.user == request.user) if view_mode == 'list': monster_queryset = monster_queryset.select_related( 'monster__leader_skill', 'monster__awakens_to').prefetch_related('monster__skills', 'runeinstance_set', 'team_set', 'team_leader', 'tags') form = FilterMonsterInstanceForm(request.POST or None, auto_id='id_filter_%s') if form.is_valid(): monster_filter = MonsterInstanceFilter(form.cleaned_data, queryset=monster_queryset) else: monster_filter = MonsterInstanceFilter(queryset=monster_queryset) filtered_count = monster_filter.qs.count() context = { 'monsters': monster_filter.qs, 'total_count': total_monsters, 'filtered_count': filtered_count, 'profile_name': profile_name, 'is_owner': is_owner, } if is_owner or summoner.public: if view_mode == 'pieces': context['monster_pieces'] = MonsterPiece.objects.filter( owner=summoner).select_related('monster') template = 'herders/profile/monster_inventory/summoning_pieces.html' elif view_mode == 'list': template = 'herders/profile/monster_inventory/list.html' else: # Group up the filtered monsters monster_stable = OrderedDict() if box_grouping == 'grade' or box_grouping == 'stars': for x in reversed(range(6)): monster_stable[f'{x+1}*'] = monster_filter.qs.filter( stars=x + 1).order_by('-level', 'monster__element', 'monster__name') elif box_grouping == 'natural_stars': for x in reversed(range(5)): monster_stable[ f'Natural {x+1}*'] = monster_filter.qs.filter( monster__natural_stars=x + 1).order_by( '-stars', '-level', 'monster__name') elif box_grouping == 'level': monster_stable['40'] = monster_filter.qs.filter( level=40).order_by('-level', '-stars', 'monster__element', 'monster__name') monster_stable['39-31'] = monster_filter.qs.filter( level__gt=30).filter(level__lt=40).order_by( '-level', '-stars', 'monster__element', 'monster__name') monster_stable['30-21'] = monster_filter.qs.filter( level__gt=20).filter(level__lte=30).order_by( '-level', '-stars', 'monster__element', 'monster__name') monster_stable['20-11'] = monster_filter.qs.filter( level__gt=10).filter(level__lte=20).order_by( '-level', '-stars', 'monster__element', 'monster__name') monster_stable['10-1'] = monster_filter.qs.filter( level__lte=10).order_by('-level', '-stars', 'monster__element', 'monster__name') elif box_grouping == 'element' or box_grouping == 'attribute': monster_stable['water'] = monster_filter.qs.filter( monster__element=Monster.ELEMENT_WATER).order_by( '-stars', '-level', 'monster__name') monster_stable['fire'] = monster_filter.qs.filter( monster__element=Monster.ELEMENT_FIRE).order_by( '-stars', '-level', 'monster__name') monster_stable['wind'] = monster_filter.qs.filter( monster__element=Monster.ELEMENT_WIND).order_by( '-stars', '-level', 'monster__name') monster_stable['light'] = monster_filter.qs.filter( monster__element=Monster.ELEMENT_LIGHT).order_by( '-stars', '-level', 'monster__name') monster_stable['dark'] = monster_filter.qs.filter( monster__element=Monster.ELEMENT_DARK).order_by( '-stars', '-level', 'monster__name') elif box_grouping == 'archetype': monster_stable['attack'] = monster_filter.qs.filter( monster__archetype=Monster.TYPE_ATTACK).order_by( '-stars', '-level', 'monster__name') monster_stable['hp'] = monster_filter.qs.filter( monster__archetype=Monster.TYPE_HP).order_by( '-stars', '-level', 'monster__name') monster_stable['support'] = monster_filter.qs.filter( monster__archetype=Monster.TYPE_SUPPORT).order_by( '-stars', '-level', 'monster__name') monster_stable['defense'] = monster_filter.qs.filter( monster__archetype=Monster.TYPE_DEFENSE).order_by( '-stars', '-level', 'monster__name') monster_stable['material'] = monster_filter.qs.filter( monster__archetype=Monster.TYPE_MATERIAL).order_by( '-stars', '-level', 'monster__name') monster_stable['other'] = monster_filter.qs.filter( monster__archetype=Monster.TYPE_NONE).order_by( '-stars', '-level', 'monster__name') elif box_grouping == 'priority': monster_stable['High'] = monster_filter.qs.select_related( 'monster').filter( owner=summoner, priority=MonsterInstance.PRIORITY_HIGH).order_by( '-level', 'monster__element', 'monster__name') monster_stable['Medium'] = monster_filter.qs.select_related( 'monster').filter( owner=summoner, priority=MonsterInstance.PRIORITY_MED).order_by( '-level', 'monster__element', 'monster__name') monster_stable['Low'] = monster_filter.qs.select_related( 'monster').filter( owner=summoner, priority=MonsterInstance.PRIORITY_LOW).order_by( '-level', 'monster__element', 'monster__name') monster_stable['None'] = monster_filter.qs.select_related( 'monster').filter(owner=summoner).filter( Q(priority=None) | Q(priority=0)).order_by( '-level', 'monster__element', 'monster__name') elif box_grouping == 'family': for mon in monster_filter.qs: family_name = mon.monster.base_monster.name if family_name not in monster_stable: monster_stable[family_name] = [] monster_stable[family_name].append(mon) # Sort ordered dict alphabetically by family name monster_stable = OrderedDict( sorted(monster_stable.items(), key=lambda family: family[0])) else: return HttpResponseBadRequest('Invalid sort method') context['monster_stable'] = monster_stable context['box_grouping'] = box_grouping.replace('_', ' ') template = 'herders/profile/monster_inventory/box.html' return render(request, template, context) else: return render(request, 'herders/profile/not_public.html', context)