コード例 #1
0
    def setUpTestData(cls):
        super(ViewAddDesafioLadderTestCase, cls).setUpTestData()

        # Configurar jogadores
        criar_jogadores_teste()
        cls.sena = Jogador.objects.get(nick='sena')
        cls.teets = Jogador.objects.get(nick='teets')
        cls.mad = Jogador.objects.get(nick='mad')

        # Jogadores fora da ladder
        cls.new_1 = criar_jogador_teste('new1')
        cls.new_2 = criar_jogador_teste('new2')

        # Stage
        cls.stage = criar_stage_teste()
        # Configurar stage como válida
        StageValidaLadder.objects.create(stage=cls.stage)

        # Personagens
        criar_personagens_teste()
        cls.marth = Personagem.objects.get(nome='Marth')
        cls.fox = Personagem.objects.get(nome='Fox')

        # Criar ladders para verificar que adicionar desafio não as afeta
        criar_ladder_teste()

        # Preparar mês anterior para histórico
        data_atual = timezone.now().date()
        cls.mes, cls.ano = mes_ano_ant(data_atual.month, data_atual.year)

        criar_ladder_historico_teste(cls.ano, cls.mes)
コード例 #2
0
 def setUpTestData(cls):
     super(ViewCancelarDesafioLadderTestCase, cls).setUpTestData()
     
     criar_jogadores_teste()
     
     cls.teets = Jogador.objects.get(nick='teets') # Admin, com desafios
     cls.saraiva = Jogador.objects.get(nick='saraiva') # Admin, sem desafios
     cls.sena = Jogador.objects.get(nick='sena') # Não-admin, com desafios
     cls.mad = Jogador.objects.get(nick='mad') # Não-admin, sem desafios
     
     # Criar ladders para verificar que adicionar desafio não as afeta
     criar_ladder_teste()
     
     # Preparar mês anterior para histórico
     horario_atual = timezone.localtime()
     data_atual = horario_atual.date()
     cls.mes, cls.ano = mes_ano_ant(data_atual.month, data_atual.year)
     
     criar_ladder_historico_teste(cls.ano, cls.mes)
     
     # Criar desafios para ladder
     horario_historico = horario_atual.replace(year=cls.ano, month=cls.mes)
     cls.desafio_ladder = criar_desafio_ladder_simples_teste(cls.sena, cls.teets, 3, 1, 
                                                                       horario_atual.replace(day=10), False, cls.sena)
     cls.desafio_ladder_volta = criar_desafio_ladder_simples_teste(cls.teets, cls.sena, 3, 1, 
                                                                       horario_atual.replace(day=20), False, cls.sena)
     
     cls.desafio_ladder_historico = criar_desafio_ladder_simples_teste(cls.sena, cls.teets, 3, 1, 
                                                                                 horario_historico, False, cls.sena)
コード例 #3
0
ファイル: test_models.py プロジェクト: nizbel/smash-ladder
    def setUpTestData(cls):
        super(JogadorTestCase, cls).setUpTestData()

        criar_jogadores_teste()

        cls.teets = Jogador.objects.get(nick='teets')
        cls.sena = Jogador.objects.get(nick='sena')
        cls.saraiva = Jogador.objects.get(nick='saraiva')
        cls.tiovsky = Jogador.objects.get(nick='tiovsky')

        # Personagens
        criar_personagens_teste()

        # Stage
        cls.stage = criar_stage_teste()

        # Criar ladders para verificar que adicionar desafio não as afeta
        criar_ladder_teste()

        cls.horario_mes = timezone.localtime().replace(day=15)
        cls.horario_atual = cls.horario_mes + datetime.timedelta(minutes=1)
        cls.mes, cls.ano = mes_ano_ant(cls.horario_mes.month,
                                       cls.horario_mes.year)
        cls.horario_historico = cls.horario_mes.replace(year=cls.ano,
                                                        month=cls.mes)

        criar_ladder_historico_teste(cls.ano, cls.mes)

        # Adicionar desafios
        cls.desafio_ladder = criar_desafio_ladder_simples_teste(
            cls.sena, cls.teets, 3, 1, cls.horario_mes, False, cls.teets)
        cls.desafio_ladder_historico = criar_desafio_ladder_simples_teste(
            cls.sena, cls.teets, 1, 3, cls.horario_historico, False, cls.teets)
