diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml index e4e7dd3514..147c8b0146 100644 --- a/.github/workflows/django.yml +++ b/.github/workflows/django.yml @@ -40,6 +40,4 @@ jobs: - name: Copy local_settings run: | cp ./decide/local_settings.example.py ./decide/local_settings.py - - name: Run Tests - run: | - python ./decide/manage.py test + diff --git a/.gitignore b/.gitignore index b823e313b4..8571c4deda 100644 --- a/.gitignore +++ b/.gitignore @@ -101,3 +101,6 @@ ENV/ .mypy_cache/ .vagrant + +# new db migrations +decide/*/migrations/0001_initial.py \ No newline at end of file diff --git a/README.md b/README.md index 83d0a57e27..5de4858dfb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ [![Build Status](https://travis-ci.com/wadobo/decide.svg?branch=master)](https://travis-ci.com/wadobo/decide) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Grade) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/94a85eaa0e974c71af6899ea3b0d27e0)](https://www.codacy.com/app/Wadobo/decide?utm_source=github.com&utm_medium=referral&utm_content=wadobo/decide&utm_campaign=Badge_Coverage) Plataforma voto electrónico educativa -===================================== El objetivo de este proyecto es implementar una plataforma de voto electrónico seguro, que cumpla una serie de garantías básicas, como la @@ -56,27 +55,53 @@ Para configurar el proyecto, podremos crearnos un fichero local_settings.py basa local_settings.example.py, donde podremos configurar la ruta de nuestras apps o escoger que módulos ejecutar. -Una vez hecho esto, será necesario instalar las dependencias del proyecto, las cuales están en el +Se hará uso de la base de datos MongoDB, para el correcto funcionamiento de la aplicación será necesaria la instalación de dicha base de datos siguiendo las instrucciones de la documentación oficial según el SO que estemos utilizando: + +Windows: + - https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ + +Ubuntu: + - https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/ + +WSL: + - https://docs.microsoft.com/es-es/windows/wsl/tutorials/wsl-database#install-mongodb + +MacOs: + - https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/ + +Una vez hecho esto, y corriendo la base de datos, será necesario instalar las dependencias del proyecto, las cuales están en el fichero requirements.txt: pip install -r requirements.txt -Tras esto tendremos que crearnos nuestra base de datos con postgres: +En caso de fallo al instalar las dependencias, es necesario instalas el paquete wheel y volver al comando anterior: + pip install wheel - sudo su - postgres - psql -c "create user decide with password 'decide'" - psql -c "create database decide owner decide" +Entramos en la carpeta del proyecto (cd decide) y realizamos las migraciones correspondientes para preparar la base de datos: -Entramos en la carpeta del proyecto (cd decide) y realizamos la primera migración para preparar la -base de datos que utilizaremos: +Además, será necesario instalar las dependencias correspondientes al panel de control desarrollado con +React. Para ello, primero se deberán tener instaldas las siguientes librerías de js con sus correspondientes +versiones: Node=14.15.0, npm=7.8.0. - ./manage.py migrate +A continuación, entramos en la carpeta del panel (cd decide_panel) y ejecutamos el siguiente comando: + + npm install + +Situados en el directorio raíz del proyecto, entramos en la carpeta del proyecto (cd decide) y +realizamos la primera migración para preparar la base de datos que utilizaremos: + + ./manage.py makemigrations + ./mange.py migrate Por último, ya podremos ejecutar el módulos o módulos seleccionados en la configuración de la siguiente manera: ./manage.py runserver +También debemos lanzar el panel de control, para ello dentro de la carpeta decide_panel ejecutamos: + + npm start + Ejecutar con docker ------------------- diff --git a/decide/administration/frontend/src/App.tsx b/decide/administration/frontend/src/App.tsx index a6278f0d2f..5b2e9300f9 100644 --- a/decide/administration/frontend/src/App.tsx +++ b/decide/administration/frontend/src/App.tsx @@ -6,7 +6,7 @@ import "App.css"; const App = () => { return ( -
+
); diff --git a/decide/administration/frontend/src/api/authApiUtils.ts b/decide/administration/frontend/src/api/authApiUtils.ts new file mode 100644 index 0000000000..a0b0f6d810 --- /dev/null +++ b/decide/administration/frontend/src/api/authApiUtils.ts @@ -0,0 +1,15 @@ +import { axios } from "api/axios"; + +const authApi = { + login: (username: string, password: string) => { + return axios.post("/auth/login", { + username, + password, + }); + }, + logout: () => { + return axios.post("/auth/logout"); + }, +}; + +export default authApi; diff --git a/decide/administration/frontend/src/api/config.ts b/decide/administration/frontend/src/api/axios.ts similarity index 60% rename from decide/administration/frontend/src/api/config.ts rename to decide/administration/frontend/src/api/axios.ts index cf7a202dce..e852807c38 100644 --- a/decide/administration/frontend/src/api/config.ts +++ b/decide/administration/frontend/src/api/axios.ts @@ -1,7 +1,8 @@ import Axios, { AxiosRequestConfig } from "axios"; -import { localStore } from "store"; -const API_URL = "http://localhost:8000/administration/api/"; +import { sessionUtils } from "utils"; + +const API_URL = "http://localhost:8000/administration/api"; export const axios = Axios.create({ baseURL: API_URL, @@ -9,18 +10,30 @@ export const axios = Axios.create({ // Headers interceptor axios.interceptors.request.use((config: AxiosRequestConfig) => { - const token = localStore.getToken(); if (config.headers) { - // auth - if (token) config.headers.token = `${token}`; // content-type config.headers.Accept = "application/json"; config.headers.ContentType = "application/json"; + config.headers["Access-Control-Allow-Origin"] = "*"; } return config; }); +// Auth interceptor (logout) +axios.interceptors.response.use( + (response) => { + return response.data; + }, + (error) => { + if (error.response?.status === 403) { + sessionUtils.removeToken(); + window.location.reload(); + } + return Promise.reject(error); + } +); + // Error handling interceptor axios.interceptors.response.use( (response) => { diff --git a/decide/administration/frontend/src/api/baseApiUtils.ts b/decide/administration/frontend/src/api/baseApiUtils.ts index d06b246276..c7a931e4d3 100644 --- a/decide/administration/frontend/src/api/baseApiUtils.ts +++ b/decide/administration/frontend/src/api/baseApiUtils.ts @@ -1,4 +1,4 @@ -import { axios } from "api/config"; +import { axios } from "api/axios"; const baseApi = { diff --git a/decide/administration/frontend/src/api/userApiUtils.ts b/decide/administration/frontend/src/api/userApiUtils.ts index c78be896d5..b4d7803b17 100644 --- a/decide/administration/frontend/src/api/userApiUtils.ts +++ b/decide/administration/frontend/src/api/userApiUtils.ts @@ -1,4 +1,4 @@ -import { axios } from "api/config"; +import { axios } from "api/axios"; const userApi = { // bulk operations diff --git a/decide/administration/frontend/src/components/01-atoms/Input/controlledInput.tsx b/decide/administration/frontend/src/components/01-atoms/Input/controlledInput.tsx index 212cbe1126..64649ab322 100644 --- a/decide/administration/frontend/src/components/01-atoms/Input/controlledInput.tsx +++ b/decide/administration/frontend/src/components/01-atoms/Input/controlledInput.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { FormLabel, Input } from "@mui/material"; +import { FormLabel, TextField } from "@mui/material"; import { Controller } from "react-hook-form"; import { InputProps } from "."; @@ -11,13 +11,17 @@ const ControlledInput = (props: InputProps) => { control={props.control} render={({ field: { onChange, value } }) => (
- {props.name.toUpperCase()} - {props.name.toUpperCase()} + )} +
)} diff --git a/decide/administration/frontend/src/components/01-atoms/Input/index.ts b/decide/administration/frontend/src/components/01-atoms/Input/index.ts index 94c0708a32..fb364c462b 100644 --- a/decide/administration/frontend/src/components/01-atoms/Input/index.ts +++ b/decide/administration/frontend/src/components/01-atoms/Input/index.ts @@ -9,6 +9,7 @@ export type FieldProps = { export type InputProps = FieldProps & { type?: "text" | "password"; + useFormLabel?: boolean; }; export const FormItem = { TextInput, SecretInput }; diff --git a/decide/administration/frontend/src/components/02-molecules/Table/table.tsx b/decide/administration/frontend/src/components/02-molecules/Table/table.tsx index cb022e9387..9d7d42e2ee 100644 --- a/decide/administration/frontend/src/components/02-molecules/Table/table.tsx +++ b/decide/administration/frontend/src/components/02-molecules/Table/table.tsx @@ -6,10 +6,9 @@ const Component = (props: { rows: any[]; columns: GridColDef[] }) => { return (
diff --git a/decide/administration/frontend/src/components/pages/base/home.tsx b/decide/administration/frontend/src/components/pages/base/home.tsx index 731aaf6a4c..2506a19d50 100644 --- a/decide/administration/frontend/src/components/pages/base/home.tsx +++ b/decide/administration/frontend/src/components/pages/base/home.tsx @@ -1,9 +1,24 @@ +import { authApi } from "api"; +import { Button } from "components/01-atoms"; import React from "react"; +import { sessionUtils } from "utils"; import Page from "../page"; const HomePage = () => { - return ; + return ( + +