Skip to content

Commit

Permalink
task(api): atualiza o frontend com as novas informações salvas de cad…
Browse files Browse the repository at this point in the history
…a matéria na api (#125)

* fix(Users): Corrige o erro de troca de nome de usuario.

- Caso o usuario trocasse de nome no Google, o nome nao era salvo
e o usuario nao conseguia logar.

* fix(users-name-change): Os dados do usuário são sempre salvos após o login

* api(views): update function calling in search api

* db(migrations): install Trigram and pt_unaccent

* db_handler(search): create new search function

* test(db_handler): add test for new function

* api(views): throw error when insufficient chars

* api(tests): test for search api insufficient chars

* make(database): Cria comandos make para atualizar o banco de dados.

- Também foram corrigidos comentários no arquivo _updatedb.py_

* api(views): add rota de ano/período disponíveis

Co-authored-by: GabrielCastelo-31 <[email protected]>

* test(api): verifica retorno da rota ano/período

* db(migrations): update migrations

* db(models): update special_dates field

* api(web-scraping): update functions add intervals

* api(web-scraping): improve function complexity

* python(requirements): add Unidecode

* api(models): add unicode field to search improve

* api(views): apply admin search method to endpoint

* api(views): change name treatment to func

* api(views): update search api - improve user exp

* api(search-api-test): remove useless tests

* utils(db-handler): update similarity function

- also removes search by name function

* utils(db-handler): remove useless tests

* tests(year-period): add descrição ao teste

* apí(commands): rm chars especiais do html do sigaa

* api(mock): atualizando mock sem chars especiais

* api(utils): melhora o entendimento do código

* api(utils): cria func sep. p/start e end das datas

* api(utils): separa func start end em duas de index

* tests(setup.cfg): config codecov to ignore files

* tests(codecov): add codecov "no cover" to ignore

* Adiciona foto de perfil aos dados retornados.

* docs(update-api): Atualiza os endpoints da API
- Todos os endpoints sofrearam alterações

Co-authored-by: mateusvrs <[email protected]>

* main(readme): update README.md

Co-authored-by: mateusvrs <[email protected]>

* Update api/utils/web_scraping.py

Co-authored-by: Gabriel Henrique Castelo <[email protected]>

* Update api/utils/web_scraping.py

Co-authored-by: Gabriel Henrique Castelo <[email protected]>

* main(readme): remove embeds

* Corrige erro causado após correção de tipagem de retorno.

-Volta ao bc28e58

* Adiciona tipagem de retorno para funções de web scraping

* applying and mergin migrations

* fix(utils): get start e end index com return erro

* main(readme): fix repo redirects

* typo(tests): add pep8

* Revert "api(search): corrige experiência do usuário e adiciona verificações"

* Revert "Revert "api(search): corrige experiência do usuário e adiciona verificações""

* docs(redoc): cria documentação integrada com swagger (#124)

* python(requirements): adiciona drf_yasg

* docs(users): descreve view de registro c/swagger

* redoc(api): descreve views de search e year/period

* docs(urls): adiciona rota do redoc e swagger

* core(settings): swagger aos app django + rota 404

* api(templates): cria página 404 personalizada

* docs(api): customiza erros com classe específica

* docs(core): adiciona contribuidores ao docs da api

* docs(swagger): classe p/padrão de response erros

* docs(users): descreve view de login e logout

* docs(api): simplifica classe de erro swagger

* api(views): atualiza com novo método de filtragem

* test(users): erros de acordo com novo padrão

* test(config): no cover nos casos de except da docs

---------

Co-authored-by: GabrielCastello-31 <[email protected]>
Co-authored-by: Caio <[email protected]>
Co-authored-by: Gabriel Henrique Castelo <[email protected]>
  • Loading branch information
4 people authored Nov 28, 2023
1 parent d171621 commit 78aef57
Show file tree
Hide file tree
Showing 34 changed files with 949 additions and 1,767 deletions.
16 changes: 11 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

# Configuration
config: copy-env setup-env config-mock entrypoint-chmod
copy-env:
copy-env:
cp ./api/.env.example ./api/.env
cp ./web/.env.example ./web/.env.local

setup-env:
setup-env:
bash scripts/env.sh

config-mock:
Expand All @@ -24,7 +24,7 @@ install:
## Docker ##

start:
sudo docker compose up -d
sudo docker compose up -d

start-b:
sudo docker compose up --build -d
Expand All @@ -33,7 +33,7 @@ stop:
sudo docker compose down

stop-v:
sudo docker compose down -v
sudo docker compose down -v


## Django Shortcuts ##
Expand All @@ -42,7 +42,7 @@ stop-v:
test:
python3 scripts/test.py --clean

testfull:
testfull:
python3 scripts/test.py
sudo docker exec django-api coverage html
python3 scripts/report.py
Expand All @@ -57,3 +57,9 @@ makemigrations:

migrate:
sudo docker exec django-api python3 manage.py migrate

# Database Operations
updatedb-all:
sudo docker exec django-api python3 manage.py updatedb -a
deletedb-all:
sudo docker exec django-api python3 manage.py updatedb -d -a
121 changes: 111 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,52 @@
# Sua Grade UnB

O Sua Grade UnB é um projeto em desenvolvimento da matéria **Métodos de Desenvolvimento de Software**, a qual tem como objetivo auxiliar os alunos da Universidade de Brasília a montarem suas grades horárias de maneira fácil e intuitiva.
# [Sua Grade UnB](https://suagradeunb.com.br/)

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
[![codecov](https://codecov.io/gh/unb-mds/2023-2-Squad11/branch/main/graph/badge.svg?token=ZQZQZQZQZQ)](https://codecov.io/gh/unb-mds/2023-2-Squad11)
[![GitHub issues](https://img.shields.io/github/issues/unb-mds/2023-2-Squad11)]()
[![GitHub contributors](https://img.shields.io/github/contributors/unb-mds/2023-2-Squad11)]()
[![GitHub stars](https://img.shields.io/github/stars/unb-mds/2023-2-Squad11)]()
[![Hit Counter](https://views.whatilearened.today/views/github/unb-mds/2023-2-Squad11.svg)](https://views.whatilearened.today/views/github/unb-mds/2023-2-Squad11.svg)
</br>

[![Python version](https://img.shields.io/badge/python-3.11.6-blue)](https://www.python.org/downloads/release/python-3116/)
[![Django version](https://img.shields.io/badge/django-4.2.5-blue)](https://www.djangoproject.com/download/)
[![Node version](https://img.shields.io/badge/node-20.9.0-blue)](https://nodejs.org/en/download/)
[![npm version](https://img.shields.io/badge/npm-10.2.3-blue)](https://nodejs.org/en/download/)
[![Docker version](https://img.shields.io/badge/docker-24.0.7-blue)](https://docs.docker.com/engine/install/)
[![Docker Compose version](https://img.shields.io/badge/docker_compose-2.21.0-blue)](https://docs.docker.com/compose/install/)

O Sua Grade UnB é um projeto da matéria **Métodos de Desenvolvimento de Software**, a qual tem como objetivo auxiliar os alunos da Universidade de Brasília a montarem suas grades horárias de maneira fácil e intuitiva.

Com apenas alguns cliques, o aluno poderá montar sua grade horária de acordo com as matérias que deseja cursar. Além disso, o sistema auxiliará o aluno ao resolver os conflitos de horários entre as matérias escolhidas, retornando as melhores opções de horários de acordo com suas preferências.

O projeto é software livre e está sob a licença [MIT](./LICENSE).

## 📝 Sumário

- [Sua Grade UnB](#sua-grade-unb)
- [📝 Sumário](#-sumário)
- [👥 Equipe](#-equipe)
- [✨ Início](#-início)
- [📋 Pré-requisitos](#-pré-requisitos)
- [💻 Ambiente](#-ambiente)
- [📁 Dependências do projeto](#-dependências-do-projeto)
- [💾 Execução](#-execução)
- [✅ Autenticação do Google OAuth](#-autenticação-do-google-oauth)
- [🖱️ Acesso aos serviços](#-acesso-aos-serviços)
- [📍 Migrations](#-migrations)
- [📚 Documentação](#-documentação)
- [📎 Extra](#-extra)

## 👥 Equipe

| Nome | GitHub |
| :--- | :----: |
| Arthur Ribeiro e Sousa | [@artrsousa1](https://github.com/artrsousa1) |
| Caio Falcão Habibe Costa | [@CaioHabibe](https://github.com/CaioHabibe) |
| Caio Felipe Rocha Rodrigues| [@caio-felipee](https://github.com/caio-felipee) |
| Gabriel Henrique Castelo Costa | [@GabrielCastelo-31](https://github.com/GabrielCastelo-31) |
| Henrique Camelo Quenino | [@henriquecq](https://github.com/henriquecq) |
| Mateus Vieira Rocha da Silva | [@mateusvrs](https://github.com/mateusvrs) |

## ✨ Início

Expand All @@ -10,7 +56,7 @@ Você pode clonar o repositório do projeto com o seguinte comando:
git clone https://github.com/unb-mds/2023-2-Squad11.git
```

### Dependências globais
### 📋 Pré-requisitos

Para rodar o projeto, você precisa instalar as dependências globais, que são:

Expand All @@ -19,15 +65,15 @@ Para rodar o projeto, você precisa instalar as dependências globais, que são:
- Node v20.9.0 e NPM v10.1.0 (ou superior)
- Docker Engine v24.0.6 e Docker Compose v2.21.0 (ou superior)

### Ambiente
### 💻 Ambiente

Para configurar o ambiente, você pode rodar o seguinte script:

```bash
make config
```

### Dependências do projeto
### 📁 Dependências do projeto

Para instalar as dependências do projeto, você pode rodar os seguintes comando:

Expand All @@ -42,15 +88,15 @@ source env/bin/activate
make install
```

### Execução
### 💾 Execução

Para executar o projeto, você pode rodar o seguinte comando:

```bash
docker compose up
```

**Observações do Docker:**
#### Observações do Docker

```bash
# Se você quiser rodar em segundo plano
Expand All @@ -63,14 +109,69 @@ docker compose up --build
docker compose down -v
```

### Migrations
### ✅ Autenticação do Google OAuth

Para que o login com o Google funcione, é necessário trocar o `your_client_id` no arquivo `web/.env.local` pelo **Client ID** do projeto no Google Cloud.

1. Crie um projeto no [Google Cloud](https://console.cloud.google.com/).
2. Vá para a página de [Credenciais](https://console.cloud.google.com/apis/credentials) do projeto.
3. Clique em **Criar credenciais** e selecione **ID do cliente OAuth**.
4. Selecione **Aplicativo da Web**.
5. Adicione `http://localhost:3000` como **Origens JavaScript autorizadas** e **URIs de redirecionamento autorizadas**.
6. Copie o **Client ID** e cole no arquivo `web/.env.local` no lugar de `your_client_id`.

Após isto:

1. Vá para a página de [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent).
2. Selecione **Usuários externos** e clique em **Criar**.
3. Preencha os campos obrigatórios e clique em **Salvar e continuar**.
4. Na seção **Usuários de Teste** adicione o seu e-mail e clique em **Adicionar**.
5. Clique em **Salvar e continuar**.

Adicionando serviços:

1. Entre na aba **APIs e Serviços**.
2. Clique em **Ativar APIs e Serviços**.
3. Ative os seguintes serviços:
- IAM Service Account Credentials API
- Identity and Access Management (IAM) API


### 🖱️ Acesso aos serviços

| Serviço | URL |
| :--- | :----: |
| Frontend | [http://localhost:3000](http://localhost:3000) |
| Backend | [http://localhost:8000](http://localhost:8000) |

### 📍 Migrations

Migration é um recurso do Django que permite que você altere o modelo de dados do seu projeto. Portanto, sempre que você alterar o modelo de dados, você deve criar uma nova migration.

Para criar possíveis novas migrations, você pode rodar o seguinte comando:

```bash
python3 ./api/manage.py makemigrations --settings=core.settings.dev
# Crie as migrations
make makemigrations

# Execute as migrations
make migrate
```

## 📚 Documentação

A documentação do projeto pode ser encontrada clicando [aqui](https://unb-mds.github.io/2023-2-Squad11/).

## 📎 Extra

### Story Map e Activity Flow

- Para acessar o Story Map e o Activity Flow, clique [aqui](https://miro.com/app/board/uXjVNYnku7s=/?share_link_id=596015837126).

### Arquitetura

- Para acessar a arquitetura do projeto, clique [aqui](https://www.figma.com/file/ZhAq8LRcclpWHYi4XnUySw/Sua-Grade-UnB---System-Design?type=whiteboard&node-id=0%3A1&t=k46HHNk4NotrkTpX-1).

### Protótipo

- Para acessar o protótipo do projeto, clique [aqui](https://www.figma.com/proto/o5Ffh1fWmmQz7KcDGuHrVP/Sua-grade-UNB?type=design&node-id=16-2775&scaling=scale-down&page-id=0%3A1&mode=design&t=L5JwoVdZsjyLBGdb-1).
24 changes: 12 additions & 12 deletions api/api/management/commands/updatedb.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ def add_arguments(self, parser: CommandParser) -> None:
"""Adiciona os argumentos do comando."""
parser.add_argument('-a', '-all', action='store_true', dest='all', default=False,
help="Atualiza o banco de dados com as disciplinas dos períodos atual e seguinte.")
parser.add_argument('-p', '--period', action='store', default=None,

parser.add_argument('-p', '--period', action='store', default=None,
choices=[".".join(sessions.get_current_year_and_period()), ".".join(sessions.get_next_period())],
dest='period', help="Atualiza o banco de dados com as disciplinas do período especificado.")

Expand All @@ -35,27 +35,27 @@ def handle(self, *args: Any, **options: Any):
print("Nenhum período foi especificado.")
print("Utilize o comando 'updatedb -h' para mais informações.")
return
# Obtem o ano e o período atual e o ano e o período seguinte

# Obtem o ano e o período anterior ao período atual
previous_period_year, previous_period = sessions.get_previous_period()

# Apaga as disciplinas do período interior
# Apaga as disciplinas do período anterior
delete_all_departments_using_year_and_period(
year=previous_period_year, period=previous_period)

if options["delete"]:
for year, period in choices:
self.delete_period(year=year, period=period)
return

departments_ids = web_scraping.get_list_of_departments()

if departments_ids is None:
self.display_error_message("department_ids")
return

print("Atualizando o banco de dados...")

for year, period in choices:
start_time = time()
self.update_departments(departments_ids=departments_ids, year=year, period=period)
Expand All @@ -68,14 +68,14 @@ def update_departments(self, departments_ids: list, year: str, period: str) -> N
department_id=department_id, current_year=year, current_period=period)
department = get_or_create_department(
code=department_id, year=year, period=period)

# Para cada disciplina do período atual, deleta as turmas previamente cadastradas e cadastra novas turmas no banco de dados
for discipline_code in disciplines_list:
classes_info = disciplines_list[discipline_code]
# Cria ou pega a disciplina
discipline = get_or_create_discipline(
name=classes_info[0]["name"], code=discipline_code, department=department)

# Deleta as turmas previamente cadastradas
delete_classes_from_discipline(discipline=discipline)

Expand Down Expand Up @@ -104,5 +104,5 @@ def display_success_update_message(self, operation: str, start_time: float) -> N

def display_success_delete_message(self, operation: str, start_time: float) -> None:
print("Operação de remoção do banco de dados realizada com sucesso.")
print(f"Sucesso em {operation}")
print(f"Tempo de execução: {(time() - start_time):.1f}s\n")
print(f"Sucesso em {operation}")
print(f"Tempo de execução: {(time() - start_time):.1f}s\n")
19 changes: 19 additions & 0 deletions api/api/migrations/0004_alter_class_special_dates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.5 on 2023-11-27 15:05

import django.contrib.postgres.fields
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0003_remove_class_workload_class_special_dates_and_more'),
]

operations = [
migrations.AlterField(
model_name='class',
name='special_dates',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=256), size=3), default=list, size=None),
),
]
22 changes: 22 additions & 0 deletions api/api/migrations/0004_auto_20231126_1740.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.5 on 2023-11-26 20:40

from django.db import migrations
from django.contrib.postgres.operations import CreateExtension

class Migration(migrations.Migration):

dependencies = [
('api', '0003_remove_class_workload_class_special_dates_and_more'),
]

operations = [
CreateExtension("pg_trgm"),
migrations.RunSQL(
"CREATE TEXT SEARCH CONFIGURATION portuguese_unaccent( COPY = portuguese );"
),
migrations.RunSQL(
"ALTER TEXT SEARCH CONFIGURATION portuguese_unaccent "
+ "ALTER MAPPING FOR hword, hword_part, word "
+ "WITH unaccent, portuguese_stem;"
)
]
18 changes: 18 additions & 0 deletions api/api/migrations/0005_discipline_unicode_name.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.5 on 2023-11-27 18:02

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0004_auto_20231126_1740'),
]

operations = [
migrations.AddField(
model_name='discipline',
name='unicode_name',
field=models.CharField(default='', max_length=128),
),
]
14 changes: 14 additions & 0 deletions api/api/migrations/0006_merge_20231127_2255.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 4.2.5 on 2023-11-28 01:55

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0004_alter_class_special_dates'),
('api', '0005_discipline_unicode_name'),
]

operations = [
]
Loading

0 comments on commit 78aef57

Please sign in to comment.