def organizacoes_prospect(request): """Exibe as organizações prospectadas e a última comunicação.""" todas_organizacoes = Organizacao.objects.all() configuracao = get_object_or_404(Configuracao) ano = configuracao.ano # Ano atual semestre = configuracao.semestre # Semestre atual # Vai para próximo semestre ano, semestre = adianta_semestre(ano, semestre) disponiveis = [] submetidas = [] contato = [] organizacoes = [] periodo = 60 if request.is_ajax() and 'periodo' in request.POST: periodo = int(request.POST['periodo']) * 30 # periodo vem em meses for organizacao in todas_organizacoes: propostas = Proposta.objects.filter(organizacao=organizacao)\ .order_by("ano", "semestre") ant = Anotacao.objects.filter(organizacao=organizacao)\ .order_by("momento").last() if (periodo > 366) or \ (ant and (datetime.date.today() - ant.momento.date() < datetime.timedelta(days=periodo))): organizacoes.append(organizacao) contato.append(ant) if configuracao.semestre == 1: propostas_submetidas = propostas\ .filter(ano__gte=configuracao.ano)\ .exclude(ano=configuracao.ano, semestre=1).distinct() else: propostas_submetidas = propostas\ .filter(ano__gt=configuracao.ano).distinct() submetidas.append(propostas_submetidas.count()) disponiveis.append( propostas_submetidas.filter(disponivel=True).count()) organizacoes_list = zip(organizacoes, disponiveis, submetidas, contato) total_organizacoes = len(organizacoes) total_disponiveis = sum(disponiveis) total_submetidas = sum(submetidas) context = { 'organizacoes_list': organizacoes_list, 'total_organizacoes': total_organizacoes, 'total_disponiveis': total_disponiveis, 'total_submetidas': total_submetidas, 'ano': ano, 'semestre': semestre, 'filtro': "todas", } return render(request, 'organizacoes/organizacoes_prospectadas.html', context)
def pre_alocar_estudante(request): """Ajax para pre-alocar estudates em propostas.""" user = get_object_or_404(PFEUser, pk=request.user.pk) if user.tipo_de_usuario == 4: # admin # Código a seguir não estritamente necessário mas pode deixar mais seguro administrador = get_object_or_404(Administrador, pk=request.user.administrador.pk) if not administrador: return HttpResponse("Administrador não encontrado.", status=401) estudante = request.GET.get('estudante', None) estudante_id = int(estudante[len("estudante"):]) proposta = request.GET.get('proposta', None) proposta_id = int(proposta[len("proposta"):]) configuracao = get_object_or_404(Configuracao) ano = configuracao.ano semestre = configuracao.semestre # Vai para próximo semestre ano, semestre = adianta_semestre(ano, semestre) proposta = get_object_or_404(Proposta, id=proposta_id) estudante = get_object_or_404(Aluno, id=estudante_id) estudante.pre_alocacao = proposta estudante.save() data = { 'atualizado': True, } elif user.tipo_de_usuario == 2: # professor # atualizações não serão salvas data = { 'atualizado': False, } else: return HttpResponseNotFound('<h1>Usuário sem privilérios!</h1>') return JsonResponse(data)
def selecionar_orientadores(request): """Selecionar Orientadores para os Projetos.""" configuracao = get_object_or_404(Configuracao) ano = configuracao.ano semestre = configuracao.semestre # try: # configuracao = Configuracao.objects.get() # ano = configuracao.ano # semestre = configuracao.semestre # except Configuracao.DoesNotExist: # return HttpResponse("Falha na configuracao do sistema.", status=401) mensagem = "" if 'mensagem' in request.session: mensagem = request.session['mensagem'] # Vai para próximo semestre ano, semestre = adianta_semestre(ano, semestre) projetos = Projeto.objects.filter(ano=ano, semestre=semestre) professores = PFEUser.objects.filter(tipo_de_usuario=2) # (2, 'professor') administradores = PFEUser.objects.filter( tipo_de_usuario=4) # (4, 'administrador') orientadores = (professores | administradores).order_by( Lower("first_name"), Lower("last_name")) # Checa se usuário é administrador ou professor user = get_object_or_404(PFEUser, pk=request.user.pk) # try: # user = PFEUser.objects.get(pk=request.user.pk) # except PFEUser.DoesNotExist: # return HttpResponse("Usuário não encontrado.", status=401) if user and user.tipo_de_usuario != 4: # admin mensagem = "Sua conta não é de administrador, " mensagem += "você pode mexer na tela, contudo suas modificações não serão salvas." context = { 'mensagem': mensagem, 'projetos': projetos, 'orientadores': orientadores, } return render(request, 'administracao/selecionar_orientadores.html', context=context)
def preenche_proposta_pdf(campos, proposta): """Preenche um proposta a partir de um dicionario PDF.""" if proposta is None: # proposta nova proposta = Proposta.create() try: configuracao = Configuracao.objects.get() ano = configuracao.ano # Ano atual semestre = configuracao.semestre # Semestre atual except Configuracao.DoesNotExist: return None # Vai para próximo semestre ano, semestre = adianta_semestre(ano, semestre) proposta.ano = ano proposta.semestre = semestre proposta.nome = campos["nome"] proposta.email = campos["email"] proposta.website = decodificar("site", campos) proposta.nome_organizacao = decodificar("organizacao", campos) proposta.endereco = decodificar("endereco", campos) proposta.contatos_tecnicos = decodificar("contatos_tecnicos", campos) proposta.contatos_administrativos = decodificar("contatos_administrativos", campos) proposta.descricao_organizacao = decodificar("descricao_organizacao", campos) proposta.departamento = decodificar("departamento", campos) proposta.titulo = decodificar("titulo", campos) proposta.descricao = decodificar("descricao", campos) proposta.expectativas = decodificar("expectativas", campos) proposta.recursos = decodificar("recursos", campos) proposta.observacoes = decodificar("observacoes", campos) # tipo = request.POST.get("interesse", "") # if tipo != "": # proposta.tipo_de_interesse = int(tipo) proposta.save() cria_area_proposta_pdf(campos, proposta) return proposta
def index_estudantes(request): """Mostra página principal do usuário estudante.""" usuario = get_object_or_404(PFEUser, pk=request.user.pk) configuracao = get_object_or_404(Configuracao) context = { 'configuracao': configuracao, 'vencido': timezone.now() > configuracao.prazo } ano = configuracao.ano semestre = configuracao.semestre # Caso estudante if usuario.tipo_de_usuario == 1: estudante = get_object_or_404(Aluno, pk=request.user.aluno.pk) context['projeto'] = Projeto.objects\ .filter(alocacao__aluno=estudante).last() # Estudantes de processos passados sempre terrão seleção vencida if semestre == 1: context['vencido'] |= estudante.anoPFE < ano context['vencido'] |= estudante.anoPFE == ano and \ estudante.semestrePFE == 1 else: context['vencido'] |= (estudante.anoPFE <= ano) # Caso professor ou administrador elif usuario.tipo_de_usuario == 2 or usuario.tipo_de_usuario == 4: context['professor_id'] = get_object_or_404( Professor, pk=request.user.professor.pk).id # Caso parceiro else: return HttpResponse("Usuário sem acesso.", status=401) context['ano'], context['semestre'] = adianta_semestre(ano, semestre) return render(request, 'estudantes/index_estudantes.html', context=context)
def recupera_orientadores_por_semestre(configuracao): """Recupera listas de orientadores de projetos ordenadas por semestre.""" professores_pfe = [] periodo = [] ano = 2018 # Ano de início do PFE semestre = 2 # Semestre de início do PFE while True: professores = [] grupos = [] for professor in Professor.objects.all().order_by( Lower("user__first_name"), Lower("user__last_name")): count_grupos = [] grupos_pfe = Projeto.objects.filter(orientador=professor).\ filter(ano=ano).\ filter(semestre=semestre) if grupos_pfe: for grupo in grupos_pfe: # garante que tem alunos no projeto alunos_pfe = Aluno.objects.filter(alocacao__projeto=grupo) if alunos_pfe: count_grupos.append(grupo) if count_grupos: professores.append(professor) grupos.append(count_grupos) if professores: # Se não houver nenhum orientador não cria entrada na lista professores_pfe.append(zip(professores, grupos)) periodo.append(str(ano) + "." + str(semestre)) # Para de buscar depois do semestre atual if ((semestre == configuracao.semestre + 1) and (ano == configuracao.ano)) or \ (ano > configuracao.ano): break # Avança um semestre ano, semestre = adianta_semestre(ano, semestre) return zip(professores_pfe[::-1], periodo[::-1]) # inverti lista deixando os mais novos primeiro
def montar_grupos(request): """Montar grupos para projetos.""" configuracao = get_object_or_404(Configuracao) ano = configuracao.ano semestre = configuracao.semestre ano, semestre = adianta_semestre(ano, semestre) propostas = Proposta.objects.filter(ano=ano, semestre=semestre, disponivel=True) estudantes = Aluno.objects.filter(trancado=False).\ filter(anoPFE=ano, semestrePFE=semestre).\ order_by(Lower("user__first_name"), Lower("user__last_name")) opcoes = [] for estudante in estudantes: opcao = Opcao.objects.filter(aluno=estudante).\ filter(proposta__ano=ano, proposta__semestre=semestre).\ order_by("prioridade") opcoes.append(opcao) # Caso haja um pré-alocação de anos anteriores, limpar a pré-alocação if estudante.pre_alocacao and estudante.pre_alocacao not in propostas: estudante.pre_alocacao = None estudantes_opcoes = zip(estudantes, opcoes) # Checa se usuário é administrador ou professor user = get_object_or_404(PFEUser, pk=request.user.pk) mensagem = "" if request.method == 'POST' and user and user.tipo_de_usuario == 4: # admin if 'limpar' in request.POST: for estudante in estudantes: estudante.pre_alocacao = None estudante.save() if 'fechar' in request.POST: for proposta in propostas: alocados = [] for estudante in estudantes: if estudante.pre_alocacao: if estudante.pre_alocacao.id == proposta.id: alocados.append(estudante) else: op_aloc = Opcao.objects.filter(aluno=estudante).\ filter(proposta__ano=ano, proposta__semestre=semestre).\ filter(prioridade=1).first() if op_aloc and op_aloc.proposta == proposta: alocados.append(estudante) if alocados: # pelo menos um estudante no projeto try: projeto = Projeto.objects.get(proposta=proposta, avancado=None) except Projeto.DoesNotExist: projeto = Projeto.create(proposta) if not projeto.titulo: projeto.titulo = proposta.titulo if not projeto.descricao: projeto.descricao = proposta.descricao if not projeto.organizacao: projeto.organizacao = proposta.organizacao # projeto.avancado = None projeto.ano = proposta.ano projeto.semestre = proposta.semestre projeto.save() alocacoes = Alocacao.objects.filter(projeto=projeto) for alocacao in alocacoes: # Apaga todas alocacoes que não tiverem nota avals = list( Avaliacao2.objects.filter(alocacao=alocacao)) if not avals: alocacao.delete() else: mensagem += "- " + str(alocacao.aluno) + "\n" for alocado in alocados: # alocando estudantes no projeto alocacao = Alocacao.create(alocado, projeto) alocacao.save() else: projetos = Projeto.objects.filter(proposta=proposta, avancado=None) if not projetos: continue for projeto in projetos: alocacoes = Alocacao.objects.filter(projeto=projeto) for alocacao in alocacoes: # Apaga todas alocacoes que não tiverem nota alocacao.delete() projeto.delete() if mensagem: request.session[ 'mensagem'] = 'Estudantes possuiam alocações com notas:\n' request.session['mensagem'] += mensagem return redirect('/administracao/selecionar_orientadores/') if user and user.tipo_de_usuario != 4: # admin mensagem = "Sua conta não é de administrador, " mensagem += "você pode mexer na tela, contudo suas modificações não serão salvas." context = { 'mensagem': mensagem, 'configuracao': configuracao, 'propostas': propostas, 'estudantes_opcoes': estudantes_opcoes, } return render(request, 'administracao/montar_grupos.html', context=context)
def proposta_editar(request, slug): """Formulário de Edição de Propostas de Projeto por slug.""" try: user = PFEUser.objects.get(pk=request.user.pk) except PFEUser.DoesNotExist: user = None parceiro = None professor = None administrador = None if user: if user.tipo_de_usuario == 1: # alunos mensagem = "Você não está cadastrado como parceiro!" context = { "area_principal": True, "mensagem": mensagem, } return render(request, 'generic.html', context=context) if user.tipo_de_usuario == 3: # parceiro parceiro = get_object_or_404(Parceiro, pk=request.user.parceiro.pk) elif user.tipo_de_usuario == 2: # professor professor = get_object_or_404(Professor, pk=request.user.professor.pk) elif user.tipo_de_usuario == 4: # admin administrador = get_object_or_404(Administrador, pk=request.user.administrador.pk) proposta = get_object_or_404(Proposta, slug=slug) configuracao = get_object_or_404(Configuracao) liberadas_propostas = configuracao.liberadas_propostas configuracao = get_object_or_404(Configuracao) ano, semestre = adianta_semestre(configuracao.ano, configuracao.semestre) vencida = proposta.ano != ano or proposta.semestre != semestre if request.method == 'POST': if (not liberadas_propostas) or (user.tipo_de_usuario == 4): if vencida: proposta = preenche_proposta(request, None) else: preenche_proposta(request, proposta) enviar = "mensagem" in request.POST # Por e-mail se enviar mensagem = envia_proposta(proposta, enviar) resposta = "Submissão de proposta de projeto " resposta += "atualizada com sucesso.<br>" if enviar: resposta += "Você deve receber um e-mail de confirmação " resposta += "nos próximos instantes.<br>" resposta += "<br><hr>" resposta += mensagem context = { "voltar": True, "mensagem": resposta, } return render(request, 'generic.html', context=context) return HttpResponse("Propostas não liberadas para edição.", status=401) areas = Area.objects.filter(ativa=True) context = { 'liberadas_propostas': liberadas_propostas, 'full_name': proposta.nome, 'email': proposta.email, 'organizacao': proposta.nome_organizacao, 'website': proposta.website, 'endereco': proposta.endereco, 'descricao_organizacao': proposta.descricao_organizacao, 'parceiro': parceiro, 'professor': professor, 'administrador': administrador, 'contatos_tecnicos': proposta.contatos_tecnicos, 'contatos_adm': proposta.contatos_administrativos, 'info_departamento': proposta.departamento, 'titulo': proposta.titulo, 'desc_projeto': proposta.descricao, 'expectativas': proposta.expectativas, 'areast': areas, 'recursos': proposta.recursos, 'observacoes': proposta.observacoes, 'proposta': proposta, 'edicao': True, 'interesses': Proposta.TIPO_INTERESSE, 'tipo_de_interesse': proposta.tipo_de_interesse, 'ano_semestre': str(proposta.ano) + "." + str(proposta.semestre), 'vencida': vencida, } return render(request, 'organizacoes/proposta_submissao.html', context)
def procura_propostas(request): """Exibe um histograma com a procura das propostas pelos estudantes.""" configuracao = get_object_or_404(Configuracao) ano = configuracao.ano semestre = configuracao.semestre # try: # configuracao = Configuracao.objects.get() # ano = configuracao.ano # semestre = configuracao.semestre # except Configuracao.DoesNotExist: # return HttpResponse("Falha na configuracao do sistema.", status=401) curso = "T" # por padrão todos os cursos ano, semestre = adianta_semestre(ano, semestre) if request.is_ajax(): if 'anosemestre' in request.POST: if request.POST['anosemestre'] == 'todas': ano = 0 else: anosemestre = request.POST['anosemestre'].split(".") ano = int(anosemestre[0]) semestre = int(anosemestre[1]) if 'curso' in request.POST: curso = request.POST['curso'] else: return HttpResponse("Erro não identificado (POST incompleto)", status=401) mylist = ordena_propostas_novo(True, ano=ano, semestre=semestre, curso=curso) propostas = [] prioridades = [[], [], [], [], []] estudantes = [[], [], [], [], []] if len(mylist) > 0: unzipped_object = zip(*mylist) propostas,\ prioridades[0], prioridades[1], prioridades[2],\ prioridades[3], prioridades[4],\ estudantes[0], estudantes[1], estudantes[2],\ estudantes[3], estudantes[4]\ = list(unzipped_object) # Para procurar as áreas mais procuradas nos projetos opcoes = Opcao.objects.filter(aluno__user__tipo_de_usuario=1, aluno__trancado=False) if ano > 0: # Ou seja não são todos os anos e semestres opcoes = opcoes.filter(aluno__anoPFE=ano, aluno__semestrePFE=semestre) opcoes = opcoes.filter(proposta__ano=ano, proposta__semestre=semestre) opcoes = opcoes.filter(prioridade=1) # Caso não se deseje todos os cursos, se filtra qual se deseja if curso != "T": opcoes = opcoes.filter(aluno__curso=curso) areaspfe = {} areas = Area.objects.filter(ativa=True) for area in areas: count = 0 for opcao in opcoes: if AreaDeInteresse.objects.filter(proposta=opcao.proposta, area=area): count += 1 areaspfe[area.titulo] = (count, area.descricao) # conta de maluco para fazer diagrama ficar correto tamanho = len(propostas) if tamanho <= 4: tamanho *= 9 else: tamanho *= 5 edicoes, _, _ = get_edicoes(Proposta) context = { 'tamanho': tamanho, 'propostas': propostas, 'prioridades': prioridades, 'estudantes': estudantes, 'ano': ano, 'semestre': semestre, 'areaspfe': areaspfe, 'opcoes': opcoes, "edicoes": edicoes, } return render(request, 'propostas/procura_propostas.html', context)
def carrega_proposta(request): """Página para carregar Proposta de Projetos em PDF.""" try: user = PFEUser.objects.get(pk=request.user.pk) except PFEUser.DoesNotExist: user = None configuracao = get_object_or_404(Configuracao) ano, semestre = adianta_semestre(configuracao.ano, configuracao.semestre) full_name = "" email_sub = "" if user: if user.tipo_de_usuario == 1: # alunos mensagem = "Você não está cadastrado como parceiro!" context = { "area_principal": True, "mensagem": mensagem, } return render(request, 'generic.html', context=context) full_name = user.get_full_name() email_sub = user.email if request.method == 'POST': if 'arquivo' in request.FILES: arquivo = simple_upload(request.FILES['arquivo'], path=get_upload_path(None, "")) fields = get_form_fields(arquivo[1:]) mensagem = "" fields["nome"] = request.POST.get("nome", "").strip() fields["email"] = request.POST.get("email", "").strip() proposta = preenche_proposta_pdf(fields, None) enviar = "mensagem" in request.POST # Por e-mail se enviar mensagem = envia_proposta(proposta, enviar) resposta = "Submissão de proposta de projeto realizada " resposta += "com sucesso.<br>" if enviar: resposta += "Você deve receber um e-mail de confirmação " resposta += "nos próximos instantes.<br>" else: mensagem = "Arquivo não identificado" resposta = mensagem context = { "voltar": True, "mensagem": resposta, } return render(request, 'generic.html', context=context) context = { 'full_name': full_name, 'email': email_sub, 'ano_semestre': str(ano) + "." + str(semestre), } return render(request, 'organizacoes/carrega_proposta.html', context)
def proposta_submissao(request): """Formulário de Submissão de Proposta de Projetos.""" try: user = PFEUser.objects.get(pk=request.user.pk) except PFEUser.DoesNotExist: user = None configuracao = get_object_or_404(Configuracao) ano, semestre = adianta_semestre(configuracao.ano, configuracao.semestre) parceiro = None professor = None administrador = None organizacao = "" website = "http://" endereco = "" descricao_organizacao = "" full_name = "" email_sub = "" if user: if user.tipo_de_usuario == 1: # alunos mensagem = "Você não está cadastrado como parceiro!" context = { "area_principal": True, "mensagem": mensagem, } return render(request, 'generic.html', context=context) full_name = user.get_full_name() email_sub = user.email if user.tipo_de_usuario == 3: # parceiro parceiro = get_object_or_404(Parceiro, pk=request.user.parceiro.pk) organizacao = parceiro.organizacao website = parceiro.organizacao.website endereco = parceiro.organizacao.endereco descricao_organizacao = parceiro.organizacao.informacoes elif user.tipo_de_usuario == 2: # professor professor = get_object_or_404(Professor, pk=request.user.professor.pk) elif user.tipo_de_usuario == 4: # admin administrador = get_object_or_404(Administrador, pk=request.user.administrador.pk) if request.method == 'POST': proposta = preenche_proposta(request, None) enviar = "mensagem" in request.POST # Por e-mail se enviar mensagem = envia_proposta(proposta, enviar) resposta = "Submissão de proposta de projeto realizada " resposta += "com sucesso.<br>" if enviar: resposta += "Você deve receber um e-mail de confirmação " resposta += "nos próximos instantes.<br>" resposta += mensagem context = { "voltar": True, "mensagem": resposta, } return render(request, 'generic.html', context=context) areas = Area.objects.filter(ativa=True) organizacao_str = request.GET.get('organizacao', None) if organizacao_str: try: organizacao_id = int(organizacao_str) organizacao = Organizacao.objects.get(id=organizacao_id) except (ValueError, Organizacao.DoesNotExist): return HttpResponseNotFound('<h1>Organização não encontrado!</h1>') context = { 'full_name': full_name, 'email': email_sub, 'organizacao': organizacao, 'website': website, 'endereco': endereco, 'descricao_organizacao': descricao_organizacao, 'parceiro': parceiro, 'professor': professor, 'administrador': administrador, 'contatos_tecnicos': "", 'contatos_adm': "", 'info_departamento': "", 'titulo': "", 'desc_projeto': "", 'expectativas': "", 'areast': areas, 'recursos': "", 'observacoes': "", 'edicao': False, 'interesses': Proposta.TIPO_INTERESSE, 'ano_semestre': str(ano) + "." + str(semestre), 'tipo_de_interesse': 0 # Não existe na verdade } return render(request, 'organizacoes/proposta_submissao.html', context)