Ejemplo n.º 1
0
def liberar_inscricao(db, atividade, pessoa=None, do_insc=False, check_insc=True):
    """Função que verifica se as inscricoes podem ou não ser liberadas para a atividade.
       Como criterio de liberacao estão o número de vagas disponiveis e se a atividade permite a
       lista de espera. Caso informado a ´´pessoa´´ verifica se a mesma está ou não  inscrita.
       ´´´do_insc´´´ E se a função deve ou não levar em conta as datas previstas de inscrição
       check_insc se for True ele verifica tbm se a pessoa ja se inscreveu na atividade,
       caso contratio ver se ela poderia se inscrever"""

    if do_insc and not em_periodo_inscricao(db, atividade):
        return

    ja_inscrito = ja_inscrito_(db, atividade, pessoa)

    if ja_inscrito and check_insc:
        return

    #    if self.groups.count() and pessoa:
    #        if not (pessoa.user and pessoa.user.groups.filter(
    #                        id__in=self.groups.values_list('id',flat=True)).count() ):
    #            return
    num_inscs = num_inscritos_(db, atividade)
    num_max = atividade.num_max or num_inscs + 1
    if (num_max <= num_inscs and atividade.espera) or (num_max > num_inscs):  # caso as vagas ja tenham se esgotado
        return True
