def profile_list(request):
    funcao = user(request)
    user_id = request.session['user_id']
    #print("can_enter:"+str(not(Coordenador.objects.filter(pk=request.session['user_id']).exists()) or not(Administrador.objects.filter(pk=request.session['user_id']).exists())))
    if not (Coordenador.objects.filter(pk=request.session['user_id']).exists()
            ) and not (Administrador.objects.filter(
                pk=request.session['user_id']).exists()) or not (
                    'user_id' in request.session):
        context = {
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        }
        return render(request, "not_for-u.html", context)
    users = Utilizador.objects.all().annotate(
        cargo=Value('Participante', CharField()),
        estado=Value('Pendente', CharField()),
        UO=Value('-', CharField()),
        no_enc=Value(0, IntegerField()),
        year=Value(0, IntegerField()))
    atual = datetime.now().year
    for u in users:
        if Coordenador.objects.filter(pk=u.idutilizador).exists():
            u.cargo = "Coordenador"
            u.UO = UnidadeOrganica.objects.get(pk=Coordenador.objects.get(
                pk=u.idutilizador).unidade_organica_iduo.pk).sigla
            if u.validada == 2:
                u.estado = "Validado"
            u.year = year(u, atual)
        elif Colaborador.objects.filter(pk=u.idutilizador).exists():
            u.cargo = "Colaborador"
            curso_id = Colaborador.objects.get(pk=u.pk).curso_idcurso.pk
            u.UO = UnidadeOrganica.objects.get(pk=Curso.objects.get(
                pk=curso_id).unidade_organica_iduo.pk).sigla
            if u.validada == 1:
                u.estado = "Validado"
            u.year = year(u, atual)
        elif ProfessorUniversitario.objects.filter(pk=u.idutilizador).exists():
            u.cargo = "Docente Universitario"
            dep = ProfessorUniversitario.objects.get(
                pk=u.idutilizador).departamento_iddepartamento
            u.UO = UnidadeOrganica.objects.get(
                pk=dep.unidade_organica_iduo.pk).sigla
            if u.validada == 3:
                u.estado = "Validado"
            u.year = year(u, atual)
        elif Administrador.objects.filter(pk=u.pk).exists():
            u.cargo = "Administrador"
            if u.validada == 4:
                u.estado = "Validado"
            u.year = year(u, atual)
        elif Participante.objects.filter(pk=u.pk).exists():
            u.estado = "Validado"
            u.year = year(u, atual)
        #print(str(u.idutilizador)+" "+str(user_id))
        u.no_enc = u.pk
        u.idutilizador = u.idutilizador
    if Coordenador.objects.filter(pk=user_id).exists():
        me = UnidadeOrganica.objects.get(pk=Coordenador.objects.get(
            pk=user_id).unidade_organica_iduo.pk).sigla
    elif Administrador.objects.filter(pk=user_id).exists():
        me = Administrador.objects.get(pk=user_id)
        me.sigla = None
    me_id = user_id
    campus = Campus.objects.all()
    uos = uo()
    #print(users)
    return render(
        request, "list_users.html", {
            'atual': atual,
            "users": users,
            "funcao": funcao,
            "me": me,
            "me_id": me_id,
            "campus": campus,
            "uos": uos,
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request),
            'colaboradores': Colaborador.objects.all(),
            'docentes': ProfessorUniversitario.objects.all()
        })
