Example #1
0
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')
Example #2
0
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)