コード例 #4
0
    def setUpTestData(cls):
        super(ViewValidarDesafioLadderTestCase, cls).setUpTestData()
        
        # Jogadores
        criar_jogadores_teste()
        
        # Personagens e estágios
        criar_personagens_teste()
        criar_stage_teste()
        
        # Buscar jogadores a serem usados nos testes
        cls.sena = Jogador.objects.get(nick='sena')
        cls.teets = Jogador.objects.get(nick='teets')
        cls.mad = Jogador.objects.get(nick='mad')
        cls.saraiva = Jogador.objects.get(nick='saraiva')
        cls.tiovsky = Jogador.objects.get(nick='tiovsky') # Último lugar da ladder
        
        # Criar ladders
        cls.ladder_atual = criar_ladder_teste()
        
        # Preparar mês anterior para histórico
        data_atual = timezone.now().date()
        cls.mes, cls.ano = mes_ano_ant(data_atual.month, data_atual.year)
        
        criar_ladder_historico_teste(cls.ano, cls.mes)
        
        # Criar desafios para ladder
        horario_atual = timezone.now().replace(day=15)
        horario_historico = horario_atual.replace(year=cls.ano, month=cls.mes)
        cls.desafio_ladder_simples = criar_desafio_ladder_simples_teste(cls.sena, cls.teets, 3, 1, 
                                                                          horario_atual.replace(hour=6), False, cls.sena)
        cls.desafio_ladder_simples_validado = criar_desafio_ladder_simples_teste(cls.sena, cls.teets, 3, 1, 
                                                                          horario_atual.replace(hour=7), False, cls.sena)
        
        cls.desafio_ladder_simples_historico = criar_desafio_ladder_simples_teste(cls.sena, cls.teets, 3, 1, 
                                                                                    horario_historico.replace(hour=6), False, cls.sena)
        cls.desafio_ladder_coringa_derrota = criar_desafio_ladder_simples_teste(cls.mad, cls.teets, 2, 3, 
                                                                          horario_atual.replace(hour=10), True, cls.mad)
        cls.desafio_ladder_coringa_vitoria = criar_desafio_ladder_simples_teste(cls.mad, cls.teets, 3, 1, 
                                                                          horario_atual.replace(hour=11), True, cls.mad)

        # Adicionar novo entrante na ladder
        cls.new = criar_jogador_teste('new')
        cls.desafio_ladder_novo_entrante = criar_desafio_ladder_simples_teste(cls.new, cls.tiovsky, 3, 1, 
                                                                          horario_atual.replace(hour=8), False, cls.tiovsky)
        
        # Adicionar segundo novo entrante na ladder
        cls.new_2 = criar_jogador_teste('new2')
        cls.desafio_ladder_novos_entrantes = criar_desafio_ladder_simples_teste(cls.new, cls.new_2, 3, 1, 
                                                                          horario_atual.replace(hour=9), False, cls.new_2)
コード例 #5
0
    def setUpTestData(cls):
        super(ViewRemoverJogadorLadderTestCase, cls).setUpTestData()

        # Jogadores
        criar_jogadores_teste()

        cls.teets = Jogador.objects.get(nick='teets')  # Admin, com desafios
        cls.saraiva = Jogador.objects.get(
            nick='saraiva')  # Admin, sem desafios
        cls.sena = Jogador.objects.get(nick='sena')  # Não-admin, com desafios
        cls.mad = Jogador.objects.get(nick='mad')  # Não-admin, sem desafios
        cls.tiovsky = Jogador.objects.get(
            nick='tiovsky')  # Não-admin, sem desafios

        # Personagens
        criar_personagens_teste()

        cls.fox = Personagem.objects.get(nome='Fox')
        cls.marth = Personagem.objects.get(nome='Marth')

        # Stage
        cls.stage = criar_stage_teste()

        # Criar ladders para verificar que adicionar desafio não as afeta
        criar_ladder_teste()

        # Preparar mês anterior para histórico
        cls.horario_atual = timezone.localtime()
        cls.mes, cls.ano = mes_ano_ant(cls.horario_atual.month,
                                       cls.horario_atual.year)

        criar_ladder_historico_teste(cls.ano, cls.mes)

        # Criar desafios para ladder
        cls.horario_historico = cls.horario_atual.replace(year=cls.ano,
                                                          month=cls.mes)
        cls.desafio_ladder = criar_desafio_ladder_simples_teste(
            cls.sena, cls.teets, 3, 1, cls.horario_atual.replace(day=15),
            False, cls.teets)

        cls.desafio_ladder_historico = criar_desafio_ladder_simples_teste(
            cls.sena, cls.teets, 3, 1, cls.horario_historico.replace(day=15),
            False, cls.sena)