def profile(request, id):
    id = id
    #print(id!=request.session['user_id'] and not(Administrador.objects.filter(pk=request.session['user_id']).exists()))
    if not (Administrador.objects.filter(pk=request.session['user_id']).exists(
    )) and not (Coordenador.objects.filter(
            pk=request.session['user_id']).exists()):
        context = {
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        }
        return render(request, "not_for-u.html", context)
    name = Utilizador.objects.get(idutilizador=id).nome
    me = request.session['user_id']
    form = ModifyForm()
    email = Utilizador.objects.get(idutilizador=id).email
    telefone = Utilizador.objects.get(idutilizador=id).telefone
    UO = False
    dep = False
    ano = False
    cursoname = False
    funcao = False
    if Administrador.objects.filter(utilizador_idutilizador=id).exists():
        funcao = "administardor"
    elif ProfessorUniversitario.objects.filter(
            utilizador_idutilizador=id).exists():
        funcao = "Docente Univesitario"
        depid = ProfessorUniversitario.objects.get(
            utilizador_idutilizador=id).departamento_iddepartamento
        dep = Departamento.objects.get(pk=depid.pk).nome
        UO = UnidadeOrganica.objects.get(
            pk=depid.unidade_organica_iduo.pk).sigla
    elif Coordenador.objects.filter(utilizador_idutilizador=id).exists():
        funcao = "Coordenador"
        IDUO = Coordenador.objects.get(pk=id).unidade_organica_iduo
        UO = UnidadeOrganica.objects.get(pk=IDUO.pk).sigla
    elif Colaborador.objects.filter(utilizador_idutilizador=id).exists():
        #ano = Utilizador.objects.get(pk=id).dia_aberto_ano.pk
        funcao = "Colaborador"
        curso = Colaborador.objects.get(
            utilizador_idutilizador=id).curso_idcurso
        cursoname = curso.nome
        UO = UnidadeOrganica.objects.get(
            pk=curso.unidade_organica_iduo.pk).sigla
    elif Participante.objects.filter(pk=id).exists():
        funcao = "Participante"
    return render(
        request, 'profile.html', {
            "form": form,
            'nome': name,
            'UO': UO,
            'email': email,
            "ano": ano,
            'telefone': telefone,
            'funcao': funcao,
            'ano': ano,
            'curso': cursoname,
            'dep': dep,
            "me": me,
            'id': id,
            'func': user(request),
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        })
def login_request(request):
    if 'user_id' in request.session:
        context = {
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        }
        return render(request, "not_for-u.html", context)
    if request.method == 'POST':
        form = AuthenticationForm(request.POST)
        tentatives = int(request.POST['tentatives'])
        #print(request.POST['email'])
        #print(request.POST['password'])
        if request.POST['email'] != '' and request.POST['password'] != '':
            #print(signing.dumps(request.POST['password']))
            if Utilizador.objects.filter(
                    email=request.POST['email'],
                    password=hashlib.sha256(request.POST['password'].encode(
                        'utf-8')).hexdigest()).exists():
                username = Utilizador.objects.get(email=request.POST['email'])
                if username.validada != int(5):
                    messages.success(request, f"Bem-vindo {username.nome}")
                    user = Utilizador.objects.get(email=request.POST['email'])
                    request.session['user_id'] = user.idutilizador
                    request.session['type'] = user.validada
                    request.session['id_encrypt'] = user.pk
                    #print(request.session['user_id'])
                    r = redirect('blog:blog-home')
                    if 'check' in request.POST and request.POST['check'] == '1':
                        Utilizador.objects.filter(
                            pk=request.session['user_id']).update(
                                remember_me=encrypt(
                                    request.session['user_id']))
                        r.set_cookie('cookie_id',
                                     encrypt(request.session['user_id']),
                                     7 * 24 * 60 * 60)
                    return r
                else:
                    messages.error(request,
                                   f"Sua conta ainda não está validada")
            else:
                tentatives -= 1
                if tentatives < 0:
                    tentatives = 5
                messages.error(
                    request,
                    f"Username e/ou palavra-passe incorreto(s). Tem mais {tentatives} tentativas"
                )
        else:
            tentatives -= 1
            if tentatives < 0:
                tentatives = 5
            messages.error(
                request,
                f"Username e/ou palavra-passe incorreto(s). Tem mais {tentatives} tentativas"
            )
    else:
        tentatives = 5
        form = AuthenticationForm()
    if tentatives < 0:
        tentatives = 5
    print(tentatives)
    return render(request=request,
                  template_name="login.html",
                  context={
                      "form": form,
                      "tentatives": tentatives,
                      'p': 2
                  })
