O ÆVALIS (Sistema de Avaliação Docente) é uma aplicação web desenvolvida em Django para o Instituto Federal de Mato Grosso (IFMT). O sistema permite a gestão completa e avaliação de desempenho de professores por alunos, seguindo a Resolução 87/2023 que regulamenta a avaliação de desempenho docente.
- Login SUAP OAuth2: Integração com o Sistema Unificado de Administração Pública do IFMT
- Login Tradicional: Suporte para usuários e senha convencionais
- Auto-login Inteligente: Detecta e autentica automaticamente usuários já cadastrados
- Sistema de Roles: Quatro perfis de usuário (Admin, Coordenador, Professor, Aluno) com permissões granulares
- Gerenciamento de Usuários: CRUD completo com controle de roles e perfis
- Cursos e Disciplinas: Administração da estrutura acadêmica
- Períodos Letivos: Controle de semestres e anos letivos
- Turmas: Gestão de turmas com professores e alunos matriculados
- Matrículas: Sistema de vínculo aluno-turma com controle de status
- Ciclos de Avaliação: Períodos configuráveis com datas de início e fim
- Questionários Personalizáveis: Criação de perguntas por categorias
- Avaliações Anônimas: Resposta de alunos sem identificação
- Relatórios por Professor: Visualização de médias e desempenho
- Soft Delete: Preservação de dados históricos mesmo após exclusão
- Notificações por Email: Lembretes automáticos sobre prazos de avaliação
- Configuração Flexível: Definição de dias antes do fim do ciclo para envio
- SendGrid Integration: Sistema de envio de emails em massa
- Design Responsivo: Interface adaptativa para desktop, tablet e mobile
- Branding Customizável: Sistema de marca com logos e cores personalizáveis
- Mensagens de Feedback: Sistema de notificações para ações do usuário
- WhiteNoise: Servir arquivos estáticos com compressão e cache
- Backend: Django 5.2.6 com Python 3.11.9
- Frontend: HTML5, CSS3, JavaScript (Vanilla) com templates Django
- Banco de Dados: PostgreSQL (produção via Vercel) / SQLite3 (desenvolvimento)
- Autenticação: Python Social Auth + Django Auth (dual authentication)
- Deploy: Vercel com Serverless Functions
- Static Files: WhiteNoise com manifest e compressão
- Email: SendGrid para notificações
Para informações detalhadas sobre instalação, configuração, deployment e práticas de desenvolvimento, consulte a pasta de documentação.
| Documento | Descrição |
|---|---|
| Setup Rápido | Guia de instalação e configuração inicial |
| Deploy Vercel | Instruções completas para deploy em produção |
| Gerenciamento de Roles | Manual de roles automáticas vs manuais |
| Arquivos Estáticos | Configuração e solução de problemas com assets |
| Sistema de Lembretes | Configuração de notificações por email |
| Estrutura de Testes | Guia completo sobre testes automatizados |
| Changelog Branding | Histórico de mudanças na identidade visual |
- Python 3.11.9+ (especificado em
runtime.txt) - pip (gerenciador de pacotes Python)
- Git
- PostgreSQL (produção) ou SQLite3 (desenvolvimento)
Crie um arquivo .env na raiz do projeto com as seguintes configurações:
# Django Core
SECRET_KEY=sua-chave-secreta-django-aqui
DEBUG=True
# Banco de Dados PostgreSQL (Produção)
DB_NAME=nome_do_banco
DB_USER=usuario_postgres
DB_PASSWORD=senha_postgres
DB_HOST=host_do_banco
DB_PORT=5432
# Autenticação SUAP OAuth2
SOCIAL_AUTH_SUAP_KEY=sua_chave_api_suap
SOCIAL_AUTH_SUAP_SECRET=seu_secret_api_suap
# Email (SendGrid) - Opcional
SENDGRID_API_KEY=sua_chave_sendgrid
DEFAULT_FROM_EMAIL=noreply@seudominio.com
ADMIN_EMAIL=admin@seudominio.com
# Branding (Opcional)
BRAND_ENABLE_NEW=True
⚠️ IMPORTANTE:
- Nunca commite o arquivo
.envno repositório!- Use
.env.examplecomo referência para as variáveis necessárias- Em produção, gere uma
SECRET_KEYcomplexa e segura
Não disponível neste projeto. Use a instalação manual abaixo.
git clone https://github.com/K6IK9/AeVALIS.SGAD.git
cd avaliacao_docente_suap# Linux/Mac
python3 -m venv .venv
source .venv/bin/activate
# Windows
python -m venv .venv
.venv\Scripts\activatepip install --upgrade pip
pip install -r requirements.txt# Copie o template de exemplo
cp .env.example .env
# Edite o .env com suas configurações
nano .env # ou use seu editor preferidopython manage.py makemigrations
python manage.py migratepython manage.py collectstatic --noinputpython manage.py createsuperuserForneça:
- Username (será usado para login)
- Email (opcional, mas recomendado)
- Password (mínimo 8 caracteres)
python manage.py runserver✅ O sistema estará disponível em: http://127.0.0.1:8000/
Para habilitar login com SUAP, você precisa:
-
Registrar aplicação no SUAP:
- Acesse o painel de desenvolvedores do SUAP IFMT
- Crie uma nova aplicação OAuth2
- Copie
Client IDeClient Secret
-
Configurar no
.env:SOCIAL_AUTH_SUAP_KEY=seu_client_id_aqui SOCIAL_AUTH_SUAP_SECRET=seu_client_secret_aqui
-
Configurar URL de callback:
- Desenvolvimento:
http://127.0.0.1:8000/complete/suap/ - Produção:
https://seudominio.com/complete/suap/
- Desenvolvimento:
Nota: Em desenvolvimento, certificados SSL são automaticamente desabilitados para conexões SUAP. NÃO USE EM PRODUÇÃO!
- URL:
http://127.0.0.1:8000/ - Login: Use credenciais do superusuário ou login SUAP (se configurado)
- URL:
http://127.0.0.1:8000/admin/ - Acesso: Apenas para superusuários
- Funcionalidades: Gerenciamento direto do banco de dados
- URL:
http://127.0.0.1:8000/admin-hub/ - Acesso: Usuários com role
adminoucoordenador - Funcionalidades: Interface amigável para gestão acadêmica
Após criar o superusuário, siga esta sequência para configurar o sistema:
- Nome completo do curso
- Sigla/código
- Modalidade (Técnico, Graduação, etc.)
- Nome da disciplina
- Código
- Vincular ao curso
- Carga horária
- Ano letivo
- Semestre (1 ou 2)
- Datas de início e fim
- Criar usuários com role
professor - Preencher perfil de professor (área de atuação, titulação, etc.)
- Vincular: Disciplina + Professor + Período
- Definir código da turma
- Configurar horários (opcional)
- Cadastrar alunos como usuários
- Vincular alunos às turmas específicas
- Definir status da matrícula (Ativo/Concluído/Trancado)
- Criar categorias de perguntas (Didática, Metodologia, Relacionamento, etc.)
- Adicionar perguntas vinculadas às categorias
- Definir ordem de exibição
- Definir período de vigência (data_inicio, data_fim)
- Vincular ao período letivo
- Ativar questionário padrão
- Acessar configurações do site
- Definir dias antes do fim do ciclo para lembrete
- Configurar método de envio (Email/Interface)
- Testar envio de emails
✅ Pronto! Com esses passos, o sistema estará pronto para que alunos respondam avaliações durante os ciclos ativos.
O projeto inclui scripts na pasta /scripts/ para auxiliar em tarefas específicas:
| Script | Função | Execução |
|---|---|---|
popular_banco_dados.py |
Popula banco com dados fictícios para testes | python -m scripts.popular_banco_dados |
atualizar_ciclos_encerrado.py |
Atualiza status de ciclos expirados | python -m scripts.atualizar_ciclos_encerrado |
validar_calculos_media.py |
Valida cálculos de média das avaliações | python -m scripts.validar_calculos_media |
auditoria_models.py |
Analisa estrutura de models e relacionamentos | python -m scripts.auditoria_models |
update_brand_titles.py |
Atualiza títulos de páginas com nova marca | python -m scripts.update_brand_titles |
Scripts exploratórios em /scripts/manual_tests/:
# Testar refatoração de turma
python -m scripts.manual_tests.test_refatoracao_turma
# Testar soft delete
python -m scripts.manual_tests.test_soft_delete💡 Dica: Execute
python -m scripts.popular_banco_dadosapós a configuração inicial para ter dados de teste no sistema!
avaliacao_docente_suap/
├── avaliacao_docente/ # App principal Django
│ ├── models/ # Models modularizados
│ │ ├── __init__.py # Exportações dos models
│ │ ├── base.py # BaseModel (classe base)
│ │ ├── mixins.py # Mixins reutilizáveis (Timestamp, SoftDelete, etc)
│ │ ├── managers.py # Custom managers (SoftDeleteManager)
│ │ ├── models_originais.py # Models concretos do sistema
│ │ └── lembretes.py # Models de notificações
│ ├── views.py # Views (CBV e FBV)
│ ├── forms.py # Formulários Django
│ ├── urls.py # URLs do app
│ ├── services.py # Lógica de negócio
│ ├── signals.py # Signals (pré/pós save)
│ ├── utils.py # Utilitários gerais
│ ├── auth_pipeline.py # Pipeline customizado OAuth2
│ ├── middleware.py # Middlewares (SocialAuth, Messages)
│ ├── enums.py # Enumerações (StatusMatricula, etc)
│ ├── templatetags/ # Custom template tags
│ ├── management/commands/ # Comandos customizados
│ ├── migrations/ # Migrações do banco
│ └── tests/ # Testes automatizados
│ ├── test_core.py # Testes principais
│ ├── test_abstracoes.py # Testes de mixins
│ └── test_refatoracao_turma.py
├── setup/ # Configurações Django
│ ├── settings.py # Settings principal
│ ├── urls.py # URLs raiz
│ ├── roles.py # Definição de roles
│ ├── brand.py # Context processor de branding
│ ├── wsgi.py # WSGI para produção
│ └── asgi.py # ASGI (async)
├── suap_backend/ # Backend OAuth2 SUAP
│ └── backends.py # Classe SuapOAuth2
├── templates/ # Templates globais
│ ├── registration/ # Login, logout
│ ├── avaliacoes/ # Templates de avaliação
│ ├── partials/ # Componentes reutilizáveis
│ └── *.html # Templates de CRUD
├── static/ # Assets fonte
│ ├── css/ # Estilos customizados
│ ├── js/ # Scripts JavaScript
│ └── assets/ # Imagens, logos, ícones
├── staticfiles/ # Arquivos coletados (gerado)
├── scripts/ # Scripts auxiliares
│ ├── popular_banco_dados.py
│ ├── atualizar_ciclos_encerrado.py
│ └── manual_tests/ # Testes exploratórios
├── docs/ # Documentação técnica
├── .env # Variáveis de ambiente (não commitado)
├── .env.example # Template de .env
├── requirements.txt # Dependências Python
├── runtime.txt # Versão Python para Vercel
├── vercel.json # Configuração Vercel
├── vercel-build.sh # Script de build Vercel
└── manage.py # CLI Django
# 🗄️ Banco de Dados
python manage.py makemigrations # Criar migrações
python manage.py migrate # Aplicar migrações
python manage.py showmigrations # Listar status de migrações
python manage.py dbshell # Shell do banco de dados
# 👤 Usuários
python manage.py createsuperuser # Criar superusuário
python manage.py changepassword <user> # Alterar senha de usuário
# 🧪 Testes
python manage.py test # Todos os testes
python manage.py test avaliacao_docente # Testes do app
python manage.py test avaliacao_docente.tests.test_core # Módulo específico
python manage.py test --verbosity=2 # Com mais detalhes
python manage.py test --keepdb # Reutilizar banco de teste
# 📁 Arquivos Estáticos
python manage.py collectstatic --noinput # Coletar para staticfiles/
python manage.py findstatic <arquivo> # Localizar arquivo estático
# 🔍 Desenvolvimento
python manage.py shell # Shell Python com Django
python manage.py shell_plus # Shell com models carregados (se django-extensions)
python manage.py runserver # Servidor desenvolvimento
python manage.py runserver 0.0.0.0:8000 # Acessível externamente
# 🛠️ Utilitários
python manage.py check # Verificar erros no projeto
python manage.py diffsettings # Comparar settings com padrão
python manage.py inspectdb # Gerar models a partir do DB
python manage.py sqlmigrate avaliacao_docente 0001 # Ver SQL de migração
# 📊 Scripts Customizados
python -m scripts.popular_banco_dados # Popular com dados de teste
python -m scripts.atualizar_ciclos_encerrado # Atualizar ciclos expirados- Django 5.2.6 - Framework web Python
- Python 3.11.9 - Linguagem de programação
- psycopg2-binary 2.9.10 - Driver PostgreSQL
- django-role-permissions 3.2.0 - Sistema de roles e permissões
- social-auth-app-django 5.4.2 - Autenticação social (OAuth2)
- social-auth-core 4.5.4 - Core do social auth
- python-decouple 3.8 - Gerenciamento de configurações/.env
- HTML5 - Estrutura semântica
- CSS3 - Estilos (Flexbox, Grid, Custom Properties)
- JavaScript (Vanilla) - Interatividade sem frameworks
- Font Awesome 6 - Ícones
- Google Fonts - Tipografia (Inter, Poppins)
- WhiteNoise 6.7.0 - Servir arquivos estáticos com compressão
- SendGrid 6.11.0 - Envio de emails transacionais
- Vercel - Plataforma de deploy serverless
- PostgreSQL - Banco de dados relacional (produção)
- SQLite3 - Banco de dados (desenvolvimento)
- Git - Controle de versão
- GitHub - Repositório remoto
- VSCode - Editor recomendado
- Python Black - Formatador de código (recomendado)
- Flake8 - Linter Python (recomendado)
O projeto inclui vários scripts úteis para instalação e diagnóstico:
| Script | Descrição | Uso |
|---|---|---|
setup_projeto.py |
Setup automático completo - Configura todo o projeto do zero | python setup_projeto.py |
diagnose_static.py |
Diagnóstico de arquivos estáticos - Identifica problemas com imagens/CSS | python diagnose_static.py |
setup_static_files.py |
Configuração específica de assets - Resolve problemas com arquivos estáticos | python setup_static_files.py |
Para primeira instalação:
python setup_projeto.pyPara problemas com imagens/CSS:
python diagnose_static.pyPara reconfigurar apenas arquivos estáticos:
python setup_static_files.py- docs/SETUP_RAPIDO.md: Instruções rápidas para instalação
- docs/STATIC_FILES_README.md: Documentação detalhada sobre arquivos estáticos
- Documentação completa: Todos os manuais e práticas de desenvolvimento
Se as imagens ou arquivos CSS/JS não estiverem carregando, siga estes passos:
python diagnose_static.pypython setup_static_files.py# Certifique-se de que estas configurações estão no settings.py:
import os
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# Para arquivos de mídia (uploads)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')python manage.py collectstatic --noinputNo arquivo setup/urls.py, certifique-se de que há:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# suas URLs aqui
]
# Adicionar estas linhas para servir arquivos estáticos em desenvolvimento
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)Certifique-se de que a estrutura está assim:
avaliacao_docente_novo/
├── static/
│ ├── css/
│ ├── js/
│ ├── images/
│ └── ...
├── media/ # Para uploads de usuários
└── staticfiles/ # Gerado pelo collectstatic
O projeto possui uma suíte completa de testes em avaliacao_docente/tests/:
- test_core.py: Testes principais de models, views, forms e integração
- test_abstracoes.py: Testes de mixins (SoftDelete, Timestamp, BaseModel)
- test_refatoracao_turma.py: Testes de regressão após refatoração
# Todos os testes do app
python manage.py test avaliacao_docente
# Módulo específico
python manage.py test avaliacao_docente.tests.test_core
# Com verbosidade aumentada
python manage.py test avaliacao_docente --verbosity=2
# Mantendo banco de dados de teste (acelera reruns)
python manage.py test --keepdb
# Testes paralelos (mais rápido)
python manage.py test --parallel=autoScripts exploratórios em /scripts/manual_tests/:
# Testar refatoração de turma
python -m scripts.manual_tests.test_refatoracao_turma
# Testar soft delete
python -m scripts.manual_tests.test_soft_deleteO projeto está configurado para deploy no Vercel com PostgreSQL:
-
Criar conta no Vercel
-
Importar repositório do GitHub
-
Configurar variáveis de ambiente:
- Adicionar todas as variáveis do
.env.example - Gerar nova
SECRET_KEYpara produção - Configurar credenciais do banco PostgreSQL
- Adicionar todas as variáveis do
-
Deploy automático:
git push origin main # Deploy automático via GitHub -
Executar migrações:
vercel env pull .env.vercel # Baixar variáveis de ambiente python manage.py migrate # Aplicar migrações
O arquivo vercel.json já está configurado:
{
"builds": [{
"src": "setup/wsgi.py",
"use": "@vercel/python",
"config": { "maxLambdaSize": "15mb", "runtime": "python3.11" }
}],
"routes": [{"src": "/(.*)", "dest": "setup/wsgi.py"}]
}-
DEBUG = Falseem produção -
ALLOWED_HOSTSconfigurado corretamente - Variáveis de ambiente definidas no Vercel
- Banco PostgreSQL provisionado
- SendGrid API Key configurada (se usar emails)
- SUAP OAuth2 credentials atualizadas com URL de produção
-
python manage.py collectstaticexecutado no build - Migrações aplicadas no banco de produção
📘 Documentação Completa: Veja docs/DEPLOY_VERCEL.md para instruções detalhadas.
- Fork o repositório
- Clone seu fork:
git clone https://github.com/seu-usuario/AeVALIS.SGAD.git
- Crie uma branch para sua feature:
git checkout -b feature/minha-feature
- Faça commit das mudanças:
git commit -m "feat: adiciona nova funcionalidade X" - Push para seu fork:
git push origin feature/minha-feature
- Abra um Pull Request no repositório original
Seguimos o padrão Conventional Commits:
feat:Nova funcionalidadefix:Correção de bugdocs:Atualização de documentaçãostyle:Formatação de códigorefactor:Refatoração sem mudança de funcionalidadetest:Adição ou correção de testeschore:Tarefas de manutenção
- Python: Seguir PEP 8
- Django: Seguir Django Coding Style
- Formatação: Use
black(recomendado) - Linting: Use
flake8oupylint - Docstrings: Formato Google ou NumPy
# Formatar código
black .
# Linting
flake8 avaliacao_docente setup
# Type checking (opcional)
mypy avaliacao_docente- Documentação Completa: /docs/README.md
- FAQ: /docs/SETUP_RAPIDO.md
- Abra uma Issue no GitHub
- Inclua: descrição do erro, steps to reproduce, ambiente (SO, Python, Django)
- Abra uma Issue de Feature Request
- Descreva o caso de uso e benefícios esperados
- Desenvolvedor Principal: K6IK9
- Instituição: Instituto Federal de Mato Grosso (IFMT)
Este projeto está sob a licença especificada no arquivo LICENSE.
Desenvolvido com ❤️ para o Instituto Federal de Mato Grosso
ÆVALIS - Sistema de Avaliação Docente