コード例 #6
0
ファイル: test_forms.py プロジェクト: nizbel/smash-ladder
    def setUpTestData(cls):
        super(RemocaoJogadorFormTestCase, cls).setUpTestData()

        # Configurar jogador
        criar_jogadores_teste()

        criar_ladder_teste()

        cls.mad = Jogador.objects.get(user__username='******')  # 4 na ladder
        cls.sena = Jogador.objects.get(user__username='******')  # 3 na ladder
        cls.teets = Jogador.objects.get(user__username='******')  # 1 na ladder
        cls.tiovsky = Jogador.objects.get(
            user__username='******')  # 10 na ladder
        cls.new = criar_jogador_teste('new')  # Novo entrande na ladder

        # Preparar mês anterior para histórico
        cls.horario_atual = timezone.localtime()
        cls.mes, cls.ano = mes_ano_ant(cls.horario_atual.month,
                                       cls.horario_atual.year)

        criar_ladder_historico_teste(cls.ano, cls.mes)
コード例 #7
0
    def setUpTestData(cls):
        super(ViewCancelarRemocaoJogadorLadderTestCase, cls).setUpTestData()

        criar_jogadores_teste()

        cls.teets = Jogador.objects.get(nick='teets')  # Admin, com desafios
        cls.saraiva = Jogador.objects.get(
            nick='saraiva')  # Admin, sem desafios
        cls.sena = Jogador.objects.get(nick='sena')  # Não-admin, com desafios
        cls.mad = Jogador.objects.get(nick='mad')  # Não-admin, sem desafios
        cls.tiovsky = Jogador.objects.get(
            nick='tiovsky')  # Não-admin, sem desafios

        # Criar ladders para verificar que adicionar desafio não as afeta
        criar_ladder_teste()

        # Preparar mês anterior para histórico
        horario_atual = timezone.localtime()
        data_atual = horario_atual.date()
        cls.mes, cls.ano = mes_ano_ant(data_atual.month, data_atual.year)

        criar_ladder_historico_teste(cls.ano, cls.mes)

        # Criar remoção por admin
        cls.remocao_admin = RemocaoJogador.objects.create(
            jogador=cls.sena,
            data=timezone.localtime() - datetime.timedelta(days=2),
            admin_removedor=cls.teets,
            posicao_jogador=3,
            remocao_por_inatividade=False)
        remover_jogador(cls.remocao_admin)

        # Criar remoção por inatividade
        cls.remocao_inatividade = RemocaoJogador.objects.create(
            jogador=cls.tiovsky,
            data=timezone.localtime() - datetime.timedelta(days=1),
            admin_removedor=cls.teets,
            posicao_jogador=9,
            remocao_por_inatividade=True)
        remover_jogador(cls.remocao_inatividade)
コード例 #8
0
ファイル: test_forms.py プロジェクト: nizbel/smash-ladder
    def setUpTestData(cls):
        super(DesafioLadderFormTestCase, cls).setUpTestData()

        # Configurar jogador
        criar_jogadores_teste()

        criar_ladder_teste()

        cls.jogador_pos_5 = Jogador.objects.get(
            user__username='******')  # 5 na ladder
        cls.jogador_pos_4 = Jogador.objects.get(
            user__username='******')  # 4 na ladder
        cls.jogador_pos_7 = Jogador.objects.get(
            user__username='******')  # 7 na ladder
        cls.jogador_pos_8 = Jogador.objects.get(
            user__username='******')  # 8 na ladder
        cls.teets = Jogador.objects.get(user__username='******')  # 1 na ladder
        cls.new = criar_jogador_teste('new')  # Novo entrande na ladder

        # Preparar mês anterior para histórico
        data_atual = timezone.localtime().date()
        cls.mes, cls.ano = mes_ano_ant(data_atual.month, data_atual.year)

        criar_ladder_historico_teste(cls.ano, cls.mes)
