Add database setup

This commit is contained in:
coolneng 2020-01-02 04:27:45 +01:00
parent 7a494f7918
commit 8a858e6fc2
Signed by: coolneng
GPG Key ID: 9893DA236405AF57
6 changed files with 280 additions and 127 deletions

4
.gitignore vendored
View File

@ -1 +1,3 @@
Assets/__titlepage.filled.tex
Assets/__titlepage.filled.tex
Design.org
Code/.env

14
Code/Pipfile Normal file
View File

@ -0,0 +1,14 @@
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
flask = "*"
sqlalchemy = "*"
pymysql = "*"
[requires]
python_version = "3.8"

105
Code/Pipfile.lock generated Normal file
View File

@ -0,0 +1,105 @@
{
"_meta": {
"hash": {
"sha256": "536bc13b89021a4575fe2c14d71636abf965ab896871f1503f3186f2f1c6a0d4"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.8"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"click": {
"hashes": [
"sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
"sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
],
"version": "==7.0"
},
"flask": {
"hashes": [
"sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
"sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
],
"index": "pypi",
"version": "==1.1.1"
},
"itsdangerous": {
"hashes": [
"sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
"sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
],
"version": "==1.1.0"
},
"jinja2": {
"hashes": [
"sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f",
"sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de"
],
"version": "==2.10.3"
},
"markupsafe": {
"hashes": [
"sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
"sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
"sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
"sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
"sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
"sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
"sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
],
"version": "==1.1.1"
},
"pymysql": {
"hashes": [
"sha256:3943fbbbc1e902f41daf7f9165519f140c4451c179380677e6a848587042561a",
"sha256:d8c059dcd81dedb85a9f034d5e22dcb4442c0b201908bede99e306d65ea7c8e7"
],
"index": "pypi",
"version": "==0.9.3"
},
"sqlalchemy": {
"hashes": [
"sha256:bfb8f464a5000b567ac1d350b9090cf081180ec1ab4aa87e7bca12dab25320ec"
],
"index": "pypi",
"version": "==1.3.12"
},
"werkzeug": {
"hashes": [
"sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7",
"sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4"
],
"version": "==0.16.0"
}
},
"develop": {}
}

20
Code/database/db_setup.py Normal file
View File

@ -0,0 +1,20 @@
from sqlalchemy import create_engine
def create_connection():
db_name = get_env_variable("DB_NAME")
db_user = get_env_variable("DB_USER")
db_password = get_env_variable("DB_PASSWORD")
db_url = get_env_variable("DB_URL")
db_connection_uri = "mysql+pymysql://{user}:{pw}@{url}/{db}".format(
user=db_user, pw=db_password, url=db_url, db=db_name
)
engine = sqlalchemy.create_engine(db_connection_uri, echo=True)
def get_env_variable(name):
try:
return os.environ[name]
except KeyError:
message = "Expected environment variable '{}' not set.".format(name)
raise Exception(message)

View File

