API simples de demonstração usando Django Rest Framework.
- Python 3.12
O ambiente de desenvolvimento foi montado utilizando poetry (https://python-poetry.org).
-
Acessar o folder onde foi baixado.
poetry install poetry shell
-
Se não tiver o poetry instalado e preferir usar o virtualvenv de forma manual:
python3 -m venv venv source venv/bin/activate (Mac/Linux) venv/Scripts/activate.bat (Windows) pip install -r agro_requirements.xtx
-
Copiar o arquivo .env.modelo para .env e ajustar o ambiente para o banco de dados. O default é usar sqlite no proprio folder do projeto (dn.sqlite3)
-
Criar as tabelas de banco de dados iniciais
python manage.py migrate
-
Opcionalmente, criar um usuário para acessar o admin do django
python manage.py createsuperuser
-
Foi criado um comando para gerar registros fake para testar:
python manage.py fake_data
cada chamada desse comando vai criar 10 fazendas com culturas aleatórias.
-
Iniciar o serviço
python manage.py runserver
Escuta a porta 8000 no protocolo HTTP. Para encerrá-lo digitar CTRL-C
Com o serviço rodando já pode chamar os endpoints criados. Para auxiliar nos testes usando Postman, importar a collection e ambientes incluidos no folder postman na raiz do projeto.
POST /api/query/
com o corpo:
{
"cidade": "",
"uf": "",
"culturas": "Cana,Café"
}
- cidade: Nome da cidade para filtrar a lista de fazendas
- uf: Estado para filtar a lista de fazendas
- culturas: Lista de culturas seperadas por "," para fitrar a lista de fazenas.
As culturas podem ser: Soja, Milho, Algodão, Café e Cana.
Qualquer parâmetro em branco ou não informado defativa o filtro por ele.
POST /api/cria_fazenda/
com o corpo no padrão:
{
"codigo": "07346324870",
"nome_fazenda": "Aurora",
"nome_produtor": "Gonçalo",
"cidade": "Ribeirão Preto",
"uf": "SP",
"area_total": 300,
"area_vegetacao": 80,
"area_cultura": 200,
"culturas": [
{
"cultura": "Soja",
"area": 100
},
{
"cultura": "Cana",
"area": 30
},
{
"cultura": "Algodão",
"area": 40
}
]
}
Vai criar uma nova fazenda ou propriedade com os dados informados e as culturas plantadas.
Faz as seguintes validações:
- Campos obrigatórios (menos culturas)
- Campo código deve ser um CPF ou CNPJ validos
- Campo area_total deve ser maior ou igual area_vegetacao + area_cultura
- Se houver culturas plantadas, a soma de suas áreas deve ser menor ou igual a area_cultura
Response
Retorna JSON com os dados da fazenda criada.
Erros
Havendo erros, retorna os detalhes em JSON. Por exemplo:
{
"codigo": [
"CPF ou CNPJ inválido"
]
}
ou
{
"non_field_errors": [
"Áreas de vegetação e cultura excedem a área total"
]
}
PATCH /api/altera_fazenda/99
Passando o id da fzenda na url e os campos que quer alterar no corpo:
{
"nome_fazenda": "Aurorinha",
"culturas": [
{
"cultura": "Cana",
"area": 10
}
]
}
Faz as mesmas validações da inclusão.
IMPORTANTE: Na alteração, se houver a campo culturas, o que for informado vai substituir todas as culturas que estavam cadastradas anteriormente. No emplo acima, se a fazenda tinha culturas de Café e Algodão, depois dessa alteração terá apenas a cultura de Cana.
Response
Retorna JSON com os dados da fazenda alterada.
Erros
Havendo erros, retorna os detalhes em JSON
DELETE /api/altera_fazenda/99
Passando o id da fazenda na url. A fazenda com esse id e todas as suas culturas serão escluidas.
GET /api/excluir_culturas/99
Passando o id da fazenda na url. Todas as culturas da fazenda serão excluidas.
GET /api/resumo
Retorna os totais cadastrados
{
"fazendas": 12,
"area_total": 2160,
"area_cultura": 2160,
"area_vegetacao": 950
}
GET /api/resumo_estado
Retorna um resumo por estado
[
{
"uf": "MG",
"fazendas": 2,
"area_total": 260,
"area_cultura": 260,
"area_vegetacao": 180
},
{
"uf": "SP",
"fazendas": 10,
"area_total": 1900,
"area_cultura": 1900,
"area_vegetacao": 770
}
]
GET /api/resumo_uf_culturas
Retorna um resumo por estado e cultura
[
{
"tipo_cultura": "Cana",
"fazenda__uf": "MG",
"total_area": 100
},
{
"tipo_cultura": "Cana",
"fazenda__uf": "SP",
"total_area": 50
},
{
"tipo_cultura": "Soja",
"fazenda__uf": "SP",
"total_area": 20
}
]
GET /api/resumo_culturas
Retorna um resumo por culturas
[
{
"tipo_cultura": "Cana",
"total_area": 150
},
{
"tipo_cultura": "Soja",
"total_area": 20
}
]
Usando o PyTest para realizar os testes. Foram criados 2 tasks no pyproject.toml:
- task test - Rodas todos os testes
- task coverage - Roda todos os testes com cobertura
Chamar na linha de comando na raiz do projeto. Por exemplo:
task coverage
O comando fake_data gera dados de teste no banco de dados em grupos de 10;
python manage.py fake_data