Commit 1d106564 authored by legton's avatar legton

Merge branch 'development' into 135-rep-por-frequencia

parents f6276a96 323caa1b
# info de contas criadas no sistema
login_info
# base de dados
*.csv
......@@ -8,14 +10,17 @@ src/cache
*.json
base_dados/*
base_dados
*/~lock.*
!./src/submission/analysis/test/historico.xls
!./src/submission/analysis/test/matricula.xls
src/.coverage
# lixo
static/*
# lixo
src/static
**/migrations/**
*~
*.swp
......@@ -26,3 +31,94 @@ src/static
**/__pycache__
*.ipynb
# Created by https://www.gitignore.io
### OSX ###
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear on external disk
.Spotlight-V100
.Trashes
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Sphinx documentation
docs/_build/
# PyBuilder
target/
### Django ###
*.log
*.pot
*.pyc
__pycache__/
local_settings.py
.env
db.sqlite3
#image: ubuntu:16.04
variables:
POSTGRES_USER: "adega"
POSTGRES_PASSWORD: "adega"
POSTGRES_DB: "adega"
POSTGRES_HOST: "postgres"
POSTGRES_PORT: "5432"
VERSION: "DEVELOPMENT"
services:
- postgres:9.6
before_script:
- export LC_ALL=C.UTF-8
- export LANG=C.UTF-8
# - apt-get update -qq
# - apt-get install -y make
# - make install
# - make install-user
#- pip3 install -U pip setuptools pipenv==9.0.3
## pip3 --version
#- pipenv install
#- source $(pipenv --venv)/bin/activate
# - pipenv shell
# - python --version
# - pip3 show django | grep Version
django-tests:
tags:
- ubuntu
- regular
script:
- cd src
# - python manage.py makemigrations degree
# - python manage.py makemigrations educator
# - python manage.py makemigrations upload
# - python manage.py migrate
#- python manage.py test
# apt-get --quiet=2 não é efetivo, com >> /dev/null só mostra erros da saída
# stderr
- apt-get update --assume-yes >> /dev/null
- apt-get install --assume-yes python3-pip libpq-dev postgresql-client >> /dev/null
- pip3 install --quiet -r requirements.txt
- pip3 show django | grep Version
django-tests:
tags:
- ubuntu
- regular
script:
- cd src
- python3 manage.py makemigrations degree
- python3 manage.py makemigrations educator
- python3 manage.py makemigrations submission
- python3 manage.py makemigrations student
- python3 manage.py makemigrations admission
- python3 manage.py migrate
- python3 manage.py test
# ADEGA
Este software faz parte de um projeto do PET Computação UFPR para
Este software faz parte de um projeto do PET Computação UFPR para
análise de dados dos cursos de graduação da UFPR. Veja a [wiki](http://gitlab.c3sl.ufpr.br/adega/adega/wikis/home).
......@@ -60,7 +60,7 @@ Enquanto o `sudo make docker-up` estiver sendo executado, as alterações feitas
Assim como é possível realizar qualquer comando como seria feito no com o manage.py, também é possível por meio do comando `sudo make docker-manage`. Por exemplo:
```bash
$ sudo make docker-manage makemigrations uploads
$ sudo make docker-manage makemigrations submission
$ sudo make docker-manage migrate
$ sudo make docker-manage createsuperuser
```
......@@ -80,6 +80,37 @@ $ sudo make docker-remove-all
```
*Observação*: Esse comando **não** irá deletar qualquer arquivo do projeto / diretório local, apenas os containers.
## Versão de produção
Para fazer o deploy do adega na versão de produção primeiro verifique se settings.py está com a seguinte linha:
```python
DEBUG = False
```
Então execute:
```bash
$ sudo make docker-production
```
Este comando funciona da mesma forma que `make docker-up` e portando também funciona com os comandos `make docker-manage`.
O aplicativo vai rodar na porta 8000, para alterar mude a porta do container nginx no arquivo `docker-production.yml`.
### Observações do servidor
Se não for possível construir as imgens do docker no servidor será necessário copia-las manualmente por scp.
Para salvar uma imagem execute:
```bash
$ sudo docker save imagem -o imagem_destino
```
Para carregar:
```bash
$ sudo docker load -i imagem
```
É necessário carregar as imagens `adega_web`, `adega_db` e `adega_nginx`.
Se alterações forem feitas no código do adega elas serão automaticamente refletidas no servidor, mesmo na versão de produção.
Porém se mudanças forem feitas no container do nginx a imagem deste deverá ser refeita.
Para manter o aplicativo atualizado só é necessário dar pull na branch production.
## Instalação e dependências manuais (não recomendado)
......@@ -96,8 +127,8 @@ sudo -u postgres psql < postgres/create.sql
```
se você possui o arquivo do banco de dados compartilhado internamente pelos
desenvolvedores do projeto coloque-o na home do projeto, ele vem com um usuário
se você possui o arquivo do banco de dados compartilhado internamente pelos
desenvolvedores do projeto coloque-o na home do projeto, ele vem com um usuário
`pet` com senha `pet` pré-configurado para testes.
......@@ -130,7 +161,7 @@ Ao sair do projeto execute `exit` para sair do virtualenv e evitar polui-lo
## Transformando o seu usuário em um professor
Após você logar no sistema com o seu super usuário você terá acesso ao `URL_DO_SITE/admin`, graças ao [Django admin](https://docs.djangoproject.com/en/1.10/ref/contrib/admin/) nesta tela você é capaz de gerenciar os dados salvos nas models do projeto.
Para transformar o seu usuário em professor basta clicar em `professor`e então selecionar o seu usuário e o curso. Agora se você voltar para a página inicial do sistema você deve ver uma listagem dos seus cursos.
Para transformar o seu usuário em professor basta clicar em `professor`e então selecionar o seu usuário e o curso. Agora se você voltar para a página inicial do sistema você deve ver uma listagem dos seus cursos.
## Executando análises (se vocẽ está usando docker)
......
This diff is collapsed.
......@@ -6,7 +6,7 @@
if ! sudo -u postgres psql adega
then
sudo -u postgres psql < postgres/create.sql
sudo -u postgres psql < postgres/create.sql
fi
......
version: '3'
services:
db:
container_name: adega_db
image: postgres
environment:
- POSTGRES_USER=adega
- POSTGRES_PASSWORD=adega
- POSTGRES_DB=adega
web:
build:
container_name: adega_web
build:
context: .
dockerfile: ./docker_scripts/Dockerfile
command: bash "./docker_scripts/on_docker_init.sh"
......@@ -23,4 +25,5 @@ services:
- POSTGRES_USER=adega
- POSTGRES_PASSWORD=adega
- POSTGRES_DB=adega
- POSTGRES_HOST=adega_db_1
- POSTGRES_HOST=adega_db
- VERSION=DEVELOPMENT
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_USER=adega
- POSTGRES_PASSWORD=adega
- POSTGRES_DB=adega
web:
build:
context: .
dockerfile: ./docker_scripts/Dockerfile
command: bash "./docker_scripts/on_docker_init_production.sh"
volumes:
- .:/adega
# ports:
# - "8000:8000"
links:
- db
depends_on:
- db
environment:
- POSTGRES_USER=adega
- POSTGRES_PASSWORD=adega
- POSTGRES_DB=adega
- POSTGRES_HOST=adega_db
- VERSION=PRODUCTION
nginx:
restart: always
build: ./nginx/
ports:
- "8000:80"
depends_on:
- web
links:
- web:web
volumes:
- ./static:/adega/static
......@@ -2,6 +2,6 @@
# If ANY of this commands fails (return != 0) the container will be down
bash ./docker_scripts/wait_for_postgres.sh
cd src
python manage.py makemigrations degree admission educator uploads course
python manage.py makemigrations degree admission educator submission course
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
# This commands will be run inside of the container web
# If ANY of this commands fails (return != 0) the container will be down
bash ./docker_scripts/wait_for_postgres.sh
cd src
python manage.py makemigrations degree admission educator submission course
python manage.py migrate
python manage.py collectstatic --noinput
#chmod 775 -R adega/static
#python manage.py runserver 0.0.0.0:8000
gunicorn adega.wsgi:application --workers 2 --timeout 600 -b :8000
......@@ -6,8 +6,7 @@ After=network.target
User=www-data
Group=www-data
WorkingDirectory=/var/www/adega/src
ExecStart=/var/www/adega/venv/bin/gunicorn --access-logfile - -k eventlet --workers 4 --bind unix:/var/www/adega/adega.sock adega.wsgi:application
ExecStart=/var/www/adega/venv/bin/gunicorn --access-logfile - -k eventlet --workers 2 --timeout 300 --bind unix:/var/www/adega/adega.sock adega.wsgi:application
[Install]
WantedBy=multi-user.target
......@@ -43,6 +43,9 @@ docker-fix:
docker-up:
docker-compose --project-directory . -f docker_scripts/docker-compose.yml -p adega up
docker-production:
docker-compose --project-directory . -f docker_scripts/docker-production.yml -p adega up
docker-remove-all:
docker rm adega_web_1 adega_db_1
docker rmi adega_web
......
FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
ADD sites-enabled/ /etc/nginx/sites-enabled
......@@ -31,7 +31,7 @@ server {
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
charset utf-8;
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
......@@ -75,7 +75,7 @@ server {
disable_symlinks off;
}
location /adega {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
......@@ -84,13 +84,13 @@ server {
proxy_pass http://adega/;
}
location /adega/static {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
root /var/www;
autoindex on;
try_files $uri $uri/ =404;
......@@ -102,5 +102,3 @@ server {
deny all;
}
}
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 100M;
proxy_connect_timeout 600;
proxy_read_timeout 600;
uwsgi_read_timeout 600;
fastcgi_read_timeout 600;
keepalive_timeout 600;
location /static/ {
alias /adega/static/;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
from django.core.management.base import BaseCommand
from uploads.models import Submission
from submission.models import Submission
from script.main import analyze
from submission.analysis.main import analyze
class Command(BaseCommand):
......
......@@ -13,6 +13,10 @@ https://docs.djangoproject.com/en/1.9/ref/settings/
import os
from django.contrib import messages
# copy envioment variables to env
env = os.environ.copy()
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.join(BASE_DIR, '..')
......@@ -24,9 +28,9 @@ PROJECT_DIR = os.path.join(BASE_DIR, '..')
SECRET_KEY = 'e#-^aknk(5k)ej6rh#h$i(%h(m9)-j*lwrc_1dxnk=a@-mixlt'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
DEBUG = os.environ['VERSION'] == "DEVELOPMENT"
ALLOWED_HOSTS = []
ALLOWED_HOSTS = ["*"]
# Application definition
......@@ -43,13 +47,13 @@ INSTALLED_APPS = [
'adega',
'public',
'degree',
'educator',
'admission',
'course',
'student',
'degree',
'educator',
'admission',
'course',
'student',
'report_api',
'uploads'
'submission'
]
MIDDLEWARE_CLASSES = [
......@@ -87,27 +91,19 @@ WSGI_APPLICATION = 'adega.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
#DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
#}
# verifica se informação do banco de dados está definido em variavel de
# ambiente, caso não esteja setado usa se informações default.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'adega',
'USER': 'adega',
'PASSWORD': 'adega',
'HOST': 'adega_db_1',
'PORT': '5432',
'NAME': env.get("POSTGRES_DB", "adega"),
'USER': env.get("POSTGRES_USER", "adega"),
'PASSWORD': env.get("POSTGRES_PASSWORD", "adega"),
'HOST': env.get("POSTGRES_HOST", "adega_db"),
'PORT': env.get("POSTGRES_PORT", "5432")
}
}
AUTHENTICATION_BACKENDS = ['public.auth.EmailBackend']
......@@ -156,16 +152,18 @@ MESSAGE_TAGS = {
if not DEBUG:
FORCE_SCRIPT_NAME = '/adega/'
# FORCE_SCRIPT_NAME = '/adega/'
# STATIC_URL = '/static/'
STATIC_URL = '/static/'
STATIC_URL = '/adega/static/'
else:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
MEDIA_URL = '/script/base/'
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'uploads')
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'submission')
# MEDIA_URL = None # a gente não quer ninguem fazendo download disso
# MEDIA_ROOT = os.path.join(PROJECT_DIR, 'uploads')
// This module simplify the use of Plotly library on this project
class AdegaChart{
constructor(config){
......@@ -9,6 +11,8 @@ class AdegaChart{
this.legend = config.legend || null;
this.barmode = config.barmode || "stack";
if(config.data == null){
this.data_x = config.data_x;
......@@ -18,8 +22,8 @@ class AdegaChart{
else{
this.data_x = [];
this.data_y = [];
var first_element;
for (first_element in this.data) break;
var first_element = Object.keys(this.data)[0];
first_element = this.data[first_element];
var multiplePlots = Array.isArray(first_element);
......@@ -53,7 +57,7 @@ class AdegaChart{
this.type = config.type || "scatter";
this.title = config.title || "";
if(typeof(this.data_y[0]) == "number"){
this.data_y = [this.data_y];
this.type = [this.type];
......@@ -63,6 +67,9 @@ class AdegaChart{
this.error_y = [this.error_y];
}
this.data_axis_y = config.data_axis_y || this.data_y.map(function(x){return "y1";});
this.reloadGraph();
}
......@@ -88,10 +95,11 @@ class AdegaChart{
continue;
data.push(
{
x: this.data_x,
y: this.data_y[i],
type: this.type[i],
fill: this.fill
x: this.data_x,
y: this.data_y[i],
type: this.type[i],
fill: this.fill,
yaxis: this.data_axis_y[i]
}
);
......@@ -110,9 +118,34 @@ class AdegaChart{
var layout = {
title: this.title,
showlegend: true
showlegend: true,
yaxis: {
// title: 'yaxis title',
rangemode: 'tozero'
// overlaying: 'y'
},
yaxis2: {
// title: 'yaxis2 title',
// titlefont: {color: 'rgb(148, 103, 189)'},
// tickfont: {color: 'rgb(148, 103, 189)'},
overlaying: 'y1',
side: 'right',
rangemode: 'tozero'
},
barmode: this.barmode
};
Plotly.newPlot(this.div_target, data, layout);
}
}
AdegaChart.sort_object_by_key = function(obj){
keys = Object.keys(obj);
keys.sort();
values = keys.map(function(x){
return obj[x];
});
return [keys,values];