コード例 #9
0
    def handle(self, *args, **options):
        # Não rodar em produção
        if settings.DEBUG == False:
            return

        mes_ano_validos = list()
        for ano, mes in HistoricoLadder.objects.filter(ano__lte=2002).order_by(
                'ano',
                'mes').values('ano',
                              'mes').distinct().values_list('ano', 'mes'):
            ladder_mes = HistoricoLadder.objects.filter(
                ano=ano, mes=mes).order_by('posicao').values_list(
                    'jogador__nick', 'posicao')

            if ('Mad', 6) in ladder_mes:
                if ('Niz', 10) in ladder_mes:
                    if ('Blöwer', 4) in ladder_mes:
                        if ('C0ox', 9) in ladder_mes:
                            if ('Bacabau', 5) in ladder_mes:
                                if ('Yalda', 3) in ladder_mes:
                                    mes_ano_validos.append((mes, ano))

        print('qtd validos:', len(mes_ano_validos))
        for mes, ano in mes_ano_validos:
            print(
                f'{mes}/{ano}:',
                HistoricoLadder.objects.filter(
                    ano=ano, mes=mes).order_by('posicao').values_list(
                        'jogador__nick', 'posicao'))

        if 2 == 2:
            return
#         HistoricoLadder.objects.filter(ano__lte=2002).delete()
        try:
            mes = 12
            ano = 2001

            nova_ladder = InicioLadder.objects.all().select_related(
                'jogador').order_by('posicao')

            # Decrementar mes ano para poder copiar
            mes, ano = mes_ano_ant(mes, ano)
            nova_opcao = copiar_ladder_como_historico(nova_ladder, mes, ano)
            opcoes_ladder = [
                nova_opcao,
            ]

            print('Inicial:',
                  nova_ladder.values_list('jogador__nick', 'posicao'))
            with open('templates/desafios.json', 'r') as arq:
                desafios = json.load(arq)
                #                     print(desafios)

                for desafio in reversed(desafios):
                    with transaction.atomic():

                        jogador_1 = desafio['jogador_1']
                        score_1 = desafio['score_jogador_1']
                        jogador_2 = desafio['jogador_2']
                        score_2 = desafio['score_jogador_2']
                        print('-----------------------------------')
                        print(jogador_1, jogador_2)

                        # Guardar próximo índice a ser avaliado
                        indice_prox = 0

                        # Guardar opções que serão removidas
                        opcoes_a_remover = list()

                        # Percorrer todas as possibilidades
                        for indice, opcao_ladder in enumerate(opcoes_ladder):
                            # Barrar novas entradas na lista
                            if indice < indice_prox:
                                continue

                            indice_prox = indice + 1

                            #                             if len(opcoes_ladder) < 4:
                            #                                 print([situacao.values_list('jogador__nick', 'posicao') for situacao in opcoes_ladder])

                            print(
                                f'Indice atual: {indice+1} de {len(opcoes_ladder)}'
                            )
                            # Desfazer desafio
                            posicao_1 = opcao_ladder.get(
                                jogador__nick=jogador_1).posicao
                            posicao_2 = opcao_ladder.get(
                                jogador__nick=jogador_2).posicao
                            #                             print(f'Luta: {jogador_1} em {posicao_1} e  {jogador_2} em {posicao_2}')
                            #                             print(opcao_ladder.values_list('jogador__nick', 'posicao'))

                            #                             jogador_verificar_1 = 'CPU'
                            #                             jogador_verificar_2 = 'Yalda'
                            #                             posicao_verificar_1 = opcao_ladder.get(jogador__nick=jogador_verificar_1).posicao
                            #                             posicao_verificar_2 = opcao_ladder.get(jogador__nick=jogador_verificar_2).posicao
                            #                             print(f'Posições a verificar: {jogador_verificar_1} em {posicao_verificar_1} e  {jogador_verificar_2} em {posicao_verificar_2}')

                            # Diferença de mais de 2 posições tem de ser removida
                            if abs(posicao_1 - posicao_2) > 2:
                                #                                 print(f'Retirar por diferença maior de 2 posições, {jogador_1}:{posicao_1} e {jogador_2}:{posicao_2}')
                                opcoes_a_remover.append(opcao_ladder)
                                continue

                            # Se 1 está na frente, e possui o score maior, voltar posição
                            if posicao_1 < posicao_2 and score_1 > score_2:
                                # Gerar novas possibilidades
                                # A opção padrão é sempre defesa
                                #                                 print('Defesa', jogador_1)

                                # Apenas adiciona situação de vitória se ganhador estiver 1 na frente
                                if posicao_1 + 1 == posicao_2:
                                    mes, ano = mes_ano_ant(mes, ano)
                                    opcao_2_diferenca = copiar_ladder_como_historico(
                                        opcao_ladder, mes, ano)
                                    #                                 print('Voltar 2 posições', jogador_1)
                                    opcao_2_diferenca.filter(
                                        posicao=posicao_1).update(posicao=0)
                                    opcao_2_diferenca.filter(
                                        posicao=posicao_2).update(
                                            posicao=posicao_1)
                                    opcao_2_diferenca.filter(
                                        posicao=(posicao_2 + 1)).update(
                                            posicao=(posicao_1 + 1))
                                    opcao_2_diferenca.filter(posicao=0).update(
                                        posicao=(posicao_2 + 1))
                                    #                                 print('Resultado:', opcao_2_diferenca)
                                    opcoes_ladder.insert(
                                        indice + 1, opcao_2_diferenca)
                                    indice_prox += 1

                                    mes, ano = mes_ano_ant(mes, ano)
                                    opcao_1_diferenca = copiar_ladder_como_historico(
                                        opcao_ladder, mes, ano)
                                    #                                     print('Voltar 1 posição', jogador_1)
                                    opcao_1_diferenca.filter(
                                        posicao=posicao_1).update(posicao=0)
                                    opcao_1_diferenca.filter(
                                        posicao=posicao_2).update(
                                            posicao=posicao_1)
                                    opcao_1_diferenca.filter(posicao=0).update(
                                        posicao=posicao_2)
                                    #                                     print('Resultado:', opcao_1_diferenca)
                                    opcoes_ladder.insert(
                                        indice + 2, opcao_1_diferenca)
                                    indice_prox += 1

    #                             print(nova_ladder.values_list('jogador__nick', 'posicao'))

                            elif posicao_1 < posicao_2 and score_1 < score_2:
                                # Se jogador 1 está na frente mas perdeu, remover da lista
                                #                                 print('Retirar por jogador 1 estar na frente mas ter perdido')
                                opcoes_a_remover.append(opcao_ladder)
                                continue

    #                           # Se 2 está na frente, e possui o score maior, voltar posição
                            elif posicao_2 < posicao_1 and score_2 > score_1:
                                # Gerar novas possibilidades
                                # A opção padrão é sempre defesa
                                #                                 print('Defesa', jogador_2)

                                # Apenas adiciona situação de vitória se ganhador estiver 1 na frente
                                if posicao_2 + 1 == posicao_1:
                                    mes, ano = mes_ano_ant(mes, ano)
                                    opcao_2_diferenca = copiar_ladder_como_historico(
                                        opcao_ladder, mes, ano)
                                    #                                 print('Voltar 2 posições', jogador_2)
                                    opcao_2_diferenca.filter(
                                        posicao=posicao_2).update(posicao=0)
                                    opcao_2_diferenca.filter(
                                        posicao=posicao_1).update(
                                            posicao=posicao_2)
                                    opcao_2_diferenca.filter(
                                        posicao=(posicao_1 + 1)).update(
                                            posicao=(posicao_2 + 1))
                                    opcao_2_diferenca.filter(posicao=0).update(
                                        posicao=(posicao_1 + 1))
                                    #                                 print('Resultado:', opcao_2_diferenca)
                                    opcoes_ladder.insert(
                                        indice + 1, opcao_2_diferenca)
                                    indice_prox += 1

                                    mes, ano = mes_ano_ant(mes, ano)
                                    opcao_1_diferenca = copiar_ladder_como_historico(
                                        opcao_ladder, mes, ano)
                                    #                                     print('Voltar 1 posição', jogador_2)
                                    opcao_1_diferenca.filter(
                                        posicao=posicao_2).update(posicao=0)
                                    opcao_1_diferenca.filter(
                                        posicao=posicao_1).update(
                                            posicao=posicao_2)
                                    opcao_1_diferenca.filter(posicao=0).update(
                                        posicao=posicao_1)
                                    #                                     print('Resultado:', opcao_1_diferenca)
                                    opcoes_ladder.insert(
                                        indice + 2, opcao_1_diferenca)
                                    indice_prox += 1

    #                             print(nova_ladder.values_list('jogador__nick', 'posicao'))

                            elif posicao_2 < posicao_1 and score_2 < score_1:
                                # Se jogador 1 está na frente mas perdeu, remover da lista
                                #                                 print('Retirar por jogador 2 estar na frente mas ter perdido')
                                opcoes_a_remover.append(opcao_ladder)
                                continue

                        # Aplicar remoções
                        print(
                            f'Remover {len(opcoes_a_remover)} de {len(opcoes_ladder)}'
                        )
                        for remover in opcoes_a_remover:
                            remover.delete()
                            opcoes_ladder.remove(remover)
                        print(len(opcoes_ladder))

                if len(opcoes_ladder) == 1:
                    print(opcoes_ladder[0].values_list('jogador__nick',
                                                       'posicao'))

                elif len(opcoes_ladder) >= 3:
                    print(opcoes_ladder[0].values_list('jogador__nick',
                                                       'posicao'))
                    print(opcoes_ladder[1].values_list('jogador__nick',
                                                       'posicao'))
                    print(opcoes_ladder[2].values_list('jogador__nick',
                                                       'posicao'))

        except:
            if score_1 == 3:
                print(
                    f'Vitória de {jogador_1} em {posicao_1}, {jogador_2} em {posicao_2}',
                    opcao_ladder.values_list('jogador__nick', 'posicao'))
            elif score_2 == 3:
                print(
                    f'{jogador_1} em {posicao_1}, Vitória de {jogador_2} em {posicao_2}',
                    opcao_ladder.values_list('jogador__nick', 'posicao'))
            raise
