diff --git a/.gitignore b/.gitignore index cb6061b..dc3ab93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,19 @@ -.DS_Store +_Store node_modules lib/core/metadata.js lib/core/MetadataBlog.js - +src/comex_stat/assets/migrations/* docs/website/translated_docs docs/website/build/ docs/website/yarn.lock docs/website/node_modules docs/website/i18n/* +**/__pycache__/ +db.sqlite3 + +src/comex_stat/static/** + +*.pyc +__pycache__ diff --git a/.travis.yml b/.travis.yml index 391f6fe..f6231a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,53 @@ -# .travis.yml +sudo: required language: node_js node_js: - - '8' -branches: - only: - - master +- '8' +services: +- docker + +env: +- DOCKER_COMPOSE_VERSION=1.21.0 + +language: node_js +before_install: +- sudo rm /usr/local/bin/docker-compose +- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname + -s`-`uname -m` > docker-compose +- chmod +x docker-compose +- sudo mv docker-compose /usr/local/bin + cache: yarn: true + script: - - git config --global user.name "${GH_NAME}" - - git config --global user.email "${GH_EMAIL}" - - echo "machine github.com login ${GH_NAME} password ${GH_TOKEN}" > ~/.netrc - - cd docs/website && yarn install && GIT_USER="${GH_NAME}" yarn run publish-gh-pages +- docker-compose up -d +- docker-compose exec web flake8 --exclude='ipython_log.py*,migrations,templates, + settings.py, manage.py' +- sudo docker-compose exec web coverage run src/manage.py test +- git config --global user.name "${GH_NAME}" +- git config --global user.email "${GH_EMAIL}" +- echo "machine github.com login ${GH_NAME} password ${GH_TOKEN}" > ~/.netrc +- cd docs/website && yarn install && GIT_USER="${GH_NAME}" GIT_BRANCH=master yarn run publish-gh-pages + +before_script: +- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter +- chmod +x ./cc-test-reporter +- ./cc-test-reporter before-build + +# deploy: +# - provider: heroku +# app: api-comexstat +# on: +# master +# api_key: +# secure: gndgDVvj2SlJ+vX7BIcIoauDb4KX2pwucuokyQSjrM7L6X4UjNNJYXfzwetRpWhN4ha8AJtHlDiIPKTgB0yf8UcWZPjGjKQ3JexGm3tCLWQd/uTpFswksr/yXEkmwLwvZVA2ukM6JQ0/MRGGHsQXD5FInxOvdLFboNuslxpnCrbHG5YKRVxUKWOD6rkd7AP1A9n8z7iAYAAMyM0wowypLvhoshAeSTcK95b64oZ3TFbfoiuQ1NMwmflgfDAb5F408trYHdoc9gTkEa2tsddIYMrtIYRl1rX3Do0fpWOJ9r6H/5uZlff9dF1VIv2bRWzAwywz1ch2p20sKXfL1WZt2rb+s91jeUjKv8kDYBUxYjvyi7I5T3j06EsJyKnAfDAezKZ4yhsL+Jo4Et4drEvHB5K7cqjEVLbKN1hl2TKO48ydTkCS+uQ4TvYoYRafWLBFiWALOViDZMxCsChwjo82laX4VA0MGUB9/wp1PhSqHsohz6fuV9wt8FZ16QmyuOhBC3PwN/nmBr3cOMPl6EBVNGbMW0QLi2hajrsNCBeUhbTNh/tbqNxsw7zIKmz9v5OxszeF/AJdLn6EVnFhTD4PMP36XyfYK5jvfkr38oziC41qhTMaw1VMxqJcpEodXTgkun4o1GKgbtmPBhZZAc//X3MjomPv67784JqK6D/SSdo= +# +# - provider: heroku +# app: api-comexstat-staging +# on: +# develop +# api_key: +# secure: gndgDVvj2SlJ+vX7BIcIoauDb4KX2pwucuokyQSjrM7L6X4UjNNJYXfzwetRpWhN4ha8AJtHlDiIPKTgB0yf8UcWZPjGjKQ3JexGm3tCLWQd/uTpFswksr/yXEkmwLwvZVA2ukM6JQ0/MRGGHsQXD5FInxOvdLFboNuslxpnCrbHG5YKRVxUKWOD6rkd7AP1A9n8z7iAYAAMyM0wowypLvhoshAeSTcK95b64oZ3TFbfoiuQ1NMwmflgfDAb5F408trYHdoc9gTkEa2tsddIYMrtIYRl1rX3Do0fpWOJ9r6H/5uZlff9dF1VIv2bRWzAwywz1ch2p20sKXfL1WZt2rb+s91jeUjKv8kDYBUxYjvyi7I5T3j06EsJyKnAfDAezKZ4yhsL+Jo4Et4drEvHB5K7cqjEVLbKN1hl2TKO48ydTkCS+uQ4TvYoYRafWLBFiWALOViDZMxCsChwjo82laX4VA0MGUB9/wp1PhSqHsohz6fuV9wt8FZ16QmyuOhBC3PwN/nmBr3cOMPl6EBVNGbMW0QLi2hajrsNCBeUhbTNh/tbqNxsw7zIKmz9v5OxszeF/AJdLn6EVnFhTD4PMP36XyfYK5jvfkr38oziC41qhTMaw1VMxqJcpEodXTgkun4o1GKgbtmPBhZZAc//X3MjomPv67784JqK6D/SSdo= + +after_script: +- ./cc-test-reporter after-build -t lcov --debug --exit-code $TRAVIS_TEST_RESULT diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2d1cd57 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.5 +ENV PYTHONUNBUFFERED 1 + +RUN mkdir /code +WORKDIR /code + +ADD . /code/ +RUN pip install -r requirements.txt && \ + chmod +x boot.sh + +CMD ["./boot.sh"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..096b5be --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2018 ComexStat MDIC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..0ea6473 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: python src/manage.py runserver 0.0.0.0:$PORT diff --git a/boot.sh b/boot.sh new file mode 100644 index 0000000..8f80f20 --- /dev/null +++ b/boot.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +pip install -r requirements.txt +cd src +python manage.py makemigrations +python manage.py migrate +python manage.py runserver 0.0.0.0:8000 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7cfced5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ + +version: '3.5' + +services: + + db: + image: postgres + ports: + - 5000:5432 + + web: + build: . + command: /bin/sh ./boot.sh + volumes: + - .:/code + ports: + - "8000:8000" + depends_on: + - db diff --git a/docs/PULL_REQUEST_TEMPLATE.md b/docs/PULL_REQUEST_TEMPLATE.md index 1ffa760..31674c4 100644 --- a/docs/PULL_REQUEST_TEMPLATE.md +++ b/docs/PULL_REQUEST_TEMPLATE.md @@ -2,7 +2,7 @@ # Issue Relacionada -# +fixes # # Tipo de Mudanças diff --git a/docs/README.md b/docs/README.md index dbca85a..c216f17 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,37 @@ + # Comex Stat -Dados abertos sobre o comércio exterior de bens e serviços no Brasil. +[![Build Status](https://travis-ci.org/fga-eps-mds/2018.2-ComexStat.svg?branch=develop)](https://travis-ci.org/fga-eps-mds/2018.2-ComexStat) +[![Maintainability](https://api.codeclimate.com/v1/badges/f8c2e994cae38bdd6ce7/maintainability)](https://codeclimate.com/github/fga-eps-mds/2018.2-ComexStat/maintainability) +[![Test Coverage](https://api.codeclimate.com/v1/badges/f8c2e994cae38bdd6ce7/test_coverage)](https://codeclimate.com/github/fga-eps-mds/2018.2-ComexStat/test_coverage) + +## Sobre + +O ComexStat, vem com o objetivo de tornar mais fácil o acesso aos dados relacionados ao comércio exterior de bens, e posteriormente serviços no Brasil, proporcionando aos usuários a possibilidade de trabalhar com as informações desejadas de forma mais adequada as suas necessidades. + +## Documentação + +Para entender um pouco mais sobre o produto, acesse nossa [documentação](https://fga-eps-mds.github.io/2018.2-ComexStat). + +## Instalação + +Nesta seção está descrito cada passo necessário para a configuração e utilização da aplicação. + +#### Pré-requisitos + * [Git](https://git-scm.com/) + * [Docker](https://www.docker.com/get-docker) + * [Docker-composer](https://docs.docker.com/compose/install/#install-compose) + +#### Configuração + +Clone o repositório no diretório desejado + + git clone https://github.com/fga-eps-mds/2018.2-ComexStat.git + +Utilize o seguinte comando para subir a aplicação + + docker-compose up + +A aplicação pode ser acessada através do localhost: + + localhost:8000 diff --git "a/docs/docs/Defini\303\247\303\243o-da-Arquitetura.md" "b/docs/docs/Defini\303\247\303\243o-da-Arquitetura.md" new file mode 100644 index 0000000..28223d1 --- /dev/null +++ "b/docs/docs/Defini\303\247\303\243o-da-Arquitetura.md" @@ -0,0 +1,115 @@ +--- +id: definicaoArquitetura +title: Definição Arquitetural +--- + +## 1. Introdução + +A arquitetura que vamos utilizar será a de microsserviços. Os microsserviços são um +estilo de arquitetura de aplicativo em que programas autônomos independentes, com uma +única finalidade, podem se comunicar entre si por meio de uma rede. Normalmente, esses +microsserviços podem ser implantados independentemente porque eles têm uma forte separação +de responsabilidades por meio de uma especificação bem definida com compatibilidade reversível +significativa para evitar a quebra súbita de dependência. + +Com base na arquitetura microserviços, foram definidas as seguintes tecnologias. + +## 2. Tecnologias que Serão Utilizadas + +Todas as tecnologias adotadas foram escolhidas em conjunto com o cliente, por meio +de reuniões que fazermos semanalmente. + +### 2.1. Django + +O Django é um framework web na linguagem Python, que permite rápido desenvolvimento e +design claro e objetivo de aplicações web.. + +O Django será utilizado no back-end do projeto por apresentar uma adequeda estrutura base +para projetos, por ser a maior comunidade e ter maior aceitação entre os frameworks +web Python, além de acarretar em um boa curva de aprendizado para a equipe. + +### 2.2. Angular + +Angular é um framework para construção da interfaces de usuário usando +HTML, CSS e JavaScript, através de suas bibliotecas facilita o desenvolvimento +de aplicações web. + +O Angular será aplicado como o front-end do projeto por ser um framework completo e por +possuir diversos componentes disponíveis para as várias necessidades da aplicação. + + +### 2.3. GraphQL + +GraphQL é uma linguagem de consulta para APIs, o GraphQL fornece uma descrição +completa e compreensível dos dados contidos na API. + +Características principais: +* Permite que o cliente especifique exatamente quais dados deseja obter. +* Facilita a agregação de dados de várias fontes. +* Usa um sistema de tipos para descrever dados. + +GraphQL foi escolhido por oferecer características arquiteturais que vão de +acordo com a aplicação. + +### 2.4. PostgreSQL + +O PostgreSQL é um sistema de gerenciamento de banco de dados do tipo objeto-relacional +(ORDBMS) com ênfase em extensibilidade e em padrões de conformidade. + +Como um servidor de banco de dados, sua principal função é armazenar dados de forma +segura, apoiando as melhores práticas, permitindo a recuperação dos dados a pedido de +outras aplicações de software. + +O PostgreSQL sará usado por ter muitos recursos destinados a ajudar os desenvolvedores +a gerenciar e a proteger a integridade dos dados. + +## 3. Relacionamento das Tecnologias + +### 3.1. GraphQL com Django + +O ComexStat contará com a implementação do GraphQL e Python, para essa integração +onde será utilizado a biblioteca Graphene. Será utilizado basicamente o query +do GraphQL, para fazer buscas de informações do banco de dados. + +### 3.2. GraphQL com Angular + +O Apollo Client possui uma implementação em Angular para GraphQL. O Apollo Client foi +projetado desde o início para facilitar a construção de componentes de interface +do usuário que buscam dados com o GraphQL. + +O Apollo Client é flexível para a plataforma Angular, onde foi cuidadosamente +desenvolvida para funcionar bem com todas as ferramentas usadas pelos +desenvolvedores Angular. + + +### 3.3. Diagrama + +![Diagrama_Representacao_Arquitetural](https://fga-eps-mds.github.io/2018.2-ComexStat/img/Representacao_Arquitetural.png) + +## 4. Arquitetura do Software + +Foi decidido junto ao cliente a posibilidade de uma arquitetura monolítica, visto +que o escopo do projeto está bem acoplado e que vamos utilizar bibliotecas externas +para as funcionalidades da aplicação. + + Uma arquitetura monolítica é o modelo unificado tradicional para o design de um + programa de software. + +O software monolítico é projetado para ser independente, os componentes do programa +são interconectados e interdependentes, em vez de fracamente acoplados, como é o +caso dos programas de software modulares. Em uma arquitetura bem acoplada, cada +componente e seus componentes associados devem estar presentes para que o código +seja executado ou compilado. + +### 4.1. Diagrama + +![Diagrama-Monolitico](https://fga-eps-mds.github.io/2018.2-ComexStat/img/Diagrama-Monolitico.png) + +## 5. Referências + +> * GraphQL. Disponível em: . Acessado em 13/09/2018. +> * GREIF, Sacha. Disponível em: . Acessado em 13/09/2018. +> * AFONSO, Alexandre. Disponível em: . Acessado em 13/09/2018. +> * Edson. Disponível em: . Acessado em 13/09/2018. +> * PostgreSQL. Disponível em: . Acessado em 13/09/2018. +> * SCARPA, João Mateus. Disponível em: . Acessado em 19/09/2018. diff --git a/docs/docs/Medicao.md b/docs/docs/Medicao.md new file mode 100644 index 0000000..7937d56 --- /dev/null +++ b/docs/docs/Medicao.md @@ -0,0 +1,163 @@ +--- +id: medicao +title: Indicadores e Métricas +--- + +## Introdução + +É fundamental para saúde do projeto realizar seu monitoramento, coletando informações +que podem auxiliar em decisões de negócio, melhoria do processo e seu gerenciamento. +Para este fim, foi utilizada uma simplificação do processo GQM(Goal-Quest-Metric, http://www.agilebuddha.com/software-metrics/which-software-metrics-and-why-introducing-basilis-gqm-approach/), para levantamento +das medições que serão realizadas no projeto. + +Por muitas vezes a medição e análise de software faz parte do processo de controle +de qualidade, onde os componentes de um sistema que são medidos e analisados +separadamente e depois há uma comparação de métricas de acordo com os dados do projeto. + +### GQM de Produtividade + +![GQM_Produtividade](https://fga-eps-mds.github.io/2018.2-ComexStat/img/GQM_Produtividade.png) + +O time possui como prazo para realização do projeto a duração das disciplinas de MDS e EPS, +no segundo semestre de 2018. Logo, o aproveitamento do tempo deve ser otimizado, tentando +entender como o time pode ser produtivo. Para isso, foram levantadas três perguntas: + +#### O conhecimento do time está nivelado? + +Caso o conhecimento não seja distribuído dentro do time, existe a possibilidade de sobrecarga de alguns membros +e a não utilização do potencial de membros que ainda não possuem as ferramentas e conhecimento necessários para ajudar o time. + +#### O time está seguindo o planejamento da sprint? + +Deve-se realizar um planejamento de acordo com a capacidade do time. Logo, o planejamento +realizado tem como objetivo trabalho do time durante toda a sprint. Caso seja diagnosticado +que o time entregou tudo muito antes da finalização, ou não conseguiu entregar todo o trabalho +alocado, existem problemas que devem ser atacados. + +#### Quão produtiva é a equipe? + +Para que se possa melhorar a produtividade da equipe, é fundamental, em primeiro lugar, entender +sua produtividade, e fazer planejamentos de acordo com esta. + +#### Métricas e Indicadores + +- Pontos + + Os pontos serão utilizados para estimar a dificuldade de entrega das issues. Cada issue + terá sua estimativa em pontos, utilizando a escala de fibonacci: 1, 2, 3, 5, 8, 11, 13 e 21. + +- Gráfico de Burndown + É um gráfico dos pontos da sprint (eixo y) e os dias da semana (eixo x) que possibilita + monitoramento do trabalho durante a execução da sprint. Possíveis interpretações são: + Se o trabalho está sendo feito de forma uniforme durante a sprint, as histórias estão sendo + entregues apenas ao final da sprint, por exemplo. + +- Velocity + +É a média de pontos entregues do time por sprint. Facilita a estimativa de alocação de pontos +para as próximas sprints. + +- Quadro de Horas +Um documento excel compartilhado na pasta do drive do time, cada membro deve +preencher o tempo de dedicação ao projeto durante a semana e quais atividades foram +realizadas. + +Link das coletas em relação ao quadro de conhecimento: https://docs.google.com/spreadsheets/d/1R_BGLs-qQCNSnxN6YPW_TGO9EQ7bSqzsIV2COs5fzx4/edit?usp=sharing + +- Earned value management (EVM) + É responsável por medir a performance técnica no projeto, em relação ao prazo e custo. + +- Diferença entre nível de conhecimento dos membros no quadro de conhecimento + Cada membro deve preencher a coluna relativa ao conhecimento na tecnologia indicada, + seguindo a legenda: + - :D - Consigo ensinar outras pessoas + - :) - Consigo me virar + - :l - Sei mais ou menos + - :( - Sei muito pouco + - :S - Não tenho a menor ideia + Dessa forma, fica transparente como está o conhecimento dividido no time e é mais + fácil a formação de pareamentos + +Link das coletas em relação ao quadro de conhecimento: https://docs.google.com/spreadsheets/d/1TF1ahfZebxilBgXzJfw6NVO-frcC9-Gw3bC4RGgJSxY/edit?usp=sharing + +### GQM de Gerência de Riscos + +![GQM_Riscos](https://fga-eps-mds.github.io/2018.2-ComexStat/img/GQM_Riscos.png) + +#### Matriz de Riscos + +É elicitada uma lista de possíveis riscos do projeto. A cada sprint, esses +riscos são analisados e priorizados, tendo as seguintes grandezas relacionadas: + +- **Impacto**(I) : É mensurado com nota de 1 a 5, possuindo o seguinte significado, + + - **5**: Catastrófico - o impacto ocasiona colapso às ações de gestão, a viabilidade + estratégica pode ser comprometida; + - **4**: Grande - o impacto compromete significativamente às ações de gestão, os + objetivos estratégicos podem ser fortemente comprometidos; + - **3**: Moderado - o impacto é significativo no alcance das ações de gestão; + - **2**: Pequeno - o impacto é pouco relevante ao alcance das ações de gestão; + - **1**: Insignificante - o impacto é mínimo no alcance das ações de gestão. + + +- **Probabilidade** (P): Também possui nota de 1 a 5, atribuídas de acordo com a frequência observada/esperada do evento, + - **5** (>=90%): Evento esperado que ocorra na maioria das circunstâncias + - **4** (>=50% < 90%): Evento provavelmente ocorra na maioria das circunstâncias + - **3** (>=30% < 50%): Evento deve ocorrer em algum momento + - **2** (>=10% < 30%): Evento pode ocorrer em algum momento + - **1** (< 10%): Evento pode ocorrer apenas em circunstâncias excepcionais + +Possuindo as duas notas, o risco possui uma nota final, que é o produto das duas, (I*P), o **Nível de Risco**, que possui +a seguinte análise: + +- Risco crítico: >=15<=25 +- Risco alto: >=8<=12 +- Risco moderado: >=4<=6 +- Risco pequeno: >=1<=3 + + +Link das coletas em relação aos riscos: https://docs.google.com/spreadsheets/d/16VGMfgXxWyXqNj7LwUO7X5FunRKnFoS_h6Idv5-Lmnw/edit?usp=sharing + +#### Burndown de Riscos + +Deve-se somar o nível dos riscos, calculado em métrica anterior, e acompanhá-los em relação ao eixo do tempo. +O ideal é observar durante o decorrer do projeto, a diminuição dos riscos. + +### GQM de Manutenção + +![GQM_Codigo](https://fga-eps-mds.github.io/2018.2-ComexStat/img/GQM_codigo.png) + +A manutenção de software preocupa-se em lidar com mudanças na parte do ciclo de vida +do desenvolvimento de software. Para efetivamente descrever problemas e apontar suas +causas, mantenedores interagem continuamente com o time, cliente e usuários. +Como isso, foram elaboradas as seguintes perguntas: + +#### Quanto o código está sendo testado? + +Os testes ajudam o desenvolvedor a garantir a qualidade interna do código, dando feedback +automatizados e permitindo uma manutenção com menor custo. + +#### O código está seguindo boas práticas de programação? + +O uso de regras e boas práticas é o melhor jeito de gerar a legibilidade do código, contribuindo significativamente para +que o ciclo de desenvolvimento de sistemas ocorra de maneira mais ágil, prática e de fácil manutenção. + +#### O código é complexo? + +A ideia é basicamente contar o número de caminhos diferentes que um método pode ter. +Quanto maior esta complexidade, mais difícil a manutenção e a testagem do código. + +#### Métricas e Indicadores + +- Porcentagem de código testado: Número de linhas percorridas durante os testes dividido pelo número de linhas totais de código +- Número de linhas por método: Definidos em 35 linhas por método em python +- Números de erros com a folha de estilo: Não devem existir nenhum erro detectado pela ferramenta de análise estática +- Duplicação de código: deve-se evitar a duplicação de código, a saúde dessa métrica será analisada por meio de análise de ferramenta +- Complexidade ciclomática + +## 3. Referências + +> * . Matriz de Riscos. Ministério do Planejamento. Disponível em . Acesso em 02/09/2018. +> * Boas Práticas de programação. Disponível em: . Acessado em 02/09/2018. +> * A importância dos Testes para a Qualidade de Software. Disponível em: . Acessado em 02/09/2018. +> * Medindo a complexidade do seu Código. Disponível em: . Acessado em 02/09/2018. diff --git "a/docs/docs/Plano-de-Comunica\303\247\303\243o.md" "b/docs/docs/Plano-de-Comunica\303\247\303\243o.md" index eb61aa4..5cb9e06 100644 --- "a/docs/docs/Plano-de-Comunica\303\247\303\243o.md" +++ "b/docs/docs/Plano-de-Comunica\303\247\303\243o.md" @@ -11,7 +11,8 @@ Este documento possui como objetivo orientar o gerenciamento da comunicação do |Ferramenta |Descrição |Finalidade| |-------------|----------|----------| -|Telegram | Ferramenta para envio de mensagens instantâneas| Comunicação rápida feita para avisos pontuais e dúvidas | +|Telegram | Ferramenta para envio de mensagens instantâneas| Comunicação rápida feita para avisos pontuais e dúvidas com o cliente | +|Slack |Ferramenta para envio de mensagens instantâneas | Comunicação e utilização de bots interno do time | |Github | Plataforma para hospedagem e versionamento de código, gerenciamento do time e documentação do projeto | O github, no aspecto de comunicação, servirá para comunicar e gerenciar o fluxo de trabalho do time, por meio de issues e do quadro kanban | |Drive | Ferramenta para compartilhamento de arquivos|Compartilhamento de materiais de estudo e outras informações mais extensas, para não poluir o grupo do telegram | @@ -24,6 +25,7 @@ Para definição da comunicação interna, cabe ressaltar que apesar dos integra |Participantes|Método |Tipo de Reunião |Horário|Dia | |-------------|----------|-------|-------|------| |Time|Presencial| Daily|15:50-16:00 |Terça| +|Time|Presencial| Daily|15:50-16:00 |Quarta| |Time |Presencial| Daily|15:50-16:00 |Quinta| |Time |Presencial| Rituais de sprint(Retrospectiva, Revisão e Planejamento)| 9:30-12:30 |Sábado| diff --git a/docs/docs/Processo.md b/docs/docs/Processo.md index d85be4f..005f0a4 100644 --- a/docs/docs/Processo.md +++ b/docs/docs/Processo.md @@ -3,21 +3,21 @@ id: processo title: Processo Definido --- -# 1. Introdução +## 1. Introdução O processo a ser seguido pelo time é baseado em Lean e metodologias ágeis , principalmente o Scrum e XP (eXtreme Programming). -# 2. Papéis +## 2. Papéis -## 2.1. Time de Desenvolvimento +### 2.1. Time de Desenvolvimento - Elaborar documento de Visão; - Elaborar documento de arquitetura; - Desenvolver código, de acordo com os requisitos definidos; - Utilizar de práticas ágeis para otimizar o desenvolvimento. -## 2.2. Devops +### 2.2. Devops - Configurar ambiente de desenvolvimento, homologação e produção utilizando contâiners; - Definir política de commits e branchs de acordo com o git flow; @@ -25,14 +25,14 @@ XP (eXtreme Programming). - Construir o pipeline de integração e deploy contínuos; - Definir roadmap de deploy contínuo. -## 2.3. Arquiteto +### 2.3. Arquiteto - Definir o roadmap de Requisitos; -- Garantir que o time de desenvolvinto siga a arquitetura; +- Garantir que o time de desenvolvimento siga a arquitetura; - Propor arquitetura de micro serviços; - Configuração de contâiners com micro serviços. -- -## 2.4. Scrum Master (SM) + +### 2.4. Scrum Master (SM) - Gerenciar comunicação do Time; - Garantir que os membros sigam o processo Definido; @@ -40,7 +40,7 @@ XP (eXtreme Programming). - Definir, monitorar e controlar indicadores e metricas de produtividade, utilizando-os para tomadas de decisões no projeto; - Definir e seguir roadmap para produtividade máxima do time. -## 2.5. Product Owner (PO) +### 2.5. Product Owner (PO) - Visão de Produto; - Elaborar o Termo de Abertura; @@ -51,19 +51,19 @@ XP (eXtreme Programming). - Definir roadmap de produto. -# 3. Eventos +## 3. Eventos Todos os eventos aqui definidos ocorrem durante o tempo de uma Sprint, que possui duração de uma semana, a partir do sábado. Cada sprint possui como resultado entregas de um ou mais artefatos, podendo ser de código ou documentação. -# 3.1. Reunião de Planejamento da Sprint +### 3.1. Reunião de Planejamento da Sprint Essa reunião realizada no inicio da sprint caracteriza-se por definir seu objetivo e Requisitos que devem ser entregues. Será utilizada a ferramenta Planning Poker para definição de pontos das histórias priorizadas na sprint. O time box deste evento é de uma hora. -# 3.2. Reuniões standup +### 3.2. Reuniões standup Essas reuniões são realizadas ao decorrer da sprint, para que haja um acompanhamento das tarefas e possível remoção de impedimentos. Cada membro da equipe deve responder as seguintes @@ -74,48 +74,55 @@ perguntas: O time box deste evento é de quinze minutos. -# 3.3. Reunião de Revisão +### 3.3. Reunião de Revisão Essa reunião é voltada para a inspeção do produto entregue ao final da sprint, certificando que as unidades desenvolvidas estão bem integradas e entregues conforme o estabelecido. Essa reunião tem time box de 40 minutos. -# 3.4. Reunião de Retrospectiva +### 3.4. Reunião de Retrospectiva Essa reunião é voltada para discussão do processo, discutindo possíveis melhorias, -sucesso e falhas. +sucesso e falhas. Para essa reunião será utilizada a construção de um mapa de empatia +do time, para que o diálogo seja mais participativo e gere mais debates (MACHADO, 2018). O time box deste evento é de trinta minutos. -# 4. Artefatos +## 4. Artefatos -# 4.1. Incremento do Produto +### 4.1. Incremento do Produto É o produto entregue, até a presente sprint bem como os artefatos que o compõe. -# 4.2. Backlog do Produto e da Sprint +### 4.2. Backlog do Produto e da Sprint São os requisitos do projeto, documentados por meio de issues do Github e gerenciados pelo PO. -# 5. Políticas +## 5. Políticas -## 5.1. Políticas de Desenvolvimento +### 5.1. Políticas de Desenvolvimento -### 5.1.1. Entrega de Código +#### 5.1.1. Entrega de Código As issues relacionadas à código só serão consideradas entregues se seguirem as seguintes restrições: 1. Não fere as métricas definidas 2. Possui sucesso na integração contínua 3. Possui testes condizentes com a funcionalidade 4. Compreende todos os critérios de aceitação definidos na issue -### 5.1.2. Ambiente de desenvolvimento +#### 5.1.2. Ambiente de desenvolvimento Todos os membros da equipe devem configurar suas máquinas para que elas possuam o ambiente de desenvolvimento. ## 5.2. Políticas de documentos - Todos os documentos criados no projeto devem estar disponíveis por sua Github Pages em: https://fga-eps-mds.github.io/2018.2-ComexStat/. + Todos os documentos criados no projeto devem estar disponíveis por sua Github Pages em: https://fga-eps-mds.github.io/2018.2-GrupoMDIC/. Cada documento deve ser criado + em branch de acordo com a política de branches, e deve ser revisado antes de aceito, por meio de revisor atribuído em pull request da branch. -## 5.3. Políticas de papéis +### 5.3. Políticas de papéis Cabe, a cada papel de EPS definir e desenvolver seu roadmap. -## 5.4. Políticas de eventos +### 5.4. Políticas de eventos - Os eventos definidos devem cumprir o time box; - Cabe aos membros serem pontuais nos horários marcados pelo time. + + +## Referências + +> * MACHADO, Mayra. 2018. "[#CriAtividade #MelhoriaContinua] Retrospectiva Mapa de empatia do Time". Disponível em: . Acessado em 30/08/2018. diff --git a/docs/docs/Termo-De-Abertura.md b/docs/docs/Termo-De-Abertura.md index 250e000..4b5fc39 100644 --- a/docs/docs/Termo-De-Abertura.md +++ b/docs/docs/Termo-De-Abertura.md @@ -5,29 +5,37 @@ title: Termo de Abertura do Projeto # 1. Introdução -O Ministérios da Indústria, Comércio Exterior e Serviços(MDIC) é responsável pelas políticas de desenvolvimento da indústria, legislação de propriedade intelectual, regulamentação e execução de políticas relacionadas ao comércio externo, assim como as políticas de prestação de serviços. Considerando a política de dados abertos que o ministério segue, deseja-se que a população brasileira consiga acessar os dados relacionados à prestação de serviços com mais facilidade. Tendo isso em vista, a criação de um sistema computacional para representação desses dados é desejada. +O Ministérios da Indústria, Comércio Exterior e Serviços(MDIC) é responsável pelas políticas de desenvolvimento da indústria, legislação de propriedade intelectual, regulamentação e execução de políticas relacionadas ao comércio externo, assim como as políticas de prestação de serviços. Dessa maneira, o MDIC possui uma vasta coleção de dados referentes à tais assuntos. Porém, tais dados são de difícil acesso, até mesmo para aqueles que trabalham dentro do próprio Ministério, o que impossibilita que ocorrão pesquisas profundas por meio dos analistas que lá trabalham. + +Seguindo uma política de dados abertos, deseja-se que tais dados sejam agora disponilibilizados de maneira simples, prática e efetiva, provendo liberdade e autonomia para o usuário, fazendo com que as informações providas a partir dessa disponibilização sejam úteis. Além disso, deseja-se que pessoas que são afetadas por esses dados sejam capazes de visualiza-los de maneira mais simples, tendo em vista que muitos dos interessados nem sabem da existência deles. Os possíveis interessados são todos aqueles que realizam comércio de bens e prestação de serviços, como imobiliárias, lojas de roupa, programadores, arquitetos, etc. # 2. Descrição do Projeto -O Comexserv é um projeto idealizado pelo Ministério da Indústria, Comércio Exterior e Serviços(MDIC), que será desenvolvido por alunos da Engenharia de Software da Universidade de Brasília. O sistema têm como objetivo a facilitação da disponibilização de dados relacionados à prestação de serviços no Brasil. Serão disponibilizados gráficos e tabelas, assim como download de todos os dados referentes à tais serviços. +O ComexStat é um projeto idealizado pelo Ministério da Indústria, Comércio Exterior e Serviços(MDIC), que será desenvolvido por alunos da Engenharia de Software da Universidade de Brasília. O sistema têm como objetivo a facilitação da disponibilização de dados relacionados à comércio de bens e prestação de serviços no Brasil, assim como a possibilidade de pesquisas avançadas e apresentação personalizada. Serão disponibilizados gráfico e tabela, além de download de arquivos PDF referente a eles. + +Além disso, outro foco importante do sistema é a praticidade de uso dele, de maneira que as informações contidas nele possam ser facilmente exportadas, seja em forma de PDF ou de permalink, de maneira que as informações geradas pelo sistema não estejam necessariamente presas à ele, provendo assim uma liberdade para o usuário utilizar o que foi gerado em outros arquivos, ou até mesmo em posts de blogs. # 3. Propósito do Projeto -O projeto têm como objetivo a disponibilização de dados referentes à prestação de serviços no Brasil, de maneira à facilitar o acesso a esses dados. +Os dados referentes à comércio de bens e prestação de serviços são vastos. Porém, o acesso à eles é muito difícil, tendo em vista a maneira na qual eles foram armazenados e o sistema existente hoje para a visualização deles. Isso causa um empencilho para muitos dos interessados neles, impossibilitando assim análises mais profundas, assim como seu entendimento. + +Notando isso, o ComexStat têm como objetivo facilitar a visualização dos dados referentes à comercio de bens e prestação de serviços para todos aqueles que estejam interessados, como imobiliárias, programadores, etc. # 4. Oportunidade de Negócios -Apesar dos dados referentes à prestação de serviços no Brasil serem abertos, o acesso a eles não é simples. Além disso, muitos brasileiros nem possuem o conhecimento de que podem acessar tais dados. Desta forma, o Comexserv se apresenta como uma solução para ambos os problemas, pois, além de facilitar o acesso e a forma como tais dados serão vistos, +Apesar dos dados referentes à comércio de bens e prestação de serviços no Brasil serem abertos, o acesso a eles não é simples e nem intuitivo, até mesmo para aqueles que trabalham dentro do próprio MDIC. Dessa maneira, muitos dos possíveis interessados nem sabem da existência de tais dados, impossibilitando o entendimento das leis e políticas brasileiras referentes à comércio de bens e prestação de serviços, prejudicando então empreendedores, empresas e prestadores de serviço em geral, como arquitetos, programadores, artistas, etc. Além, é claro, de prejudicar os estudos que poderiam ser feitos dentro do próprio Ministério, já que uma análise profunda dos dados hoje é inviável ou indevidamente complexa para os analistas. + +Tendo isso em vista, o ComexStat se apresenta como uma solução para tais problemas. O sistema será feito de maneira a focar em pontos essenciais para que se tenha facilidade e praticidade para o usuário, focando em maneiras avançadas de pesquisa de dados. Além disso, o sistema oferecerá opções personalizadas de apresentação dos dados por meio de gráficos, assim como a opção de geração de arquivos PDF a partir das pesquisas feitas pelo usuário. # 5. Escopo do Projeto -O Comexserv será uma plataforma web que terá como objetivo a facilitação na visualização dos dados de prestação de serviços no Brasil. Tendo isso em vista, alguns recursos são imprescindíveis para o sucesso do sistema. +O ComexStat será uma plataforma web que terá como objetivo a facilitação na visualização dos dados do comércio de bens e de prestação de serviços no Brasil. Tendo isso em vista, alguns recursos são imprescindíveis para o sucesso do sistema. -O sistema deve ser capaz de gerar tabelas a partir dos dados providos pelo banco de dados do MDIC, com a aplicação de filtros específicos, de maneira que o usuário possa ser capaz de fazer uma pesquisa personalizada para as suas necessidades. Além disso, deve se ter a opção de fazer downloas de dados no formato .scv, de maneira que o usuário possa adquirir os dados de sua fonte primária. +O sistema deve ser capaz de gerar tabelas a partir dos dados providos pelo banco de dados do MDIC, com a aplicação de filtros específicos, de maneira que o usuário possa ser capaz de fazer uma pesquisa personalizada para as suas necessidades. Além disso, o sistema deve apresentar opções de gráficos, para que a visualização dos dados seja facilitada para o usuário. Outro ponto importante é a capacidade de se gerar arquivos PDF a partir do que foi gerado nas pesquisas do usuário. # 6. Equipe e Papéis -A equipe que realizará o Comexserv estará dividida entre os seguintes papéis: +A equipe que realizará o ComexStat estará dividida entre os seguintes papéis: | Papel | Responsabilidade | | :---: | :--------------: | @@ -52,7 +60,36 @@ A equipe é compostas por alunos da disciplina de Métodos de Desenvolvimento de | Marcos Nery Borges Júnior | Desenvolvedor | | Rogério Silva dos Santos Júnior | Desenvolvedor | +# 7. Metodologia de Desenvolvimento + +A metodologia decidida para a realização desse projeto é a Ágil, mais especificamente, será utilizado uma adaptação do modelo Scrum e do XP(eXtreme Programming), para que as necessidades da equipe possam ser atendidas, devido ao contexto da disciplina. + +# 8. Estratégia de Comunicação + +A equipe irá necessitar fortemente de contato presencial e virtual acentuados, graças à complexidade do projeto. Tendo isso em vista, para o aspecto presencial, serão realizadas reuniões ao longo da semana, sendo elas: + +| Reunião | Descrição | Dia | Horário | Duração | +| :-----: | :-------: | :-: | :-----: | :-----: | +| Daily | Essa reunião tem como objetivo alinhar a equipe durante a semana, de maneira que seja um momento para que todos os membros fiquem cientes da evolução do projeto como um todo. Além disso, é um momento para se expôr impedimentos, assim como compartilhar experiências. | Terças e Quintas | 15:50 | No máximo 15 minutos. | +| Review, Retrospectiva e Planejamento | Essa reunião é para que seja feita uma análise da sprint como um todo. Nela será feito uma revisão do que foi produzido durante a semana, assim como uma retrospectiva do que foi positivo e negativo em questão de processo. Também será planejado o que será feito na próxima sprint. | Sábado | 09:30 | No máximo 3 horas. | + +Além disso, para o aspecto virtual, serão utilizadas as seguintes ferramentas: + +| Nome | Descrição | +| :--: | :-------: | +| Slack | Principal canal de comunicação da equipe. Aqui são tiradas dúvidas, imprevistos são comunicados e se tem a integração com o github, para que os membros sejam notificados da atividade do repositório. | +| Telegram | Canal de comunicação utilizado primariamente para a comunicação com o cliente. | + +# 9. Prazo e Custo + +O projeto terá uma duração de um total de 16 sprints. A primeira sprint teve inicio no dia 14 de Agosto de 2018, de maneira que a última sprint será iniciada no dia 26 de novembro de 2018. Durante esse período, haverão duas datas de entregas importantes, sendo elas denominadas releases. Uma ocorrerá no inico de outubro, enquanto outra ocorrerá entre o final de novembro e o início de dezembro. Totalizando assim 4 meses para a duração do projeto. + + +O custo do projeto foi calculado utilizando os seguintes valores, em reais: -# 7. Prazo +| Nome | Custo | Quantidade | Custo Mensal | Custo Total | +| :--: | :---: | :--------: | :----------: | :---------: | +| Desenvolvedores | 3500 | 6 | 21000 | 84000 | +| Engenheiros de Produto | 6500 | 4 | 26000 | 104000 | -# 8. Custo +Os valores para os salários foram obtidos a partir de salários de pessoas que exercem cargos semelhantes em Brasília. Para o time de desenvolvedor, considerou-se um salário de um desenvolvedor júnior, enquanto para os Engenheiros de Produto foi considerado o salário de um desenvolvedor sênior. diff --git a/docs/docs/Treinamentos.md b/docs/docs/Treinamentos.md index 0c419af..65a41a9 100644 --- a/docs/docs/Treinamentos.md +++ b/docs/docs/Treinamentos.md @@ -299,7 +299,7 @@ title: Treinamentos -## 3. Treinamento de Github Pages +## 4. Treinamento de Github Pages @@ -310,7 +310,7 @@ title: Treinamentos - @@ -395,3 +395,302 @@ title: Treinamentos
Instrutores: Fabíola, Matheus,Sannya e Vinicius Data: 25/09/2018 + Data: 25/08/2018
+ + + + +## 5. Treinamento de Métricas + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Github
Instrutores: Fabíola + Data: 01/09/2018 +
Objetivo: Argumentar a importância das medições e instruir as possíveis análises que podem ser feitas com os dados coletados. +
Conteúdo:GQM, métricas, análise de resultados. +
NomePresenteFaltaFalta Justificada
+
Caio + + + :white_check_mark: +
+
João Victor + +:white_check_mark: + +
+
Kaique Henrique + :white_check_mark: + +
+
Marcos Nery + :white_check_mark: + +
+
Rogério + :white_check_mark: + +
+
André Lucas + :white_check_mark: + +
+
+ +## 6. Treinamento de Docker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Github
Instrutores: Vinícius + Data: 06/09/2018 +
Objetivo: Instalação do ambiente, explicações sobre Docker, para que os mesmos possam iniciar o desenvolvimento com mais facilidade e segurança. +
Conteúdo:Docker, Django. +
NomePresenteFaltaFalta Justificada
+
Caio + + + :white_check_mark: +
+
João Victor + + + :white_check_mark: +
+
Kaique Henrique + :white_check_mark: + +
+
Marcos Nery + :white_check_mark: + +
+
Rogério + :white_check_mark: + +
+
André Lucas + :white_check_mark: + +
+
+ + + +## 6. Dojo de Python/Django e Graphene + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Github
Instrutores: Fabíola + Data: 10/09/2018 +
Objetivo: Familiariedade com as tecnologias de back end e API orientada ao GraphQL. +
Conteúdo:Docker, Django. +
NomePresenteFaltaFalta Justificada
+
Caio + + :white_check_mark: + +
+
João Victor + + :white_check_mark: + +
+
Kaique Henrique + :white_check_mark: + +
+
Marcos Nery + :white_check_mark: + +
+
Rogério + :white_check_mark: + +
+
André Lucas + :white_check_mark: + +
+
diff --git a/docs/docs/canvas.md b/docs/docs/canvas.md new file mode 100644 index 0000000..d073a74 --- /dev/null +++ b/docs/docs/canvas.md @@ -0,0 +1,6 @@ +--- +id: canvas +title: Canvas +--- + +![Canvas](https://fga-eps-mds.github.io/2018.2-ComexStat/img/canvasv1.jpg) diff --git a/docs/docs/doc-de-arquitetura.md b/docs/docs/doc-de-arquitetura.md new file mode 100644 index 0000000..56fd076 --- /dev/null +++ b/docs/docs/doc-de-arquitetura.md @@ -0,0 +1,183 @@ +--- +id: docArquitetura +title: Documento de Arquitetura +--- + +*** +## 1. Introdução +*** +Na introdução será apresentada uma ampla visão do documento, deixando clara a sua finalidade e quais pontos aborda. Além disso, serão neste tópico listadas algumas definições, acrônimos e abreviações de grande importância para o pleno entendimento do restante das seções. + +### 1.1 Objetivo + +Expor aos interessados uma visão geral acerca da arquitetura do ComexStat, pontuando aspectos deste segundo diferentes visões arquiteturais, deixando também em evidência algumas restrições e metas quanto a estes pontos. + + +### 1.2 Escopo + +Sendo uma sequência para a descrição geral do produto dada pelo Documento de Visão, o documento de Arquitetura ao descrever o sistema em um ponto de vista mais técnico, ajuda na compreensão do software bem como na compreensão da abordagem utilizada para desenvolve-lo, podendo por conseguinte servir também de base para avaliar se tal abordagem atende os requisitos do cliente. O descrito no documento afetará toda a construção do software, de tal forma que todo o prosseguimento do projeto será de acordo com as arquiteturas e modelos aqui definidos. + + +### 1.3 Definições, Acrônimos e Abreviações + +| **Abreviação** | **Definição** | +| :--------: | :-------: | +| MVC | Model-View-Controller (Modelo-Visão-Controlador, em inglês) | +| MVT | Model-View-Template (Modelo-Visão-Template, em inglês) | +| MDIC |Ministério da Indústria, Comércio Exterior e Serviços| + +*** +## 2. Representação Arquitetural +*** +O ComexStat será uma aplicação web desenvolvida a partir do framework Django, escrito em Python, em conjunto com o framework Angular 2, que será utilizado no desenvolvimento do front-end, e com a linguagem de consulta a bases de dados GraphQL, que servirá para facilitar os meios de comunicação com o banco de dados, escolhida por sua grande capacidade como linguagem de consulta dentro do contexto de Data Science. + + +O Angular 2 possuí uma arquitetura orientada a componentes como visualizado pelo diagrama abaixo: + +![Diagrama Angular](https://fga-eps-mds.github.io/2018.2-ComexStat/img/diagrama-angular.PNG) + + +Cada componente constrói através de Templates em HTML uma View, na qual é projetado o conteúdo visto pelo usuário. As chamadas Event e Propery Biding são as âncoras que ligam os elementos do Template nas funções do componente (que por sí é formado por várias parcelas de código em TypeScript definindo diversos métodos e elementos visuais, manipulando o conteúdo que é renderizado nas Views), o primeiro tipo conectando eventos e o segundo propriedades. Os serviços por sua vez, que são inseridos através das "Dependency Injections" (dependências de serviços estabelecidas nos componentes), são tarefas que fogem do aspecto da interação entre Templates e Views, como por exemplo uma requisição de dados ao servidor, e por isso ficam fora do mediado pelos componentes, sendo definidos de forma separada para uma melhor modularização e reutilização de código. Por fim, as "Directives" são classes que possuem outras instruções para a renderização das Templates em Views, podendo ser estruturais (definindo adição, remoção ou substituição de elementos a serem renderizados) ou de atributo (podendo definir outros comportamentos para atributos dentro do HTML). Todo esse conjunto forma enfim um Modulo, que ao se agrupar com outros módulos constrói a aplicação em Angular. + + +O Django, que será utilizado no back-end, por sua vez segue o padrão **MVC** de perto, no entanto, ele usa sua própria lógica na implementação. Como o *“Controller”* é manipulado pelo próprio framework e a maior parte do entusiasmo no Django acontece em modelos, templates e views, o Django é frequentemente chamado de framework da MTV. No padrão de desenvolvimento da **MVT**: + +**Model**, a camada de acesso a dados. Essa camada contém tudo e qualquer coisa sobre os dados: como acessá-lo, como validá-lo, quais comportamentos ele possui e as relações entre os dados. + +**View**, a camada de lógica de negócios. Essa camada contém a lógica que acessa o modelo e requisita a respectiva reposta. Você pode pensar nisso como a ponte entre modelos e templates. + +**Template**, a camada de apresentação. Essa camada contém decisões relacionadas à apresentação: como algo deve ser exibido em uma página da Web ou outro tipo de documento. + +Desta forma, a *view* do Django é mais parecida com o *controller* no MVC, e a *view* do MVC é na verdade um *Template* no Django. + +Dito isso, o sistema será desenvolvido não pela utilização da arquitetura MVT do Django de forma pura, mas pela adaptação já denotada com a utilização do Angular, dando ao projeto uma nova face arquitetural, na qual as models do Django continuarão fazendo seu papel de classes de domínios e interface com o banco de dados, o Angular 2 será utilizado para construção front-end, substituindo por conseguinte a função que seria feita pelas templates do Django. E por fim, o GraphQL, no caso do Django através da biblioteca Graphene, será a linguagem e ferramenta utilizada para realizar as consultas ao banco, ficando como interface entre o back-end e o front-end. + +Na prática, esse processo se dará por meio do usuário fazendo requisições por meio do front-end em Angular, que enviará uma ordem de pesquisa para a API através de um query parametrizado. Logo então, através dos métodos de pesquisa e filtragem definidos no Schema e pela utilização dos modelos de dados definidos nas models, será feita com o GraphQL uma consulta ao banco de dados (construído em SQLite). Após isso, o front-end receberá em formato JSON uma resposta com os resultados da pesquisa, que serão enfim mostrados ao usuário pelos Components do Angular. Isso tudo pode ser visualizado no seguinte diagrama: + + +![Diagrama de arquitetura](https://fga-eps-mds.github.io/2018.2-ComexStat/img/diagrama-arquitetura.png) + + +*** +## 3. Restrições e Metas Arquiteturais +*** +* **Suportabilidade** + O software poderá ser utilizado sem grandes problemas pela maior parte dos navegadores mais populares, no entanto, mas o principal enfoque são o Google Chrome e o FireFox, de tal forma que o usuário ao acessar o sistema por uma dessas vias poderá esperar total compatibilidade. + + * **Usabilidade** + O sistema deverá ser intuitivo e de simples uso, seguindo uma sequência lógica de ações possíveis, definida por Pesquisa ->Filtros -> Agrupamentos -> Visualização de dados -> Compartilhamento dos resultados. Dessa forma, o usuário não deverá precisar de tutoriais ou treinamentos extras para usufruir dos recursos disponibilizados. + + * **Ferramentas de Desenvolvimento** + O projeto será desenvolvido em Python (versão 3.5.6), usando o framework Django (versão 2.0.3), em conjunto com o Angular 2 que será de uso no front-end e com a utilização da linguagem GraphQL de consultas a banco de dados, no caso do Django através da biblioteca Graphene. + * **Confiabilidade** + O sistema terá uma cobertura mínima de testes de 90%, buscando garantir que suas funcionalidades foram suficientemente testadas. + +*** +## 4. Visão de Casos de Uso +*** + +### 4.1 Atores + +#### 4.1.1 Usuário comum +Usuário do sistema que utiliza os recursos disponibilizados pela aplicação web, usufruindo de tudo que ela pode oferecer por meio de uma interface intuitiva e de fácil uso. É o usuário que representa os gestores ou produtores de bens/serviços que tenham interesse nos dados relacionados ao comércio exterior, destes objetos de estudo e nas capacidades de análise desses dados que o sistema proporciona, proporcionando-lhes maior embasamento para decisões de mercado ou pesquisas similares. + +#### 4.1.2 Usuário desenvolvedor +Usuário do sistema que acessa, filtra e manuseia os dados da forma desejada através de uma API. É o usuário que representa, principalmente, os funcionários do MDIC cuja função profissional envolve o manejo direto dos dados relacionados ao comércio exterior de bens e serviços agrupados por este ministério. + +### 4.2 Diagrama de casos de uso + +![Casos de uso](https://fga-eps-mds.github.io/2018.2-ComexStat/img/casosDeUso.png) + +### 4.3 Prioridade dos casos de uso + +Na forma escolhida para classifica-los, os casos de uso possuem três tipos de prioridades: + + * **Essenciais:** Funcionalidades indispensáveis para o sistema, sem as quais o mesmo não é considerado funcional. + * **Importantes:** Funcionalidades que são necessárias para o cliente, mas o sistema pode funcionar sem elas. + * **Desejáveis:** Funcionalidades desejadas mas que podem ou não ser adicionadas posteriormente, sem elas o sistema já atende todas as necessidades do cliente. + + + |Caso de Uso|Prioridade| + |:---------:|:--------:| + |Consultar e filtrar os dados disponibilizados, através da API|Essencial| + |Consultar e filtrar os dados disponibilizados, através da aplicação web|Essencial| + |Gerar permalinks dos resultados pesquisados|Essencial| + |Exportar os resultados das consultas em formatos como .csv e PDF|Essencial| + |Gerar visualizações gráficas dos dados|Essencial| + |Compartilhamento da consulta feita em redes sociais ou similares|Importante| + |Comparar, incluindo graficamente ,os dados resultantes de múltiplas pesquisas|Desejável| + |Compartilhamento via embedding de páginas|Desejável| + + +*** +## 5. Visão Lógica +*** + +### 5.1 Visão Geral + +O sistema será desenvolvido usando o framework web Django, com uma forma adaptada de seu padrão MVT, em conjunto com o Angular para o front-end e o GraphQL como linguagem e ferramenta de consulta ao banco de dados. Ficando portanto setorizado da seguinte forma: + + * API em Django. + * Models do Django como classes de domínios e interface com o banco de dados. + * Front-end em Angular 2 funcionando como cliente do back-end e fazendo requisições a ele pela interação do usuário ao acessar a aplicação, de tal forma a processar e mostrar de forma apropriada os dados de saída ao mesmo. + * GraphQL como interface entre front-end e back-end, tendo a função de fazer a consulta ao banco, cujos resultados serão posteriormente retornados ao front-end se necessário. + +Sendo assim, pelo navegador, o usuário acessa diretamente a API, podendo nela fazer diretamente as suas pesquisas e filtragem nos dados do banco através do GraphQL, ou então acessa a aplicação web por meio do front-end em Angular. Neste, um chamado "router" fará a identificação no padrão da URL e irá direcionar o usuário à View apropriada, através da qual o mesmo poderá fazer suas requisições, que serão então passadas para API da forma já descrita. Por fim, os resultados retornados da busca feita são renderizados na View de forma apropriada para a visualização. + +### 5.2 Pacotes de Design Significativos do Ponto de Vista da Arquitetura + +![Diagrama de pacotes](https://fga-eps-mds.github.io/2018.2-ComexStat/img/diagrama_pacotes.png) + +No Back-End temos os pacotes de design significativos como sendo: models, schema e tests. Cada um com seu respectivo conteúdo: + + * models: Contém as models do Django, onde são definidos os modelos de dados. Representam a interface com o banco de dados. + * schema: Contém a definição dos métodos de pesquisa e filtragem de dados, unindo Django e GraphQL através da biblioteca Graphene. + * tests: Contém os testes unitários feitos no sistema. + +Já no Front-End, em Angular 2, temos a representação dos pacotes de design significativos como sendo os Components do módulo "assets", que pertence a aplicação "comex_stat", sendo estes (todos contendo suas devidas Views e Templates relacionadas): + + * search: Component que define a parte da aplicação dedicada as pesquisas de dados + * graphic: Component que define a parte da aplicação dedicada a visualização gráfica dos dados + * nav: Component que define a barra de navegação da aplicação + * export: Component que define a parte da aplicação dedicada a exportação dos dados + * share: Component que define a parte da aplicação dedicada ao compartilhamento de páginas + +Além disso, há também dentro do módulo "assets" a seção "shared", na qual serão definidas coisas como os já citados Services da aplicação. + + +*** +## 6. Visão da Implementação +*** + +### 6.1 Diagrama do banco de dados +![Diagrama banco](https://fga-eps-mds.github.io/2018.2-ComexStat/img/ComexStat_DataBasehtml.png) + +### 6.2 Diagramas de classes, por camadas + +#### Model +![Diagrama-classe-model](https://fga-eps-mds.github.io/2018.2-ComexStat/img/diagrama-de-classe-model.png) + +*** +## 7. Qualidade +*** +A arquitetura adotada, utilizada como adaptação do MVT, oferece uma organização das camadas da aplicação, possibilitando aos desenvolvedores uma fácil manutenção, além de vir de um padrão de arquitetura altamente confiável e muito utilizado. Além disso, GraphQL é mais eficiente que outras linguagens na função que cumpre, já que ele não é vinculado a nenhum banco de dados, apenas realisa a consulta retornando o requisitado. + +Outro ponto a ser ressaltado, é o uso das ferramentas citadas em busca pelo desenvolvimento de um código de fácil manutenibilidade, para que o sistema possa ser facilmente mantido e evoluído, mesmo após sua finalização, quando ele será passado para os cuidados de outros profissionais. + + +## Histórico da Revisão + +| **Data** | **Versão** | **Descrição** | **Autor** | +| :------: | :--------: | :-----------: | :-------: | +|09/09/2018|0.1.0|Abertura e preenchimento da introdução|Marcos Nery| +|10/09/2018|0.2.0|Adição das restrições e metas arquiterurais|Marcos Nery| +|10/09/2018|0.3.0|Adição da visão geral da visão lógica|Kaique Borges| +|10/09/2018|0.4.0|Adição da representação arquitetural|André Lucas| +|10/09/2018|0.5.0|Adição da qualidade|João Victor| +|13/09/2018|0.6.0|Adição da visão de casos de uso|Marcos Nery| +|13/09/2018|0.6.1|Atualização da representação arquitetural,restrições e metas arquiteturais e qualidade|João Victor| +|13/09/2018|0.7.0|Adição do diagrama de classe|André Lucas| +|13/09/2018|0.8.0|Adição do diagrama de banco de dados|Marcos Nery| +|14/09/2018|1.0.0|Revisões gerais para primeira versão do documento|Marcos Nery e Rogério Júnior| +|25/09/2018|2.0.0|Refatoração da arquitetura|Marcos Nery| +|26/09/2018|2.1.0|Adição do diagrama de pacotes|Marcos Nery| \ No newline at end of file diff --git a/docs/docs/doc-de-visao.md b/docs/docs/doc-de-visao.md new file mode 100644 index 0000000..2b5036f --- /dev/null +++ b/docs/docs/doc-de-visao.md @@ -0,0 +1,208 @@ +--- +id: docVisao +title: Documento de Visão +--- + +## 1. Introdução + + + Nesta introdução serão abordados tópicos referentes a uma visão geral do produto, definindo seu propósito, escopo, definições, acrônimos, abreviações e referências. + +### 1.1 Propósito + + Esse documento visa especificar todo o escopo de funcionamento do ComexStat, deixando claro seu objetivo, a razão de sua necessidade e a forma como busca solucionar os problemas aos quais se propõe, deixando claro possíveis restrições. Dessa forma, sua principal utilidade objetiva também, ao esclarecer o que é o sistema para os desenvolvedores, clientes e usuários, estabelecer entre os mesmos um eficiente alinhamento de ideias. + +### 1.2 Escopo + +Suprir a necessidade de um sistema proeminente na visualização de dados relacionados ao comércio de bens no Brasil. Proporcionando algo que seja mais intuitivo ao usuário, o ComexStat será integrado por uma plataforma web, cujas capacidades abrangem funcionalidades como: +* Gerar tabelas a partir de dados providos pelo banco de dados do MDIC, dando ao usuário a possibilidade de filtrar os resultados a partir de informações específicas, de acordo com as suas necessidades; +* Disponibilizar os resultados de tais tabelamentos para download, principalmente, em formato PDF ou similar, de tal forma que o usuário tenha facilidade para salvar os dados que são de seu interesse; +* Gerar gráficos que facilitem a visualização e entendimentos dos dados requisitados. + +Além disso, o sistema também deverá ser feito de forma adequada para integrar posteriormente, além das informações relacionadas ao comércio exterior de bens, os dados relacionados ao comércio exterior de serviços no Brasil. + + +### 1.3 Definições, acrônimos e abreviações + +| **Abreviação** | **Definição** | +| :--------: | :-------: | +| MDIC | Ministério da Industria, Comércio Exterior e Serviços | +| MDS | Métodos de Desenvolvimento de Software | +| EPS | Engenharia do Produto de Software | +| FGA | Faculdade do Gama | +| UnB | Universidade do Brasília | + +### 1.4 Referências + + **PORTAL IFRN .MODELO DE UM DOCUMENTO DE VISÃO.** Disponível em: + . Acessado em: 29 de Agosto de 2018. + + **SISTEMA DE PESQUISA DE DADOS RELACIONADOS AO COMÉRCIO EXTERNO BRASILEIRO DE BENS.** Disponível em: + . Acessado em: 29 de Agosto de 2018. + + **FILTROS PARA ANÁLISE DE DADOS DO SISCOSERV.** Disponível em: + . Acessado em: 28 de Agosto de 2018. + +### 1.5 Visão Geral + +A organização do documento é feita de maneira a prover ao leitor a capacidade de através do mesmo entender o produto em seus vários aspectos de forma coesa. Para tal, são apresentados primeiramente os tópicos referentes a função geral do software e as motivações que levaram a sua criação, após isso, é descrito o posicionamento do produto em relação ao mercado e as partes interessadas, incluindo a forma como a criação do sistema afetará os usuários. Por fim, são descritas as principais funcionalidades do software, bem como algumas de suas restrições e requisitos. + +*** +## 2. Posicionamento +*** + +### 2.1 Oportunidade de Negócios + +O ComexStat, tornando mais fácil o acesso aos dados relacionados ao comércio exterior de bens, e posteriormente serviços, no Brasil, proporciona também aos usuários a possibilidade de trabalhar com as informações desejadas de forma mais adequada as suas necessidades. Resolvendo portanto principalmente os problemas relacionados a atual dificuldade em acessar os dados e tirar deles alguma conclusão, por conta da forma pela qual os mesmos são disponibilizados e por seu grande volume, além da falta de ferramentas que possibilitem ao usuário filtrar, visualizar graficamente, e exportar de formas variadas esses dados, recursos estes que são presentes no ComexStat. Dessa forma, o sistema dá mais eficiência para as funções do MDIC quanto a exposição das informações, bem como para qualquer gestor ou produtor de bens ou serviços que tenha interesse nos dados disponibilizados para fazer qualquer tipo de análise. + +### 2.2 Instrução do Problema + +| | | +| :--------: | :-------: | +| **Problema**| Dados relacionados ao comércio exterior de bens e serviços no Brasil são abertos a população porém de difícil uso e interpretação, por conta do seu grande volume e formato disponibilizado| +| **Funções afetadas** | Análise e visualização dos dados de comércio de bens e serviços | +| **Efeito** | Os dados acabam por não serem utilizados| +| **Solução** | Reformular a plataforma web já existente, de forma a dar ao usuário a possibilidade de acessar, filtrar e visualizar os dados de forma mais intuitiva| + +### 2.3 Instrução de Posição do produto + +| | | +| :--: | :--: | +| **Público Alvo** | Gestores e produtores de bens ou serviços| +| **Carência** | Necessidade de um melhor acesso e ferramentas de manejo a informações relacionadas ao comércio exterior de bens e serviço no Brasil | +| **Solução** | ComexStat | +| **Descrição da Solução** | Uma plataforma web que permita ao usuário o acesso aos dados de forma fácil e intuitiva, a partir de uso de filtros, detalhamento e ferramentas de visualização gráfica, além da possibilidade de exportação das informações em formatos como PDF e .csv | +| **Diferenciais** | Facilidade no acesso e ferramental para proporcionar uma melhor interpretação dos dados, oferecendo diversos recursos que não estão presentes no atual sistema, como permalinks para compartilhamento de resultados e as já citadas soluções de exportação e visualização gráfica dos dados | + +*** +## 3. Descrição dos Envolvidos e dos Usuários +*** + +### 3.1. Resumo dos Envolvidos + +| Nome | Descrição | Responsabilidade| +|-----|-------|---------| +| Equipe de Programação | Estudantes da UnB da disciplina de MDS | Elaboração dos documentos de visão e de arquitetura; Desenvolvimento do software esclarecido nesse documento; Atendendo aos requisitos definidos; Utilizar as práticas ágeis para otimizar o processo. | +| Devops | Estudante da UnB da disciplina de EPS | Configurar ambiente de desenvolvimento, homologação e produção utilizando contâiners; Definir política de commits e branchs de acordo com o git flow; Garantir que o time siga o git flow; Construir o pipeline de integração e deploy contínuos; Definir roadmap de deploy contínuo. | +| Arquiteto | Estudante da UnB da disciplina de EPS | Definir o roadmap de requisitos; Garantir que o time de desenvolvimento siga a arquitetura; Propor arquitetura de micro serviços e a configuração de contâiners com micro serviços. | +| Scrum Master (SM) | Estudante da UnB da disciplina de EPS | Gerenciar comunicação do Time; Garantir que os membros sigam o processo Definido; Gerenciar riscos; Definir, monitorar e controlar indicadores e metricas de produtividade, utilizando-os para tomadas de decisões no projeto; Definir e seguir roadmap para produtividade máxima do time. | +| Product Owner (PO) | Estudante da UnB da disciplina de EPS | Ter a visão de Produto; Elaborar o Termo de Abertura; Elaborar a Estrutura Analítica do Projeto (EAP); Definir plano de negócio; Gerenciar backlog de histórias; Desenvolver identidade visual e guia de usabilidade do produto; Definir roadmap de produto. | +| Cliente | Requisitou a aplicação | Fornecer e validar os requisitos da aplicação | + +### 3.2. Descrição dos Usuários + +| Representantes | Gestores em empresas ou autônomos provedores de bens ou serviços | +| :--------: | :-------: | +| Descrição | Indivíduos que por sua função/ocupação profissional podem ter interesse em acessar os dados disponibilizados pelo MDIC, para finalidades como análise de mercado ou similares, muitas vezes servindo como base para tomada de decisões relacionadas a investimentos/negócios| +| Responsabilidades | Fazer pesquisas filtrando os resultados e utilizar ferramentas de visualização gráfica | +| Critérios de Sucesso | Entender de forma adequada os dados pesquisados sobre bens e serviços e conseguir exportá-los caso desejado | + +### 3.3. Ambiente do Usuário +O acesso aos serviços do software poderá ser feito por navegadores de internet, como: +* Google Chrome; +* Mozila Firefox; + + +### 3.4 Principais necessidades dos usuários ou envolvidos + +| **Necessidade** | **Prioridade** | **Interesses** | **Solução Atual** | **Solução Proposta** | +| :--------: | :-------: | :--------: | :-------: | :--------: | +| Ter acesso aos dados em outros formatos | Alta | Ter tudo reunido em um arquivo para diversos usos como pesquisas, análise de dados, etc. | Acessar o site do MDIC, procurar pelas estatísticas de 2017 e baixá-las | Disponibilizar o download dos dados em diversos formatos através de botões na página de resultado da pesquisa | +| Filtrar a busca dos dados | Alta | Facilitar ao usuário a obtenção dos dados de forma mais rápida e objetiva | Manualmente categorizar e filtrar os dados | Disponibilizar filtros e categorias na página de busca | +| Visualizar os dados de forma mais organizada | Alta | Entender e absorver os dados com maior facilidade | Gerar gráficos manualmente usando as planilhas disponibilizadas pelo MDIC | Disponibilizar gráficos, tabelas e outras ferramentas interativas para uma descrição mais clara e visual das informações | + +*** +## 4.Visão Geral do Produto +*** + +### 4.1 Perspectiva do produto + + O ComexStat visa prover ao usuário facilidade de acesso a informações referentes ao comércio exterior brasileiro de bens, descomplicando a interpretação e visualização dos dados por meio de filtros de pesquisas e uso de gráficos. Além disso, também são disponibilizadas formas coerentes para que os dados de interesse possam ser extraídos, em formato .csv, PDF ou similar. + + +### 4.2 Resumo das capacidades + +| **Benefícios para o Cliente** | **Recursos de Suporte** | +| :--------: | :-------: | +| Consulta rápida e fácil aos dados disponibilizados pelo MDIC | Pesquisa no banco de dados | +| Capacidade de filtrar as informações pesquisadas | Opções para obter resultados de acordo com filtros de categorias pré-determinadas ou customizadas | +| Possibilidade de fazer o download das informações desejadas| Recurso que permite ao usuário extrair uma determinada seleção de dados, seja em formatos tabulares como .csv ou em formatos de documento como PDF | +| Capacidade de visualizar as informações de formas diferentes| Disponibilização de formas gráficas de representação dos dados selecionados| + +*** +## 5.Recursos do Produto +*** + + * Área de acesso aos dados disponibilizados acerca do comércio externo brasileiro de bens. + * Opções para filtrar as pesquisas por categorias específicas. + * Layout intuitivo, para que o usuário possa selecionar os filtros que melhor se encaixam as suas necessidades. + * Opções para ordenar os resultados encontrados a partir de uma coluna específica. + * Opções para incluir ou retirar colunas de informação da pesquisa feita. + * Possibilidade de extrair as informações de interesse em formatos tabulares acessíveis, como .csv, ou em formatos mais acessíveis como o PDF. + * Mais ferramentas relacionadas a formas diferentes de visualizar os dados, como aparatos gráficos e afins. + * Permitir ao usuário, pelo uso de permalinks, compartilhar facilmente um conjunto específico de resultados. + +*** +## 6: Restrições +*** + +### 6.1 Restrições de implementação + + O sistema deverá ser implementado na linguagem Python, construindo uma aplicação web com o uso do framework Django. + +### 6.2 Restrições externas + + Dentre as restrições externas as que mais irão influenciar são a inexperiência com a linguagem e frameworks, além de possíveis transtornos entre a equipe de desenvolvimento. + +### 6.3 Restrições de design + +O sistema deve ter uma interface que seja de fácil uso para pessoas. Dessa forma, será necessária uma plataforma intuitiva, com ícones e botões de fácil pesquisa e acesso. + +### 6.4 Restrições de confiabilidade + +O sistema deverá ter cobertura de testes - mínimo de 90%. + +*** +## 7: Faixas de Qualidade +*** + + Para maior eficiência, a aplicação será web, pois o gerenciamento de dados e informações seria dificultado no caso de uma aplicação exclusiva para aparelhos mobile. + +*** +## 8. Requisitos do Produto +*** + +### 8.1 Requisitos do Sistema + + O sistema poderá ser acessado pelo usuário através de um navegador, tendo a necessidade de conexão com a internet. + +### 8.2 Requisitos de Design + + O sistema deverá ser intuitivo e autoexplicativo, possibilitando uma fácil interação com o usuário, seguindo um fluxo básico de funcionamento definido por: Pesquisa ->Filtros -> Agrupamentos -> Visualização de dados -> Compartilhamento dos resultados. + +### 8.3 Requisitos de Portabilidade + + O sistema é utilizável através da maior parte dos navegadores web atuais, sendo compatível com os principais sistemas operacionais como Windows, Mac OS e Linux. + +### 8.4 Requisitos de Confiabilidade + + O sistema deve se comprometer em disponibilizar os dados de maneira transparente e confiável aos usuários. + +## Histórico da Revisão + +| **Data** | **Versão** | **Descrição** | **Autor** | +| :------: | :--------: | :-----------: | :-------: | +|29/08/2018|0.1.0|Abertura do documento|Rogério Junior, Marcos Nery e André Lucas| +|29/08/2018|0.2.0|Preenchimento dos tópicos da introdução|Rogério Junior, Marcos Nery e André Lucas| +|30/08/2018|0.3.0|Preenchimento inicial dos tópicos do Posicionamento|Marcos Nery| +| 30/08/2018 | 0.4.0 | Finalização dos tópicos de Posicionamento | Rogério Júnior | +| 30/08/2018 | 0.5.0 | Preenchimento inicial dos tópicos de Descrição | André Lucas | +| 30/08/2018 | 0.6.0 | Preenchimento do tópico Perfis dos Usuários | João Victor | +| 30/08/2018 | 0.7.0 | Preenchimento inicial dos tópicos da visão geral | Marcos Nery| +| 30/08/2018 | 0.8.0 | Melhorias e preenchimento dos Tópicos 6 e 7 | André Lucas | +| 30/08/2018 | 0.9.0 | Preenchimento do tópico referente aos recursos do sistema |Marcos Nery| +| 30/08/2018 | 0.10.1| Preenchimento das referências e correções gerais|Marcos Nery| +| 30/08/2018 | 0.11.1| Preenchimento do tópico Requisitos do Produto | Caio Santos | +| 31/08/2018 | 1.0.0 | Correções ortográficas e organização final da primeira versão do documento|Marcos Nery| +| 06/09/2018 | 1.1.1 | Alterações no documento com base nas revisões feitas e novas informações acrescentadas| Marcos Nery, Rogério Júnior, Kaique Borges, André Lucas, João Victor e Caio Santos| +| 08/09/2018 | 2.0.0 | Feitas as revisões solicitadas pela Scrum Master | Marcos Nery e Rogério Júnior | diff --git a/docs/docs/doc_politica_branches.md b/docs/docs/doc_politica_branches.md new file mode 100644 index 0000000..6f8e1a3 --- /dev/null +++ b/docs/docs/doc_politica_branches.md @@ -0,0 +1,157 @@ +--- +id: politicaBranches +title: Política de Branches +--- + +# Política de Branches + +## Divisão e como usar as branches +Com o intuito de possuir uma melhor dinâmica de mudanças de código, é importante que tenhamos uma boa política de branches. Este documento servirá de base para criação de branches e como serão organizadas, estas baseadas no **git flow** que é um modelo de organização de branches. + +Aqui será descrito como funcionará as branches do projeto. + +* **Branch master** - Esta será a branch que contém o código em nível de produção, será o código mais consolidado existente na aplicação. Todo o código novo produzido eventualmente é juntado com a branch master, em algum momento do desenvolvimento; + +* **Branch develop** - Develop é a branch que logo após releases deverá ser identica à master, porém, quando as features são terminadas, elas são juntadas nesta branch, testadas e somente depois as atualizações da develop passam pelo processo de juntar as novas atualizações com a branch master; + +* **Branches feature** - Essas são as branches na qual são desenvolvidos novos recursos ao projeto, elas serão criadas com o nome começando **feature**/ (exemplo: feature/new-layout) e a partir da branch develop, e, ao final, são juntadas com a branch develop; + +* **Branches hotfix** - São branches no qual são realizadas correções de bugs críticos encontrados em ambiente de produção, e que por isso são criadas a partir da branch master, e são juntadas diretamente com a branch master e com a branch develop. Por convenção, essas branches tem o nome começando com **hotfix**/ e terminando com o próximo sub-número de versão (exemplo: hotfix/2.31.1); + +* **Branches release** - São branches com um nível de confiança maior do que a branch develop, e que se encontram em nível de preparação para ser juntada com a branch master e com a branch develop, nessas branches, bugs encontrados durante os testes das features que vão para produção podem ser corrigidos mais tranquilamente, antes de irem efetivamente para produção. Por convenção, essas branches tem o nome começando com **release**/ e terminando com o número da próxima versão do software, exemplo (release/2.32.0); + +* **Branches documentation** - Essas são as branches na qual são desenvolvidos os documentos do projeto, elas serão criadas com o nome começando **documentation**/ (exemplo: documentation/documento-visao), elas são criadas a partir da branch develop e, ao final, é feito um pull-request para a branch develop. + +Para ir para a master, só é possível via requisição aqui na interface do github. E a branch tem q estar "rebased", ou seja, sem conflitos, com os commits que estão na master (e os commits que entraram na master) e o acréscimo dos commits que foram feitos efetivamente pela sua branch. + +## Comandos básicos a serem seguidos + +A branch master devemos sempre mantê-la atualizada, primeiro atualizando quais branches foram criadas ou deletadas no remoto, e depois dando pull na master: + + git fetch -p --all + +A opção -p, ou --prune serve pra tbm deletar localmente as branchs q foram deletadas no remoto. --all serve para olhar para outros remotes (github, gitlab se tiver) + + git pull origin master + +Isso atualiza a master, e por padrão não deve haver conflito. + +Origin é o remoto padrão, o primeiro cadastrado. é a url do repositório. + +Para ter certeza de que estamos na master: + + git checkout master + +E a partir da master criamos a dev: + + git checkout -b develop # (nosso repo ja tem isso... nao rode "-b" com branches ja existentes) + +A partir da develop diversos developers irão criar novas funcionalidades. Como exemplo podemos criar uma nova branch para desenvolver: + + git checkout -b feature/nova-func + +Nessa nova branch iremos fazer diversos commits, de preferencia um commit a cada ponto importante, para termos pra onde voltar se algo der errado. + +Ao finalizar o desenvolvimento, damos push nessa nossa branch. + + git add -u + git commit -s + # escreva mensagem + git push origin feature/nova-func + +Ao final de toda a funcionalidade temos que mandar o que fizemos para a branch develop, para de la mandar pra master via merge request. + +Mas outras pessoas provavelmente ja mandaram modificações para a develop, de suas respectivas branchs. Isso pode gerar conflitos, commits de merge, entre outras coisas indesejadas. + +Uma boa pratica é, ir para develop: + + git checkout develop + +Fazer um pull, mas usando o --rebase, para evitar commits de merge. (uma alternativa é apagar a branch de develop local, dar um fetch, e dar um checkout pra ela) + + git pull origin develop --rebase + +ou + + git branch -D develop # estando em outra branch qualquer + git fetch -p + git checkout develop + +Isso atualiza a branch develop. + +É interessante olhar os commits que estão acrescentados à develop por outras pessoas: + + git log + +Agora de volta em nossa branch: + + git checkout feature/nova-func + +Olhamos nossos commits e contamos quantos foram os que fizemos: + + git log + +Se houver conflito basta dar + + git status + +Corrigir o conflito no arquivo. Dar git add no mesmo, e entao + + git rebase --continue + +Se nao houver conflito o rebase local ja está feito. + +Para subir isso pro remoto é necessário usar a flag -f pois vamos fazer uma alteração na branch que não é somente acrescentar um commit a frente de tudo. Essas alterações demandam a flag force. + + git push origin feature/nova-fun -f + +Mas ainda nao podemos mandar nada pra develop, por conta dos commits de outras pessoas que já entraram la. + +Para solucionar isso fazemos um rebase com a develop: + + git rebase develop + +Os commits que estão diferentes na branch develop, são aplicados à branch feature/nova-func. + +Se houver conflito, temos que resolver da mesma maneira: + + git status + +Editar os arquivos com conflito, dar git add, e entao git rebase --continue + +Assim que a branch feature/nova-func estiver "rebased" podemos, ou fazer um merge request para a develop, ou mergir direto na develop, ja que a deve não precisa de tanta revisão. Isso vai depender da certeza de que as modificações estão ok. + +Para mergir direto, vá para a branch develop, e fazer um + + git merge feature/nova-func # ou rebase + git push origin develop # de maneira geral nao precia de -f, ja q a develop não foi ""rebased"" + +Já que os rebases foram feitos, não haverá conflito, por padrão. + + +Para efetuar um merge request, basta ir na interface do github e apertar o botão, e mandar comparar as branchs (develop, e feature/nova-func). E assinar um revisor para aceitar ou não o merge request. + +Para mandar da develop para a master da org oficial só é possível via merge request, com branches rebased e sem conflitos. Nunca a pessoa que trabalhou na branch pode ser o próprio revisor. Deve-se ter cuidado ao aceitar merge requests na master, pois por padrão ela é uma brach protegida e que não pode sofrer nenhum rebase. + +## Política de commits + +Para que ocorra uma padronização, nossos commits serão em inglês, com mensagens curtas e que possuam significados relevantes sobre o conteúdo do commit, estas mensagens deverão possuir verbos conjulgados no tempo passado ou participio e serem feitos apenas quando os incremetos forem significativos, devem ser evitado commits alterando nome de variáveis, excluindo e adicionando linhas em branco. + +Exemplo de commits + + Creating code of feature X. + +Se estiver trabalhando em conjunto especifique os participantes no commit. + + git commit -s + +Irá abrir o seu editor de texto e nele deverá ser acrescentado o(s) co-authored da seguindo o exemplo: + + Signed-off-by: Vinicius Rodrigues + Co-authored-by: João Victor + +## Referências Bibliográficas + +> * HADLER, Mikael. Utilizando o fluxo Git Flow. Disponível em: . Acesso em: 26 ago. 2018. + +> * MOTA, Fernando Jorge. Git Flow: Uma forma legal de organizar repositórios git. Disponível em: . Acesso em: 26 ago. 2018. diff --git a/docs/docs/documentoDeVisao.md b/docs/docs/documentoDeVisao.md deleted file mode 100644 index f21d9ba..0000000 --- a/docs/docs/documentoDeVisao.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: docVisao -title: Documento de Visão ---- - -# 1. Introdução - -Realização do treinamento para documentação diff --git a/docs/docs/estrutura-analitica-projeto.md b/docs/docs/estrutura-analitica-projeto.md new file mode 100644 index 0000000..179e651 --- /dev/null +++ b/docs/docs/estrutura-analitica-projeto.md @@ -0,0 +1,10 @@ +--- +id: eap +title: Estrutura Análitica do Projeto +--- + +## Visão Geral +![EAP Geral](https://fga-eps-mds.github.io/2018.2-ComexStat/img/eap_geral.jpg) + +## Visão de Produto +![Estrutura Análitica do Projeto](https://fga-eps-mds.github.io/2018.2-ComexStat/img/eap.png) diff --git a/docs/docs/guia-de-estilo.md b/docs/docs/guia-de-estilo.md new file mode 100644 index 0000000..fe2ade3 --- /dev/null +++ b/docs/docs/guia-de-estilo.md @@ -0,0 +1,34 @@ +--- +id: guiaestilo +title: Guia de Estilo +--- + +## 1. Introdução + +Neste documento serão documentados os atributos utilizados para compor o guia de estilo. Estará incluso aqui a logo da aplicação, assim como a tipografia utilizada e as cores definidas. + +## 2. Cores + +- Primária: Foi escolhido como cor primária o verde, em sua tonalidade(em hexadecimal) #17c13d. Essa cor será utilizada em navbars, separações, botões, etc. + +![Cor Primária](https://fga-eps-mds.github.io/2018.2-ComexStat/img/guiaestilo/greencomexstat.png) + +- SecundáriaO cinza, em seu tom #c9c9ce foi escolhido como cor secundária para utilização de contraste, principalmente em tabelas geradas pelo usuário a partir de uma busca. Além dela, foi escolhido o vermelho #c11717, para que exista um contraste com o verde, criando um sentimento de negatividade para o botão que a utilizar. + +![Cor Secundária](https://fga-eps-mds.github.io/2018.2-ComexStat/img/guiaestilo/secondarycomexstat.png) +![Cor Secundária2](https://fga-eps-mds.github.io/2018.2-ComexStat/img/guiaestilo/redcomexstat.png) + +- Neutras: Foram escolhidas as cores branca e preto. A branca é utilizada para background e textos de botões da navbar, enquanto o preto é utilizado em componentes com o background branco. + +![Cor Neutra](https://fga-eps-mds.github.io/2018.2-ComexStat/img/guiaestilo/blackcomexstat.png) +![Cor Neutra2](https://fga-eps-mds.github.io/2018.2-ComexStat/img/guiaestilo/whitecomexstat.png) + +## 3. Logo + +A logo utilizada para o Comexstat será a mesma do sistema antigo. + +![Logo](https://fga-eps-mds.github.io/2018.2-ComexStat/img/guiaestilo/logo.png) + +## 4. Tipografia + +A fonte escolhida para o website foi a Helvetica Neue, com tamanho 18 para botões da navbar e 16 para botões e textos na página principal. diff --git a/docs/docs/pipelineDevOps.md b/docs/docs/pipelineDevOps.md new file mode 100644 index 0000000..593e491 --- /dev/null +++ b/docs/docs/pipelineDevOps.md @@ -0,0 +1,121 @@ +--- +id: pipelineDevOps +title: Pipeline DevOps +--- + +## Integração Contínua + +A Integração Contínua é uma prática de desenvolvimento da metodologia Extreme Programming(XP) +que exige que os desenvolvedores integrem o código em uma mainline o mais frequentemente +possível, pelo menos uma vez por dia, e cada check-in é verificado por uma build automática +que compila o código e roda o conjunto de testes automatizados contra ele, permitindo que +os times detectem problemas com antecedência. + +## Deploy Contínuo + +O processo de Deploy Contínuo ou Continuous Deploy tem a capacidade para automatizar +a aprovação e os testes do produto de software. O conceito é entregar valor de negócio +o mais rápido possível e não acumular um código novo, ou seja, se o código passou pelo +processo de integração que é responsável por testes de integração ou testes unitários, +e também foi avançando no processo de delivery com testes manuais, visuais e de +comportamento, então entra a fase de deployment que é responsável por publicar o +código em produção de forma automatizada. + + +Este processo normalmente é distribuído em dois aspectos, que chega a ser modificada +dependendo do tipo de projeto que está sendo desenvolvido: + +* Totalmente automatizado: onde a cada mudança no código é automaticamente verificada +e, se tudo estiver certo a aplicação vai para produção. (LANDIER et al., 2013) + +* Semi-automatizado: onde a ideia é ser capaz de empurrar para produção a última +versão estável do sistema em qualquer momento apenas apertando um botão, nesse caso, +chamamos de "one-click-deployment". (LANDIER et al., 2013) + +## Estrutura do Ambiente + +* Desenvolvimento - O ambiente de desenvolvimento será onde o software será desenvolvido. + +* Homologação - O ambiente de homologação é o ambiente de teste e onde será feito o +desenvolvimento do software. É onde o cliente aceita ou não as funcionalidades implementadas. + +* Produção - O produto é onde se encontra a versão mais estável do software, em que estará +dispinível a versão final do produto para os usuários. + +## Teste e Build + +Planejamos utilizar a ferramenta Travis-CI para a realização de testes unitários no +projeto. + +O Travis possui integração com o Github, uma vez configurado, a cada commit um build +é lançado pelo Travis de forma automática. Também conhecido como integração contínua, +o processo de executar o build e testes é feita a cada commit. + +Para avaliar a manutenibilidade do código iremos utilizar o Code Climate para analisar +estaticamente a qualidade do código, onde será visto a complexidade ciclomática e a +duplicidade de código. + +O Code Climate foi criado por Bryan Helmkamp, bastante conhecido por contribuições +em vários projetos open source. + +O Code Climate funciona de maneira muito simples, após o cadastro do projeto público +ou privado do Github na plataforma ele vai iniciar a verificá-lo até gerar um nota +que vai de zero a quatro. + +## Pipeline + +O ambiente de homologação será atualizado a cada sprint e estará disponível apenas +para desenvolvedores e cliente, já o de produção será atualizado a cada duas sprints +e está disponível além do cliente para os usuários. + +Nossos serviços estão separados em três parte: back-end, front-end e database. + +Foi separado em quatro fases a entrega de artefatos, onde, no ambiente de homologação +deverá ser entregue pequenas funcionalidades já para o ambiente de produção será +criada uma release para fazer o deploy das funcionalidades do software. + +### Fase 1 + +![Fase 1](https://fga-eps-mds.github.io/2018.2-ComexStat/img/Diagrama-Pipeline1.png) + +Na primeira fase será executada a política de branches, de commits e os teste para a +construção do código, onde o time terá que seguir os padrões que foi proposto para +assim criar uma versão com funcionalidades. + +### Fase 2 + +![Fase 2](https://fga-eps-mds.github.io/2018.2-ComexStat/img/Diagrama-Pipeline2.png) + +Na segunda fase a nova versão que foi publicada é processada pela ferramenta que vai +realizar todos os testes unitários, os que já foram implementados e os novos, logo +após é feito a build de teste. Em caso de erros a versão voltará para primeira fase. + +### Fase 3 + +![Fase 3](https://fga-eps-mds.github.io/2018.2-ComexStat/img/Diagrama-Pipeline3.png) + +Nessa fase a versão está mais estável, se a nova funcionalidade estiver funcionando +como desejado e devidamente testada então um pull request poderá ser solicitado para +ser feito a união da nova funcionalidade com a versão em produção da aplicação. + +Será feito a análise manual do pull request, se a pipeline estiver operando corretamente +ela segue para produção, caso contrário ela volta pra fase anterior. + + +### Fase 4 + +![Fase 4](https://fga-eps-mds.github.io/2018.2-ComexStat/img/Diagrama-Pipeline4.png) + +Na quarta versão a versão já foi aprovada e é colocada na linha de produção onde +as ferramentas de CI e CD fará o deploy da nova funcionalidade, no qual executará +a entrega automática da mesma. + + +## Processo do Pipeline DevOps + +![Pipeline DevOps](https://fga-eps-mds.github.io/2018.2-ComexStat/img/pipelineDevops.png) + +## 3. Referências + +> * 4LINUX. Diferenças entre Integração, deploy e entrega contínua. Disponível em: . Acesso em: 18 set. 2018. +> * Landier, N., Lanfontaine, B. & Fernandes, S. Os padrões dos Gigantes da Web - Deploy Contínuo. Disponível em: , 2013. Acessado em: 19/09/2018. diff --git a/docs/docs/prototipo.md b/docs/docs/prototipo.md new file mode 100644 index 0000000..e62c5f0 --- /dev/null +++ b/docs/docs/prototipo.md @@ -0,0 +1,8 @@ +--- +id: prototipo +title: Protótipo de Baixa Fidelidade +--- + +![Protótipo pag 1](https://fga-eps-mds.github.io/2018.2-ComexStat/img/prototipo_pag1.jpg) +![Protótipo pag 2](https://fga-eps-mds.github.io/2018.2-ComexStat/img/prototipo_pag2.jpg) +![Protótipo pag 3](https://fga-eps-mds.github.io/2018.2-ComexStat/img/prototipo_pag3.jpg) diff --git a/docs/docs/utilizandoDockerDjango.md b/docs/docs/utilizandoDockerDjango.md new file mode 100644 index 0000000..2673fec --- /dev/null +++ b/docs/docs/utilizandoDockerDjango.md @@ -0,0 +1,36 @@ +--- +id: utilizandoDockerDjango +title: Como executar comandos Django +--- + + +## 1. Introdução + +Este documento possui o objetivo de orientar e ajudar os desenvolvedores da equipe a, com mais facilidade, utilizar o framework Djando com os containers do Docker. + +## Como utilizar + +Com os critérios de uso descritos no Readme do projeto satisfeitos, o usuário deverá seguir os seguintes passos + +Vá até o diretorio da aplicação e a inicie, para isso rode em seu terminal o comando + + sudo docker-compose up + +Com a aplicação rodando local, abra outro terminal para que consiga fazer as modificações que deseja com o Django, como por exemplo rodar as migrações + + sudo docker-compose exec web python3 manage.py makemigrations + + sudo docker-compose exec web python3 manage.py migrate + +Caso queira criar um usuário admininstrador, execute o comando + + sudo docker-compose exec web python3 manage.py createsuperuser + +Para criar novos diretórios com a estrutura do Django + + sudo docker-compose exec web python3 manage.py startapp polls + + +## 3. Referências Bibliográficas + +> * DJANGO, TUTORIAL. "Escrevendo seu primeiro app Django." . diff --git a/docs/website/blog/2018-08-17-sprint-0.md b/docs/website/blog/2018-08-17-sprint-0.md new file mode 100644 index 0000000..0850b95 --- /dev/null +++ b/docs/website/blog/2018-08-17-sprint-0.md @@ -0,0 +1,37 @@ +--- +title: Sprint 0 +author: Fabíola Fleury +authorURL: https://github.com/fabiolamfleury +authorFBID: 100002504848674 +--- + + +# Planejamento da Sprint + +## Objetivo + +Treino inicial e primeiro contato do time + +## Dados gerais + +**Data de início:** 14/08/2018 +**Data de término:** 17/08/2018 + +**Pontos Planejados:** Não se aplica +**Pontos Adicionados:** Não se aplica +**Pontos totais:** Não se aplica + +## Issues + +Podem ser acompanhadas [aqui](https://github.com/fga-eps-mds/2018.2-ComexStat/milestone/4). + +## Pareamentos +Não se aplica + +# Resultados + +## Análise Geral + +Durante essa sprint, que ocorreu na primeira semana de aula,o time foi formado e teve seu primeiro contato, bem como os primeiros treinos em: engenharia de requisitos, métodos ágeis e fluxo de trabalho usando Github. +O processo não estava bem definido e também não havia definição do tema do projeto, então as reuniões não foram executadas. Ao final da sprint, foi definido o tema do trabalho. +Para melhoria das próximas sprints, deve-se realizar mais treinamentos para capacitação do time e definir o processo e comunicação do time, para que haja alinhamento. diff --git a/docs/website/blog/2018-08-24-sprint-2.md b/docs/website/blog/2018-08-24-sprint-2.md index 968f548..b150b62 100644 --- a/docs/website/blog/2018-08-24-sprint-2.md +++ b/docs/website/blog/2018-08-24-sprint-2.md @@ -7,6 +7,18 @@ authorFBID: 100002504848674 # Planejamento da Sprint +| Membros presentes no planejamento da Sprint | +|---------------------| +| André Lucas | +| Caio Brandão | +| Fabíola Malta | +| João Victor | +| Kaique Henrique | +| Matheus Vitor | +| Marcos Nery | +| Sannya Santana | +| Vinicius Rodrigues | + ## Objetivo Organização da equipe e visão do produto @@ -29,17 +41,73 @@ Não se aplica # Resultados -## Medições obtidas dos indicadores e métricas +| Membros presentes nas reuniões de finalização de Sprint | +|---------------------| +| André Lucas | +| Rogério | +| Fabíola Malta | +| João Victor | +| Kaique Henrique | +| Matheus Vitor | +| Marcos Nery | +| Sannya Santana | + ## Resultado da Revisão da Sprint +### Histórias entregues + +- [#21 - Realizar treino sobre medição ágil ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/21) +- [#26 - Configurar deploy contínuo do github pages](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/26) +- [#23 - Reservar espaço de reunião aos sábados ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/23) +- [#19 - Realizar Treinamento Github Pages](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/19) + +### Dívidas técnicas + +- [#10 - Elaborar indicadores e métricas](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/10) +- [#11 - Elaborar documento de visão](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/11) +- [#6 - Elaborar o termo de abertura](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/6) +- [#22 - Realizar treinamento de docker](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/22) + +### História retirada do backlog + +- [#20 - Mapear o fluxo do processo ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/20) + + ## Retrospectiva da Sprint +A revisão da sprint foi realizada utilizando uma adaptação do mapa de empatia, observada na imagem a seguir: + +![Sprint 2 Retrospective](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprint2_retrospective.jpg) + ### Pontos positivos +- Conseguimos configurar a atualização contínua do docusaurus! +- Spam do github bot! Existem membros trabalhando constantemente no time +- Alguns membros deixaram para realizar o trabalho apenas no final da sprint +- Aprendizagem contínua +- Motivação, membros estão sendo constantemente assegurados. ### Pontos negativos +- A visão do produto ainda não está concretizada, devido a dificuldades de comunicação com o cliente +- O time de MDS ainda possui medo de realizar commits, mesmo de documentação +- Spam do github bot! Como o time estava utilizando um grupo do telegram para comunicação e o bot estava nele, +algumas informações se perderam por conta do bot +- Os critérios de aceitação de documento não estavam dispostos de forma direta, MDS não sabia a necessidade de revisão +antes de aceitar o Pull Request. +- Sensação de atraso constante e instabilidade ### Possíveis melhorias +- Realização de um encontro do time, para entrosamento +- Troca de ferramenta do telegram para o slack +- Não commitar na master! +- Não aceitar o próprio pull request +- Realizar trabalho constante durante a sprint +- Seguir a política de branchs +- Saber filtrar críticas externas # Análise Geral + +Apesar de muitas issues não entregues, os artefatos relacionados com a visão do produto já esperava-se esse resultado, pois eles foram alocados para elicitar dúvidas +que poderiam ser levadas para o cliente e ter melhor base em relação aos requisitos do projeto. Issues foram deixadas para o final da sprint, o que +concretizou o risco da não entrega. O time ainda não está seguindo o processo de forma consistente. diff --git a/docs/website/blog/2018-09-01-sprint-3.md b/docs/website/blog/2018-09-01-sprint-3.md new file mode 100644 index 0000000..0ce4d19 --- /dev/null +++ b/docs/website/blog/2018-09-01-sprint-3.md @@ -0,0 +1,135 @@ +--- +title: Sprint 3 +author: Fabíola Fleury +authorURL: https://github.com/fabiolamfleury +authorFBID: 100002504848674 +--- + +# Planejamento da Sprint + +| Membros presentes na reunião de planejamento da Sprint | +|---------------------| +| André Lucas | +| Rogério | +| Fabíola Malta | +| João Victor | +| Kaique Henrique | +| Matheus Vitor | +| Marcos Nery | +| Sannya Santana | + +## Objetivo + +Refinar a visão do produto e inicializar configurações de ambiente e entendimento da arquitetura. Reunião será realizada com o cliente dia 03/09/2018, no início da sprint, para +orientar os artefatos relacionados a visão, em paralelo, serão realizadas atividades de arquitetura e devops para assegurar o ambiente de desenvolvimento. + +## Dados gerais + +**Data de início:** 01/09/2018 +**Data de término:** 07/09/2018 + +**Pontos Planejados:** Não se aplica +**Pontos Adicionados:** Não se aplica +**Pontos totais:** Não se aplica + +## Issues + +Podem ser acompanhadas [aqui](https://github.com/fga-eps-mds/2018.2-ComexStat/milestone/5). + +### Dívidas alocadas + +- [#10 - Elaborar indicadores e métricas](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/10) +- [#11 - Elaborar documento de visão](https://github.com/fga-eps-mds/2018-ComexStat/issues/11) +- [#6 - Elaborar o termo de abertura](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/6) +- [#22 - Realizar treinamento de docker](https://github.com/fga-eps-mds/2018.2-ComexStats/issues/22) + + +## Possíveis Riscos mapeados para a sprint + +![Sprint 3 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprint3_risks.jpg) + +## Pareamentos +Não se aplica + +## Resultados + +| Membros presentes nas reuniões de fechamento da Sprint | +|---------------------| +| André Lucas | +| Caio Brandão | +| Fabíola Malta | +| João Victor | +| Matheus Vitor | +| Marcos Nery | +| Rogério | + +## Resultado da Revisão da Sprint + +### Histórias entregues + +- [#35 - Configurar ambiente de desenvolvimento ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/35) +- [#37 - Estudos de python/django](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/37) +- [#46 - Criar pagina no docs para ajuda em como mexer com django e docker ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/46) + +### Dívidas entregues + +- [#22 - Realizar treinamento de docker ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/22) +- [#11 - Elaborar documento de visão ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/11) +- [#10 - Elaborar indicadores e métricas ](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/10) +- [#4 - Criar a política de branchs do repositório](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/4) + +### Dívidas técnicas + +- [#36 - Organização da arquitetura do projeto](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/36) +- [#34 - Fazer o protótipo de baixa fidelidade junto ao cliente](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/34) +- [#6 - Elaborar o termo de abertura](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/6) + +## Retrospectiva da Sprint + +### Pontos positivos + +- Agilidade +- Conseguimos conversar com o cliente de forma a definir a visão do produto e fechar o escopo +- Nada foi deixado para última hora (por MDS). +- Terminamos o documento de visão +- Comunicação do time para cumprir as tarefas mesmo com o feriado atrapalhando + +### Pontos negativos + +- Feriado +- Membro do time viajando +- Prova de outras matérias de EPS +- Falta de produtividade/engajamento de EPS +- Criação de issues durante a sprint e alocamento dela por membro do time +- Muitas ferramentas de comunicação, time dividido entre elas +- Galera faltando as dailies (EPS) + + +### Melhorias +- Acabar o grupo do telegram +- Seguir a metodologia +- Comprometer-se com as issues atribuídas + +## Medições obtidas dos indicadores e métricas + +### Quadro de Conhecimento + +![Quadro de conhecimento do final da sprint](https://fga-eps-mds.github.io/2018.2-ComexStat/img/quadrosprint3final.png) + +### Quadro de Horas + +![Quadro de hhoras do final da sprint](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprint3_horas.jpeg) + + +### Riscos + +Em relação aos riscos mapeados para essa sprint, os que se concretizaram foram a baixa produtividade do grupo, e planejamento ineficiente, +resultando em dívidas. A visão de produto foi esclarecida com o cliente, delimitando de forma mais clara o escopo do projeto. +Houveram provas de outras matérias, diminuindo as horas dedicadas ao projeto. + + + +# Análise Geral + +Nesta sprint, houve esclarecimentos fundamentais em relação a visão do produto, uma preocupação existente em membros da equipe. Porém, vários membros não se dedicaram +ao projeto, não participando dos rituais e nem entregando suas issues, o que comprometeu a produtividade do time. diff --git a/docs/website/blog/2018-09-08-sprint-4.md b/docs/website/blog/2018-09-08-sprint-4.md new file mode 100644 index 0000000..58b5d1b --- /dev/null +++ b/docs/website/blog/2018-09-08-sprint-4.md @@ -0,0 +1,137 @@ +--- +title: Sprint 4 +author: Fabíola Fleury +authorURL: https://github.com/fabiolamfleury +authorFBID: 100002504848674 +--- + +# Planejamento da Sprint + +| Membros presentes no planejamento da Sprint | +|---------------------| +| André Lucas | +| Caio Brandão | +| Fabíola Malta | +| João Victor | +| Matheus Vitor | +| Marcos Nery | +| Rogério | + +## Objetivo + +Mapear a arquitetura do projeto e aprofundar a visão do produto. + +## Dados gerais + +**Data de início:** 09/09/2018 +**Data de término:** 14/09/2018 + +**Pontos Planejados:** 22 +**Pontos Adicionados:** 7 +**Pontos totais:** 29 + +## Issues + +Podem ser acompanhadas [aqui](https://github.com/fga-eps-mds/2018.2-ComexStat/milestone/6). + +### Dívidas alocadas + +- [#6 - Elaborar o termo de abertura](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/6) +- [#36 - Organização da arquitetura do projeto](https://github.com/fga-eps-mds/2018.2-ComexStats/issues/26) + + +## Possíveis Riscos mapeados para a sprint + +![Sprint 4 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprint4_risks.png) + +# Resultados + + + + +## Resultado da Revisão da Sprint + +| Membros presentes nas reuniões de finalização de sprint | +|---------------------| +| André Lucas | +| Caio Brandão | +| Fabíola Malta | +| João Victor | +| Matheus Vitor | +| Marcos Nery | +| Matheus Joranhezon | +| Sannya | +| Vinicius | +| Kaique | +| Rogério | + +### Histórias entregues + +![Sprint 4 Burndown](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/burndown_sprint4.jpg) + +### Dívidas entregues + +Pontos de dívidas entregues: 7 +- [#6 - Elaborar o termo de abertura](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/6) +- [#36 - Organização da arquitetura do projeto](https://github.com/fga-eps-mds/2018.2-ComexStats/issues/26) + +## Retrospectiva da Sprint + +![Sprint 4 Empatia](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/empatia_sprint4.jpg) + +### Pontos positivos + +- Com a definição básica da arquitetura, os membros agora tem uma base para começar a desenvolver o produto +- Foram escritas as primeiras linhas de código! +- A documentação está acessível para todos os membros do time que estão alinhados sobre sua importância +- Houveram feedbacks positivos em relação ao trabalho da equipe + +### Pontos negativos + +- Existem membros sobrecarregados, que são vistos como 'heróis' +- A comunicação não foi constante, e dificuldades não foram comunicadas no meio da sprint +- Membros foram alocados para muitas tarefas, tendo atividades de outras matérias +- Receio de atraso em relação a outros grupos da matéria + +### Possíveis melhorias + +- Quebra das atividades em menores +- Mais standup meetings + +## Medições obtidas dos indicadores e métricas + +### Riscos + +![Sprint 4 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprint4_risks_burndown.jpeg) + +Mais riscos foram identificados, porém houveram ações para tentar impedir a concretização destes. Houve a execução de um dojo para +iniciar a primeira história de código da equipe, que foi entregue ao final da sprint. Foram definidas as tecnologias que seriam utilizadas +dentro da arquitetura do projeto, diminuindo assim o risco de dificuldades no desenvolvimento e facilitando a configuração do ambiente. Tentou-se +fazer o planejamento observando os dados já existente sobre conhecimento e trabalho do time para que o planejamento não fosse ineficiente + +### Quadro de horas + +![Sprint 4 horas](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/horas_sprint4.jpg) + +Durante essa sprint os membros trabalharam por mais horas e também entregaram mais issues, não pode-se fazer uma interpretação em relação aos pontos entregues +pois foi a primeira sprint pontuada da equipe. + + +### Velocity + +![Sprint 4 velocity](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/velocity_sprint4.jpg) + +Das histórias planejadas, apenas uma não foi entregue, e todas as dívidas foram entregues. + + +![Sprint 4 conhecimento](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/conhecimento_sprint4.jpg) + +Com a definição da arquitetura, foram mapeados outros conhecimentos para o quadro de conhecimento da equipe. + + +# Análise Geral + +Embora tenha sido evidenciado que o trabalho não ficou dividido de forma uniforme entre os membros da equipe, foi entregue a maioria das histórias alocadas. Mais uma vez, foram deixadas para +entrega ao final da sprint, o que resultou em revisão tardia e não entrega de uma história, como o risco de não entrega de outras, como pode ser observado no burndown da sprint. +Faz-se necessário a quebra em histórias menores, para que haja possibilidade de entregas durante a semana e também a inclusão de uma reunião de stand up no meio da sprint, pois estas +estão sendo realizadas apenas nas terças e quintas. Observou-se, mais ao final da sprint, maior proatividade e independência do time de desenvolvimento. diff --git a/docs/website/blog/2018-09-15-sprint-5.md b/docs/website/blog/2018-09-15-sprint-5.md new file mode 100644 index 0000000..9013155 --- /dev/null +++ b/docs/website/blog/2018-09-15-sprint-5.md @@ -0,0 +1,107 @@ +--- +title: Sprint 5 +author: Fabíola Fleury +authorURL: https://github.com/fabiolamfleury +authorFBID: 100002504848674 +--- + +# Planejamento da Sprint + +| Membros presentes no planejamento da Sprint | +|---------------------| +| André Lucas | +| Caio Brandão | +| Fabíola Malta | +| João Victor | +| Matheus Vitor | +| Marcos Nery | +| Matheus Joranhezon | +| Sannya | +| Vinicius | +| Kaique | + +## Objetivo + +Estruturação básica das classes de domínio da aplicação e do banco de dados. Criação de protótipo. Arquitetura de micro serviços. Definição do pipeline + + + +## Dados gerais + +**Data de início:** 15/09/2018 +**Data de término:** 21/09/2018 + +**Pontos Planejados:** 32 +**Pontos Adicionados:** 13 +**Pontos totais:** 45 + + +## Pareamentos + +Os pareamentos foram distribuidos pensando na disponibilidade dos membros, já que muitos possuem atividades avaliativas durante essa sprint, tentou-se equilibrar +agrupando os que possuiam mais tempo para poder dedicar as histórias com aqueles que não poderão trabalhar com tamanho afinco. + +O pareamento foi feito entre membros de MDS que estão responsáveis por implementar a história, e membros de EPS foram atribuídos a história para poderem testá-la. + +- André e Kaique: Matheus +- Caio e Marcos: Sannya e Fabíola +- João e Rogério: Vinicius + + +## Issues + +As issues podem ser encontradas [aqui](https://github.com/fga-eps-mds/2018.2-ComexStat/milestone/7) + + +### Dívidas alocadas + +- [# 50 - Construir pipeline do produto](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/50) +- [# 34 - Fazer o protótipo de baixa fidelidade junto ao cliente](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/34) + + +## Possíveis Riscos mapeados para a sprint + +Durante essa sprint foi definida a realização de uma stand up meeting na quarta as 15:50, utilizando +a sugestão de melhoria mapeada durante a retrospectiva da sprint 4. Também foram fatiadas as histórias em menores tamanhos, na tentativa de reduzir entregas feitas apenas no último dia da sprint. + +![Sprint 5 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/riscos_sprin5.jpg) + +![Sprint 5 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/burndown_riscos_sprint5.jpg) + +# Resultados + + + + +## Resultado da Revisão da Sprint + +### Histórias entregues + + +### Dívidas entregues + +Pontos de dívidas entregues: + + +## Retrospectiva da Sprint + + +![Sprint 5 Empatia](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/empatia_sprint5.jpg) + + +### Pontos positivos + + +### Pontos negativos + + +### Possíveis melhorias + + +## Medições obtidas dos indicadores e métricas + + + + + +# Análise Geral diff --git a/docs/website/blog/2018-09-22-sprint-6.md b/docs/website/blog/2018-09-22-sprint-6.md new file mode 100644 index 0000000..1a574bf --- /dev/null +++ b/docs/website/blog/2018-09-22-sprint-6.md @@ -0,0 +1,110 @@ +--- +title: Sprint 6 +author: Fabíola Fleury +authorURL: https://github.com/fabiolamfleury +authorFBID: 100002504848674 +--- + +# Planejamento da Sprint + +| Membros presentes no planejamento da Sprint | +|---------------------| +| André Lucas | +| Fabíola Malta | +| João Victor | +| Matheus Vitor | +| Marcos Nery | +| Matheus Joranhezon | +| Sannya | +| Kaique | +| Rogério | + +## Objetivo + +Organização da viabilidade técnica , ambientes de entrega (homologação e produção) e monitaremento de código + +## Dados gerais + +**Data de início:** 22/09/2018 +**Data de término:** 28/09/2018 + +**Pontos Planejados:** 58 +**Pontos Adicionados:** 32 +**Pontos totais:** 92 + + +## Pareamentos + +- Caio, João e Kaique +- Rogério e André + + +## Issues + +As issues podem ser encontradas [aqui](https://github.com/fga-eps-mds/2018.2-ComexStat/milestone/8) + + +### Dívidas alocadas + +- [# 74 - Fazer protótipo de alta fidelidade](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/74) +- [# 71 - Estruturar as nomeclaturas de comércio exterior de bens](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/71) +- [# 72 - Estruturar origem, destino e vias de comércio de bens](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/72) +- [# 70 - Montar o backlog do produto](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/70) + +## Possíveis Riscos mapeados para a sprint + +Pontuação de tasks e quebra das histórias em menores foram mudanças adotas para essa sprint. Existem riscos de não entrega de ambiente de produção e homologação até a +Release 1, bem como o protótipo de alta fidelidade e a identidade visual do produto. + +![Sprint 6 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/riscos_sprin5.jpg) + +![Sprint 6 Risks](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/burndown_riscos_sprint5.jpg) + +# Resultados + + +## Resultado da Revisão da Sprint + +![Burndown Sprint 6](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/sprint6/burndown.png) + +### Histórias entregues + +![Sprint 6 Histórias Entregues](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/sprint6/entregues_sprint6.png) + + +### Dívidas entregues + +Pontos de dívidas entregues: 32 + +Todas as dívidas alocadas para essa sprint foram entregues. + + +## Retrospectiva da Sprint + +![Retrospectiva](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/sprint6/retrospectiva.jpg) + +### Pontos positivos + +- Ambiente está finalmente estabilizando; +- Pareamentos Efetivos; +- Membro Motivado + +### Pontos negativos + +- Membro Ausente; +- Membros Tirando Dúvidas em Horários Indevidos; +- Muitas issues complexas por sprint. + +### Possíveis melhorias + +- Pensar melhor nas histórias no momento de pontuar; +- Mensagens de dúvidas no privado apenas até às 23:00. + + +## Medições obtidas dos indicadores e métricas + + + + + +# Análise Geral diff --git a/docs/website/blog/2018-09-29-sprint7.md b/docs/website/blog/2018-09-29-sprint7.md new file mode 100644 index 0000000..f1ee762 --- /dev/null +++ b/docs/website/blog/2018-09-29-sprint7.md @@ -0,0 +1,97 @@ +--- +title: Sprint 7 +author: Matheus Joranhezon +authorURL: https://github.com/joranhezon +authorFBID: 100002504848674 +--- + +# Planejamento da Sprint + +| Membros presentes no planejamento da Sprint | +|---------------------| +| André Lucas | +| João Victor | +| Matheus Vitor | +| Marcos Nery | +| Matheus Joranhezon | +| Sannya | +| Kaique | +| Vinicius | + +## Objetivo + +Fechar dívidas de Devops, começar o desenvolvimento Frontend. + + + +## Dados gerais + +**Data de início:** 29/09/2018 +**Data de término:** 06/10/2018 + +**Pontos Planejados:** 31 +**Pontos Adicionados:** 26 +**Pontos totais:** 57 + + +## Pareamentos + +- Kaique, Caio e André +- Marcos, Rogério e João + + +## Issues + +As issues podem ser encontradas [Issues](https://github.com/fga-eps-mds/2018.2-ComexStat/milestone/9) + + +### Dívidas alocadas + +- [# 110 - Configurar ambiente de homologação do backend](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/110) +- [# 109 - Configurar ambiente de homologação do frontend](https://github.com/fga-eps-mds/2018.2-ComexStat/issues/109) + +## Possíveis Riscos mapeados para a sprint + +Para essa sprint, os riscos alocados foram: + +![Riscos Sprint 7](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/sprint7/riscos.png) + +O maior risco apresentado por essa sprint é o técnico, tendo em vista que os membros do time de desenvolvimento irão desenvolver pela primeira vez utilizando o Angular, um framework de alta complexidade. Tendo isso em vista, as histórias alocadas foram de baixa complexidade, simplificadas ao máximo, para que os membros possam se famirializar com o framework enquanto desenvolve. + +Burndown de riscos: + +![Burndown de Riscos Sprint 7](https://fga-eps-mds.github.io/2018.2-ComexStat/img/sprints/sprint7/burndown_riscos.png) + + +# Resultados + + +## Resultado da Revisão da Sprint + +### Histórias entregues + + +### Dívidas entregues + +Pontos de dívidas entregues: + + +## Retrospectiva da Sprint + + +### Pontos positivos + + +### Pontos negativos + + +### Possíveis melhorias + + +## Medições obtidas dos indicadores e métricas + + + + + +# Análise Geral diff --git a/docs/website/pages/en/index.js b/docs/website/pages/en/index.js index 6680028..de26717 100755 --- a/docs/website/pages/en/index.js +++ b/docs/website/pages/en/index.js @@ -123,8 +123,21 @@ const FeatureCallout = () => (
-