@ -1,47 +1,58 @@
* DB
** Fields
*** ID
*** Location
*** Area change
*** Volume change
*** Name
** ID
** Location
** Area change
** Volume change
** Name
* Users
** Admin
* Tasks
** TODO Parsing script [0/2] [0%]
- [ ] Select useful fiels with awk
- [ ] Sum of the volume and areas of each year
** DONE Type requirements handout [4/4] [100%]
CLOSED: [2019-09-27 Fri 14:54] SCHEDULED: <2019-09-27 Fri 23:55>
- [X] Problem description
- [X] Functional requirements
- [X] Data requirements
- [X] Semantic restrictions
** DONE Makefile [3/3] [100%]
CLOSED: [2019-09-30 Mon 20:05]
- [X] Org to Markdown
- [X] Add YAML to Markdown
- [X] Compile to PDF using Eisvogel
** TODO Update date in YAML automatically [0/2] [0%]
- [ ] Awk command
- [ ] Add to Makefile
** DONE Add WGMS citation [2/2] [100%]
CLOSED: [2019-10-08 Tue 18:16]
- [X] Pandoc citations
- [X] Bibtex syntax
** DONE Setup PlantUML integration [2/2] [100%]
CLOSED: [2019-10-18 Fri 17:58]
- [X] Org Babel
- [X] Source code on a different file
** DONE Improve first handout [3/3] [100%]
CLOSED: [2019-10-08 Tue 20:45]
- [X] Data types
- [X] Non functional requirements
- [X] Longer description
** DONE Generate diagrams [4/5] [80%]
CLOSED: [2019-11-01 Fri 00:34]
- [X] Data-flow
- [ ] Conceptual
- [X] Functional
- [X] Black box
- [X] Entity-Relationship
** Specification
*** TODO Improve second handout [0/2] [0%]
- [ ] Correct diagrams
- [ ] Add conceptual diagram
*** INACTIVE Update date in YAML automatically [0/1] [0%]
- [ ] Add to Makefile
*** DONE Type requirements handout [4/4] [100%]
CLOSED: [2019-09-27 Fri 14:54] SCHEDULED: <2019-09-27 Fri 23:55>
- [X] Problem description
- [X] Functional requirements
- [X] Data requirements
- [X] Semantic restrictions
*** DONE Makefile [3/3] [100%]
CLOSED: [2019-09-30 Mon 20:05]
- [X] Org to Markdown
- [X] Add YAML to Markdown
- [X] Compile to PDF using Eisvogel
*** DONE Add WGMS citation [2/2] [100%]
CLOSED: [2019-10-08 Tue 18:16]
- [X] Pandoc citations
- [X] Bibtex syntax
*** DONE Setup PlantUML integration [2/2] [100%]
CLOSED: [2019-10-18 Fri 17:58]
- [X] Org Babel
- [X] Source code on a different file
*** DONE Improve first handout [3/3] [100%]
CLOSED: [2019-10-08 Tue 20:45]
- [X] Data types
- [X] Non functional requirements
- [X] Longer description
*** DONE Generate diagrams [4/5] [80%]
CLOSED: [2019-11-01 Fri 00:34]
- [X] Data-flow
- [ ] Conceptual
- [X] Functional
- [X] Black box
- [X] Entity-Relationship
** Implementation
*** TODO Backend [0/2] [0%]
**** TODO Database [1/2] [50%]
- [X] Connection
- [ ] Creation of fields via class
**** NEXT Flask framework
-[[https://flask.palletsprojects.com/en/1.1.x/patterns/#patterns][ Patterns]]
*** NEXT Parsing script [0/2] [0%]
- [ ] Select useful fiels with awk
- [ ] Arithmetic operations for comparisons
*** INACTIVE Frontend [0/1] [0%]
- [ ] [[https://adminlte.io/][Adminlte]]

View File

@ -2,144 +2,145 @@
** Descripción del problema
Pretendemos crear una base de datos que incluye información general y específica de los principales glaciares. Nuestro fin es compartir información con la comunidad científica,
sin ánimo de lucro, y concienciar a un número máximo de personas sobre los devastadores efectos del cambio climático.
La IGDB ofrecerá dos interfaces distintas para la consulta de información, una con información extensiva enfocada para el uso científico (se podrán incluir los datos
en cualquier documento científico, mencionándola en la bibliografía), y otra con información general y mucho más visual para el público general.
Para el uso científico, ofreceremos estadísticas individuales de un glaciar y la posibilidad de comparar dos glaciares para observar la correlación entre sus tasas de cambio.
Para el público general, añadiremos un conjunto de tablas y gráficas, junto con valores estadísticos que permiten visualizar el impacto del cambio climático de forma muy intuitiva.
Nos basaremos en la base de datos cite:wgms-db, ya que ésta contiene una mucha información acerca de gran número de glaciares. IGDB simplificará la WGMS, escogiendo únicamente los
datos relevantes para estudios acerca del cambio climático, y acotando éstos a la década actual (2010-2018).
Pretendemos crear una base de datos que incluye información general y específica de los principales glaciares. Nuestro fin es compartir información con la comunidad científica,
sin ánimo de lucro, y concienciar a un número máximo de personas sobre los devastadores efectos del cambio climático.
La IGDB ofrecerá dos interfaces distintas para la consulta de información, una con información extensiva enfocada para el uso científico (se podrán incluir los datos
en cualquier documento científico, mencionándola en la bibliografía), y otra con información general y mucho más visual para el público general.
Para el uso científico, ofreceremos estadísticas individuales de un glaciar y la posibilidad de comparar dos glaciares para observar la correlación entre sus tasas de cambio.
Para el público general, añadiremos un conjunto de tablas y gráficas, junto con valores estadísticos que permiten visualizar el impacto del cambio climático de forma muy intuitiva.
Nos basaremos en la base de datos cite:wgms-db, ya que ésta contiene una mucha información acerca de gran número de glaciares. IGDB simplificará la WGMS, escogiendo únicamente los
datos relevantes para estudios acerca del cambio climático, y acotando éstos a la década actual (2010-2018).
** Requisitos
*** Datos
1. *RD1*: Datos del glaciar
- País - /Cadena de 30 caracteres máximo/
- Nombre del glaciar - /Cadena de 30 caracteres máximo/
- ID del glaciar (Compatible con la WGMS) - /Entero de 5 dígitos/
2. *RD2*: Datos anuales de un glaciar
- ID del glaciar (Compatible con la WGMS) - /Entero de 5 dígitos/
- Área - /Entero de 10 dígitos/
- Volumen - /Entero de 10 dígitos/
- Grosor - /Entero de 10 dígitos/
- Año - /Entero de 10 dígitos/
1. *RD1*: Datos del glaciar
- País - /Cadena de 30 caracteres máximo/
- Nombre del glaciar - /Cadena de 30 caracteres máximo/
- ID del glaciar (Compatible con la WGMS) - /Entero de 5 dígitos/
2. *RD2*: Datos anuales de un glaciar
- ID del glaciar (Compatible con la WGMS) - /Entero de 5 dígitos/
- Área - /Entero de 10 dígitos/
- Volumen - /Entero de 10 dígitos/
- Grosor - /Entero de 10 dígitos/
- Año - /Entero de 10 dígitos/
3. *RD3*: Datos de cambio de un glaciar
- ID del glaciar (Compatible con la WGMS) - /Entero de 5 dígitos/
- Variación de área - /Entero de 10 dígitos/
- Variación de volumen - /Entero de 10 dígitos/
- Variación de grosor - /Entero de 10 dígitos/
- Año - /Entero de 10 dígitos/
3. *RD3*: Datos de cambio de un glaciar
- ID del glaciar (Compatible con la WGMS) - /Entero de 5 dígitos/
- Variación de área - /Entero de 10 dígitos/
- Variación de volumen - /Entero de 10 dígitos/
- Variación de grosor - /Entero de 10 dígitos/
- Año - /Entero de 10 dígitos/
4. *RD4*: Datos del administrador
- ID - /Entero de 4 dígitos/
- Fecha de alta - /Fecha en formato dd-mm-yyyy/
4. *RD4*: Datos del administrador
- ID - /Entero de 4 dígitos/
- Fecha de alta - /Fecha en formato dd-mm-yyyy/
*** Funcionales
1. *RF1*: Alta de un glaciar
1. *RF1*: Alta de un glaciar
Se añade un glaciar al sistema a partir de los datos de la WGMS
- Entrada: *RD1*
Se añade un glaciar al sistema a partir de los datos de la WGMS
- Entrada: *RD1*
2. *RF2*: Inclusión de datos anuales
2. *RF2*: Inclusión de datos anuales
Añade los datos relevantes de cada año para un glaciar
- Entrada: *RD2*
Añade los datos relevantes de cada año para un glaciar
- Entrada: *RD2*
3. *RF3*: Cálculo de las variaciones anuales
3. *RF3*: Cálculo de las variaciones anuales
Calcula las variaciones anuales de grosor, área y volumen para un glaciar
- Entrada: *RD2*
- Manejo: *RD3*
Calcula las variaciones anuales de grosor, área y volumen para un glaciar
- Entrada: *RD2*
- Manejo: *RD3*
4. *RF4*: Alta del administrador
4. *RF4*: Alta del administrador
Crea un usuario de tipo administrador, encargado de monitorizar el sistema y resolver conflictos
- Entrada: *RD4*
Crea un usuario de tipo administrador, encargado de monitorizar el sistema y resolver conflictos
- Entrada: *RD4*
5. *RF5*: Actualización de la base de datos
5. *RF5*: Actualización de la base de datos
Añade nuevos datos a partir de nuevas versiones de la WGMS
- Entrada: *RD2*
Añade nuevos datos a partir de nuevas versiones de la WGMS
- Entrada: *RD2*
6. *RF6*: Resolución de conflictos
6. *RF6*: Resolución de conflictos
Permite al administrador la resolución de conflictos de datos al actualizar la base de datos
Permite al administrador la resolución de conflictos de datos al actualizar la base de datos
*** No Funcionales
1. *RNF1*: Seguridad
1. *RNF1*: Seguridad
La página web de consulta será accesible únicamente mediante HTTPS, y la base de datos tendrá su propio usuario de acceso
La página web de consulta será accesible únicamente mediante HTTPS, y la base de datos tendrá su propio usuario de acceso
2. *RNF2*: Escalabilidad
2. *RNF2*: Escalabilidad
Se podrá aumentar el rendimiento de IGDB mediante una mejora del hardware del servidor, o montando un cluster
Se podrá aumentar el rendimiento de IGDB mediante una mejora del hardware del servidor, o montando un cluster
3. *RNF3*: Disponibilidad
3. *RNF3*: Disponibilidad
La IGDB estará disponible 24/7, y en caso de necesidad de mantenimiento, se procederá a mostrar un snapshot de la página
La IGDB estará disponible 24/7, y en caso de necesidad de mantenimiento, se procederá a mostrar un snapshot de la página
4. *RNF4*: Tolerancia a fallos
4. *RNF4*: Tolerancia a fallos
Se usará un cluster para permitir que la IGDB siga siendo disponible, aunque falle algún servidor
Se usará un cluster para permitir que la IGDB siga siendo disponible, aunque falle algún servidor
5. *RNF5*: Copias de seguridad
5. *RNF5*: Copias de seguridad
Se harán copias de seguridad diarias del sistema, además de enviarlas a otro servidor en caso de que se pierdan los datos locales de backup
Se harán copias de seguridad diarias del sistema, además de enviarlas a otro servidor en caso de que se pierdan los datos locales de backup
6. *RNF6*: Rotación de logs
6. *RNF6*: Rotación de logs
Se eliminarán los logs del sistema antiguos, cada semana
Se eliminarán los logs del sistema antiguos, cada semana
*** Restricciones Semánticas
1. *RS1*:
No podrá haber dos glaciares con el mismo ID
1. *RS1*:
No podrá haber dos glaciares con el mismo ID
2. *RS2*:
No podrá haber más de un administrador del sistema
2. *RS2*:
No podrá haber más de un administrador del sistema
3. *RS3*:
El atributo año solo podrá estar comprendido entre 2010-2018, inclusive
3. *RS3*:
El atributo año solo podrá estar comprendido entre 2010-2018, inclusive
** Diagramas
Para el diseño del sistema, procederemos con la modelización de diagramas estandarizados, dado que es una herramienta imprescindible en
Ingeniería del Software.
Para el diseño del sistema, procederemos con la modelización de diagramas estandarizados, dado que es una herramienta imprescindible en
Ingeniería del Software.
*** Diagrama funcional
[[./FD.png]]
[[./FD.png]]
*** Diagramas de flujo
[[./DF1.png]]
[[./DF1.png]]
[[./DF2.png]]
[[./DF3.png]]
[[./DF4.png]]
[[./DF5.png]]
[[./DF6.png]]
[[./DF2.png]]
[[./DF3.png]]
[[./DF4.png]]
[[./DF5.png]]
[[./DF6.png]]
*** Diagrama de caja negra
#+CAPTION: IGDB
[[./BB.png]]
#+CAPTION: IGDB
[[./BB.png]]
\clearpage
*** Diagrama Entidad-Relación
\newpage
[[./ER.png]]
[[./ER.png]]
** Bibliografía