Ejemplo n.º 2
0
def inscricao_pessoal(request, db, atividade, pessoa, insc_grupo=False, editar=False, tipo="pessoal"):
    ##Obtendo/definindo paramentros basicos
    atividade_pagamento = atividade_pagamento_(db, atividade)
    insc_grupo = insc_grupo  # and pessoa.is_integrante()
    do_insc = em_periodo_inscricao(db, atividade)
    ja_inscrito = ja_inscrito_(db, atividade, pessoa)
    submit_value = "Inscrever-se"

    if request.vars.get("atividade_inscricao"):
        atividade_inscricao = db.atividade[request.vars("atividade_inscricao")] or redirect(URL("index"))
    else:
        atividade_inscricao = atividade

    permuta = (
        not do_insc and atividade_inscricao.permuta
    )  ##Caso a atividade não esteja mais em periodo de inscricao e aceite permuta
    integrantes_inscritos = []
    #    extra_filtro = Q()

    #    if insc_grupo:
    #        boletos = atividade.boletos(pessoa,pessoa.get_grupo() )
    #        grupos = list(pessoa.integrante_set.all().values_list('grupo',flat=True) ) + \
    #                 list(pessoa.tutor_set.all().values_list('grupo',flat=True) )
    #        pessoas_id = [ i.pessoa.id for i in chain(
    #                            Integrante.objects.filter(grupo__id__in=grupos),
    #                            Tutor.objects.filter(grupo_id__in=grupos) ) ]

    #        integrantes_inscritos = list(Inscrito.objects.filter(atividade=atividade_inscricao,
    #                            pessoa__id__in=pessoas_id).values_list('pessoa',flat=True) )
    #        extra_filtro = Q(Q(Q(atividade=atividade.id) |Q(atividade__atividade=atividade.id)) &
    #                         Q(pessoa__id__in=pessoas_id))
    #        grupos_finalizadas = all(Grupo_Inscricao.objects.filter(grupo__id__in=grupos,
    #                    atividade=atividade).values_list('finalizada',flat=True) or [False])

    #        if Grupo_Inscricao.objects.filter(atividade=atividade,grupo=pessoa.get_grupo()).count():
    #            grupo_inscricao = Grupo_Inscricao.objects.get(atividade=atividade,grupo=pessoa.get_grupo())
    #            n_pagos = grupo_inscricao.boletos().exclude(
    #                Q(Q(valor_pago__isnull=False,valor_pago__gt=0.) |
    #                  Q(sinalizar_pago=True)))

    #            if n_pagos.count() > 1:
    #                for b in n_pagos[:n_pagos.count()-1]:
    #                    b.trash=True
    #                    b.save()
    #                ##Atualiza os boletos da pessoa
    #                boletos = atividade.boletos(pessoa,pessoa.get_grupo() )

    #            valor_total = grupo_inscricao.valor_total
    #            valor_boletos = boletos.aggregate(Sum('valor'))['valor__sum'] or 0.

    #            valor_residual = atividade.valor_residual(grupo_inscricao.grupo.id_pessoa)

    #            if valor_total > valor_boletos and valor_residual:
    #                novo = bool(not boletos.filter(sinalizar_pago=False).count() )#or grupo_inscricao.finalizada)
    #                boleto = grupo_inscricao.get_numero_sequencial(novo=novo,update=grupo_inscricao.finalizada)
    #                if not novo and grupo_inscricao.finalizada:
    #                    messages.warning(request,u"Observe que o boleto %s pode ter sofrido alterações!" %boleto.nosso_numero_formatado)
    #                boletos = atividade.boletos(pessoa,pessoa.get_grupo() )
    #            elif valor_total < valor_boletos:
    #                ##O boleto deve ser atualizado caso eles marquem o boleto como 'não pago'
    #                ## e ainda exista um valor residual, ou caso o integrante nao informe
    #                ## nada se admite quando existe boletos que nao foram pagos
    #                update = bool(n_pagos.count())
    #                novo=False
    #                boleto = grupo_inscricao.get_numero_sequencial(update=update,
    #                                                                novo=novo )
    #                if update:
    #                    messages.warning(request,u"Observe que o boleto %s pode ter sofrido alterações!" %boleto.nosso_numero_formatado)
    #    else:
    ########-------------------
    boletos = boletos_(db, atividade, pessoa.pessoa if pessoa else None)
    n_pagos = boletos.exclude(lambda row: ((db.boleto.valor_pago > 0) | (db.boleto.sinalizar_pago == True)))

    if len(n_pagos):
        for b in n_pagos[: len(n_pagos) - 1]:
            b.update_record(trash=True)

        ##Atualiza os boletos da pessoa
        boletos = boletos_(db, atividade, pessoa.pessoa if pessoa else None)

    valor_total = valor_total_(db, atividade, pessoa.pessoa if pessoa else None)

    valor_boletos = 0.0
    for b in boletos:
        valor_boletos += b.valor

    valor_residual = valor_residual_(db, atividade, pessoa.pessoa if pessoa else None)
    if atividade_pagamento and atividade_pagamento.forma_pagamento == "bo":
        if valor_total > valor_boletos and valor_residual:
            novo = bool(
                boletos.find(lambda row: db.boleto.sinalizar_pago == False).isempty()
            )  # or grupo_inscricao.finalizada)
            #            boleto = atividade.atividade_pagamento_.numero_sequencial(pessoa,novo=novo,update=atividade_inscricao.inscricoes_finalizadas(pessoa))
            #            if not novo and atividade_inscricao.inscricoes_finalizadas(pessoa):
            #                messages.warning(request,u"Observe que o boleto %s pode ter sofrido alterações!" %boleto.nosso_numero_formatado)
            boletos = boletos_(db, atividade, pessoa.pessoa)

        elif valor_total < valor_boletos:
            ##O boleto deve ser atualizado caso eles marquem o boleto como 'não pago'
            ## e ainda exista um valor residual, ou caso o integrante nao informe
            ## nada se admite quando existe boletos que nao foram pagos
            update = bool(not n_pagos.isempty())
            novo = False
    #            boleto = atividade_pagamento.numero_sequencial(pessoa,novo=novo,update=update)

    #            if update:
    #                messages.warning(request,u"Observe que o boleto %s pode ter sofrido alterações!" %boleto.nosso_numero_formatado)
    ####--------------bloco identado para traz---------------------

    ##insc_ativ representa se o usuario ou integrante de seu grupo já foram inscritos nesta atividade
    insc_ativ = (not atividade_inscricao.requer_inscricao) or bool(
        ja_inscrito or (insc_grupo and len(integrantes_inscritos))
    )

    lib_inscricao = False
    if atividade_inscricao.insc_online or insc_online_subativs_(db, atividade_inscricao) and not insc_ativ:
        lib_inscricao = liberar_inscricao(db, atividade_inscricao, pessoa, do_insc=True, check_insc=True)

    bloquear = False
    #    ##Verificando se o usuário se enquadra em nos grupos que a atividade permite se inscrever
    #    if atividade_inscricao.groups.count():
    #        if not (pessoa.user and pessoa.user.groups.filter(
    #                    id__in=atividade_inscricao.groups.values_list('id',flat=True)).count() ):
    #            bloquear = not insc_grupo

    # Filtra as atividades relacionadas a esta atividade que o usuário já se inscreveu
    #    filtro = Q(Q(Q(atividade=atividade.id) |Q(atividade__atividade=atividade.id)) &
    #                 Q(pessoa__user=request.user))
    #    inscricoes = Inscrito.objects.filter(filtro | extra_filtro)
    action = request.post_vars.get("submit")
    #    ##EFETIVANDO A INSCRIÇÃO
    if action:
        if action == "Cancelar":
            redirect(URL("atividade", "mostra_atividade", args=(atividade.slug,)))

        elif action in ["Próximo passo", "Inscreva-se", "Salvar", "Finalizar inscrição"]:
            ##Só inscreve a pessoa na atividade se a atividade requerer inscrição e se
            ##ela ainda não estiver inscrita. Observe o caso de ser um integrante de um grupo
            ##que pode estar efetivando a inscrição de outros integrantes na mesma atividade
            if atividade_inscricao.requer_inscricao and (not insc_ativ or insc_grupo):
                espera = False
                #                pessoas_insc = 1
                pessoas_id = [pessoa.pessoa.id]

                #                if insc_grupo:
                #                    num_inscritos_inicial =  inscricoes.count() #Numeros de Inscritos dos Quais o Grupo "tem direito"

                #                    form = InscGrupoAtividade(data=request.POST,pessoa=pessoa,
                #                                              atividade=atividade_inscricao,
                #                                              initial={'atividade':atividade_inscricao.id})
                #                    if form.is_valid():
                #                        pessoas_id = map(int, form.cleaned_data['pessoas'])
                #                        pessoas_insc = Pessoa.objects.filter(id__in=pessoas_id)
                #                        if pessoas_insc.count() > num_inscritos_inicial and permuta:
                #                            removidos = pessoas_insc[num_inscritos_inicial:]
                #                            for p in removidos:
                #                                Inscrito.objects.filter(pessoa=p,
                #                                                    atividade = atividade_inscricao).delete()
                #                            messages.error(request,u"Você não pode selecionar um número de inscritos maior que o inicial. Pois as inscrições estão encerradas!")
                #                            messages.error(request,u"As seguintes pessoas tiveram suas inscrições removidas: %s!" %','.join(map(unicode,removidos)))
                #                            pessoas_insc = pessoas_insc[:num_inscritos_inicial]

                #                    ##Removendo os integrantes que não estão inscritos
                #                    for c in form.fields['pessoas'].choices:
                #                        if not c[0] in pessoas_id:
                #                            Inscrito.objects.filter(pessoa=c[0],
                #                                                atividade = atividade_inscricao).delete()

                pessoas_insc = len(pessoas_id)
                ##Somente retornar a mensagem de erro caso apenas uma pessoa esta
                ##realizando a inscrição. Caso contrário deve-se proceder a inscrição
                ##até que as vagas se esgotem
                num_inscritos = num_inscritos_(
                    db, atividade_inscricao, extra_query=~db.inscrito.pessoa_id.belongs(pessoas_id)
                )
                if atividade_inscricao.num_max and (num_inscritos + pessoas_insc > atividade_inscricao.num_max):
                    if not atividade_inscricao.espera:
                        if pessoas_insc > 1:
                            for pessoa in range(pessoas_insc):
                                if num_inscritos_(db, atividade_inscricao) < atividade_inscricao.num_max:
                                    insc = db.inscrito.update_or_insert(atividade=atividade_inscricao)
                                else:
                                    break
                            msg = u"Nem todos os integrantes selecionados puderam ser\
                                         inscritos pois as vagas se esgotaram."
                        else:
                            msg = u"Vagas esgotadas"

                        session.messages = ("error", request, msg)
                        return locals()
                    else:
                        espera = True

                for pessoa_id in pessoas_id:
                    new_insc = db.inscrito.update_or_insert(pessoa_id=pessoa_id, atividade_id=atividade_inscricao.id)
                    if espera and new_insc:
                        if num_inscritos_(db, atividade_inscricao) > atividade_inscricao.num_max:
                            db.inscrito[new_insc].update_record(espera=True)

            #                if espera:
            #                    a = atividade_inscricao.inscritos().count()
            #                    b = atividade_inscricao.num_max
            #                    if pessoas_insc.count() > 1:
            #                        msg = u"Algum dos integrantes selecionados estão na lista de espera \
            #                                da atividade, pois as vagas disponíveis se esgotaram."
            #                    else:
            #                        msg = u'<i class="icon-circle-info"></i> Você foi inscrito nesta \
            #                                atividade com sucesso. No entanto, você é o %sº da lista \
            #                                de espera esteja atento caso surjam novas vagas' %(
            #                                atividade_inscricao.inscritos().count() - atividade_inscricao.num_max)
            #                    messages.warning(request, msg)
            #                else:
            #                    messages.success(request,"Inscrição efetuada com Sucesso!")

            #                if insc_grupo:
            #                    grupos = list(Integrante.objects.filter(pessoa__id__in=pessoas_id
            #                                            ).values_list('grupo',flat=True) ) + \
            #                             list(Tutor.objects.filter(pessoa__id__in=pessoas_id
            #                                            ).values_list('grupo',flat=True) )
            #                    grupos = Grupo.objects.filter(id__in=grupos)
            #                    for grupo in grupos:
            #                        grupo_inscricao = Grupo_Inscricao.objects.get_or_create(grupo=grupo,atividade=atividade)[0]
            #                        if editar:
            #                            grupo_inscricao.finalizada=False
            #                        grupo_inscricao.inscritos = inscricoes
            #                        grupo_inscricao.save()
            #######################
            if not action == "Finalizar inscrição":
                return redirect(URL(""))  # "%s%s" %(
            #                            request.path,'?atividade_inscricao=%s' %request.GET.get('atividade_inscricao') if request.GET.get('atividade_inscricao') else "") )
            else:
                finaliza_inscricoes(db, atividade, pessoa.pessoa)

                #                ##Caso seja um integrante inscrevendo o seu grupo finalizar a inscrição dos grupo
                #                ##que tiveram seus integrantes selecionados por esta pessoa
                if insc_grupo:
                    pass
                #                    for grupo in grupos:
                #                        grupo_inscricao = Grupo_Inscricao.objects.get_or_create(grupo=grupo,atividade=atividade)[0]
                #                        grupo_inscricao.finalizada=True
                #                        grupo_inscricao.save()
                #                        status_pagamento = request.POST.get('pago',"")

                #                        if status_pagamento=='pago':
                #                            boletos.update(sinalizar_pago=True)
                #                        ##Adicionar verificação se a atividade exige boleto!
                #                        valor_residual = atividade.valor_residual(grupo_inscricao.grupo.id_pessoa)
                #                        n_pagos = grupo_inscricao.boletos().exclude(
                #                                    Q(Q(valor_pago__isnull=False,valor_pago__gt=0.) |
                #                                      Q(sinalizar_pago=True)))

                #                        ##O boleto deve ser atualizado caso eles marquem o boleto como 'não pago'
                #                        ## e ainda exista um valor residual, ou caso o integrante nao informe
                #                        ## nada se admite quando existe boletos que nao foram pagos
                #                        update = bool(status_pagamento=='update' and valor_residual) or n_pagos.count()
                #                        novo=bool((status_pagamento=='pago' or not boletos.count()) and valor_residual)\
                #                                    or ( not n_pagos.count() and valor_residual) #not update and
                #                        boleto = grupo_inscricao.get_numero_sequencial(
                #                                                                        update=update,
                #                                                                        novo=novo )
                #                        ##Remove o boleto apenas por seguranca!
                #                        if boleto.valor==0. and not boleto.valor_pago and not boleto.sinalizar_pago:
                #                            boleto.trash=True
                #                            boleto.save()

                #                        if update and not boleto.valor==0.:
                #                            messages.warning(request,u"Observe que o boleto %s pode ter sofrido alterações!" %boleto.nosso_numero_formatado)
                #                inscricoes.update(finalizada=True)
                ##                messages.success(request,u'<h4><i class="icon-ok"></i> Inscrição %s\
                #                     com sucesso!</h4>' %('finalizada' if not editar else 'editada'))
                #                if atividade.atividade_pagamento_ and atividade.atividade_pagamento_.forma_pagamento == "bo":
                #                    messages.warning(request,u"<h4>Você deve pagar seu boleto até o dia %s!</h4>" \
                #                     %date_filter(atividade.atividade_pagamento.data_vencimento,'d \d\e F \d\e Y') )
                #                ## Remove o campo de edicao caso o inscrito esteja editando a inscrição
                #                url = request.path.replace('editar/','')
                return redirect(URL("atividades", "inscricao", args=(atividade.slug)))  # "%s%s" %(
    #                                url,'?atividade_inscricao=%s' %request.GET.get(
    #                                'atividade_inscricao') if request.GET.get('atividade_inscricao') else "") )

    ###    if insc_grupo:
    ###        form = InscGrupoAtividade(pessoa = pessoa,atividade=atividade_inscricao,
    ###                                  initial={'atividade':atividade_inscricao.id})

    insc_finalizadas = inscricoes_finalizadas(db, atividade, pessoa.pessoa if pessoa else None)
    print insc_finalizadas, 111111111111111111111111111111111111111111111111111111111111
    #    valor_total = atividade.valor_total(pessoa)
    show_resumo = (
        (not do_insc and not atividade_inscricao.permuta)
        or (insc_finalizadas and not insc_grupo and not editar)
        or (not lib_inscricao and not atividade.tipo == "ev")
        or (insc_grupo and grupos_finalizadas and not editar)
        or bloquear
    )

    ##Caso especifico onde nao se caracteriza edição mas os usuários removeram todos os integrantes
    ###    if insc_grupo and grupos_finalizadas and not editar and not inscricoes.count():
    ###        return HttpResponseRedirect(reverse('editar_inscricao_pessoal',args=(atividade.slug,)))
    pessoa_insc = pessoa
    return locals()