def modify_user(request, id):
    #print(id!=request.session['user_id'] or not(Administrador.objects.filter(pk=request.session['user_id']).exists()))
    if id != request.session['user_id'] and not (Administrador.objects.filter(
            pk=request.session['user_id']).exists()):
        context = {
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        }
        return render(request, "not_for-u.html", context)
    name = Utilizador.objects.get(idutilizador=id).nome
    me = request.session['user_id']
    if request.method == 'POST':
        form = ModifyForm(request.POST)
        print(request.POST['name'] != "")
        print(request.POST['email'] != "")
        print(not Utilizador.objects.filter(
            email=request.POST['email']).exists())
        print(not Utilizador.objects.filter(
            telefone=request.POST['telefone']).exists())
        print(request.POST['telefone'] != "")
        print(bool(validateEmail(request.POST['email'])))
        if (request.POST['name'] != "") and (request.POST['email'] != "") and (
                not (Utilizador.objects.filter(
                    email=request.POST['email']).exists())
                or Utilizador.objects.get(pk=id).email == request.POST['email']
        ) and (request.POST['telefone'] != "") and (validateEmail(
                request.POST['email'])):
            t = Utilizador.objects.get(pk=id)
            t.nome = request.POST['name']
            t.email = request.POST['email']
            t.telefone = request.POST['telefone']
            if t.validada == 5:
                t.validada = 0
            t.save()
            print("1")
            noti_views.new_noti(
                request, t.pk, 'Alteração de dados no perfil',
                'Foram feitas alterações nos dados do seu perfil. Por favor consulte as alterações.'
            )
            messages.success(request, f"Utilizador alterado com sucesso")
            if id == request.session['user_id']:
                return redirect('blog:blog-home')
            return redirect('profile_list')
        else:
            error = False
            error3 = False
            error5 = False
            data = request.POST
            telefone = data['telefone']
            funcao = data['funcao']
            email = data['email']
            curso = False
            dep = False
            UO = False
            ano = False
            if 'ano' in data:
                ano = data['ano']
            if 'curso' in data:
                curso = data['curso']
            if 'dep' in data:
                dep = data['dep']
            if 'UO' in data:
                UO = data['UO']
            if request.POST['telefone'] == "":
                error3 = 'Preencha este campo.'
            if Utilizador.objects.filter(email=request.POST['email']).exists(
            ) and Utilizador.objects.get(
                    email=request.POST['email']).idutilizador != id:
                error = "Email ja existe"
            return render(
                request, 'profile_modify.html', {
                    'email': email,
                    'UO': UO,
                    'telefone': telefone,
                    'funcao': funcao,
                    'curso': curso,
                    'dep': dep,
                    "form": form,
                    'error4': error3,
                    "error1": error,
                    'me': me,
                    'id': id,
                    'nome': name,
                    'ano': ano,
                    'i': len(noti_not_checked(request)),
                    'not_checked': noti_not_checked(request),
                    'error5': error5
                })
    else:
        form = ModifyForm()
        email = Utilizador.objects.get(idutilizador=id).email
        telefone = Utilizador.objects.get(idutilizador=id).telefone
    UO = False
    dep = False
    ano = False
    curso = False
    funcao = False
    atual = datetime.now().year
    u = Utilizador.objects.get(pk=id)
    if Administrador.objects.filter(utilizador_idutilizador=id).exists():
        funcao = "Administardor"
        ano = year(u, atual)
    elif ProfessorUniversitario.objects.filter(
            utilizador_idutilizador=id).exists():
        funcao = "Docente Univesitario"
        depid = ProfessorUniversitario.objects.get(
            utilizador_idutilizador=id).departamento_iddepartamento
        dep = Departamento.objects.get(pk=depid.pk).nome
        UO = depid.unidade_organica_iduo.sigla
        ano = year(u, atual)
    elif Coordenador.objects.filter(utilizador_idutilizador=id).exists():
        funcao = "Coordenador"
        IDUO = Coordenador.objects.get(pk=id).unidade_organica_iduo
        UO = UnidadeOrganica.objects.get(pk=IDUO.pk).sigla
        ano = year(u, atual)
    elif Colaborador.objects.filter(utilizador_idutilizador=id).exists():
        funcao = "Colaborador"
        cursoid = Colaborador.objects.get(
            utilizador_idutilizador=id).curso_idcurso
        UO = Curso.objects.get(pk=cursoid.pk).unidade_organica_iduo.sigla
        ano = year(u, atual)
    elif Participante.objects.filter(utilizador_idutilizador=id).exists():
        funcao = "Participante"
        ano = year(u, atual)
    return render(
        request, 'profile_modify.html', {
            "form": form,
            'nome': name,
            'UO': UO,
            'email': email,
            "ano": ano,
            'telefone': telefone,
            'funcao': funcao,
            'ano': ano,
            'curso': curso,
            'dep': dep,
            "me": me,
            'id': id,
            'func': user(request),
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        })
def register(request):
    me = None
    #print("enter"+str(not('user_id' in request.session) and not('type' in request.session)))
    if 'user_id' in request.session and request.session['type'] != 4:
        context = {
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request)
        }
        return render(request, "not_for-u.html", context)
    elif ('user_id' in request.session) and ('type' in request.session):
        if request.session['type'] != 4:
            ontext = {
                'i': len(noti_not_checked(request)),
                'not_checked': noti_not_checked(request)
            }
            return render(request, "not_for-u.html", context)
    if 'user_id' in request.session:
        me = request.session['user_id']
    UOs = UnidadeOrganica.objects.all()
    deps = dep()
    cursos = curso()
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        data = request.POST
        form.is_valid()
        #print(data)
        #print(len(data['name'])>0)
        #print(len(data['email'])>0)
        #print(len(data['password1'])>0)
        #print(validateEmail(data['email']))
        #print(type_user(data,None))
        #print(request.POST['password1']==request.POST['password2'])
        #print(not Utilizador.objects.filter(email=request.POST['email']).exists())
        #print(not Utilizador.objects.filter(telefone=request.POST['telefone']).exists())
        #print(password_check(request.POST['password1']))
        print(request.POST)
        print(vefy(data))
        if data['funcao'] != '3' and data['funcao'] != '1':
            mutable = data._mutable
            data._mutable = True
            data['curso'] = '0'
            data['departamento'] = '0'
            data._mutable = mutable
        if vefy(data) and (
                len(data['name']) > 0 and len(data['name']) < 255
        ) and (len(data['email']) > 0 and len(data['email']) < 255) and (
                len(data['password1']) > 0
                and len(data['password1']) < 255) and validateEmail(
                    data['email']) and (
                        type_user(data, None, request) is True
                        or type_user(data, None, request)
                        == 4) and request.POST['password1'] == request.POST[
                            'password2'] and not Utilizador.objects.filter(
                                email=request.POST['email']).exists(
                                ) and password_check(
                                    request.POST['password1']) is True:
            form.save()
            user_id = Utilizador.objects.get(
                email=request.POST['email']).idutilizador
            type_user(data, user_id, request)
            if 'user_id' in request.session:
                validacoes(request, 1, user_id)
            messages.success(request, f'Registo efetuado com Sucesso!')
            return redirect('blog:blog-home')
        else:
            error = False
            error3 = False
            error2 = False
            error1 = False
            error5 = True
            error6 = True
            error7 = True
            if request.POST['email'] == "":
                error = 'Preencha este campo.'
            if request.POST['telefone'] == "":
                error3 = 'Preencha este campo.'
            if request.POST['password1'] == "":
                error1 = 'Preencha este campo.'
            if request.POST['password2'] == "":
                error2 = 'Preencha este campo.'
            if Utilizador.objects.filter(email=request.POST['email']).exists():
                error = "Email ja existe"
            elif not validateEmail(data['email']):
                error = "Formato do email errado."
            if request.POST['password1'] != request.POST['password2']:
                error2 = "Passwords nao coincidem"
            if password_check(request.POST['password1']) != True:
                error1 = password_check(request.POST['password1'])
            if data['UO'] == '0' and (data['funcao'] == '3' or data['funcao']
                                      == '2' or data['funcao'] == '1'):
                error5 = 'Preencha este campo'
            if data['curso'] == '0' and data['funcao'] == '1' or not (
                    vefy(data)):
                error6 = 'Campo mal preenchido/ Não preenchido'
            if data['departamento'] == '0' and data['funcao'] == '3' or not (
                    vefy(data)):
                error7 = 'Campo mal preenchido/ Não preenchido'
            return render(
                request, 'register.html', {
                    'me': me,
                    "func": user(request),
                    'form': form,
                    'cursos': cursos,
                    'UOs': UOs,
                    'deps': deps,
                    'error1': error,
                    'error2': error1,
                    'error3': error2,
                    'error4': error3,
                    'error5': type_user(data, None, request),
                    'i': len(noti_not_checked(request)),
                    'not_checked': noti_not_checked(request),
                    'p': 1,
                    'error5': error5,
                    'error6': error6,
                    'error7': error7
                })
    form = UserRegisterForm()
    return render(
        request, 'register.html', {
            'form': form,
            'UOs': UOs,
            'deps': deps,
            'cursos': cursos,
            "func": user(request),
            'me': me,
            'i': len(noti_not_checked(request)),
            'not_checked': noti_not_checked(request),
            'p': 1,
            'error5': True,
            'error6': True,
            'error7': True
        })