Closed JoaoFelipe closed 3 years ago
Eu acho que apenas o CPF e data de nascimento devem ser suficientes. Eu nem colocaria naturalidade, pq não é um campo obrigatório no SAPOS. Acho que para alunos avulsos isso não é preenchido (aqui temos que ter cuidado, pq aluno avulso não deveria poder emitir declaração de aluno regularmente matriculado). A data de nascimento tb não é obrigatória -- teríamos que mudar isso e fazer com que fosse obrigatória no cadastro de students no SAPOS.
Oi pessoal,
A associação entre user e student não poderia ser automática? Ao contrário dos professores, potencialmente, todos os alunos terão que entrar no sistema. Poderia até, idealmente, ser gerado um e-mail automático de boas-vindas explicando como acessar e como gerar a senha (no estilo id.uff, que pergunta alguns dados do usuário). Digo isso para reduzir o trabalho da secretaria, que já tem que lançar todos os alunos no sistema.
Com relação aos avulsos, especiais e regulares, acho que seria interessante a gente poder marcar isso no sistema. No momento, o avulso não tem matrícula UFF, mas o especial e o regular têm. Mas para o especial, não pode ser gerada a declaração de regularmente matriculado como aluno regular, mas sim como aluno especial.
Sobre o pedido de banca, em alguns programas ele é feito pelo aluno, mas em outros é feito pelo orientador. Acho que esse ponto deveria ser configurável no sistema.
Ainda sobre o painel dos alunos, se não for muito complexo, talvez fosse legal ter algum tipo de visualização que mostrasse o que eles já fizeram e o que falta. A maior parte das dúvidas que a gente recebe (de alunos e professores) são sobre prazo final e se já cumpriu ou não todos os créditos e requisitos. Se isso estivesse disponível para alunos, professores e secretaria, acredito que deixaria a vida de todos mais fácil.
Seguindo a sugestão da Natália, vou propor aqui um design diferente para vcs avaliarem. Vejo duas situações que precisamos cobrir:
Os alunos atuais que são tuplas de Student: nesse caso, poderíamos fazer uma rotina que cria automaticamente um User usando o e-mail cadastrado em Student, desde que esse seja do tipo Regular (será que todos os programas usam essa mesma classificação de tipos?). Com o user criado, poderíamos disparar o procedimento de troca de senha, que se não me engano acontece quando criamos um User do zero.
Os novos alunos: no momento de criação do aluno, o respectivo user poderia ser criado, caso o aluno seja regular, seguindo a mesma filosofia acima.
Note que esse procedimento número 2 poderia ser pensado também para professor, já que hoje temos que criar na mão o professor, o user e vincular ambos. Só que, assim como Student, o Professor tb precisa ser de um tipo específico (credenciado?) para poder ter acesso ao Sapos. Caso achem arriscado esse procedimento automático de criar User quando o Student/Professor é criado, uma alternativa seria ter um botão em Student/Professor para criar o User, caso ele não existe. Outra alternativa seria uma página de solicitação. Mas acho que não precisaria confirmar dados pessoais, já que o e-mail para cadastrar senha vai para o e-mail cadastrado em Student, então não vejo muita possibilidade de fraude.
Essa discussão de tipo de aluno é válida nessa issue e na issue #348. Acho que no tipo de aluno poderia ter uma flag para indicar se aquele tipo deve ou não ter acesso ao sistema (essa issue). Além disso, lá nas declarações também poderíamos pensar em configurar se aquela declaração é restrita a um tipo específico.
Legal o comentário da @nataliacfUFF sobre indicar quais papéis estão autorizados a fazer quais pedidos. Talvez uma primeira implementação poderia aceitar qq um e depois poderíamos refinar para isso. Mas talvez fosse melhor migrarmos essa discussão para a issue #351.
Essa ideia final da @nataliacfUFF poderia se tornar uma issue por si só. Algo que mostrasse todas as etapas e prorrogações e indicasse o que já foi feito e o que ainda não. Bem legal a ideia. Só precisaríamos depois priorizar essa issue frente às demais.
Também acho legal a ideia de fazer automaticamente dos Students atuais e da forma sugerida por Leo, disparando um e-mail de redefinição de senha. Para novos alunos, essa forma que o Leo sugeriu também me parece ser boa.
A ideia de ter um portal diferente para os alunos é interessante.
Sobre os dados: Geralmente CPF é o suficiente. Acho que nem data de nascimento seja necessário. Porém, e para os alunos que não tem CPF? Ou seja, os estrangeiros? Todos os alunos tem email do iduff? Isso seria interessante para os estrangeiros, onde poderia usar o @iduff em vez do cpf para fazer login.
Pensando no cadastro de professores, já que foi mencionado, será que não poderia ter uma tabela de "credenciamento" que automaticamente seria usada para vincular o User (do professor) a Professor credenciado? Assim, a secretária só precisaria atualizar essa tabela (inserir/remover Users dela) para ajustar os professores credenciados.
Sobre tipos de user, então pelo que entendi, teriamos: Students, Avulso (Loose?), Professor.
O controle de acesso no Sapos é feito pela lib devise. O username é o e-mail.
Já existe uma entidade que representa o credenciamento (https://github.com/gems-uff/sapos/blob/master/app/models/advisement_authorization.rb). Ela poderia ser usada sim para controle de acesso. Ou seja, só deixar logar um user do tipo professor que esteja credenciado. É isso, @Kohwalter ?
User tem vários outros tipos (Role), que não são mapeados a entidades do Sapos, como, por exemplo, admin, coordenador, secretaria, suporte. Usamos a lib cancancan para definir as permissões de um User em função do seu tipo. Aqui é que configuramos a permissão de cada Role: https://github.com/gems-uff/sapos/blob/master/app/models/ability.rb.
A propósito, @JoaoFelipe , apesar de eu ter gostado de termos uma interface própria para users do tipo Student, pense bem sobre isso. Será que não é mais fácil usar o ActiveScaffold e mostrar só o que eles podem ver/editar. Possivelmente não, mas quis falar isso aqui para vc refletir.
Isso mesmo, @leomurta.
Nessa sugestão de associar automaticamente Student a User e disparar emails de recuperação de senha para alunos específicos, fiquei pensando na issue #350 (que acabei de renomear de "evento" para "ação") e na infrastrutura de notificações/consultas complexas.
Que tal algo assim:
A consulta do passo 2 também poderia usar o sistema de notificação, mas sem notificação: apenas ser realizada periodicamente para criar a associação automaticamente.
Além disso, com a issue #350 completa, o sistema de ações poderia colocar um botão na interface de alunos e professores para a criação "manual" do usuário quando não satisfizesse a configuração da consulta do passo 2.
@JoaoFelipe , mas será que não podemos encarar essa situação como uma migração ao invés de uma funcionalidade? Isso só será necessário para os programas que já estão usando o Sapos e só será rodado uma vez, para criar os usuários dos alunos vigentes. Quem começar depois não vai ter aluno para migrar em lote. Falo isso pq acho que seria muito mais simples termos um script para fazer isso do que tudo isso que vc comentou, não?
No mais, acho que esse estado especial já é esperado na gem devise, para usuários recém-criados. Dá uma conferida.
Pode ser uma migração sim e realmente seria bem mais fácil de fazer. Talvez só fique mais amarrado na hora de configurar. Em relação ao devise, vi agora que ele tem um campo confirmed_at que começa como nulo e serve para isso.
Então a proposta agora é:
rake sapos:alunos-usuarios
talvez) que verifique quais alunos desses tipos não possuem usuário associado, crie e mande um email de troca de senha/confirmação. (a alternativa é colocar em uma migration, mas ficaria meio complicado pedir para migrarem para uma versão intermediária, configurar o campo certo e só então ir para a versão mais nova que executa essa migration automática). A dificuldade aqui é mandar o email com o link certo. Existe alguma variável que indica qual é a url do servidor?Não temos variável que indique a URL do servidor, mas não sei se o Rails não tem uma forma de extrair isso... pode ser que tenha. @Carlos-Eduardo-Cabral-da-Cunha, você sabe?
Se o comando fosse feito pelo site (com a sugestão anterior de ação, por exemplo), isso poderia ser extraído da requisição. O problema é que executando como um comando externo de migração, o comando não tem como saber essa URL. A não ser que passe como argumento, mas acho que seria melhor ter uma variável configurada pra isso.
@JoaoFelipe , eu hoje rodo scripts no rails com o comando bundle exec rails runner script.rb
. Não sei se esse rake sapos:alunos-usuarios
daria no mesmo. Não acho que migration (no sentido de migração de BD) seja o caminho, pois o programa pode não querer dar acesso aos usuários. Isso só estaria lá para facilitar a vida de quem quer. Caso contrário, seria necessário criar o usuário e indicar o respectivo aluno para cada aluno.
Mas vendo essa discussão do link, outra alternativa é colocar na aba Configurações/Usuários um botão para criação de usuários em lote. Seria basicamente igual ao script, mas disparado pela interface. Lá poderíamos primeiro listar todos os alunos/professores credenciados que estão sem usuários com uma checkbox do lado e uma opção de select/deselect all. No final, um botão de "criar". O que acha?
A criação só deve ser feita para alunos com matriculas ativas, certo?
Sim!
@JoaoFelipe @braganholo , será que podemos afirmar isso? Será que essa decisão não poderia ser tomada por quem for rodar a criação de usuários em lote? Talvez usar a própria interface de consulta para, filtrar e ter um botão de "criar usuários" (já tem isso no sapos para matrícula e bolsa. A partir de uma busca se pode gerar um relatório. Nesse caso, seria gerar usuários)? Digo isso pois se vamos deixar os alunos tirarem declarações ou históricos, pode ser interessante permitir usuários inativos terem acesso, para aliviar as solicitações que chegam na secretaria.
Só precisaria conseguir perceber quais alunos da lista que ainda não tem usuário para gerar só para esses, obviamente. Mas me parece a saída mais flexível (e fácil) discutida até agora.
Realmente fica bem mais simples dessa forma. Só cuidado para que esse botão esteja disponível apenas para usuários do tipo admin.
Me parece uma boa saída. Onde ficaria esse filtro?
Alternativas:
1- Tela Users. Vantagem: já comecei a fazer a versão anterior lá. Desvantagem: teria que implementar filtro do zero lá e daria mais trabalho. O processo ficaria: clicar em "criar para alunos", apareceria um form com uma tabela com todos alunos sem usuário; usar filtros nessa lista; clicar em "criar".
2- Tela Enrollments. Vantagem: dá pra usar a busca que já existe lá e só adicionar campo na busca avançada para verificar "sem usuário". Desvantagem: um aluno pode ter mais de uma matrícula e tenho que ver como fazer a restrição pro botão só aparecer pra admin. Talvez a solução fosse: fazer a busca, clicar em "criar usuário", que mostraria a lista de alunos para selecionar com base no resultado da busca. E depois clicar em "criar" para criar os usuários.
3- Tela Students. Vantagem: existe a garantia de não ter repetição. Desvantagem: a busca existente é mais simples e teria que implementar um tipo de busca avançada (o que não é difícil, considerando que já existe uma pronta). O processo seria o mesmo que o anterior.
4- Cópia de tela students disponível apenas para admin. Vantagem: mesma vantagem anterior, restrição possivelmente mais fácil e daria pra ver a possibilidade de colocar um checkbox do lado de cada registro para já usar o próprio resultado do active scaffold para filtrar. Desvantagem: não sei se o active scaffold suporta isso. O processo seria: fazer a busca (ou não), selecionar os alunos desejados na interface do active scaffold e clicar em "criar usuário".
Quando falei “filtrar”, pensei nos critérios de busca que já existem em enrollment. A pessoa faria a busca que quisesse. Ao final, clicaria em “criar usuários”. Nós iteraríamos por todos os resultados, pegando o respectivo aluno e vendo se ele já tem usuário. Se não tem, cria. Ao final, poderia informar quantos usuários foram criados, quantos já existiam, etc.
Isso que eu falei parece ser próximo da solução 2 citada na sua mensagem. Eu tb gostei da solução 3, mas acho que uma busca em aluno será mais pobre, já que algumas coisas como nível, estar ativo ou não, etc. pertence à matrícula. Então meu voto vai para fazer em matrícula, da forma simplificada que eu falei, sem ter que listar alunos e selecionar.
Eu também prefiro a segunda opção sem ter que selecionar aluno por aluno, conforme Léo mencionou.
Não temos variável que indique a URL do servidor, mas não sei se o Rails não tem uma forma de extrair isso... pode ser que tenha. @Carlos-Eduardo-Cabral-da-Cunha, você sabe?
Usei um comando root_url que cria um url absoluto na issue #313. Pelo que entendi, o Rails usa uma rota root definida em config/routes.rb e cria um helper adicionando "_url". Testei no ambiente de desenvolvimento, não sei ainda como se comporta em produção.
Acho que terminei a issue. Está funcionando da seguinte forma:
ATENÇÃO: esse email é enviado direto pela gem DeviseInvitable e a variável redirect_email
não tem efeito nenhum. Cuidado ao homologar para não enviar emails a alunos antes do tempo. Se acharem melhor, eu posso tentar ver se tem como configurar o envio para usar essa variável, mas a princípio não dediquei tempo a isso
O template deste email é definido pela variável account_email
em erb. A interface de variável não tem um editor bom para isso, e ela basicamente tem que usar duas coisas: @resource
que é o objeto user e accept_invitation_url(@resource, invitation_token: @token)
que retorna a URL de aceitação do convite.
Após a conta ser criada dessa forma, se o aluno perder o email de convite, ainda dá para entrar/criar senha na opção de resetar senha.
Ao clicar na ação, ela abre esse pequeno formulário que mostra para a visão atual (sujeita a condições de busca) qual é a quantidade de matrículas (6 linhas da tabela), qual é a quantidade de alunos dessas matrículas (5, já que 1 possui duas matrículas), quantos alunos já possuem usuários (0), quantos alunos não possuem email (1), e um combobox para escolher o que deseja adicionar com duas opções:
No caso, a restrição que está impedindo a inserção da aluna "Carol" é o tipo de matrícula "Avulso". Além dessa restrição, existe a restrição de matrículas desligadas
Ao clicar em "Adicionar", o sistema cria usuários para cada aluno e envia o email de convite (do item 2).
Além dessa funcionalidade, usuários criados desta forma ficam associados a alunos e existem restrições para não deixar um aluno ter mais de um usuário e vice versa. Não consegui fazer testes automatizados para essa parte e usei apenas o que já estava feito para usuário de professor. Aparentemente o active scaffold deixa criar usuário com o relacionamento "inválido" (repetir aluno, por exemplo) pela interface, mas esse relacionamente não fica salvo (porém ele também não dá nenhuma mensagem de erro). A restrição funciona e mostra mensagem de erro ao tentar editar usuário. Fiquei algumas horas tentando corrigir isso agora, mas não consegui... Não me parece um problema muito relevante, então vou seguir para a próxima issue.
@Carlos-Eduardo-Cabral-da-Cunha Pode olhar o código no branch feature_student_access
@JoaoFelipe , excelente trabalho. Muito obrigado. Alguns pontos:
redirect_email
, tenho a impressão que seria importante para podermos testar em homologação com tranquilidade. Será que é muito difícil? Sem ele, testar a criação de um usuário não seria problemático, mas testar a migração de vários em lote seria. Além disso, tenho medo de no futuro esquecermos e acabarmos mandando um monte de e-mails para os usuários.Concordo com o Leo. Os pontos 2 e 4 são bem importantes. Acho que a opção de retirar os alunos inválidos da jogada é boa. Aí deixaria só as opções de alunos válidos e alunos válidos, incluindo desligados.
Fiz 2 e 3. Vou deixar o 4 para mais tarde/amanhã
Pronto
Agora a bola está com o @Carlos-Eduardo-Cabral-da-Cunha . Quando eu puder prosseguir, avisem!
Oi pessoal,
Essa questão dos inválidos é importante... O que foi considerado como válido? Regulares e especiais?
Abs,
Natalia
Em ter, 10 de ago de 2021 13:35, Leonardo Gresta Paulino Murta < @.***> escreveu:
Agora a bola está com o @Carlos-Eduardo-Cabral-da-Cunha https://github.com/Carlos-Eduardo-Cabral-da-Cunha . Quando eu puder prosseguir, avisem!
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/gems-uff/sapos/issues/346#issuecomment-896134086, or unsubscribe https://github.com/notifications/unsubscribe-auth/AU6PTJB7XLAZGALBRMT4IK3T4FIMHANCNFSM5A52E35Q . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&utm_campaign=notification-email .
Oi Natália. Nós deixamos isso configurável, então lá no cadastro de tipo de alunos será possível escolher se aquele tipo de aluno vai ou não ter usuário associado. Os inválidos então são os alunos de tipos que não estão configurados para serem vinculados a usuários. Tem um comentário do João Felipe com um protótipo dessa tela postado há 2 dias.
Oi Pessoal. Vou baixar para minha máquina para rodar a funcionalidade.
Agora a bola está com o @Carlos-Eduardo-Cabral-da-Cunha . Quando eu puder prosseguir, avisem!
Funcionou em meu ambiente de desenvolvimento. Fiz alguns testes das funcionalidades e parecem estar ok para teste em homologação. A gem letter_opener_web que o João Felipe instalou ajudou bastante nos testes que enviam emails.
Fiz alguns testes:
Não consegui reproduzir esse ultimo erro aqui, mas encontrei uma possível solução ( https://stackoverflow.com/questions/15486218/how-to-avoid-devise-invitable-from-sending-a-confirmation-email) e já fiz um commit com ela. Verifiquei aqui e tanto convite de matrícula quanto confirmação na criação de usuário continua funcionando. Pode colocar o master em homologação outra vez
João Felipe
Em qua., 18 de ago. de 2021 às 10:36, Vanessa Braganholo < @.***> escreveu:
Fiz alguns testes:
- coloquei primeiro o redirect email e aí criei um tipo de matrícula que tem usuário associado, criei uma matrícula desse tipo para o João Felipe, mas não recebi o email referente à criação do usuário, e ele também não recebeu. Depois descobri que ele já tinha um usuário associado ao email cadastrado em student, como admin em staging. Aí deu o erro que ele menciona ali acima que não pode ter o mesmo usuário associado a 2 papéis diferentes, e não dá mensagem de erro, então OK (caso raro de acontecer)
- quando a matrícula que está associada ao usuário é apagada, o usuário não é apagado. João disse que não dá pra fazer um cascading direto pq o relacionamento do usuário é com student e não com matricula. Isso é pouco prioritário, pois na prática a chance de alguém apagar uma matrícula em produção é quase NULA, mas de qq maneira vou documentar isso numa issue nova sem prioridade.
- quando o email do aluno é atualizado no SAPOS, o email vinculado ao usuário não atualiza também. Não acho que deveria, mas acho importante deixar isso registrado no manual do SAPOS.
- usei a opção de criar usuários na tela de matrícula de duas formas diferentes, e em ambas ocorreu um comportamento estranho.
- Peguei duas matrículas existentes e mudei o tipo delas para um tipo que tem usuário vinculado. Depois efetuei a migração usando a opção na tela de matrícula. Os emails que chegaram para esses dois alunos foram diferentes: Um veio como "Instruções para confirmação" e outro veio como "Novo usuário no SAPOS". Não entendi o pq dessa diferença, e o email de "Instrução para confirmação" causa confusão, pois ele nem menciona o SAPOS. O aluno não vai entender porque recebeu aquela mensagem. O ideal seria todos receberem "Novo usuário no SAPOS".
- Criei um tipo novo de matrícula, sem usuário vinculado, depois vinculei dois alunos a esse tipo, depois voltei no cadastro do tipo e mudei para ter usuário vinculado. Aí usei a opção de migração na tela de matrícula. Ocorreu o mesmo que havia ocorrido no teste anterior: cada aluno recebeu um email diferente. Um veio como "Instruções para confirmação" e outro veio como "Novo usuário no SAPOS".
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/gems-uff/sapos/issues/346#issuecomment-901121445, or unsubscribe https://github.com/notifications/unsubscribe-auth/AACQA3IGS3LH62TV4IRNEN3T5OZN7ANCNFSM5A52E35Q . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&utm_campaign=notification-email .
Já coloquei em homologação. Podem testar.
Fiz alguns testes em homologação e peguei os seguintes problemas:
@JoaoFelipe , talvez o ideal seja, depois que vc fizer a nova versão e eu colocar em homologação, vc testar lá, pois assim vc vai conseguir perceber essas coisas.
Comecei tentando resolver a (1) usando o mesmo email para confirmação e para convite. Não deu certo, pois o link de confirmação não abre a página com senha. Nessa tentativa, fiz o cherry-pick dos commits da issue #358. Então essa parte também foi para o master e deve ser homologada. A #358 está bem avançada e tem a funcionalidade principal funcionando, mas não está exatamente completa, então quebrei ela também em outra issue (#360)
Alias, percebi agora que ainda tenho que fazer uns ajustes para a #348. Devo terminar em 1h. Aviso quando terminar e puder colocar em homologação.
Pode colocar em homologação
Coloquei em homologação. Vc topa dar uma passada antes de mim? Assim, se tiver algum problema vc conseguirá ver diretamente.
Ok, vou passar
Parece ter funcionado! (tanto essa como #358)
Obrigado @JoaoFelipe . Já lancei a feature. Por favor, pegue a info que vc detalhou aqui e coloque no manual. Obrigado.
Atualmente o SAPOS está restrito a coordenação, secretaria, professores e suporte. Seria interessante dar acesso a alunos para que possam realizar automaticamente diversas atividades como inscrição em disciplinas, geração de declarações (histórico, regularidade da matrícula), pedido de banca e prorrogação e alteração de cadastro.
Esta issue tratará apenas da permissão de acesso a alunos. Outras issues serão criadas para cada uma dessas atividades.
Na versão atual do SAPOS, temos alunos cadastrados em Student e temos usuários do sistema cadastrados em User. Para esta issue, proponho a criação de uma página de cadastro de User que peça email, CPF, data de nascimento e naturalidade (cidade) e senha para a criação de um User que possa fazer login no sistema.
Ao preencher o cadastro, o sistema deve verificar se as informações cadastradas estão de acordo com as informações cadastradas em Student. Um email de verificação deve ser enviado.
Dúvidas: Será que vale a pena incluir nome também na verificação? Como pode ter variações na escrita (letra maiuscula, acento, nome sem um dos sobrenomes), penso que pode acabar atrapalhando. Algum outro campo deve ser incluido?
Ao fazer o cadastro, o acesso dos alunos deve ser feito a uma página diferente da visão padrão do SAPOS. Alunos não poderão ter acesso a nenhuma funcionalidade de controle.
Para esta issue, a página de aluno deverá apenas exibir suas informações pessoais e permitir trocar a senha de usuário.