コード例 #10
0
ファイル: models.py プロジェクト: nizbel/smash-ladder
    def posicao_em(self, data_hora):
        """Retora a posição do jogador na ladder na data/hora especificada"""
        # Verificar Season para data/hora
        season = Season.objects.filter(
            data_inicio__lte=data_hora.date()).order_by('-data_inicio')[0]

        # Buscar última remoção da ladder, posição será definida a partir de sua data
        if RemocaoJogador.objects.filter(
                jogador=self,
                data__lt=data_hora,
                data__gte=season.data_hora_inicio).exists():
            data_inicial = RemocaoJogador.objects.filter(
                jogador=self).order_by('-data')[0].data
            desafios_validados_considerando_remocao = DesafioLadder.validados.na_season(
                season).filter(data_hora__gt=data_inicial)
        else:
            data_inicial = None
            desafios_validados_considerando_remocao = DesafioLadder.validados.na_season(
                season)

        # Buscar último desafio participado
        desafio_mais_recente = None

        if desafios_validados_considerando_remocao.filter(
                data_hora__lt=data_hora).filter(
                    Q(desafiante=self) | Q(desafiado=self)).exists():
            desafio_mais_recente = desafios_validados_considerando_remocao.filter(data_hora__lt=data_hora) \
                .filter(Q(desafiante=self) | Q(desafiado=self)).annotate(
                    posicao=Case(When(Q(desafiante=self) & Q(score_desafiante__gt=F('score_desafiado')), then=F('posicao_desafiado')),
                                 When(Q(desafiante=self) & Q(score_desafiante__lt=F('score_desafiado')), then=F('posicao_desafiante')),
                                 When(Q(desafiado=self) & Q(score_desafiante__gt=F('score_desafiado')), then=F('posicao_desafiado') + 1),
                                 When(Q(desafiado=self) & Q(score_desafiante__lt=F('score_desafiado')), then=F('posicao_desafiado')))) \
                                 .order_by('-data_hora')[0]

        if desafio_mais_recente:
            #             print(f'Desafio mais recente de {self}: {desafio_mais_recente.id} com {desafio_mais_recente.desafiante} VS {desafio_mais_recente.desafiado}')
            posicao = desafio_mais_recente.posicao

            # Buscar alterações feitas por remoções de outros jogadores
            posicao += (ResultadoRemocaoJogador.objects.filter(remocao__data__range=[desafio_mais_recente.data_hora, data_hora], jogador=self) \
                .exclude(remocao__data=data_hora).aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

            #             print(self, ResultadoDesafioLadder.objects.filter(jogador=self, desafio_ladder__data_hora__range=[desafio_mais_recente.data_hora, data_hora]) \
            #                 .exclude(desafio_ladder=desafio_mais_recente).exclude(desafio_ladder__data_hora=data_hora) \
            #                 .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

            # Buscar alterações feitas por desafios de outros jogadores
            posicao += (ResultadoDesafioLadder.objects.filter(jogador=self, desafio_ladder__data_hora__range=[desafio_mais_recente.data_hora, data_hora]) \
                .filter(desafio_ladder__admin_validador__isnull=False, desafio_ladder__cancelamentodesafioladder__isnull=True) \
                .exclude(desafio_ladder=desafio_mais_recente).exclude(desafio_ladder__data_hora=data_hora) \
                .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

            # Buscar alterações feitas por decaimentos de outros jogadores
            posicao += (ResultadoDecaimentoJogador.objects.filter(jogador=self, decaimento__data__range=[desafio_mais_recente.data_hora, data_hora]) \
                .exclude(decaimento__data=data_hora) \
                .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

            return posicao

        # Se não houver desafios cadastrados, verificar última ladder
        # Definir ultima ladder
        mes, ano = mes_ano_ant(data_hora.month, data_hora.year)

        if HistoricoLadder.objects.filter(ano=ano, mes=mes).exists():
            # Se houver remoção e ela ocorrer no mês atual, ignorar busca e retornar como novo entrante
            if data_inicial and data_inicial.month == data_hora.month and data_inicial.year == data_hora.year:
                return 0
            ultima_ladder = HistoricoLadder.objects.filter(ano=ano, mes=mes)
        else:
            # Se houver remoção, ignorar busca por ladder inicial
            if data_inicial:
                return 0
            ultima_ladder = InicioLadder.objects.all()

        if ultima_ladder.filter(jogador=self).exists():
            posicao = ultima_ladder.get(jogador=self).posicao

            #             print(self, ResultadoDesafioLadder.objects.filter(jogador=self, desafio_ladder__data_hora__lt=data_hora) \
            #                 .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

            # Buscar alterações feitas por alterações de outros jogadores
            if HistoricoLadder.objects.filter(ano=ano, mes=mes).exists():
                # Remoções
                posicao += (ResultadoRemocaoJogador.objects.filter(remocao__data__lt=data_hora, jogador=self) \
                            .filter(remocao__data__month=data_hora.month, remocao__data__year=data_hora.year)
                            .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)
                #                 posicao -= RemocaoJogador.objects.filter(data__lt=data_hora, posicao_jogador__lt=posicao) \
                #                     .filter(data__month=data_hora.month, data__year=data_hora.year).count()

                # Desafios
                posicao += (ResultadoDesafioLadder.objects.filter(jogador=self, desafio_ladder__data_hora__lt=data_hora) \
                    .filter(desafio_ladder__data_hora__month=data_hora.month, desafio_ladder__data_hora__year=data_hora.year,
                            desafio_ladder__admin_validador__isnull=False, desafio_ladder__cancelamentodesafioladder__isnull=True) \
                    .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

                # Decaimentos
                posicao += (ResultadoDecaimentoJogador.objects.filter(jogador=self, decaimento__data__lt=data_hora) \
                    .filter(decaimento__data__month=data_hora.month, decaimento__data__year=data_hora.year)
                    .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)
            else:
                # Remoções
                #                 posicao -= RemocaoJogador.objects.filter(data__lt=data_hora, posicao_jogador__lt=posicao).count()
                posicao += (ResultadoRemocaoJogador.objects.filter(remocao__data__lt=data_hora, remocao__data__gte=season.data_hora_inicio,
                                                                   jogador=self).aggregate(alteracao_total= \
                                                                                           Sum('alteracao_posicao'))['alteracao_total'] or 0)

                # Desafios
                posicao += (ResultadoDesafioLadder.objects.filter(jogador=self, desafio_ladder__data_hora__lt=data_hora,
                            desafio_ladder__data_hora__gte=season.data_hora_inicio, desafio_ladder__admin_validador__isnull=False,
                            desafio_ladder__cancelamentodesafioladder__isnull=True) \
                    .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

                # Decaimentos
                posicao += (ResultadoDecaimentoJogador.objects.filter(jogador=self, decaimento__data__lt=data_hora,
                                                                      decaimento__data__gte=season.data_hora_inicio) \
                    .aggregate(alteracao_total=Sum('alteracao_posicao'))['alteracao_total'] or 0)

            return posicao

        # Novos entrantes começam na posição 0
        return 0
コード例 #11
0
ファイル: test_seasons.py プロジェクト: nizbel/smash-ladder
    def testa_gerar_primeira_season(self):
        """Testa gerar primeira season"""
        criar_jogadores_teste()

        # Pegar objetos de jogador de acordo com sua posição
        jogador_pos_1 = Jogador.objects.get(nick='teets')
        jogador_pos_2 = Jogador.objects.get(nick='saraiva')
        jogador_pos_3 = Jogador.objects.get(nick='sena')
        jogador_pos_4 = Jogador.objects.get(nick='mad')
        jogador_pos_5 = Jogador.objects.get(nick='blöwer')
        jogador_pos_6 = Jogador.objects.get(nick='frodo')
        jogador_pos_7 = Jogador.objects.get(nick='dan')
        jogador_pos_8 = Jogador.objects.get(nick='phils')
        jogador_pos_9 = Jogador.objects.get(nick='rata')
        jogador_pos_10 = Jogador.objects.get(nick='tiovsky')

        criar_season_teste(
            data_inicio=timezone.localdate() - datetime.timedelta(days=30),
            data_fim=timezone.localdate() - datetime.timedelta(days=1))
        criar_ladder_inicial_teste()
        criar_ladder_teste()

        horario_atual = timezone.localtime()
        ano, mes = mes_ano_ant(horario_atual.month, horario_atual.year)
        criar_ladder_historico_teste(ano, mes)

        # Criar desafios
        desafio_ladder = criar_desafio_ladder_simples_teste(
            jogador_pos_3, jogador_pos_1, 3, 1, horario_atual, False,
            jogador_pos_1)
        validar_desafio_ladder_teste(desafio_ladder, jogador_pos_1)

        criar_desafio_ladder_simples_teste(jogador_pos_4, jogador_pos_2, 3, 1,
                                           horario_atual, False, jogador_pos_1)

        # Pegar situação da ladder inicial antes
        ladder_inicial_antes = list(
            InicioLadder.objects.all().order_by('posicao').values_list(
                'jogador', 'posicao'))

        # Pegar situação da ladder atual antes
        ladder_atual_antes = list(
            PosicaoLadder.objects.all().order_by('posicao').values_list(
                'jogador', 'posicao'))

        guardar_dados_season_anterior()
        apagar_ladder_season_anterior()
        gerar_nova_season()

        self.assertFalse(HistoricoLadder.objects.exists())

        self.assertEqual(DesafioLadder.objects.count(), 1)
        self.assertTrue(
            DesafioLadder.objects.filter(id=desafio_ladder.id).exists())

        # Validar ladder inicial e atual
        ladder_inicial_apos = list(
            InicioLadder.objects.all().order_by('posicao').values_list(
                'jogador', 'posicao'))
        ladder_atual_apos = list(
            PosicaoLadder.objects.all().order_by('posicao').values_list(
                'jogador', 'posicao'))

        self.assertEqual(len(ladder_inicial_antes), len(ladder_inicial_apos))
        for situacao_antes, situacao_apos in zip(ladder_inicial_antes,
                                                 ladder_inicial_apos):
            self.assertNotEqual(situacao_antes, situacao_apos)

        self.assertEqual(len(ladder_atual_antes), len(ladder_atual_apos))
        for situacao_antes, situacao_apos in zip(ladder_atual_antes,
                                                 ladder_atual_apos):
            self.assertNotEqual(situacao_antes, situacao_apos)