Descrição: Uma inspirada no sistema canvas de controle de atividades Canvas utilizado na Kenzie Academy. Podemos criar usuário com até 3 perfis, Estudante, Facilitador e Instrutor com permissões diferentes. Criar cursos e matricular estudantes, que podem submeter tarefas e terem essas avaliadas por supervisores.
- Tenha o Python instalado na sua máquina
- O banco de dados utilizado é o sqlite3, já instalado pelo django, não se preocupe com isso
1 - Após baixar esta aplicação usando o GIT CLONE do seguinte repositrório:
$ git clone https://gitlab.com/brunovcg/q4-s1-e2-kanvas
2 - Entre na pasta:
$ cd /Q4-S1-E1\ /-\ /Kanvas
3 - Inicie um ambiente virtual com o comando no terminal:
$ python -m venv venv
4 - Inicialize o ambiente virtual
$ source venv/bin/activate
5 - Instale as dependências do projeto com o comando:
$ pip install -r requirements.txt
(esse comando instalará o django e o djangorestframework)
6 - Rodar as migrations:
$ ./manage.py makemigrations
7 - Inicialize o servidor:
$ python manage.py runserver
Essa aplicação trata os erros permissão e autenticação, cursos e atividades com o mesmo nome, busca de usuarios, cursos, atividades ou submissões que não existem.
Quando faltar um token o seguinte erro é mostrado
{
"detail": "Invalid token."
}
Quando existe um token mas este não é de um dos tipos permitidos:
{
"detail": "You do not have permission to perform this action."
}
Permissão: Qualquer request, não necessita de token
os campos is_staff e is_superuser definem as permissões:
Estudante: is_staff = False and is_superuser = False Facilitador: is_staff = True and is_superuser = False Instrutor: is_staff = True and is_superuser = True
{
"username": "student",
"password": "1234",
"is_superuser": false,
"is_staff": false
}
{
"id": 1,
"username": "student",
"is_superuser": false,
"is_staff": false
}
{"user already exists"}
Permissão: Qualquer request, não necessita de token
{
"username": "student",
"password": "1234",
}
{
"token": "dfd384673e9127213de6116ca33257ce4aa203cf"
}
Esse token deve ser usado nas rotas que pedem autenticação e permissão, da seguinte maneira:
No HEADER da requisição:
KEY Value
Content-Type application/json
Authorization Token <digite_o_token>
Permissão: Instrutor
{
"name": "Node"
}
{
"id": 1,
"name": "Node",
"users": []
}
Se o nome do curso já existir
{"error': 'Course with this name already exists"}
Permissão: Instrutor
{
"name": "Node2"
}
{
"id": 1,
"name": "Node2",
"users": []
}
Se o curso não existir
{"error": "invalid course_id"}
Se o nome do curso já existir
{"error": "Course with this name already exists"}
PUT /api/courses/int:course_id/registrations/- atualizando a lista de estudantes matriculados em um curso
Esse endpoint vai receber "user_ids" que vai atualizar a lista corrente de alunos, ATENÇÃO, não é adicionado, mas a lista de alunos do curso passa a ser exatamente a lista passada, sobrescrevendo o que havia antes. Só usuários com ID de estudante podem ser matriculados
Permissão: Instrutor
{
"user_ids": [3, 4, 5]
}
{
"id": 1,
"name": "Node",
"users": [
{
"id": 3,
"username": "student1"
},
{
"id": 4,
"username": "student2"
},
{
"id": 5,
"username": "student3"
}
]
}
Quando algum usuário não for aluno:
{
"errors": "Only students can be enrolled in the course."
}
Quando o curso não existir na base:
{
"errors": "invalid course_id"
}
Quando algum aluno não existir na base:
{
"errors": "invalid user_id list"
}
Permissão: Qualquer request, não necessita de token
Não possui body
[
{
"id": 1,
"name": "Node",
"users": [
{
"id": 3,
"username": "student1"
}
]
},
{
"id": 2,
"name": "Django",
"users": []
},
{
"id": 3,
"name": "React",
"users": []
}
]
Permissão: Qualquer request, não necessita de token
Não tem body
GET /api/courses/1/ - endpoint exemplo
{
"id": 1,
"name": "Node",
"users": [
{
"id": 3,
"username": "student1"
}
]
}
Caso não haja courso com o ID no banco de
{
"errors": "invalid course_id"
}
Permissão: Instrutor
Não possui body
Endpoin EXEMPLO: DELETE /api/courses/1/
Sem contrúdo
Caso não haja courso com o ID no banco de
{
"errors": "invalid course_id"
}
Permissão: Instrutor
{
"title": "Kenzie Pet",
"points": 10
}
{
"id": 1,
"title": "Kenzie Pet",
"points": 10,
"submissions": []
}
{"error": "Activity with this name already exists"}
Permissão: Instrutor ou Facilitador
Sem Body
[
{
"id": 1,
"title": "Kenzie Pet",
"points": 10,
"submissions": [
{
"id": 1,
"grade": 10,
"repo": "http://gitlab.com/kenzie_pet",
"user_id": 3,
"activity_id": 1
}
]
},
{
"id": 2,
"title": "Kanvas",
"points": 10,
"submissions": [
{
"id": 2,
"grade": 8,
"repo": "http://gitlab.com/kanvas",
"user_id": 4,
"activity_id": 2
}
]
},
]
Permissão: Instrutor ou Facilitador
{
"title": "Kenzie Pet2",
"points": 11
}
{
"id": 1,
"title": "Kenzie Pet2",
"points": 11,
"submissions": []
}
{"error": "Activity with this name already exists"}
Permissão: Estudante
{
"grade": 10,
"repo": "http://gitlab.com/kenzie_pet"
}
obs: a grade sempre será criada como null pois não é o estudante que faz a avaliaão da nota.
{
"id": 7,
"grade": null,
"repo": "http://gitlab.com/kenzie_pet",
"user_id": 3,
"activity_id": 1
}
Permissão: Facilitador ou Instrutor
{
"grade": 10
}
{
"id": 3,
"grade": 10,
"repo": "http://gitlab.com/kenzie_pet",
"user_id": 3,
"activity_id": 1
}
Permissões - Estar logado
Esse endpoint terá a resposta de acordo com o token de que tipo de usuário está logado.
Caso seja Estudante, somente suas submissões serão exibidas, se for facilitador ou instrutor, todas serão.
Sem corpo
sendo o estudante 4 por exemplo:
[
{
"id": 2,
"grade": 8,
"repo": "http://gitlab.com/kanvas",
"user_id": 4,
"activity_id": 2
},
{
"id": 5,
"grade": null,
"repo": "http://gitlab.com/kmdb2",
"user_id": 4,
"activity_id": 1
}
]
sendo um porfessor ou facilitador:
[
{
"id": 1,
"grade": 10,
"repo": "http://gitlab.com/kenzie_pet",
"user_id": 3,
"activity_id": 1
},
{
"id": 2,
"grade": 8,
"repo": "http://gitlab.com/kanvas",
"user_id": 4,
"activity_id": 2
},
{
"id": 3,
"grade": 4,
"repo": "http://gitlab.com/kmdb",
"user_id": 5,
"activity_id": 3
},
{
"id": 4,
"grade": null,
"repo": "http://gitlab.com/kmdb2",
"user_id": 5,
"activity_id": 3
}
]