Feature Callout

- These are features of this project +

Time do projeto

+ + |Nome|Github|Email| + |----------------------- |--------------------| ---------------------| + |André Lucas Ferreira Lemos de Souza|[@andrelucasf](https://github.com/andrelucasf)|andre.lucas.lemos@hotmail.com| + |Caio Brandão Santos|[@caioiobs](https://github.com/caioiobs)|caiobs10@gmail.com| + |Fabíola Malta Fleury|[@fabiolamfleury](https://github.com/fabiolamfleury)|fabiola.mfleury@gmail.com| + |João Victor de Oliveira Matos | [@joao15victor08](https://github.com/joao15victor08)| joao15victor08@gmail.com| + |Kaique Henrique de Carvalho Borges| [@riquekaique](https://github.com/riquekaique)| rique.kaique@gmail.com| + |Matheus Vitor Costa Joranhezon |[@Joranhezon](https://github.com/Joranhezon)| mjoranhezon@gmail.com| + |Marcos Nery Borges Júnior |[@MarcosNBJ](https://github.com/MarcosNBJ)| marcosnery.comp@gmail.com| + |Rogério Silva dos Santos Júnior |[@rogerioo](https://github.com/rogerioo)| rogeriojunior@aluno.unb.br| + |Sannya Santana De Arvelos |[@SannyaArvelos](https://github.com/SannyaArvelos)| sannyasantana@gmail.com| + |Vinicius Rodrigues Oliveira |[@vinicinolivera](https://github.com/vinicinolivera)| vinifladf@gmail.com | +
); diff --git a/docs/website/sidebars.json b/docs/website/sidebars.json index 7ee42ae..c4c891b 100644 --- a/docs/website/sidebars.json +++ b/docs/website/sidebars.json @@ -1,8 +1,9 @@ { "docs": { "Comunidade": ["codeofconduct", "contributing"], - "Gerência": ["comunicacao", "processo", "termodeabertura"], - "Capacitação": ["microsservicos", "devOps","treinamentos"], - "Visão de Produto": ["docVisao"] + "Gerência": ["comunicacao", "processo", "medicao", "politicaBranches"], + "Capacitação": ["treinamentos", "microsservicos", "devOps", "pipelineDevOps", "utilizandoDockerDjango"], + "Visão de Produto": ["docVisao", "termodeabertura", "eap", "canvas", "prototipo", "guiaestilo"], + "Arquitetura": ["definicaoArquitetura", "docArquitetura"] } } diff --git a/docs/website/siteConfig.js b/docs/website/siteConfig.js index cb2ad51..86c9b88 100644 --- a/docs/website/siteConfig.js +++ b/docs/website/siteConfig.js @@ -39,8 +39,8 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ {doc: 'contributing', label: 'Docs'}, - {doc: 'contributing', label: 'API'}, - {page: 'help', label: 'Help'}, + // {doc: 'contributing', label: 'API'}, +// {page: 'help', label: 'Help'}, {blog: true, label: 'Sprints'}, ], diff --git a/docs/website/static/img/ComexStat_DataBasehtml.png b/docs/website/static/img/ComexStat_DataBasehtml.png new file mode 100644 index 0000000..91b4c2a Binary files /dev/null and b/docs/website/static/img/ComexStat_DataBasehtml.png differ diff --git a/docs/website/static/img/Diagrama-Monolitico.png b/docs/website/static/img/Diagrama-Monolitico.png new file mode 100644 index 0000000..be324b6 Binary files /dev/null and b/docs/website/static/img/Diagrama-Monolitico.png differ diff --git a/docs/website/static/img/Diagrama-Pipeline1.png b/docs/website/static/img/Diagrama-Pipeline1.png new file mode 100644 index 0000000..0e04f4b Binary files /dev/null and b/docs/website/static/img/Diagrama-Pipeline1.png differ diff --git a/docs/website/static/img/Diagrama-Pipeline2.png b/docs/website/static/img/Diagrama-Pipeline2.png new file mode 100644 index 0000000..a4d6dba Binary files /dev/null and b/docs/website/static/img/Diagrama-Pipeline2.png differ diff --git a/docs/website/static/img/Diagrama-Pipeline3.png b/docs/website/static/img/Diagrama-Pipeline3.png new file mode 100644 index 0000000..7d0137e Binary files /dev/null and b/docs/website/static/img/Diagrama-Pipeline3.png differ diff --git a/docs/website/static/img/Diagrama-Pipeline4.png b/docs/website/static/img/Diagrama-Pipeline4.png new file mode 100644 index 0000000..979ab8d Binary files /dev/null and b/docs/website/static/img/Diagrama-Pipeline4.png differ diff --git a/docs/website/static/img/GQM_Produtividade.png b/docs/website/static/img/GQM_Produtividade.png new file mode 100644 index 0000000..45ee1bf Binary files /dev/null and b/docs/website/static/img/GQM_Produtividade.png differ diff --git a/docs/website/static/img/GQM_Riscos.png b/docs/website/static/img/GQM_Riscos.png new file mode 100644 index 0000000..79525cb Binary files /dev/null and b/docs/website/static/img/GQM_Riscos.png differ diff --git a/docs/website/static/img/GQM_codigo.png b/docs/website/static/img/GQM_codigo.png new file mode 100644 index 0000000..b8cb479 Binary files /dev/null and b/docs/website/static/img/GQM_codigo.png differ diff --git a/docs/website/static/img/Representacao_Arquitetural.png b/docs/website/static/img/Representacao_Arquitetural.png new file mode 100644 index 0000000..6f1d5cb Binary files /dev/null and b/docs/website/static/img/Representacao_Arquitetural.png differ diff --git a/docs/website/static/img/canvasv1.jpg b/docs/website/static/img/canvasv1.jpg new file mode 100644 index 0000000..b1c4655 Binary files /dev/null and b/docs/website/static/img/canvasv1.jpg differ diff --git a/docs/website/static/img/casosDeUso.png b/docs/website/static/img/casosDeUso.png new file mode 100644 index 0000000..bf40ab6 Binary files /dev/null and b/docs/website/static/img/casosDeUso.png differ diff --git a/docs/website/static/img/diagrama-angular.PNG b/docs/website/static/img/diagrama-angular.PNG new file mode 100644 index 0000000..f514c8b Binary files /dev/null and b/docs/website/static/img/diagrama-angular.PNG differ diff --git a/docs/website/static/img/diagrama-arquitetura.png b/docs/website/static/img/diagrama-arquitetura.png new file mode 100644 index 0000000..0e4820a Binary files /dev/null and b/docs/website/static/img/diagrama-arquitetura.png differ diff --git a/docs/website/static/img/diagrama-de-classe-model.png b/docs/website/static/img/diagrama-de-classe-model.png new file mode 100644 index 0000000..5ed6d9c Binary files /dev/null and b/docs/website/static/img/diagrama-de-classe-model.png differ diff --git a/docs/website/static/img/diagrama_pacotes.png b/docs/website/static/img/diagrama_pacotes.png new file mode 100644 index 0000000..e520108 Binary files /dev/null and b/docs/website/static/img/diagrama_pacotes.png differ diff --git a/docs/website/static/img/eap.png b/docs/website/static/img/eap.png new file mode 100644 index 0000000..587bc9d Binary files /dev/null and b/docs/website/static/img/eap.png differ diff --git a/docs/website/static/img/eap_geral.jpg b/docs/website/static/img/eap_geral.jpg new file mode 100644 index 0000000..92f2a9c Binary files /dev/null and b/docs/website/static/img/eap_geral.jpg differ diff --git a/docs/website/static/img/guiaestilo/blackcomexstat.png b/docs/website/static/img/guiaestilo/blackcomexstat.png new file mode 100644 index 0000000..e30ab72 Binary files /dev/null and b/docs/website/static/img/guiaestilo/blackcomexstat.png differ diff --git a/docs/website/static/img/guiaestilo/greencomexstat.png b/docs/website/static/img/guiaestilo/greencomexstat.png new file mode 100644 index 0000000..0c97899 Binary files /dev/null and b/docs/website/static/img/guiaestilo/greencomexstat.png differ diff --git a/docs/website/static/img/guiaestilo/logo.png b/docs/website/static/img/guiaestilo/logo.png new file mode 100644 index 0000000..723faf8 Binary files /dev/null and b/docs/website/static/img/guiaestilo/logo.png differ diff --git a/docs/website/static/img/guiaestilo/redcomexstat.png b/docs/website/static/img/guiaestilo/redcomexstat.png new file mode 100644 index 0000000..08fd480 Binary files /dev/null and b/docs/website/static/img/guiaestilo/redcomexstat.png differ diff --git a/docs/website/static/img/guiaestilo/secondarycomexstat.png b/docs/website/static/img/guiaestilo/secondarycomexstat.png new file mode 100644 index 0000000..11d7161 Binary files /dev/null and b/docs/website/static/img/guiaestilo/secondarycomexstat.png differ diff --git a/docs/website/static/img/guiaestilo/whitecomexstat.png b/docs/website/static/img/guiaestilo/whitecomexstat.png new file mode 100644 index 0000000..6847b6c Binary files /dev/null and b/docs/website/static/img/guiaestilo/whitecomexstat.png differ diff --git a/docs/website/static/img/pipelineDevops.png b/docs/website/static/img/pipelineDevops.png new file mode 100644 index 0000000..0948901 Binary files /dev/null and b/docs/website/static/img/pipelineDevops.png differ diff --git a/docs/website/static/img/prototipo_pag1.jpg b/docs/website/static/img/prototipo_pag1.jpg new file mode 100644 index 0000000..865e828 Binary files /dev/null and b/docs/website/static/img/prototipo_pag1.jpg differ diff --git a/docs/website/static/img/prototipo_pag2.jpg b/docs/website/static/img/prototipo_pag2.jpg new file mode 100644 index 0000000..731ac6a Binary files /dev/null and b/docs/website/static/img/prototipo_pag2.jpg differ diff --git a/docs/website/static/img/prototipo_pag3.jpg b/docs/website/static/img/prototipo_pag3.jpg new file mode 100644 index 0000000..ba96fda Binary files /dev/null and b/docs/website/static/img/prototipo_pag3.jpg differ diff --git a/docs/website/static/img/quadrosprint3final.png b/docs/website/static/img/quadrosprint3final.png new file mode 100644 index 0000000..f3c8527 Binary files /dev/null and b/docs/website/static/img/quadrosprint3final.png differ diff --git a/docs/website/static/img/sprint2_retrospective.jpg b/docs/website/static/img/sprint2_retrospective.jpg new file mode 100644 index 0000000..9396036 Binary files /dev/null and b/docs/website/static/img/sprint2_retrospective.jpg differ diff --git a/docs/website/static/img/sprint3_horas.jpeg b/docs/website/static/img/sprint3_horas.jpeg new file mode 100644 index 0000000..2fe7807 Binary files /dev/null and b/docs/website/static/img/sprint3_horas.jpeg differ diff --git a/docs/website/static/img/sprint3_risks.jpg b/docs/website/static/img/sprint3_risks.jpg new file mode 100644 index 0000000..758c75c Binary files /dev/null and b/docs/website/static/img/sprint3_risks.jpg differ diff --git a/docs/website/static/img/sprint4_risks.png b/docs/website/static/img/sprint4_risks.png new file mode 100644 index 0000000..dc5b1ca Binary files /dev/null and b/docs/website/static/img/sprint4_risks.png differ diff --git a/docs/website/static/img/sprint4_risks_burndown.jpeg b/docs/website/static/img/sprint4_risks_burndown.jpeg new file mode 100644 index 0000000..898f248 Binary files /dev/null and b/docs/website/static/img/sprint4_risks_burndown.jpeg differ diff --git a/docs/website/static/img/sprints/burndown_riscos_sprint5.jpg b/docs/website/static/img/sprints/burndown_riscos_sprint5.jpg new file mode 100644 index 0000000..0efee1c Binary files /dev/null and b/docs/website/static/img/sprints/burndown_riscos_sprint5.jpg differ diff --git a/docs/website/static/img/sprints/burndown_sprint4.jpg b/docs/website/static/img/sprints/burndown_sprint4.jpg new file mode 100644 index 0000000..b2e0f8b Binary files /dev/null and b/docs/website/static/img/sprints/burndown_sprint4.jpg differ diff --git a/docs/website/static/img/sprints/conhecimento_sprint4.jpg b/docs/website/static/img/sprints/conhecimento_sprint4.jpg new file mode 100644 index 0000000..8430edb Binary files /dev/null and b/docs/website/static/img/sprints/conhecimento_sprint4.jpg differ diff --git a/docs/website/static/img/sprints/empatia_sprint4.jpg b/docs/website/static/img/sprints/empatia_sprint4.jpg new file mode 100644 index 0000000..c91a5ae Binary files /dev/null and b/docs/website/static/img/sprints/empatia_sprint4.jpg differ diff --git a/docs/website/static/img/sprints/empatia_sprint5.jpg b/docs/website/static/img/sprints/empatia_sprint5.jpg new file mode 100644 index 0000000..390cb3d Binary files /dev/null and b/docs/website/static/img/sprints/empatia_sprint5.jpg differ diff --git a/docs/website/static/img/sprints/horas_sprint4.jpg b/docs/website/static/img/sprints/horas_sprint4.jpg new file mode 100644 index 0000000..6c27993 Binary files /dev/null and b/docs/website/static/img/sprints/horas_sprint4.jpg differ diff --git a/docs/website/static/img/sprints/riscos_sprin5.jpg b/docs/website/static/img/sprints/riscos_sprin5.jpg new file mode 100644 index 0000000..f52f2f4 Binary files /dev/null and b/docs/website/static/img/sprints/riscos_sprin5.jpg differ diff --git a/docs/website/static/img/sprints/sprint6/burndown.png b/docs/website/static/img/sprints/sprint6/burndown.png new file mode 100644 index 0000000..59a33b4 Binary files /dev/null and b/docs/website/static/img/sprints/sprint6/burndown.png differ diff --git a/docs/website/static/img/sprints/sprint6/entregues_sprint6.png b/docs/website/static/img/sprints/sprint6/entregues_sprint6.png new file mode 100644 index 0000000..2185a88 Binary files /dev/null and b/docs/website/static/img/sprints/sprint6/entregues_sprint6.png differ diff --git a/docs/website/static/img/sprints/sprint6/retrospectiva.jpg b/docs/website/static/img/sprints/sprint6/retrospectiva.jpg new file mode 100644 index 0000000..da6c485 Binary files /dev/null and b/docs/website/static/img/sprints/sprint6/retrospectiva.jpg differ diff --git a/docs/website/static/img/sprints/sprint7/burndown_riscos.png b/docs/website/static/img/sprints/sprint7/burndown_riscos.png new file mode 100644 index 0000000..38c8d92 Binary files /dev/null and b/docs/website/static/img/sprints/sprint7/burndown_riscos.png differ diff --git a/docs/website/static/img/sprints/sprint7/riscos.png b/docs/website/static/img/sprints/sprint7/riscos.png new file mode 100644 index 0000000..ae20a90 Binary files /dev/null and b/docs/website/static/img/sprints/sprint7/riscos.png differ diff --git a/docs/website/static/img/sprints/velocity_sprint4.jpg b/docs/website/static/img/sprints/velocity_sprint4.jpg new file mode 100644 index 0000000..42a1864 Binary files /dev/null and b/docs/website/static/img/sprints/velocity_sprint4.jpg differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6d1a3a7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +django==2.0.3 +graphene-django==2.2.0 +django-filter==2.0.0 +django-graphiql==0.4.4 +gunicorn==19.7.1 +psycopg2 +pytest==3.5.0 +pytest-cov==2.5.1 +pytest-django==3.1.2 +flake8==3.5.0 +coveralls +coverage +psycopg2-binary diff --git a/src/.coverage b/src/.coverage new file mode 100644 index 0000000..0875c93 --- /dev/null +++ b/src/.coverage @@ -0,0 +1 @@ +!coverage.py: This is a private format, don't read it directly!{"lines":{"/code/src/comex_stat/assets/schema.py":[],"/code/src/comex_stat/__init__.py":[1],"/code/src/comex_stat/assets/views.py":[],"/code/src/comex_stat/urls.py":[1,2,4,6,7],"/code/src/comex_stat/assets/migrations/0001_initial.py":[3,4,5,8,10,12,16,17,19,20,21,22,23,24,27,30,31,33,34,35,36,37,38,41,44,45,47,48,49,50,51,52,53,54,55,56,57,58,59,62,63,65,66,67,68,69,72,73,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,98,99,101,102,103,104,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,148,149,151,152,153,154,155,158,159,161,162,163,166,167,169,170,171,174,175,176,177,179,180,181,182,184,185,186,187,189,190,191,192,194,195,196,197,199,200,201,202,204,205,206,207,209,210,211,212,214,215,216,217,219,220,221,222,224,225,226,227,229,230,231,232],"/code/src/comex_stat/assets/admin.py":[1],"/code/src/comex_stat/assets/fixtures/__init__.py":[1],"/code/src/comex_stat/assets/migrations/__init__.py":[1],"/code/src/comex_stat/assets/tests.py":[1],"/code/src/comex_stat/schema.py":[],"/code/src/comex_stat/wsgi.py":[],"/code/src/comex_stat/settings.py":[130,11,13,16,23,26,28,34,35,36,37,38,39,40,41,45,49,53,54,55,56,57,58,59,62,66,67,68,69,70,71,72,73,74,80,87,88,89,99,102,105,108,116,118,120,122,124],"/code/src/manage.py":[2,3,5,6,7,8,15],"/code/src/comex_stat/assets/__init__.py":[1],"/code/src/comex_stat/assets/models.py":[1,2,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25,26,27,28,29,30,31,32,33,34,35,36,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,79,80,81,82,83,86,87,88,89,90,91,94,95,96,97,100,101,102,105,107,108,111,112,113,114,115,116,117,118,119,120,122,123,126,127,128,129,132,133,134,135],"/code/src/comex_stat/assets/apps.py":[]}} \ No newline at end of file diff --git a/src/comex_stat/__init__.py b/src/comex_stat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/comex_stat/assets/__init__.py b/src/comex_stat/assets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/comex_stat/assets/admin.py b/src/comex_stat/assets/admin.py new file mode 100644 index 0000000..830f9e5 --- /dev/null +++ b/src/comex_stat/assets/admin.py @@ -0,0 +1,16 @@ +from django.contrib import admin +from comex_stat.assets.models import (AssetImportFacts, AssetExportFacts, + TradeBlocs, Country, FederativeUnit, + Transportation, Urf, NCM, CUCI, CGCE, SH) + +admin.site.register(AssetExportFacts) +admin.site.register(AssetImportFacts) +admin.site.register(TradeBlocs) +admin.site.register(Country) +admin.site.register(FederativeUnit) +admin.site.register(Transportation) +admin.site.register(Urf) +admin.site.register(NCM) +admin.site.register(CUCI) +admin.site.register(CGCE) +admin.site.register(SH) diff --git a/src/comex_stat/assets/apps.py b/src/comex_stat/assets/apps.py new file mode 100644 index 0000000..5569d30 --- /dev/null +++ b/src/comex_stat/assets/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AssetsConfig(AppConfig): + name = 'assets' diff --git a/src/comex_stat/assets/fixtures/__init__.py b/src/comex_stat/assets/fixtures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/comex_stat/assets/fixtures/assetexportfacts.json b/src/comex_stat/assets/fixtures/assetexportfacts.json new file mode 100644 index 0000000..8d14b20 --- /dev/null +++ b/src/comex_stat/assets/fixtures/assetexportfacts.json @@ -0,0 +1,82 @@ +[ + { + "model": "assets.assetexportfacts", + "pk": 1, + "fields": { + "origin_fed_unit": 45, + "destination_country": 97, + "date": "2018-03-01", + "name": "Outras partes para motores de explosão", + "ncm": 84099190, + "urf": 147600, + "transportation": 1, + "registries": 1, + "net_kilogram": 1, + "fob_value": 191 + } + }, + { + "model": "assets.assetexportfacts", + "pk": 2, + "fields": { + "origin_fed_unit": 41, + "destination_country": 345, + "date": "2018-03-05", + "name": "Painéis de fibras madeira de média densidade (denominados MDF), com densidade superior a 0,8 g/cm3, não trabalhados mecanicamente nem recobertos à superfície", + "ncm": 44119210, + "urf": 147600, + "transportation": 1, + "registries": 39, + "net_kilogram": 39071, + "fob_value": 16590 + } + }, + { + "model": "assets.assetexportfacts", + "pk": 3, + "fields": { + "origin_fed_unit": 41, + "destination_country": 845, + "date": "2018-03-09", + "name": "Calças, jardineiras, bermudas e shorts (calções), de uso feminino, de fibras sintéticas", + "ncm": 62046300, + "urf": 817700, + "transportation": 4, + "registries": 14, + "net_kilogram": 6, + "fob_value": 769 + } + }, + { + "model": "assets.assetexportfacts", + "pk": 4, + "fields": { + "origin_fed_unit": 41, + "destination_country": 586, + "date": "2018-08-15", + "name": "Produtos de maquiagem para os lábios", + "ncm": 33049990, + "urf": 917500, + "transportation": 6, + "registries": 3399, + "net_kilogram": 3399, + "fob_value": 39508 + } + }, + { + "model": "assets.assetexportfacts", + "pk": 5, + "fields": { + "origin_fed_unit": 33, + "destination_country": 239, + "date": "2018-06-19", + "name": "Outros parafusos e pinos ou pernos, mesmo com as porcas e arruelas, de ferro fundido, ferro ou aço", + "ncm": 73181500, + "urf": 817700, + "transportation": 4, + "registries": 0, + "net_kilogram": 0, + "fob_value": 9 + } + } +] diff --git a/src/comex_stat/assets/fixtures/assetimportfacts.json b/src/comex_stat/assets/fixtures/assetimportfacts.json new file mode 100644 index 0000000..69d0646 --- /dev/null +++ b/src/comex_stat/assets/fixtures/assetimportfacts.json @@ -0,0 +1,82 @@ +[ + { + "model": "assets.assetimportfacts", + "pk": 1, + "fields": { + "destination_fed_unit": 32, + "origin_country": 23, + "date": "2018-05-01", + "name": "Guarnições para móveis, carrocerias e semelhantes, de plásticos", + "ncm": 39263000, + "transportation": 1, + "urf": 817800, + "registries": 4, + "net_kilogram": 4, + "fob_value": 555 + } + }, + { + "model": "assets.assetimportfacts", + "pk": 2, + "fields": { + "destination_fed_unit": 41, + "origin_country": 249, + "date": "2018-05-01", + "name": "Outras obras de cortiça aglomerada", + "ncm": 45049000, + "urf": 0, + "transportation": 0, + "registries": 26, + "net_kilogram": 26, + "fob_value": 3215 + } + }, + { + "model": "assets.assetimportfacts", + "pk": 3, + "fields": { + "destination_fed_unit": 26, + "origin_country": 160, + "date": "2018-05-01", + "name": "Porcas de ferro fundido, ferro ou aço", + "ncm": 73181600, + "urf": 417902, + "transportation": 1, + "registries": 370, + "net_kilogram": 370, + "fob_value": 2283 + } + }, + { + "model": "assets.assetimportfacts", + "pk": 4, + "fields": { + "destination_fed_unit": 41, + "origin_country": 249, + "date": "2018-05-01", + "name": "Outras partes de bombas para líquidos", + "ncm": 84139190, + "urf": 817600, + "transportation": 4, + "registries": 4424, + "net_kilogram": 4424, + "fob_value": 332623 + } + }, + { + "model": "assets.assetimportfacts", + "pk": 5, + "fields": { + "destination_fed_unit": 41, + "origin_country": 386, + "date": "2018-05-01", + "name": "Outras partes de bombas para líquidos", + "ncm": 84139190, + "urf": 817600, + "transportation": 4, + "registries": 464, + "net_kilogram": 464, + "fob_value": 31454 + } + } +] diff --git a/src/comex_stat/assets/fixtures/cgce.json b/src/comex_stat/assets/fixtures/cgce.json new file mode 100644 index 0000000..d88048a --- /dev/null +++ b/src/comex_stat/assets/fixtures/cgce.json @@ -0,0 +1,92 @@ +[ + { + "model": "assets.CGCE", + "pk": 280, + "fields": { + "level1_code": "280", + "level1_name_pt": "Peças para equipamentos de transporte", + "level1_name_en": "Parts for transport equipment", + "level1_name_es": "Piezas para equipos de transporte", + "level2_code": "28", + "level2_name_pt": "Peças para equipamentos de transporte", + "level2_name_en": "Parts for transport equipment", + "level2_name_es": "Piezas para equipos de transporte", + "level3_code": "2", + "level3_name_pt": "BENS INTERMEDIÁRIOS (BI)", + "level3_name_en": "INTERMEDIATE GOODS (BI)", + "level3_name_es": "BIENES INTERMEDIOS (BI)" + } + }, + { + "model": "assets.CGCE", + "pk": 240, + "fields": { + "level1_code": "240", + "level1_name_pt": "Insumos industriais elaborados", + "level1_name_en": "Elaborated industrial inputs", + "level1_name_es": "Insumos industriales elaborados", + "level2_code": "24", + "level2_name_pt": "Insumos industriais elaborados", + "level2_name_en": "Elaborated industrial inputs", + "level2_name_es": "Insumos industriales elaborados", + "level3_code": "2", + "level3_name_pt": "BENS INTERMEDIÁRIOS (BI)", + "level3_name_en": "INTERMEDIATE GOODS (BI)", + "level3_name_es": "BIENES INTERMEDIOS (BI)" + } + }, + { + "model": "assets.CGCE", + "pk": 321, + "fields": { + "level1_code": "321", + "level1_name_pt": "Bens de consumo semiduráveis", + "level1_name_en": "Semi-durable consumer goods", + "level1_name_es": "Bienes de consumo semidurables", + "level2_code": "321", + "level2_name_pt": "Bens de consumo semiduráveis e não duráveis", + "level2_name_en": "Consumer goods semi-durable and non-durable", + "level2_name_es": "Bienes de consumo semidurables y no durables", + "level3_code": "3", + "level3_name_pt": "BENS DE CONSUMO (BC)", + "level3_name_en": "CONSUMER GOODS (BC)", + "level3_name_es": "BIENES DE CONSUMO (BC)" + } + }, + { + "model": "assets.CGCE", + "pk": 322, + "fields": { + "level1_code": "322", + "level1_name_pt": "Bens de consumo não duráveis", + "level1_name_en": "Non-durable goods", + "level1_name_es": "Bienes de consumo no durables", + "level2_code": "32", + "level2_name_pt": "Bens de consumo semiduráveis e não duráveis", + "level2_name_en": "Consumer goods semi-durable and non-durable", + "level2_name_es": "Bienes de consumo semidurables y no durables", + "level3_code": "3", + "level3_name_pt": "BENS DE CONSUMO (BC)", + "level3_name_en": "CONSUMER GOODS (BC)", + "level3_name_es": "BIENES DE CONSUMO (BC)" + } + }, + { + "model": "assets.CGCE", + "pk": 270, + "fields": { + "level1_code": "270", + "level1_name_pt": "Peças e acessórios para bens de capital", + "level1_name_en": "Parts and accessories for capital goods", + "level1_name_es": "Piezas y accesorios para bienes de capital", + "level2_code": "27", + "level2_name_pt": "Peças e acessórios para bens de capital", + "level2_name_en": "Parts and accessories for capital goods", + "level2_name_es": "Piezas y accesorios para bienes de capital", + "level3_code": "2", + "level3_name_pt": "BENS INTERMEDIÁRIOS (BI)", + "level3_name_en": "INTERMEDIATE GOODS (BI)", + "level3_name_es": "BIENES INTERMEDIOS (BI)" + } + } +] diff --git a/src/comex_stat/assets/fixtures/country.json b/src/comex_stat/assets/fixtures/country.json new file mode 100644 index 0000000..8346106 --- /dev/null +++ b/src/comex_stat/assets/fixtures/country.json @@ -0,0 +1,101 @@ +[ + { + "model": "assets.Country", + "pk": 249, + "fields": { + "name_portuguese": "Estados Unidos", + "name_english": "United States", + "name_spanish": "Estados Unidos", + "code_iso3": "USA", + "trade_bloc": 107 + } + }, + { + "model": "assets.Country", + "pk": 160, + "fields": { + "name_portuguese": "China", + "name_english": "China", + "name_spanish": "China", + "code_iso3": "CHN", + "trade_bloc": 39 + } + }, + { + "model": "assets.Country", + "pk": 23, + "fields": { + "name_portuguese": "Alemanha", + "name_english": "Germany", + "name_spanish": "Alemania", + "code_iso3": "DEU", + "trade_bloc": 112 + } + }, + { + "model": "assets.Country", + "pk": 386, + "fields": { + "name_portuguese": "Itália", + "name_english": "Italy", + "name_spanish": "Italia", + "code_iso3": "ITA", + "trade_bloc": 112 + } + }, + { + "model": "assets.Country", + "pk": 97, + "fields": { + "name_portuguese": "Bolívia", + "name_english": "Bolivia", + "name_spanish": "Bolivia", + "code_iso3": "BOL", + "trade_bloc": 48 + } + }, + { + "model": "assets.Country", + "pk": 345, + "fields": { + "name_portuguese": "Honduras", + "name_english": "Honduras", + "name_spanish": "Honduras", + "code_iso3": "HND", + "trade_bloc": 105 + } + }, + { + "model": "assets.Country", + "pk": 845, + "fields": { + "name_portuguese": "Uruguai", + "name_english": "Uruguay", + "name_spanish": "Uruguay", + "code_iso3": "URY", + "trade_bloc": 48 + } + }, + { + "model": "assets.Country", + "pk": 586, + "fields": { + "name_portuguese": "Paraguai", + "name_english": "Paraguay", + "name_spanish": "Paraguay", + "code_iso3": "PRY", + "trade_bloc": 111 + } + }, + { + "model": "assets.Country", + "pk": 239, + "fields": { + "name_portuguese": "Equador", + "name_english": "Ecuador", + "name_spanish": "Ecuador", + "code_iso3": "ECU", + "trade_bloc": 48 + } + } +] diff --git a/src/comex_stat/assets/fixtures/cuci.json b/src/comex_stat/assets/fixtures/cuci.json new file mode 100644 index 0000000..f2b60cb --- /dev/null +++ b/src/comex_stat/assets/fixtures/cuci.json @@ -0,0 +1,210 @@ +[ + { + "model": "assets.CUCI", + "pk": 71391, + "fields": { + "item_code": "", + "item_name_pt": "Peças, n.e.p., para motores de ignição por centelha dos subgrupos 713.2, 713.3 e 713.8, exclusiva ou principalmente com ignição por centelha motores de pistão de combustão interna.", + "item_name_en": "Parts, n.e.s, for the internal combustion piston engines of subgroups 713.2, 713.3 & 713.8, suitable for use solely/principally with spark-ignition internal combustion piston engines.", + "item_name_es": "", + "subitem_code": "7139", + "subitem_name_pt": "Peças, n.e.p., para motores de ignição por centelha dos subgrupos 713.2, 713.3 e 713.8", + "subitem_name_en": "Parts, n.e.s, for the internal combustion piston engines of subgroups 713.2, 713.3 and 713.8", + "subitem_name_es": "", + "position_code": "713", + "position_name_pt": "Motores de pistão, e suas partes, n.e.p.", + "position_name_en": "Internal combustion piston engines and parts thereof, n.e.s.", + "position_name_es": "", + "chapter_code": "71", + "chapter_name_pt": "Máquinas e equipamentos de geração de energia", + "chapter_name_en": "Power-generating machinery and equipment", + "chapter_name_es": "", + "section_code": "7", + "section_name_pt": "MAQUINAS E EQUIPAMENTOS DE TRANSPORTE", + "section_name_en": "MACHINERY AND TRANSPORT EQUIPMENT", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 63459, + "fields": { + "item_code": "63459", + "item_name_pt": "Painéis de fibras de madeira ou de outras matérias lenhosas, n.e.p.", + "item_name_en": "Fibreboard of wood/other ligneous materials, n.e.s.", + "item_name_es": "", + "subitem_code": "6345", + "subitem_name_pt": "Painéis de fibras de madeira ou de outras matérias lenhosas, mesmo aglomeradas com resinas ou outras substâncias orgânicas", + "subitem_name_en": "Fibreboard of wood or other ligneous materials, whether or not bonded with resins or other organic substances", + "subitem_name_es": "", + "position_code": "634", + "position_name_pt": "Folheados, contraplacados, aglomerados, e outras madeiras, trabalhoados, n.e.p.", + "position_name_en": "Veneers, plywood, particle board, and other wood, worked, n.e.s.", + "position_name_es": "", + "chapter_code": "63", + "chapter_name_pt": "Manufaturas de cortiça e madeira (exceto mobiliário)", + "chapter_name_en": "Cork and wood manufactures (excluding furniture)", + "chapter_name_es": "", + "section_code": "6", + "section_name_pt": "ARTIGOS MANUFATURADOS, CLASSIFICADOS PRINCIPALMENTE PELO MATERIAL", + "section_name_en": "MANUFACTURED GOODS CLASSIFIED CHIEFLY BY MATERIAL", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 8426, + "fields": { + "item_code": "8426", + "item_name_pt": "Calças, jardineiras, bermudas e shorts", + "item_name_en": "Trousers, bib & brace overalls, breeches & shorts, women's/girls', of textile materials, not knitted/crocheted", + "item_name_es": "", + "subitem_code": "8426", + "subitem_name_pt": "Calças, jardineiras, bermudas e shorts", + "subitem_name_en": "Trousers, bib & brace overalls, breeches & shorts, women's/girls', of textile materials, not knitted/crocheted", + "subitem_name_es": "", + "position_code": "842", + "position_name_pt": "Casacos femininos e infantis (de meninas), capas, jaquetas, ternos, calças, shorts, camisas, vestidos e saias, roupa interior, roupa de dormir e artigos semelhantes de tecidos, de malha (exceto os do subgrupo 845.2)", + "position_name_en": "Women's or girls' coats, capes, jackets, suits, trousers, shorts, shirts, dresses and skirts, underwear, nightwear and similar articles of textile fabrics, not knitted or crocheted (other than those of subgroup 845.2)", + "position_name_es": "", + "chapter_code": "84", + "chapter_name_pt": "Artigos de vestuário e seus acessórios", + "chapter_name_en": "Articles of apparel and clothing accessories", + "chapter_name_es": "", + "section_code": "8", + "section_name_pt": "OBRAS DIVERSAS", + "section_name_en": "MISCELLANEOUS MANUFACTURED ARTICLES", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 5532, + "fields": { + "item_code": "5532", + "item_name_pt": "Preparações de beleza ou de maquiagem para os cuidados da pele (exceto medicamentos), incluindo protetores solares e bronzeadores preparações; manicure e pedicure", + "item_name_en": "Beauty/make-up preparations for the care of the skin (other than medicaments), including sunscreen/suntan preparations; manicure/pedicure preparations", + "item_name_es": "", + "subitem_code": "5532", + "subitem_name_pt": "Preparações de beleza ou de maquiagem para os cuidados da pele (exceto medicamentos), incluindo protetores solares e bronzeadores preparações; manicure e pedicure", + "subitem_name_en": "Beauty/make-up preparations for the care of the skin (other than medicaments), including sunscreen/suntan preparations; manicure/pedicure preparations", + "subitem_name_es": "", + "position_code": "553", + "position_name_pt": "Produtos de perfumaria ou de toucador (excluindo sabonetes)", + "position_name_en": "Perfumery, cosmetic or toilet preparations (excluding soaps)", + "position_name_es": "", + "chapter_code": "55", + "chapter_name_pt": "Óleos essenciais e resinóides e produtos de perfumaria; higiene, polimento e preparações de limpeza", + "chapter_name_en": "Essential oils and resinoids and perfume materials; toilet, polishing and cleansing preparations", + "chapter_name_es": "", + "section_code": "5", + "section_name_pt": "PRODUTOS QUIMICOS E RELACIONADOS, N.E.P.", + "section_name_en": "CHEMICALS AND RELATED PRODUCTS, N.E.S.", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 69421, + "fields": { + "item_code": "69421", + "item_name_pt": "Parafusos, parafusos, porcas, tirafundos, ganchos, rebites, chavetas, cavilhas, contrapinos, arruelas (incluídas as de pressão) e artefatos semelhantes, de ferro ou aço Enroscados", + "item_name_en": "Screws, bolts, nuts, coach screws, screw hooks, rivets, cotters, cotter pins, washers (including spring washers) & similar articles, of iron/steel, threaded", + "item_name_es": "", + "subitem_code": "6942", + "subitem_name_pt": "Parafusos, parafusos, porcas, tirafundos, ganchos, rebites, chavetas, cavilhas, contrapinos, arruelas (incluídas as de pressão) e artefatos semelhantes, de ferro ou aço", + "subitem_name_en": "Screws, bolts, nuts, coach screws, screw hooks, rivets, cotters, cotter pins, washers (including spring washers) and similar articles, of iron or steel", + "subitem_name_es": "", + "position_code": "694", + "position_name_pt": "Pregos, parafusos, porcas, parafusos, rebites e semelhantes, de ferro, aço, cobre ou alumínio", + "position_name_en": "Nails, screws, nuts, bolts, rivets and the like, of iron, steel, copper or aluminium", + "position_name_es": "", + "chapter_code": "69", + "chapter_name_pt": "Produtos metálicos, n.e.p.", + "chapter_name_en": "Manufactures of metals, n.e.s.", + "chapter_name_es": "", + "section_code": "6", + "section_name_pt": "ARTIGOS MANUFATURADOS, CLASSIFICADOS PRINCIPALMENTE PELO MATERIAL", + "section_name_en": "MANUFACTURED GOODS CLASSIFIED CHIEFLY BY MATERIAL", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 89395, + "fields": { + "item_code": "89395", + "item_name_pt": "Guarnições para móveis, carroçarias ou semelhantes", + "item_name_en": "Fittings for furniture, coachwork/the like, of plastics", + "item_name_es": "", + "subitem_code": "8939", + "subitem_name_pt": "Obras de plástico, n.e.p.", + "subitem_name_en": "Articles of plastics, n.e.s.", + "subitem_name_es": "", + "position_code": "893", + "position_name_pt": "Artigos, n.e.p., de plásticos", + "position_name_en": "Articles, n.e.s., of plastics", + "position_name_es": "", + "chapter_code": "89", + "chapter_name_pt": "Artigos manufaturados diversos, n.e.p.", + "chapter_name_en": "Miscellaneous manufactured articles, n.e.s.", + "chapter_name_es": "", + "section_code": "8", + "section_name_pt": "OBRAS DIVERSAS", + "section_name_en": "MISCELLANEOUS MANUFACTURED ARTICLES", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 63329, + "fields": { + "item_code": "63329", + "item_name_pt": "Outros", + "item_name_en": "Articles of agglomerated cork, not of 633.21", + "item_name_es": "", + "subitem_code": "6332", + "subitem_name_pt": "Cortiça aglomerada (com ou sem aglutinantes) e artigos de cortiça aglomerada.", + "subitem_name_en": "Agglomerated cork (with or without a binding substance) and articles of agglomerated cork.", + "subitem_name_es": "", + "position_code": "633", + "position_name_pt": "Manufaturas de cortiça ", + "position_name_en": "Cork manufactures", + "position_name_es": "", + "chapter_code": "63", + "chapter_name_pt": "Manufaturas de cortiça e madeira (exceto mobiliário)", + "chapter_name_en": "Cork and wood manufactures (excluding furniture)", + "chapter_name_es": "", + "section_code": "6", + "section_name_pt": "ARTIGOS MANUFATURADOS, CLASSIFICADOS PRINCIPALMENTE PELO MATERIAL", + "section_name_en": "MANUFACTURED GOODS CLASSIFIED CHIEFLY BY MATERIAL", + "section_name_es": "" + } + }, + { + "model": "assets.CUCI", + "pk": 74291, + "fields": { + "item_code": "74291", + "item_name_pt": "Partes das bombas do grupo 742", + "item_name_en": "Parts of the pumps of group 742", + "item_name_es": "", + "subitem_code": "7429", + "subitem_name_pt": "Partes das bombas e elevadores de líquidos do grupo 742", + "subitem_name_en": "Parts of the pumps and liquid elevators of group 742", + "subitem_name_es": "", + "position_code": "742", + "position_name_pt": "Bombas para líquidos, mesmo equipados com dispositivo medidor; elevadores de líquidos; peças para essas bombas e elevadores de líquidos", + "position_name_en": "Pumps for liquids, whether or not fitted with a measuring device; liquid elevators; parts for such pumps and liquid elevators", + "position_name_es": "", + "chapter_code": "74", + "chapter_name_pt": "Máquinas em geral e equipamentos industriais, n.e.p., e peças de máquinas, n.e.p.", + "chapter_name_en": "General industrial machinery and equipment, n.e.s., and machine parts, n.e.s.", + "chapter_name_es": "", + "section_code": "7", + "section_name_pt": "MAQUINAS E EQUIPAMENTOS DE TRANSPORTE", + "section_name_en": "MACHINERY AND TRANSPORT EQUIPMENT", + "section_name_es": "" + } + } +] diff --git a/src/comex_stat/assets/fixtures/federativeunit.json b/src/comex_stat/assets/fixtures/federativeunit.json new file mode 100644 index 0000000..2580e6a --- /dev/null +++ b/src/comex_stat/assets/fixtures/federativeunit.json @@ -0,0 +1,47 @@ +[ + { + "model": "assets.FederativeUnit", + "pk": 45, + "fields": { + "name": "Rio Grande do Sul", + "code": "45", + "initials": "RS" + } + }, + { + "model": "assets.FederativeUnit", + "pk": 41, + "fields": { + "name": "São Paulo", + "code": "41", + "initials": "SP" + } + }, + { + "model": "assets.FederativeUnit", + "pk": 33, + "fields": { + "name": "Minas Gerais", + "code": "33", + "initials": "MG" + } + }, + { + "model": "assets.FederativeUnit", + "pk": 32, + "fields": { + "name": "Bahia", + "code": "32", + "initials": "BA" + } + }, + { + "model": "assets.FederativeUnit", + "pk": 26, + "fields": { + "name": "Pernambuco", + "code": "26", + "initials": "PE" + } + } +] diff --git a/src/comex_stat/assets/fixtures/ncm.json b/src/comex_stat/assets/fixtures/ncm.json new file mode 100644 index 0000000..2548aa5 --- /dev/null +++ b/src/comex_stat/assets/fixtures/ncm.json @@ -0,0 +1,182 @@ +[ + { + "model": "assets.ncm", + "pk": 84099190, + "fields": { + "ncm_code": "84099190", + "statistic_unit_code": "10", + "ppe_code": "3193", + "ppi_code": "3172", + "aggregate_factor_code": "03", + "isic4_code": "29", + "exportation_subset": "1005", + "ncm_name_pt": "Outras partes para motores de explosão", + "ncm_name_es": "Other parts for internal combustion engines", + "ncm_name_en": "Otras partes para motores de explosión", + "siit_code": "2000", + "cuci": 71391, + "cgce": 280, + "sh": 840991 + } + }, + { + "model": "assets.ncm", + "pk": 44119210, + "fields": { + "ncm_code": "44119210", + "statistic_unit_code": "16", + "ppe_code": "3580", + "ppi_code": "3580", + "aggregate_factor_code": "03", + "isic4_code": "16", + "exportation_subset": "0805", + "ncm_name_pt": "Painéis de fibras madeira de média densidade (denominados MDF), com densidade superior a 0,8 g/cm3, não trabalhados mecanicamente nem recobertos à superfície", + "ncm_name_en": "Medium density fibreboard (called MDF), with a density of more than 0,8 g / cm3, not mechanically worked or surface covered", + "ncm_name_es": "Paneles de fibras de madera de media densidad (denominados MDF), con una densidad superior a 0,8 g / cm3, no trabajados mecánicamente ni recubiertos a la superficie", + "siit_code": "4000", + "cuci": 63459, + "cgce": 240, + "sh": 441192 + } + }, + { + "model": "assets.ncm", + "pk": 62046300, + "fields": { + "ncm_code": "62046300", + "statistic_unit_code": "11", + "ppe_code": "3499", + "ppi_code": "3083", + "aggregate_factor_code": "03", + "isic4_code": "14", + "exportation_subset": "1602", + "ncm_name_pt": "Calças, jardineiras, bermudas e shorts (calções), de uso feminino, de fibras sintéticas", + "ncm_name_en": "Women's or girls' trousers, bib and brace overalls, breeches and shorts of synthetic fibers", + "ncm_name_es": "Pantalones, pantalones cortos, bermudas y pantalones cortos (pantalones), de uso femenino, de fibras sintéticas", + "siit_code": "4000", + "cuci": 8426, + "cgce": 321, + "sh": 620463 + } + }, + { + "model": "assets.ncm", + "pk": 33049990, + "fields": { + "ncm_code": "33049990", + "statistic_unit_code": "10", + "ppe_code": "3681", + "ppi_code": "3681", + "aggregate_factor_code": "03", + "isic4_code": "20", + "exportation_subset": "1404", + "ncm_name_pt": "Outros sabões/produtos/preparações, em barras, pedaços, etc.", + "ncm_name_en": "Other soaps / products / preparations, in bars, pieces, etc.", + "ncm_name_es": "Otros jabones / productos / preparaciones, en barras, pedazos, etc.", + "siit_code": "2000", + "cuci": 5532, + "cgce": 322, + "sh": 330499 + } + }, + { + "model": "assets.ncm", + "pk": 73181500, + "fields": { + "ncm_code": "73181500", + "statistic_unit_code": "10", + "ppe_code": "3671", + "ppi_code": "3671", + "aggregate_factor_code": "03", + "isic4_code": "25", + "exportation_subset": "1599", + "ncm_name_pt": "Outros parafusos e pinos ou pernos, mesmo com as porcas e arruelas, de ferro fundido, ferro ou aço", + "ncm_name_en": "Other screws and bolts, whether or not with their nuts and washers, of cast iron, iron or steel", + "ncm_name_es": "Otros tornillos y pernos o pernos, incluso con las tuercas y arandelas, de fundición, hierro o acero", + "siit_code": "3000", + "cuci": 69421, + "cgce": 240, + "sh": 731815 + } + }, + { + "model": "assets.ncm", + "pk": 39263000, + "fields": { + "ncm_code": "39263000", + "statistic_unit_code": "10", + "ppe_code": "3619", + "ppi_code": "3427", + "aggregate_factor_code": "03", + "isic4_code": "22", + "exportation_subset": "1407", + "ncm_name_pt": "Guarnições para móveis, carrocerias e semelhantes, de plásticos", + "ncm_name_en": "Fittings for furniture, coachwork and the like, of plastics", + "ncm_name_es": "Guarniciones para muebles, carrocerías y similares, de plástico", + "siit_code": "3000", + "cuci": 89395, + "cgce": 240, + "sh": 392630 + } + }, + { + "model": "assets.ncm", + "pk": 45049000, + "fields": { + "ncm_code": "45049000", + "statistic_unit_code": "10", + "ppe_code": "3990", + "ppi_code": "3990", + "aggregate_factor_code": "03", + "isic4_code": "16", + "exportation_subset": "8099", + "ncm_name_pt": "Outras obras de cortiça aglomerada", + "ncm_name_en": "Other articles of agglomerated cork", + "ncm_name_es": "Otras manufacturas de corcho aglomerado", + "siit_code": "4000", + "cuci": 63329, + "cgce": 240, + "sh": 450490 + } + }, + { + "model": "assets.ncm", + "pk": 73181600, + "fields": { + "ncm_code": "73181600", + "statistic_unit_code": "10", + "ppe_code": "3671", + "ppi_code": "3671", + "aggregate_factor_code": "03", + "isic4_code": "25", + "exportation_subset": "1599", + "ncm_name_pt": "Porcas de ferro fundido, ferro ou aço", + "ncm_name_en": "Nuts of cast iron, iron or steel", + "ncm_name_es": "Tuercas de hierro fundido, hierro o acero", + "siit_code": "3000", + "cuci": 69421, + "cgce": 240, + "sh": 731816 + } + }, + { + "model": "assets.ncm", + "pk": 84139190, + "fields": { + "ncm_code": "84139190", + "statistic_unit_code": "10", + "ppe_code": "3060", + "ppi_code": "3060", + "aggregate_factor_code": "03", + "isic4_code": "28", + "exportation_subset": "0901", + "ncm_name_pt": "Outras partes de bombas para líquidos", + "ncm_name_en": "Other parts of pumps for liquids", + "ncm_name_es": "Otras partes de bombas para líquidos", + "siit_code": "2000", + "cuci": 74291, + "cgce": 270, + "sh": 841391 + } + } +] diff --git a/src/comex_stat/assets/fixtures/sh.json b/src/comex_stat/assets/fixtures/sh.json new file mode 100644 index 0000000..3d44b18 --- /dev/null +++ b/src/comex_stat/assets/fixtures/sh.json @@ -0,0 +1,200 @@ +[ + { + "model": "assets.SH", + "pk": 840991, + "fields": { + "chapter_code": "84", + "chapter_name_pt": "Reatores nucleares, caldeiras, máquinas, aparelhos e instrumentos mecânicos, e suas partes", + "chapter_name_en": "Nuclear reactors, boilers, machinery and mechanical appliances; others", + "chapter_name_es": "Reactores nucleares, calderas, máquinas, otros.", + "position_code": "8409", + "position_name_pt": "Partes reconhecíveis como exclusiva ou principalmente destinadas aos motores das posições 8407 ou 8408", + "position_name_en": "Parts suitable for use solely or principally with the engines of heading No 8407 or 8408", + "position_name_es": "Partes identificables como destinadas, exclusiva o principalmente, a los motores de las partidas 8407 u 8408", + "subposition_code": "840991", + "subposition_name_pt": "Outras partes exclusiva ou principalmente destinadas aos motores de pistão, de ignição por centelha", + "subposition_name_en": "Parts suitable for use solely or principally with spark-ignition internal combustion piston engine, n.e.s.", + "subposition_name_es": "Partes identificables como destinadas exclusiva o principalmente a motores de émbolo pistón de encendido por chispa, n.c.o.p.", + "section_code": "XVI", + "section_name_pt": "Máquinas e aparelhos, material elétrico e suas partes; Aparelhos de gravação ou reprodução de som, aparelhos de gravação ou reprodução de imagens e de som em televisão, e suas partes e acessórios", + "section_name_en": "Machinery and mechanical appliances; Electrical equipment and parts thereof; Sound recorders and reproducers, sound recorders and producers of television image; Parts and accessoires of such articles", + "section_name_es": "Máquinas y aparatos, material eléctrico e sus partes; Aparatos de grabación o reproducción de sonido, aparatos de grabación o reproducción de imágenes y sonido en televisión, y las partes y accesorios de estos aparatos" + } + }, + { + "model": "assets.SH", + "pk": 441192, + "fields": { + "chapter_code": "44", + "chapter_name_pt": "Madeira, carvão vegetal e obras de madeira", + "chapter_name_en": "Wood and articles of wood; wood charcoal", + "chapter_name_es": "Madera, carbón vegetal y manufacturas de madera", + "position_code": "4411", + "position_name_pt": "Painéis de fibras de madeira ou de outras matérias lenhosas, mesmo aglomeradas com resinas ou com outros aglutinantes orgânicos", + "position_name_en": "Tableros de fibra de madera u otras materias leñosas, incluso aglomerados con resinas u otros aglutinantes orgánicos", + "position_name_es": "Fibreboard of wood or other ligneous materials, whether or not bonded with resins or other organic substances", + "subposition_code": "441192", + "subposition_name_pt": "Painéis de fibra de madeira ou de outras matérias lenhosas, mesmo aglomeradas com resinas ou outros algutinantes orgânicos, com densidade superior a 0,8g/cm3", + "subposition_name_en": "Other fibreboard of wood, 0.35 0,8 g/cm³", + "section_code": "IX", + "section_name_pt": "Madeira, carvão vegetal e obras de madeira; Cortiça e suas obras; Obras de espartaria ou de cestaria", + "section_name_en": "Madera, carbón vegetal y manufacturas de madera; Corcho y manufacturas de corcho; Manufacturas de espartería o de cestería", + "section_name_es": "Wood, vegetal charcoal and wood manufactures" + } + }, + { + "model": "assets.SH", + "pk": 620463, + "fields": { + "chapter_code": "62", + "chapter_name_pt": "Vestuário e seus acessórios, exceto de Malha", + "chapter_name_en": "Articles of apparel and clothing accessories, not knitted or crocheted", + "chapter_name_es": "Prendas y complementos (accesorios), de vestir, excepto los de punto", + "position_code": "6204", + "position_name_pt": "Fatos de saia-casaco, conjuntos, casacos, vestidos, saias, saias-calças, calças, jardineiras, bermudas e calções (shorts) (exceto de banho), de uso feminino", + "position_name_en": "Women's or girls' suits, ensembles, jackets, blazers, dresses, skirts, divided skirts, trousers, bib and brace overalls, breeches and shorts (other than swimwear)", + "position_name_es": "Trajes sastre, conjuntos, chaquetas (sacos), vestidos, faldas, faldas pantalón, pantalones largos, pantalones con peto, pantalones cortos (calzones) y shorts (excepto de baño), para mujeres o niñas", + "subposition_code": "620463", + "subposition_name_pt": "Camisas de algodão, de uso masculino", + "subposition_name_en": "Women''s or girls'' trousers, bib and brace overalls, breeches and shorts of synthetic fibres (excl. knitted or crocheted, panties and swimwear)", + "subposition_name_es": "Camisas de fibras sintéticas o artificiales, para hombres o niños (exc. de punto, así como camisones y camisetas)", + "section_code": "XI", + "section_name_pt": "Matérias têxteis e suas obras", + "section_name_en": "Textiles and textiles articles", + "section_name_es": "Materias textiles y sus manufacturas" + } + }, + { + "model": "assets.SH", + "pk": 330499, + "fields": { + "chapter_code": "33", + "chapter_name_pt": "Óleos essenciais e resinóides; produtos de perfumaria ou de toucador preparados e preparações cosméticas", + "chapter_name_en": "Essential oils and resinoids; perfumery, cosmetic or toilet preparations", + "chapter_name_es": "Aceites esenciales y resinoides; preparaciones de perfumería, otros.", + "position_code": "3304", + "position_name_pt": "Produtos de beleza ou de maquilhagem preparados e preparações para conservação ou cuidados da pele (exceto medicamentos), incluídas as preparações anti-solares e os bronzeadores; preparações para manicuros e pedicuros", + "position_name_en": "Beauty or make-up preparations and preparations for the care of the skin (other than medicaments), including sunscreen or sun tan preparations; manicure or pedicure preparations", + "position_name_es": "Preparaciones capilares", + "subposition_code": "330499", + "subposition_name_pt": "Outros produtos de beleza ou de maquilagem preparados", + "subposition_name_en": "Beauty or make-up preparations and preparations for the care of the skin (other than medicaments), incl. sunscreen or suntan preparations (excl. medicaments, lip and eye make-up preparations, manicure or pedicure preparations and make-up", + "subposition_name_es": "Preparaciones de belleza, maquillaje y para el cuidado de la piel, incl. las preparaciones antisolares y las bronceadoras (exc. medicamentos, preparaciones para el maquillaje de los labios o de los ojos, preparaciones para manicuras", + "section_code": "VI", + "section_name_pt": "Produtos das indústrias químicas ou indústrias conexas", + "section_name_en": "Products of chemical or allied industries", + "section_name_es": "Productos de las industrias químicas o de las industrias conexas" + } + }, + { + "model": "assets.SH", + "pk": 731815, + "fields": { + "chapter_code": "73", + "chapter_name_pt": "Obras de ferro fundido, ferro ou aço", + "chapter_name_en": "Articles of iron or steel", + "chapter_name_es": "Manufacturas de fundición, de hierro o acero", + "position_code": "7318", + "position_name_pt": "Parafusos, pernos ou pinos, roscados, porcas, tira-fundos, ganchos roscados, rebites, chavetas, cavilhas, contrapinos ou troços, anilhas ou arruelas", + "position_name_en": "Screws, bolts, nuts, coach screws, screw hooks, rivets, cotters, cotter-pins, washers (including spring washers) and similar articles, of iron or steel", + "position_name_es": "Tornillos, pernos, tuercas, tirafondos, escarpias roscadas, remaches, pasadores, clavijas, chavetas, arandelas, incluidas las arandelas de muelle (resorte) y artículos similares, de fundición, hierro o acero", + "subposition_code": "731815", + "subposition_name_pt": "Outros parafusos e pinos ou pernos, mesmo com as porcas e arruelas, de ferro fundido, ferro ou aço", + "subposition_name_en": "Screws, bolts, nuts, coach screws, screw hooks, rivets, cotters, cotter-pins, washers (including spring washers) and similar articles, of iron or steel", + "subposition_name_es": "Tornillos y pernos, roscados, de fundición, hierro o acero, incl. con sus tuercas y arandelas (exc. tirafondos y demás tornillos para madera; escarpias y armellas, roscadas; tornillos taladradores; clavos-tornillo, tapones metálicos roscados", + "section_code": "XV", + "section_name_pt": "Metais comuns e suas obras", + "section_name_en": "Metales comunes y manufacturas de estos metales", + "section_name_es": "Base metals and articles of base metal" + } + }, + { + "model": "assets.SH", + "pk": 392630, + "fields": { + "chapter_code": "39", + "chapter_name_pt": "Plásticos e suas obras", + "chapter_name_en": "Plastics and articles thereof", + "chapter_name_es": "Plástico y sus manufacturas", + "position_code": "3926", + "position_name_pt": "Outras obras de plástico e obras de outras matérias das posições 3901 a 3914", + "position_name_en": "Other articles of plastics and articles of other materials of headings 3901 to 3914", + "position_name_es": "Demás manufacturas de plástico y manufacturas de las demás materias de las partidas 3901 a 3914", + "subposition_code": "392630", + "subposition_name_pt": "Outras obras de plásticos e obras de outras matérias das posições 3901 a 3904", + "subposition_name_en": "Articles of plastics and articles of other materials of heading 3901 to 3914, n.e.s", + "subposition_name_es": "Manufacturas de plástico y manufacturas de las demás materias de las partidas 3901 a 3914, n.c.o.p.", + "section_code": "VII", + "section_name_pt": "Plásticos e suas obras; Borracha e suas obras", + "section_name_en": "Plastics and articles thereof", + "section_name_es": "Materias plásticas y manufacturas de estas materias; Caucho y manufacturas de caucho" + } + }, + { + "model": "assets.SH", + "pk": 450490, + "fields": { + "chapter_code": "45", + "chapter_name_pt": "Cortiça e suas obras", + "chapter_name_en": "Cork and articles of cork", + "chapter_name_es": "Corcho y sus manufacturas", + "position_code": "4054", + "position_name_pt": "Cortiça aglomerada (com ou sem aglutinantes) e suas obras", + "position_name_en": "Agglomerated cork (with or without a binding substance) and articles of agglomerated cork", + "position_name_es": "Corcho aglomerado, incluso con aglutinante, y manufacturas de corcho aglomerado", + "subposition_code": "450490", + "subposition_name_pt": "Outras obras de cortiça aglomerada", + "subposition_name_en": "Agglomerated cork, with or without a binding substance, and articles of agglomerated cork (excl. footware and parts thereof; insoles, whether or not removable; headgear and parts thereof", + "subposition_name_es": "Corcho aglomerado, incl. con aglutinante, y manufacturas de corcho aglomerado (exc. calzado y sus partes, principalmente las plantillas no fijas; artículos de sombrerería y sus partes", + "section_code": "IX", + "section_name_pt": "Madeira, carvão vegetal e obras de madeira; Cortiça e suas obras; Obras de espartaria ou de cestaria", + "section_name_en": "Madera, carbón vegetal y manufacturas de madera; Corcho y manufacturas de corcho; Manufacturas de espartería o de cestería", + "section_name_es": "Wood and articles of wood; Wood charcoal; Cork and articles of cork; Manufactures of straw, of esparto or of other plaiting materials; Basketware and wickerwork" + } + }, + { + "model": "assets.SH", + "pk": 731816, + "fields": { + "chapter_code": "73", + "chapter_name_pt": "Obras de ferro fundido, ferro ou aço", + "chapter_name_en": "Articles of iron or steel", + "chapter_name_es": "Manufacturas de fundición, de hierro o acero", + "position_code": "7318", + "position_name_pt": "Parafusos, pernos ou pinos, roscados, porcas, tira-fundos, ganchos roscados, rebites, chavetas, cavilhas, contrapinos ou troços, anilhas ou arruelas (incluídas as de pressão) e artefactos semelhantes", + "position_name_en": "Screws, bolts, nuts, coach screws, screw hooks, rivets, cotters, cotter-pins, washers (including spring washers) and similar articles, of iron or steel", + "position_name_es": "Tornillos, pernos, tuercas, tirafondos, escarpias roscadas, remaches, pasadores, clavijas, chavetas, arandelas, incluidas las arandelas de muelle (resorte) y artículos similares, de fundición, hierro o acero", + "subposition_code": "731816", + "subposition_name_pt": "Porcas de ferro fundido, ferro ou aço", + "subposition_name_en": "Nuts of iron or steel", + "subposition_name_es": "Tuercas, de fundición, hierro o acero", + "section_code": "XV", + "section_name_pt": "Metais comuns e suas obras", + "section_name_en": "Metales comunes y manufacturas de estos metales", + "section_name_es": "Base metals and articles of base metal" + } + }, + { + "model": "assets.SH", + "pk": 841391, + "fields": { + "chapter_code": "84", + "chapter_name_pt": "Reatores nucleares, caldeiras, máquinas, aparelhos e instrumentos mecânicos, e suas partes", + "chapter_name_en": "Nuclear reactors, boilers, machinery and mechanical appliances; others", + "chapter_name_es": "Reactores nucleares, calderas, máquinas, otros.", + "position_code": "8412", + "position_name_pt": "Bombas para líquidos, mesmo com dispositivo medidor; elevadores de líquidos", + "position_name_en": "Pumps for liquids, whether or not fitted with a measuring device; liquid elevators", + "position_name_es": "Bombas para líquidos, incluso con dispositivo medidor incorporado; elevadores de líquidos", + "subposition_code": "841391", + "subposition_name_pt": "Bombas de vácuo", + "subposition_name_en": "Vacuum pumps", + "subposition_name_es": "Bombas de vacío", + "section_code": "XVI", + "section_name_pt": "Máquinas e aparelhos, material elétrico e suas partes; Aparelhos de gravação ou reprodução de som, aparelhos de gravação ou reprodução de imagens e de som em televisão, e suas partes e acessórios", + "section_name_en": "Machinery and mechanical appliances", + "section_name_es": "Máquinas y aparatos, material eléctrico e sus partes; Aparatos de grabación o reproducción de sonido, aparatos de grabación o reproducción de imágenes y sonido en televisión, y las partes y accesorios de estos aparatos" + } + } +] diff --git a/src/comex_stat/assets/fixtures/tradeblocs.json b/src/comex_stat/assets/fixtures/tradeblocs.json new file mode 100644 index 0000000..2e2934e --- /dev/null +++ b/src/comex_stat/assets/fixtures/tradeblocs.json @@ -0,0 +1,112 @@ +[ + { + "model": "assets.TradeBlocs", + "pk": 51, + "fields": { + "name_portuguese": "África", + "name_english": "Africa (minus MIDDLE EAST)", + "name_spanish": "África (menos ORIENTE MEDIO)", + "code": "51" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 105, + "fields": { + "name_portuguese": "América Central e Caribe", + "name_english": "Central America and Caribbean", + "name_spanish": "América Central y Caribe", + "code": "105" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 107, + "fields": { + "name_portuguese": "América do Norte", + "name_english": "North America", + "name_spanish": "América del norte", + "code": "107" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 48, + "fields": { + "name_portuguese": "América do Sul", + "name_english": "South America", + "name_spanish": "América del Sur", + "code": "48" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 39, + "fields": { + "name_portuguese": "Ásia (Exclusive Oriente Médio)", + "name_english": "Asia (minus MIDDLE EAST)", + "name_spanish": "Asia (menos Oriente Medio)", + "code": "39" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 53, + "fields": { + "name_portuguese": "Associcação de Nações do Sudeste Asiático - ASEAN", + "name_english": "Association Of Southeast Asian Nations (ASEAN)", + "name_spanish": "Asociación de Países del Sudeste Asiático (ASEAN)", + "code": "53" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 112, + "fields": { + "name_portuguese": "Europa", + "name_english": "Europe", + "name_spanish": "Europa", + "code": "112" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 111, + "fields": { + "name_portuguese": "Mercado Comum do Sul - Mercosul", + "name_english": "Southern Common Market (MERCOSUL)", + "name_spanish": "Mercado Comum del Sur (MERCOSUR)", + "code": "111" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 61, + "fields": { + "name_portuguese": "Oceania", + "name_english": "Oceania", + "name_spanish": "Oceania", + "code": "61" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 41, + "fields": { + "name_portuguese": "Oriente Médio", + "name_english": "Middle East", + "name_spanish": "Oriente Medio", + "code": "41" + } + }, + { + "model": "assets.TradeBlocs", + "pk": 22, + "fields": { + "name_portuguese": "União Europeia - UE", + "name_english": "European Union (EU)", + "name_spanish": "Uniao Europea (UE)", + "code": "22" + } + } +] diff --git a/src/comex_stat/assets/fixtures/transportation.json b/src/comex_stat/assets/fixtures/transportation.json new file mode 100644 index 0000000..99c37bb --- /dev/null +++ b/src/comex_stat/assets/fixtures/transportation.json @@ -0,0 +1,98 @@ +[ + { + "model": "assets.Transportation", + "pk": 0, + "fields": { + "name": "VIA NAO DECLARADA", + "code": "00" + } + }, + { + "model": "assets.Transportation", + "pk": 1, + "fields": { + "name": "MARITIMA", + "code": "01" + } + }, + { + "model": "assets.Transportation", + "pk": 2, + "fields": { + "name": "FLUVIAL", + "code": "02" + } + }, + { + "model": "assets.Transportation", + "pk": 3, + "fields": { + "name": "LACUSTRE", + "code": "03" + } + }, + { + "model": "assets.Transportation", + "pk": 4, + "fields": { + "name": "AEREA", + "code": "04" + } + }, + { + "model": "assets.Transportation", + "pk": 5, + "fields": { + "name": "POSTAL", + "code": "05" + } + }, + { + "model": "assets.Transportation", + "pk": 6, + "fields": { + "name": "FERROVIARIA", + "code": "06" + } + }, + { + "model": "assets.Transportation", + "pk": 7, + "fields": { + "name": "RODOVIARIA", + "code": "07" + } + }, + { + "model": "assets.Transportation", + "pk": 8, + "fields": { + "name": "CONDUTO/REDE DE TRANSMISSAO", + "code": "08" + } + }, + { + "model": "assets.Transportation", + "pk": 9, + "fields": { + "name": "MEIOS PROPRIOS", + "code": "09" + } + }, + { + "model": "assets.Transportation", + "pk": 99, + "fields": { + "name": "VIA DESCONHECIDA", + "code": "99" + } + }, + { + "model": "assets.Transportation", + "pk": 10, + "fields": { + "name": "ENTRADA/SAIDA FICTA", + "code": "10" + } + } +] diff --git a/src/comex_stat/assets/fixtures/urf.json b/src/comex_stat/assets/fixtures/urf.json new file mode 100644 index 0000000..737855f --- /dev/null +++ b/src/comex_stat/assets/fixtures/urf.json @@ -0,0 +1,58 @@ +[ + { + "model": "assets.Urf", + "pk": 817800, + "fields": { + "name": "0817800 - PORTO DE SANTOS", + "code": "817800" + } + }, + { + "model": "assets.Urf", + "pk": 0, + "fields": { + "name": "0000000 - NAO INFORMADO", + "code": "0" + } + }, + { + "model": "assets.Urf", + "pk": 417902, + "fields": { + "name": "0417902 - IRF - PORTO DE SUAPE", + "code": "417902" + } + }, + { + "model": "assets.Urf", + "pk": 817600, + "fields": { + "name": "0817600 - AEROPORTO INTERNACIONAL DE SAO PAULO/GUARULHOS", + "code": "817600" + } + }, + { + "model": "assets.Urf", + "pk": 147600, + "fields": { + "name": "0147600 - ALF - CORUMBÁ", + "code": "147600" + } + }, + { + "model": "assets.Urf", + "pk": 817700, + "fields": { + "name": "0817700 - AEROPORTO INTERNACIONAL DE VIRACOPOS", + "code": "817700" + } + }, + { + "model": "assets.Urf", + "pk": 917500, + "fields": { + "name": "0917500 - ALF - FOZ DO IGUAÇU", + "code": "917500" + } + } +] diff --git a/src/comex_stat/assets/migrations/__init__.py b/src/comex_stat/assets/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/comex_stat/assets/models.py b/src/comex_stat/assets/models.py new file mode 100644 index 0000000..19d9361 --- /dev/null +++ b/src/comex_stat/assets/models.py @@ -0,0 +1,182 @@ +from django.db import models +from django.core.validators import RegexValidator +from datetime import datetime +validate_only_numbers = RegexValidator(regex="^[0-9]+$", + message="Somente números são permitidos" + ) + + +class SH(models.Model): + ''' + SH stands for Sistema Harmónico + ''' + + chapter_code = models.CharField(max_length=2, blank=True, + validators=[validate_only_numbers]) + chapter_name_pt = models.CharField(max_length=250, blank=True) + chapter_name_en = models.CharField(max_length=250) + chapter_name_es = models.CharField(max_length=250) + position_code = models.CharField(max_length=4, blank=False, + validators=[validate_only_numbers]) + position_name_pt = models.CharField(max_length=250) + position_name_en = models.CharField(max_length=250) + position_name_es = models.CharField(max_length=250) + subposition_code = models.CharField(max_length=6, blank=False, + validators=[validate_only_numbers]) + subposition_name_pt = models.CharField(max_length=250) + subposition_name_en = models.CharField(max_length=250) + subposition_name_es = models.CharField(max_length=250) + section_code = models.CharField(max_length=2, blank=False, + verbose_name="Section code from NCM") + section_name_pt = models.CharField(max_length=250) + section_name_en = models.CharField(max_length=250) + section_name_es = models.CharField(max_length=250) + + +class CGCE(models.Model): + ''' + CGCE stands for Classificação por Grandes Categorias Econômicas + ''' + level1_code = models.CharField(max_length=1, blank=False, + validators=[validate_only_numbers]) + level1_name_pt = models.CharField(max_length=250, blank=False) + level1_name_en = models.CharField(max_length=250, blank=False) + level1_name_es = models.CharField(max_length=250, blank=False) + level2_code = models.CharField(max_length=2, blank=False, + validators=[validate_only_numbers]) + level2_name_pt = models.CharField(max_length=250, blank=False) + level2_name_en = models.CharField(max_length=250, blank=False) + level2_name_es = models.CharField(max_length=250, blank=False) + level3_code = models.CharField(max_length=3, blank=False, + validators=[validate_only_numbers]) + level3_name_pt = models.CharField(max_length=250, blank=False) + level3_name_en = models.CharField(max_length=250, blank=False) + level3_name_es = models.CharField(max_length=250, blank=False) + + +class CUCI(models.Model): + ''' + CUCI stands for Classificação Uniforme do Comércio Internacional + ''' + item_code = models.CharField(max_length=5, blank=False, + validators=[validate_only_numbers]) + item_name_pt = models.CharField(max_length=250, blank=False) + item_name_en = models.CharField(max_length=250, blank=False) + item_name_es = models.CharField(max_length=250, blank=False) + subitem_code = models.CharField(max_length=4, blank=False, + validators=[validate_only_numbers]) + subitem_name_pt = models.CharField(max_length=250, blank=False) + subitem_name_en = models.CharField(max_length=250, blank=False) + subitem_name_es = models.CharField(max_length=250, blank=False) + position_code = models.CharField(max_length=3, blank=False, + validators=[validate_only_numbers]) + position_name_pt = models.CharField(max_length=250, blank=False) + position_name_en = models.CharField(max_length=250, blank=False) + position_name_es = models.CharField(max_length=250, blank=False) + chapter_code = models.CharField(max_length=2, blank=False, + validators=[validate_only_numbers]) + chapter_name_pt = models.CharField(max_length=250, blank=False) + chapter_name_en = models.CharField(max_length=250, blank=False) + chapter_name_es = models.CharField(max_length=250, blank=False) + section_code = models.CharField(max_length=1, blank=False, + verbose_name="Section code from NCM") + section_name_pt = models.CharField(max_length=250, blank=False) + section_name_en = models.CharField(max_length=250, blank=False) + section_name_es = models.CharField(max_length=250, blank=False) + + +class NCM(models.Model): + ''' + NCM stands for Nomenclatura Comum do Mercosul + ''' + ncm_code = models.CharField(max_length=8, blank=False, + validators=[validate_only_numbers]) + ncm_name_pt = models.CharField(max_length=250, blank=False) + ncm_name_en = models.CharField(max_length=250, blank=False) + ncm_name_es = models.CharField(max_length=250, blank=False) + statistic_unit_code = models.CharField(max_length=2, blank=False, + validators=[validate_only_numbers]) + ppe_code = models.CharField(max_length=4, blank=False, + verbose_name="Pauta de Produtos Exportados", + validators=[validate_only_numbers]) + ppi_code = models.CharField(max_length=4, blank=False, + verbose_name="Pauta de Produtos Importados", + validators=[validate_only_numbers]) + aggregate_factor_code = models.CharField(max_length=1, blank=False, + validators=[validate_only_numbers] + ) + cuci = models.ForeignKey(CUCI, on_delete=models.CASCADE, + verbose_name='''Classificação Uniforme do + Comércio Internacional''') + cgce = models.ForeignKey(CGCE, on_delete=models.CASCADE, + verbose_name='''Classificação por Grandes + Categorias Econômicas''') + sh = models.ForeignKey(SH, on_delete=models.CASCADE, + verbose_name="Sistema Harmónico") + isic4_code = models.CharField(max_length=2, blank=False, + verbose_name='''International Standard Industrial + Classification (Revision 4)''', + validators=[validate_only_numbers]) + exportation_subset = models.CharField(max_length=4, blank=False) + siit_code = models.CharField(max_length=4, blank=False, + verbose_name='''Setores Industriais por + Intensidade Tecnológica code''', + validators=[validate_only_numbers]) + + +class TradeBlocs(models.Model): + name_portuguese = models.CharField(max_length=100) + name_english = models.CharField(max_length=100) + name_spanish = models.CharField(max_length=100) + code = models.CharField(max_length=10) + + +class Country(models.Model): + name_portuguese = models.CharField(max_length=100) + name_english = models.CharField(max_length=100) + name_spanish = models.CharField(max_length=100) + code_iso3 = models.CharField(max_length=3) + trade_bloc = models.ForeignKey(TradeBlocs, on_delete=models.CASCADE) + + +class FederativeUnit(models.Model): + name = models.CharField(max_length=100) + code = models.CharField(max_length=100) + initials = models.CharField(max_length=6) + + +class Transportation(models.Model): + name = models.CharField(max_length=100) + code = models.CharField(max_length=100) + + +class Urf(models.Model): + name = models.CharField(max_length=100) + code = models.CharField(max_length=100) + + +class AssetFacts(models.Model): + date = models.DateField(default=datetime.now) + name = models.CharField(max_length=100) + ncm = models.ForeignKey(NCM, on_delete=models.CASCADE) + urf = models.ForeignKey(Urf, on_delete=models.CASCADE, null=True) + transportation = models.ForeignKey( + Transportation, on_delete=models.CASCADE) + registries = models.BigIntegerField() + net_kilogram = models.FloatField() + fob_value = models.FloatField() + + class Meta: + abstract = True + + +class AssetImportFacts(AssetFacts): + destination_fed_unit = models.ForeignKey( + FederativeUnit, on_delete=models.CASCADE) + origin_country = models.ForeignKey(Country, on_delete=models.CASCADE) + + +class AssetExportFacts(AssetFacts): + origin_fed_unit = models.ForeignKey( + FederativeUnit, on_delete=models.CASCADE) + destination_country = models.ForeignKey(Country, on_delete=models.CASCADE) diff --git a/src/comex_stat/assets/schema.py b/src/comex_stat/assets/schema.py new file mode 100644 index 0000000..e009098 --- /dev/null +++ b/src/comex_stat/assets/schema.py @@ -0,0 +1,230 @@ +import graphene + +from graphene_django.types import DjangoObjectType +from graphene_django.filter.fields import DjangoFilterConnectionField + +from comex_stat.assets.models import (AssetImportFacts, AssetExportFacts, + NCM, TradeBlocs, Country, FederativeUnit, + Transportation, Urf, CUCI, CGCE, SH) + + +class AssetImportFactsType(DjangoObjectType): + class Meta: + model = AssetImportFacts + filter_fields = { + 'date': ['icontains'], + 'name': ['icontains'], + 'registries': ['icontains'], + 'net_kilogram': ['icontains'], + 'fob_value': ['icontains'] + } + interfaces = {graphene.Node, } + + +class AssetExportFactsType(DjangoObjectType): + class Meta: + model = AssetExportFacts + filter_fields = { + 'date': ['icontains'], + 'name': ['icontains'], + 'registries': ['icontains'], + 'net_kilogram': ['icontains'], + 'fob_value': ['icontains'] + } + interfaces = {graphene.Node, } + + +class NCMType(DjangoObjectType): + class Meta: + model = NCM + filter_fields = { + 'ncm_code': ['icontains'], + 'ncm_name_pt': ['icontains'], + 'ncm_name_en': ['icontains'], + 'ncm_name_es': ['icontains'], + 'statistic_unit_code': ['icontains'], + 'ppe_code': ['icontains'], + 'ppi_code': ['icontains'], + 'aggregate_factor_code': ['icontains'], + 'cuci': [], + 'cgce': [], + 'sh': [], + 'isic4_code': ['icontains'], + 'exportation_subset': ['icontains'], + 'siit_code': ['icontains'] + } + interfaces = {graphene.Node, } + + +class CUCIType(DjangoObjectType): + class Meta: + model = CUCI + filter_fields = { + 'item_code': ['icontains'], + 'item_name_pt': ['icontains'], + 'item_name_en': ['icontains'], + 'item_name_es': ['icontains'], + 'subitem_code': ['icontains'], + 'subitem_name_pt': ['icontains'], + 'subitem_name_en': ['icontains'], + 'subitem_name_es': ['icontains'], + 'position_code': ['icontains'], + 'position_name_pt': ['icontains'], + 'position_name_en': ['icontains'], + 'position_name_es': ['icontains'], + 'chapter_code': ['icontains'], + 'chapter_name_pt': ['icontains'], + 'chapter_name_en': ['icontains'], + 'chapter_name_es': ['icontains'], + 'section_code': ['icontains'], + 'section_name_pt': ['icontains'], + 'section_name_en': ['icontains'], + 'section_name_es': ['icontains'] + } + interfaces = {graphene.Node, } + + +class CGCEType(DjangoObjectType): + class Meta: + model = CGCE + filter_fields = { + 'level1_code': ['icontains'], + 'level1_name_pt': ['icontains'], + 'level1_name_en': ['icontains'], + 'level1_name_es': ['icontains'], + 'level2_code': ['icontains'], + 'level2_name_pt': ['icontains'], + 'level2_name_en': ['icontains'], + 'level2_name_es': ['icontains'], + 'level3_code': ['icontains'], + 'level3_name_pt': ['icontains'], + 'level3_name_en': ['icontains'], + 'level3_name_es': ['icontains'] + } + interfaces = {graphene.Node, } + + +class SHType(DjangoObjectType): + class Meta: + model = SH + filter_fields = { + 'chapter_code': ['icontains'], + 'chapter_name_pt': ['icontains'], + 'chapter_name_en': ['icontains'], + 'chapter_name_es': ['icontains'], + 'position_code': ['icontains'], + 'position_name_pt': ['icontains'], + 'position_name_en': ['icontains'], + 'position_name_es': ['icontains'], + 'subposition_code': ['icontains'], + 'subposition_name_pt': ['icontains'], + 'subposition_name_en': ['icontains'], + 'subposition_name_es': ['icontains'], + 'section_code': ['icontains'], + 'section_name_pt': ['icontains'], + 'section_name_en': ['icontains'], + 'section_name_es': ['icontains'] + } + interfaces = {graphene.Node, } + + +class TradeBlocsType(DjangoObjectType): + class Meta: + model = TradeBlocs + filter_fields = { + 'name_portuguese': ['icontains'], + 'name_english': ['icontains'], + 'name_spanish': ['icontains'], + 'code': ['icontains'] + } + interfaces = {graphene.Node, } + + +class CountryType(DjangoObjectType): + class Meta: + model = Country + filter_fields = { + 'name_portuguese': ['icontains'], + 'name_english': ['icontains'], + 'name_spanish': ['icontains'], + 'code_iso3': ['icontains'] + } + interfaces = {graphene.Node, } + + +class FederativeUnitType(DjangoObjectType): + class Meta: + model = FederativeUnit + filter_fields = { + 'code': ['icontains'], + 'name': ['icontains'], + 'initials': ['icontains'] + } + interfaces = {graphene.Node, } + + +class TransportationType(DjangoObjectType): + class Meta: + model = Transportation + filter_fields = { + 'name': ['icontains'], + 'code': ['icontains'] + } + interfaces = {graphene.Node, } + + +class UrfType(DjangoObjectType): + class Meta: + model = Urf + filter_fields = { + 'code': ['icontains'], + 'name': ['icontains'], + } + interfaces = {graphene.Node, } + + +class Query(graphene.ObjectType): + all_import = DjangoFilterConnectionField(AssetImportFactsType) + all_export = DjangoFilterConnectionField(AssetExportFactsType) + all_tradeBlocs = DjangoFilterConnectionField(TradeBlocsType) + all_country = DjangoFilterConnectionField(CountryType) + all_federativeUnit = DjangoFilterConnectionField(FederativeUnitType) + all_transportation = DjangoFilterConnectionField(TransportationType) + all_urf = DjangoFilterConnectionField(UrfType) + all_ncm = DjangoFilterConnectionField(NCMType) + all_cuci = DjangoFilterConnectionField(CUCIType) + all_cgce = DjangoFilterConnectionField(CGCEType) + all_sh = DjangoFilterConnectionField(SHType) + + def resolve_all_import(self, info, **kwargs): + return AssetImportFacts.objects.all() + + def resolve_all_export(self, info, **kwargs): + return AssetExportFacts.objects.all() + + def resolve_all_ncm(self, info, **kwargs): + return NCM.objects.all() + + def resolve_all_tradeBlocs(self, info, **kwargs): + return TradeBlocs.objects.all() + + def resolve_all_country(self, info, **kwargs): + return Country.objects.all() + + def resolve_all_federativeUnit(self, info, **kwargs): + return FederativeUnit.objects.all() + + def resolve_all_transportation(self, info, **kwargs): + return Transportation.objects.all() + + def resolve_all_urf(self, info, **kwargs): + return Urf.objects.all() + + def resolve_all_cuci(self, info, **kwargs): + return CUCI.objects.all() + + def resolve_all_cgce(self, info, **kwargs): + return CGCE.objects.all() + + def resolve_all_sh(self, info, **kwargs): + return SH.objects.all() diff --git a/src/comex_stat/assets/tests.py b/src/comex_stat/assets/tests.py new file mode 100644 index 0000000..4f5abe9 --- /dev/null +++ b/src/comex_stat/assets/tests.py @@ -0,0 +1,1600 @@ +import graphene +from django.test import TestCase +from django.db import IntegrityError +from comex_stat.assets.schema import Query +from comex_stat.assets.models import (AssetImportFacts, AssetExportFacts, + TradeBlocs, Country, FederativeUnit, + Transportation, Urf, NCM, CUCI, CGCE, SH) +from django.core.exceptions import ValidationError + + +class SHTests(TestCase): + def create_sh(self, chapter_code, position_code, subposition_code): + return SH.objects.create(chapter_code=chapter_code, + position_code=position_code, + subposition_code=subposition_code) + + def test_code_fields_do_not_accept_letters(self): + """ + Test if a validation error occurs when a field that store a code + tries to be saved with a letter or special char + """ + sh = self.create_sh(chapter_code="#", position_code="4%3", + subposition_code="1-+=3") + with self.assertRaises(ValidationError) as cm: + sh.full_clean() + + self.assertTrue('chapter_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['chapter_code']) + self.assertTrue('position_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['position_code']) + self.assertTrue('subposition_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['subposition_code']) + + +class CGCETests(TestCase): + def create_cgce(self, level1_code, level2_code, level3_code): + return CGCE.objects.create(level1_code=level1_code, + level2_code=level2_code, + level3_code=level3_code) + + def test_code_fields_do_not_accept_letters(self): + """ + Test if a validation error occurs when a field that store a code + tries to be saved with a letter or special char + """ + cgce = self.create_cgce(level1_code="2k", + level2_code="d45", + level3_code="skdfj") + with self.assertRaises(ValidationError) as cm: + cgce.full_clean() + + self.assertTrue('level1_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['level1_code']) + self.assertTrue('level2_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['level2_code']) + self.assertTrue('level3_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['level3_code']) + + +class CUCITests(TestCase): + def create_cuci(self, item_code, subitem_code, + position_code, chapter_code): + return CUCI.objects.create(item_code=item_code, + subitem_code=subitem_code, + position_code=position_code, + chapter_code=chapter_code) + + def test_code_fields_do_not_accept_letters(self): + """ + Test if a validation error occurs when a field that store a code + tries to be saved with a letter or special char + """ + cuci = self.create_cuci(item_code="2%", + subitem_code="&*45", + position_code="skdfj", + chapter_code="test") + with self.assertRaises(ValidationError) as cm: + cuci.full_clean() + + self.assertTrue('item_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['item_code']) + self.assertTrue('subitem_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['subitem_code']) + self.assertTrue('position_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['position_code']) + self.assertTrue('chapter_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['chapter_code']) + + +class NCMTests(TestCase): + + def setUp(self): + self.sh = SH.objects.create( + chapter_code="32", + chapter_name_pt="test", + chapter_name_en="test", + chapter_name_es="test", + position_code="3215", + position_name_pt="test", + position_name_en="test", + position_name_es="test", + subposition_code="321574", + subposition_name_pt="test", + subposition_name_en="test", + subposition_name_es="test", + section_code="IV", + section_name_pt="test", + section_name_en="test", + section_name_es="test" + ) + + self.cgce = CGCE.objects.create( + level1_code="2", + level1_name_pt="test", + level1_name_en="test", + level1_name_es="test", + level2_code="23", + level2_name_pt="test", + level2_name_en="test", + level2_name_es="test", + level3_code="235", + level3_name_pt="test", + level3_name_en="test", + level3_name_es="test" + ) + + self.cuci = CUCI.objects.create( + item_code="12345", + item_name_pt="test", + item_name_en="test", + item_name_es="test", + subitem_code="1234", + subitem_name_pt="test", + subitem_name_en="test", + subitem_name_es="test", + position_code="123", + position_name_pt="test", + position_name_en="test", + position_name_es="test", + chapter_code="12", + chapter_name_pt="test", + chapter_name_en="test", + chapter_name_es="test", + section_code="XX", + section_name_pt="test", + section_name_en="test", + section_name_es="test" + ) + + def create_ncm(self, ncm_code, ppe_code, + ppi_code, statistic_unit_code, + aggregate_factor_code, + isic4_code, siit_code): + return NCM.objects.create(ncm_code=ncm_code, ppe_code=ppe_code, + ppi_code=ppi_code, + statistic_unit_code=statistic_unit_code, + aggregate_factor_code=aggregate_factor_code, + isic4_code=isic4_code, siit_code=siit_code, + sh=self.sh, cgce=self.cgce, cuci=self.cuci, + ncm_name_pt="test", ncm_name_en="test", + ncm_name_es="test", exportation_subset="2") + + def test_code_fields_do_not_accept_letters(self): + """ + Test if a validation error occurs when a field that store a code + tries to be saved with a letter or special char + """ + ncm = self.create_ncm(ncm_code="%321", ppe_code="kd9", + ppi_code="2#8", + statistic_unit_code="#@!9", + aggregate_factor_code="test", + isic4_code="$'od", siit_code="sadc") + with self.assertRaises(ValidationError) as cm: + ncm.full_clean() + + self.assertTrue('ncm_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['ncm_code']) + self.assertTrue('ppe_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['ppe_code']) + self.assertTrue('ppi_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['ppi_code']) + self.assertTrue('statistic_unit_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['statistic_unit_code']) + self.assertTrue('aggregate_factor_code' in cm.exception.message_dict + and "Somente números são permitidos" in + cm.exception.message_dict['aggregate_factor_code']) + self.assertTrue('isic4_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['isic4_code']) + self.assertTrue('siit_code' in cm.exception.message_dict and + "Somente números são permitidos" in + cm.exception.message_dict['siit_code']) + + def test_cascade_delete_sh(self): + self.create_ncm(ncm_code="123", ppe_code="32", + ppi_code="28", + statistic_unit_code="11", + aggregate_factor_code="2", + isic4_code="21", siit_code="4") + self.sh.delete() + + with self.assertRaises(NCM.DoesNotExist): + NCM.objects.get() + + def test_cascade_delete_cgce(self): + self.create_ncm(ncm_code="123", ppe_code="32", + ppi_code="28", + statistic_unit_code="11", + aggregate_factor_code="2", + isic4_code="21", siit_code="4") + self.cgce.delete() + + with self.assertRaises(NCM.DoesNotExist): + NCM.objects.get() + + def test_cascade_delete_cuci(self): + self.create_ncm(ncm_code="123", ppe_code="32", + ppi_code="28", + statistic_unit_code="11", + aggregate_factor_code="2", + isic4_code="21", siit_code="4") + self.cuci.delete() + + with self.assertRaises(NCM.DoesNotExist): + NCM.objects.get() + + +class AssetExportFactsTestModel(TestCase): + + def setUp(self): + """ + This method will run before each test + """ + + self.tradeBlocs = TradeBlocs.objects.create( + name_portuguese="portuguese", + name_english="english", + name_spanish="spanish", + code="190" + ) + + self.country = Country.objects.create( + name_portuguese="Nome", + name_english="Name", + name_spanish="Nombre", + code_iso3="190", + trade_bloc=self.tradeBlocs + ) + + self.federativeUnit = FederativeUnit.objects.create( + name="Name", + code="9090", + initials="SP" + ) + + self.urf = Urf.objects.create( + name="name", + code="code" + ) + + self.transportation = Transportation.objects.create( + name="Name", + code="code" + ) + + self.sh = SH.objects.create( + chapter_code="5555", + chapter_name_pt="abcd", + chapter_name_en="efdg", + chapter_name_es="ghij", + position_code="6666", + position_name_pt="klmn", + position_name_en="nopq", + position_name_es="rstu", + subposition_code="7777", + subposition_name_pt="vwyz", + subposition_name_en="asdf", + subposition_name_es="ghjk", + section_code="8888", + section_name_pt="ideia", + section_name_en="test", + section_name_es="teste" + ) + + self.cgce = CGCE.objects.create( + level1_code="2222", + level1_name_pt="texto", + level1_name_en="text", + level1_name_es="texto", + level2_code="3333", + level2_name_pt="algo", + level2_name_en="something", + level2_name_es="algo", + level3_code="4444", + level3_name_pt="teste", + level3_name_en="test", + level3_name_es="teste" + ) + + self.cuci = CUCI.objects.create( + item_code="1234", + item_name_pt="Nome", + item_name_en="Name", + item_name_es="Nombre", + subitem_code="5678", + subitem_name_pt="nome", + subitem_name_en="name", + subitem_name_es="nombre", + position_code="0000", + position_name_pt="posicao", + position_name_en="position", + position_name_es="posicion", + chapter_code="1111", + chapter_name_pt="capitulo", + chapter_name_en="chapter", + chapter_name_es="capitulo", + section_code="2222", + section_name_pt="secao", + section_name_en="section", + section_name_es="seccion" + ) + + self.ncm = NCM.objects.create( + ncm_code="84099190", + statistic_unit_code="10", + ppe_code="3193", + ppi_code="3172", + aggregate_factor_code="03", + isic4_code="29", + exportation_subset="1005", + ncm_name_pt="Outras partes para motores de explosao", + ncm_name_en="Other parts for internal combustion engines", + ncm_name_es="Otras partes para motores de explosion", + siit_code="2000", + cuci=self.cuci, + cgce=self.cgce, + sh=self.sh + ) + + self.AssetExportFacts = AssetExportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + origin_fed_unit=self.federativeUnit, + destination_country=self.country + ) + + def test_instaced(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.AssetExportFacts) + + def test_instaced_country(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.country) + + def test_instaced_trade_blocks(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.tradeBlocs) + + def test_instaced_federative_unit(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.federativeUnit) + + def test_instaced_transportation(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.transportation) + + def test_instaced_urf(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.urf) + + def test_facts_relations(self): + """ + This method will test if the export relations are beeing linked + as they should + """ + + self.assertIs(self.ncm, self.AssetExportFacts.ncm) + self.assertIs(self.urf, self.AssetExportFacts.urf) + self.assertIs(self.transportation, + self.AssetExportFacts.transportation) + self.assertIs(self.federativeUnit, self. + AssetExportFacts.origin_fed_unit) + self.assertIs(self.country, self. + AssetExportFacts.destination_country) + + def test_cascade_delete_ncm(self): + """ + This will test the deletion cascade + """ + self.ncm.delete() + + with self.assertRaises(AssetExportFacts.DoesNotExist): + AssetExportFacts.objects.get() + + def test_cascade_delete_urf(self): + """ + This will test the deletion cascade + """ + self.urf.delete() + + with self.assertRaises(AssetExportFacts.DoesNotExist): + AssetExportFacts.objects.get() + + def test_cascade_delete_transportation(self): + """ + This will test the deletion cascade + """ + self.transportation.delete() + + with self.assertRaises(AssetExportFacts.DoesNotExist): + AssetExportFacts.objects.get() + + def test_cascade_delete_federative_unit(self): + """ + This will test the deletion cascade + """ + self.federativeUnit.delete() + + with self.assertRaises(AssetExportFacts.DoesNotExist): + AssetExportFacts.objects.get() + + def test_cascade_delete_country(self): + """ + This will test the deletion cascade + """ + self.country.delete() + + with self.assertRaises(AssetExportFacts.DoesNotExist): + AssetExportFacts.objects.get() + + def test_missing_ncm(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetExportFacts = AssetExportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + origin_fed_unit=self.federativeUnit, + destination_country=self.country + ) + + def test_missing_transportation(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetExportFacts = AssetExportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + registries=1, + net_kilogram=1, + fob_value=191, + origin_fed_unit=self.federativeUnit, + destination_country=self.country + ) + + def test_missing_federative_unit(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetExportFacts = AssetExportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + destination_country=self.country + ) + + def test_missing_country(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetExportFacts = AssetExportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + origin_fed_unit=self.federativeUnit, + ) + + +class AssetImportFactsTestModel(TestCase): + + def setUp(self): + """ + This method will run before each test + """ + + self.tradeBlocs = TradeBlocs.objects.create( + name_portuguese="portuguese", + name_english="english", + name_spanish="spanish", + code="190" + ) + + self.country = Country.objects.create( + name_portuguese="Nome", + name_english="Name", + name_spanish="Nombre", + code_iso3="190", + trade_bloc=self.tradeBlocs + ) + + self.federativeUnit = FederativeUnit.objects.create( + name="Name", + code="9090", + initials="SP" + ) + + self.urf = Urf.objects.create( + name="name", + code="code" + ) + + self.transportation = Transportation.objects.create( + name="Name", + code="code" + ) + + self.sh = SH.objects.create( + chapter_code="5555", + chapter_name_pt="abcd", + chapter_name_en="efdg", + chapter_name_es="ghij", + position_code="6666", + position_name_pt="klmn", + position_name_en="nopq", + position_name_es="rstu", + subposition_code="7777", + subposition_name_pt="vwyz", + subposition_name_en="asdf", + subposition_name_es="ghjk", + section_code="8888", + section_name_pt="ideia", + section_name_en="test", + section_name_es="teste" + ) + + self.cgce = CGCE.objects.create( + level1_code="2222", + level1_name_pt="texto", + level1_name_en="text", + level1_name_es="texto", + level2_code="3333", + level2_name_pt="algo", + level2_name_en="something", + level2_name_es="algo", + level3_code="4444", + level3_name_pt="teste", + level3_name_en="test", + level3_name_es="teste" + ) + + self.cuci = CUCI.objects.create( + item_code="1234", + item_name_pt="Nome", + item_name_en="Name", + item_name_es="Nombre", + subitem_code="5678", + subitem_name_pt="nome", + subitem_name_en="name", + subitem_name_es="nombre", + position_code="0000", + position_name_pt="posicao", + position_name_en="position", + position_name_es="posicion", + chapter_code="1111", + chapter_name_pt="capitulo", + chapter_name_en="chapter", + chapter_name_es="capitulo", + section_code="2222", + section_name_pt="secao", + section_name_en="section", + section_name_es="seccion" + ) + + self.ncm = NCM.objects.create( + ncm_code="84099190", + statistic_unit_code="10", + ppe_code="3193", + ppi_code="3172", + aggregate_factor_code="03", + isic4_code="29", + exportation_subset="1005", + ncm_name_pt="Outras partes para motores de explosao", + ncm_name_en="Other parts for internal combustion engines", + ncm_name_es="Otras partes para motores de explosion", + siit_code="2000", + cuci=self.cuci, + cgce=self.cgce, + sh=self.sh + ) + + self.AssetImportFacts = AssetImportFacts.objects.create( + date="2018-09-22", + name="Texto", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + destination_fed_unit=self.federativeUnit, + origin_country=self.country + ) + + def test_instaced(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.AssetImportFacts) + + def test_instaced_country(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.country) + + def test_instaced_trade_blocks(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.tradeBlocs) + + def test_instaced_federative_unit(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.federativeUnit) + + def test_instaced_transportation(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.transportation) + + def test_instaced_urf(self): + """ + This will test if the object are being instaced + """ + self.assertIsNotNone(self.urf) + + def test_facts_relations(self): + """ + This method will test if the import relations are beeing linked + as they should + """ + + self.assertIs(self.ncm, self.AssetImportFacts.ncm) + self.assertIs(self.urf, self.AssetImportFacts.urf) + self.assertIs(self.transportation, + self.AssetImportFacts.transportation) + self.assertIs(self.federativeUnit, self. + AssetImportFacts.destination_fed_unit) + self.assertIs(self.country, self. + AssetImportFacts.origin_country) + + def test_cascade_delete_ncm(self): + """ + This will test the deletion cascade + """ + self.ncm.delete() + + with self.assertRaises(AssetImportFacts.DoesNotExist): + AssetImportFacts.objects.get() + + def test_cascade_delete_urf(self): + """ + This will test the deletion cascade + """ + self.urf.delete() + + with self.assertRaises(AssetImportFacts.DoesNotExist): + AssetImportFacts.objects.get() + + def test_cascade_delete_transportation(self): + """ + This will test the deletion cascade + """ + self.transportation.delete() + + with self.assertRaises(AssetImportFacts.DoesNotExist): + AssetImportFacts.objects.get() + + def test_cascade_delete_federative_unit(self): + """ + This will test the deletion cascade + """ + self.federativeUnit.delete() + + with self.assertRaises(AssetImportFacts.DoesNotExist): + AssetImportFacts.objects.get() + + def test_cascade_delete_country(self): + """ + This will test the deletion cascade + """ + self.country.delete() + + with self.assertRaises(AssetImportFacts.DoesNotExist): + AssetImportFacts.objects.get() + + def test_missing_ncm(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetImportFacts = AssetImportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + destination_fed_unit=self.federativeUnit, + origin_country=self.country + ) + + def test_missing_transportation(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetImportFacts = AssetImportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + registries=1, + net_kilogram=1, + fob_value=191, + destination_fed_unit=self.federativeUnit, + origin_country=self.country + ) + + def test_missing_federative_unit(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetImportFacts = AssetImportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + origin_country=self.country + ) + + def test_missing_country(self): + """ + This will test if it's possible to create the object without the + foreign key + """ + with self.assertRaises(IntegrityError): + self.AssetImportFacts = AssetImportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + destination_fed_unit=self.federativeUnit, + ) + + +class QueryTest(TestCase): + + def setUp(self): + """ + This method will run before each test + """ + + self.tradeBlocs = TradeBlocs.objects.create( + name_portuguese="portuguese", + name_english="english", + name_spanish="spanish", + code="190" + ) + + self.country = Country.objects.create( + name_portuguese="Nome", + name_english="Name", + name_spanish="Nombre", + code_iso3="190", + trade_bloc=self.tradeBlocs + ) + + self.federativeUnit = FederativeUnit.objects.create( + name="Name", + code="9090", + initials="SP" + ) + + self.urf = Urf.objects.create( + name="name", + code="code" + ) + + self.transportation = Transportation.objects.create( + name="Name", + code="code" + ) + + self.sh = SH.objects.create( + chapter_code="5555", + chapter_name_pt="abcd", + chapter_name_en="efdg", + chapter_name_es="ghij", + position_code="6666", + position_name_pt="klmn", + position_name_en="nopq", + position_name_es="rstu", + subposition_code="7777", + subposition_name_pt="vwyz", + subposition_name_en="asdf", + subposition_name_es="ghjk", + section_code="8888", + section_name_pt="ideia", + section_name_en="test", + section_name_es="teste" + ) + + self.cgce = CGCE.objects.create( + level1_code="2222", + level1_name_pt="texto", + level1_name_en="text", + level1_name_es="texto", + level2_code="3333", + level2_name_pt="algo", + level2_name_en="something", + level2_name_es="algo", + level3_code="4444", + level3_name_pt="teste", + level3_name_en="test", + level3_name_es="teste" + ) + + self.cuci = CUCI.objects.create( + item_code="1234", + item_name_pt="Nome", + item_name_en="Name", + item_name_es="Nombre", + subitem_code="5678", + subitem_name_pt="nome", + subitem_name_en="name", + subitem_name_es="nombre", + position_code="0000", + position_name_pt="posicao", + position_name_en="position", + position_name_es="posicion", + chapter_code="1111", + chapter_name_pt="capitulo", + chapter_name_en="chapter", + chapter_name_es="capitulo", + section_code="2222", + section_name_pt="secao", + section_name_en="section", + section_name_es="seccion" + ) + + self.ncm = NCM.objects.create( + ncm_code="84099190", + statistic_unit_code="10", + ppe_code="3193", + ppi_code="3172", + aggregate_factor_code="03", + isic4_code="29", + exportation_subset="1005", + ncm_name_pt="Outras partes para motores de explosao", + ncm_name_en="Other parts for internal combustion engines", + ncm_name_es="Otras partes para motores de explosion", + siit_code="2000", + cuci=self.cuci, + cgce=self.cgce, + sh=self.sh + ) + + self.AssetExportFacts = AssetExportFacts.objects.create( + date="2018-09-21", + name="Outras partes para motores de explosao", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + origin_fed_unit=self.federativeUnit, + destination_country=self.country + ) + + self.AssetImportFacts = AssetImportFacts.objects.create( + date="2018-09-22", + name="Texto", + ncm=self.ncm, + urf=self.urf, + transportation=self.transportation, + registries=1, + net_kilogram=1, + fob_value=191, + destination_fed_unit=self.federativeUnit, + origin_country=self.country + ) + + def test_query_asset_import(self): + ''' + This test verifies the database search result + ''' + + query = ''' + query { + allImport{ + edges { + node { + date + name + ncm { + ncmCode + statisticUnitCode + ppeCode + ppiCode + aggregateFactorCode + isic4Code + exportationSubset + ncmNamePt + ncmNameEn + ncmNameEs + siitCode + cuci { + itemCode + itemNamePt + itemNameEn + itemNameEs + subitemCode + subitemNamePt + subitemNameEn + subitemNameEs + positionCode + positionNamePt + positionNameEn + positionNameEs + chapterCode + chapterNamePt + chapterNameEn + chapterNameEs + sectionCode + sectionNamePt + sectionNameEn + sectionNameEs + } + cgce { + level1Code + level1NamePt + level1NameEn + level1NameEs + level2Code + level2NamePt + level2NameEn + level2NameEs + level3Code + level3NamePt + level3NameEn + level3NameEs + } + sh { + chapterCode + chapterNamePt + chapterNameEn + chapterNameEs + positionCode + positionNamePt + positionNameEn + positionNameEs + subpositionCode + subpositionNamePt + subpositionNameEn + subpositionNameEs + sectionCode + sectionNamePt + sectionNameEn + sectionNameEs + } + } + urf { + name + code + } + transportation { + name + code + } + registries + netKilogram + fobValue + destinationFedUnit { + name + code + initials + } + originCountry { + namePortuguese + nameEnglish + nameSpanish + codeIso3 + tradeBloc { + namePortuguese + nameEnglish + nameSpanish + code + } + } + } + } + } + } + ''' + + expected = {"allImport": { + "edges": [ + { + "node": { + "date": "2018-09-22", + "name": "Texto", + "ncm": { + "ncmCode": "84099190", + "statisticUnitCode": "10", + "ppeCode": "3193", + "ppiCode": "3172", + "aggregateFactorCode": "03", + "isic4Code": "29", + "exportationSubset": "1005", + "ncmNamePt": + "Outras partes para motores de explosao", + "ncmNameEn": + "Other parts for internal combustion engines", + "ncmNameEs": + "Otras partes para motores de explosion", + "siitCode": "2000", + "cuci": { + "itemCode": "1234", + "itemNamePt": "Nome", + "itemNameEn": "Name", + "itemNameEs": "Nombre", + "subitemCode": "5678", + "subitemNamePt": "nome", + "subitemNameEn": "name", + "subitemNameEs": "nombre", + "positionCode": "0000", + "positionNamePt": "posicao", + "positionNameEn": "position", + "positionNameEs": "posicion", + "chapterCode": "1111", + "chapterNamePt": "capitulo", + "chapterNameEn": "chapter", + "chapterNameEs": "capitulo", + "sectionCode": "2222", + "sectionNamePt": "secao", + "sectionNameEn": "section", + "sectionNameEs": "seccion" + }, + "cgce": { + "level1Code": "2222", + "level1NamePt": "texto", + "level1NameEn": "text", + "level1NameEs": "texto", + "level2Code": "3333", + "level2NamePt": "algo", + "level2NameEn": "something", + "level2NameEs": "algo", + "level3Code": "4444", + "level3NamePt": "teste", + "level3NameEn": "test", + "level3NameEs": "teste" + }, + "sh": { + "chapterCode": "5555", + "chapterNamePt": "abcd", + "chapterNameEn": "efdg", + "chapterNameEs": "ghij", + "positionCode": "6666", + "positionNamePt": "klmn", + "positionNameEn": "nopq", + "positionNameEs": "rstu", + "subpositionCode": "7777", + "subpositionNamePt": "vwyz", + "subpositionNameEn": "asdf", + "subpositionNameEs": "ghjk", + "sectionCode": "8888", + "sectionNamePt": "ideia", + "sectionNameEn": "test", + "sectionNameEs": "teste" + } + }, + "urf": { + "name": "name", + "code": "code" + }, + "transportation": { + "name": "Name", + "code": "code" + }, + "registries": 1, + "netKilogram": 1.0, + "fobValue": 191.0, + "destinationFedUnit": { + "name": "Name", + "code": "9090", + "initials": "SP" + }, + "originCountry": { + "namePortuguese": "Nome", + "nameEnglish": "Name", + "nameSpanish": "Nombre", + "codeIso3": "190", + "tradeBloc": { + "namePortuguese": "portuguese", + "nameEnglish": "english", + "nameSpanish": "spanish", + "code": "190" + } + } + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) + + def test_query_asset_export(self): + ''' + This test verifies the database search result + ''' + + query = ''' + query { + allExport { + edges { + node { + date + name + ncm { + ncmCode + statisticUnitCode + ppeCode + ppiCode + aggregateFactorCode + isic4Code + exportationSubset + ncmNamePt + ncmNameEn + ncmNameEs + siitCode + cuci { + itemCode + itemNamePt + itemNameEn + itemNameEs + subitemCode + subitemNamePt + subitemNameEn + subitemNameEs + positionCode + positionNamePt + positionNameEn + positionNameEs + chapterCode + chapterNamePt + chapterNameEn + chapterNameEs + sectionCode + sectionNamePt + sectionNameEn + sectionNameEs + } + cgce { + level1Code + level1NamePt + level1NameEn + level1NameEs + level2Code + level2NamePt + level2NameEn + level2NameEs + level3Code + level3NamePt + level3NameEn + level3NameEs + } + sh { + chapterCode + chapterNamePt + chapterNameEn + chapterNameEs + positionCode + positionNamePt + positionNameEn + positionNameEs + subpositionCode + subpositionNamePt + subpositionNameEn + subpositionNameEs + sectionCode + sectionNamePt + sectionNameEn + sectionNameEs + } + } + urf { + name + code + } + transportation { + name + code + } + registries + netKilogram + fobValue + originFedUnit { + name + code + initials + } + destinationCountry { + namePortuguese + nameEnglish + nameSpanish + codeIso3 + tradeBloc { + namePortuguese + nameEnglish + nameSpanish + code + } + } + } + } + } + } + ''' + + expected = {"allExport": { + "edges": [ + { + "node": { + "date": "2018-09-21", + "name": "Outras partes para motores de explosao", + "ncm": { + "ncmCode": "84099190", + "statisticUnitCode": "10", + "ppeCode": "3193", + "ppiCode": "3172", + "aggregateFactorCode": "03", + "isic4Code": "29", + "exportationSubset": "1005", + "ncmNamePt": + "Outras partes para motores de explosao", + "ncmNameEn": + "Other parts for internal combustion engines", + "ncmNameEs": + "Otras partes para motores de explosion", + "siitCode": "2000", + "cuci": { + "itemCode": "1234", + "itemNamePt": "Nome", + "itemNameEn": "Name", + "itemNameEs": "Nombre", + "subitemCode": "5678", + "subitemNamePt": "nome", + "subitemNameEn": "name", + "subitemNameEs": "nombre", + "positionCode": "0000", + "positionNamePt": "posicao", + "positionNameEn": "position", + "positionNameEs": "posicion", + "chapterCode": "1111", + "chapterNamePt": "capitulo", + "chapterNameEn": "chapter", + "chapterNameEs": "capitulo", + "sectionCode": "2222", + "sectionNamePt": "secao", + "sectionNameEn": "section", + "sectionNameEs": "seccion" + }, + "cgce": { + "level1Code": "2222", + "level1NamePt": "texto", + "level1NameEn": "text", + "level1NameEs": "texto", + "level2Code": "3333", + "level2NamePt": "algo", + "level2NameEn": "something", + "level2NameEs": "algo", + "level3Code": "4444", + "level3NamePt": "teste", + "level3NameEn": "test", + "level3NameEs": "teste" + }, + "sh": { + "chapterCode": "5555", + "chapterNamePt": "abcd", + "chapterNameEn": "efdg", + "chapterNameEs": "ghij", + "positionCode": "6666", + "positionNamePt": "klmn", + "positionNameEn": "nopq", + "positionNameEs": "rstu", + "subpositionCode": "7777", + "subpositionNamePt": "vwyz", + "subpositionNameEn": "asdf", + "subpositionNameEs": "ghjk", + "sectionCode": "8888", + "sectionNamePt": "ideia", + "sectionNameEn": "test", + "sectionNameEs": "teste" + } + }, + "urf": { + "name": "name", + "code": "code" + }, + "transportation": { + "name": "Name", + "code": "code" + }, + "registries": 1, + "netKilogram": 1.0, + "fobValue": 191.0, + "originFedUnit": { + "name": "Name", + "code": "9090", + "initials": "SP" + }, + "destinationCountry": { + "namePortuguese": "Nome", + "nameEnglish": "Name", + "nameSpanish": "Nombre", + "codeIso3": "190", + "tradeBloc": { + "namePortuguese": "portuguese", + "nameEnglish": "english", + "nameSpanish": "spanish", + "code": "190" + } + } + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) + + def test_query_trade_blocs(self): + ''' + This test verifies the database search result + ''' + + query = ''' + query{ + allTradeblocs{ + edges{ + node{ + nameEnglish + nameSpanish + namePortuguese + code + } + } + } + } + ''' + + expected = {"allTradeblocs": { + "edges": [ + { + "node": { + "nameEnglish": "english", + "nameSpanish": "spanish", + "namePortuguese": "portuguese", + "code": "190" + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) + + def test_query_country(self): + ''' + This test verifies the database search result + ''' + + query = ''' + { + allCountry{ + edges{ + node{ + nameEnglish + namePortuguese + nameSpanish + codeIso3 + } + } + } + } + ''' + + expected = {"allCountry": { + "edges": [ + { + "node": { + "nameEnglish": "Name", + "namePortuguese": "Nome", + "nameSpanish": "Nombre", + "codeIso3": "190" + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) + + def test_query_federative_unit(self): + ''' + This test verifies the database search result + ''' + + query = ''' + { + allFederativeunit{ + edges{ + node{ + name + code + initials + } + } + } + } + ''' + + expected = {"allFederativeunit": { + "edges": [ + { + "node": { + "name": "Name", + "code": "9090", + "initials": "SP" + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) + + def test_query_transportation(self): + ''' + This test verifies the database search result + ''' + + query = ''' + { + allTransportation{ + edges{ + node{ + name + code + } + } + } + } + ''' + + expected = {"allTransportation": { + "edges": [ + { + "node": { + "name": "Name", + "code": "code" + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) + + def test_query_urf(self): + ''' + This test verifies the database search result + ''' + + query = ''' + { + allUrf{ + edges{ + node{ + name + code + } + } + } + } + ''' + + expected = {"allUrf": { + "edges": [ + { + "node": { + "name": "name", + "code": "code" + } + } + ] + } + } + + schema = graphene.Schema(Query) + result = schema.execute(query) + self.assertEqual(expected, result.data) diff --git a/src/comex_stat/assets/views.py b/src/comex_stat/assets/views.py new file mode 100644 index 0000000..fd0e044 --- /dev/null +++ b/src/comex_stat/assets/views.py @@ -0,0 +1,3 @@ +# from django.shortcuts import render + +# Create your views here. diff --git a/src/comex_stat/schema.py b/src/comex_stat/schema.py new file mode 100644 index 0000000..b238e89 --- /dev/null +++ b/src/comex_stat/schema.py @@ -0,0 +1,12 @@ +import graphene + +import comex_stat.assets.schema + + +class Query(comex_stat.assets.schema.Query, graphene.ObjectType): + # This class will inherit from multiple Queries + # as we begin to add more apps to our project + pass + + +schema = graphene.Schema(query=Query) diff --git a/src/comex_stat/settings.py b/src/comex_stat/settings.py new file mode 100644 index 0000000..168e80a --- /dev/null +++ b/src/comex_stat/settings.py @@ -0,0 +1,132 @@ +""" +Django settings for comex_stat project. + +Generated by 'django-admin startproject' using Django 2.0.3. + +For more information on this file, see +https://docs.djangoproject.com/en/2.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.0/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'jn#m30o_p6ufakd62_hm-2cm#c4o!3)4vauea$db3i8uhlcdz9' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = False if (os.environ.get('DEBUG') == 'FALSE') else True + +ALLOWED_HOSTS = ['*'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'comex_stat.assets', + 'graphene_django', +] + +GRAPHENE = { + 'SCHEMA': 'comex_stat.schema.schema' +} + +FIXTURE_DIRS = ( + 'assets/fixtures/', +) + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'comex_stat.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'comex_stat.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.0/howto/static-files/ + +PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') diff --git a/src/comex_stat/static/.keep b/src/comex_stat/static/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/comex_stat/urls.py b/src/comex_stat/urls.py new file mode 100644 index 0000000..7b17cc3 --- /dev/null +++ b/src/comex_stat/urls.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from django.urls import path + +from graphene_django.views import GraphQLView +urlpatterns = [ + path('admin/', admin.site.urls), + path('graphql/', GraphQLView.as_view(graphiql=True)), +] diff --git a/src/comex_stat/wsgi.py b/src/comex_stat/wsgi.py new file mode 100644 index 0000000..d2d179b --- /dev/null +++ b/src/comex_stat/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for comex_stat project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "comex_stat.settings") + +application = get_wsgi_application() diff --git a/src/manage.py b/src/manage.py new file mode 100755 index 0000000..1ca9ed6 --- /dev/null +++ b/src/manage.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "comex_stat.settings") + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv)