## Setup guide
To start running the application, first carry out the installations listed below.
### MacOS
Instructions assume [Homebrew](https://brew.sh/) is already installed on your OSX host.
### python 3
Used as the backend language for the project, handling server connections and database connections and for processing data used in the application.
```
brew install python
```
### MongoDB
The NoSQL database used for the application.
If not already tapped 'MongoDB Homebrew Tap':
```
brew tap mongodb/brew
```
Now it is possible to install MongoDB Community Edition.
```
brew install mongodb-community@4.2
```
### D3.js
D3.js is used to create the different data visualisations used in the app, such as bar charts and line graphs. To install using [NPM](https://www.npmjs.com/get-npm), first initialise an NPM.
```
npm init
```
Then install D3.js and all of its dependencies.
```
npm install --save d3
```
And then include the following line in the HTML.
```
```
For the creation of geographical maps.
```
npm install datamap
```
For saving graphs produced by D3, I use 'saveSvgAsPng' and 'canvg'
```
npm install save-svg-as-png
npm install canvg
```
Alternatively to the above, you can include the scripts directly for D3 and canvg:
```
```
NOTE: DataMap requires version 3 of D3 and therefore you will need to include it separately (along with topojson):
```
```
### Python packages
For installing our python packages we will be using [pipenv](https://pypi.org/project/pipenv/) which will also handle our virtual environment for us. To do this, run the following command (Note: it must be this latest version.)
```
pip install 'pipenv==2018.11.26'
```
Clone the git repository and navigate into the directory.
Then run the following command to install all the relevant packages.
```
pipenv install
```
If you would like to also install the dev dependencies, including 'pytest' for testing, then instead run:
```
pipenv install --dev
```
With this method there is no need to create a virtual environment, it is handled for you automatically by pipenv.
Following the installations, you can then enter that virtual environment by using:
```
pipenv shell
```
Then to run the application, navigate to the 'site' directory and run 'flask run'
```
cd site
flask run
```
The flask application knows which file needs to be run when starting the app from the environment variables set in ['.flaskenv'](./site/.flaskenv). At the moment, the .flaskenv file specifies the app to run in developer mode. Simply edit the '.flasenv' file for running in a different environment.
### Full packages list
All the python packages used are listed below for your information (along with the pip command for installing if you would rather do it that way instead.)
#### Flask and its extensions
Flask is a microframework of python that provides many of the tools required for building a web application, such as templating, routing and Web Server Gateway Interface (WSGI).
As it is a 'microframework', it is often also required to install several extensions to get more functionality.
The dependencies that are included are:
- jinja2 - the templating engine.
- Werkzeug - a WSGI utility library.
```
pip install Flask
```
##### Flask-WTF
Flask-WTF is a wrapper around the WTForms package, including CSRF, file upload, and reCAPTCHA.
```
pip install flask-wtf
```
##### email_validator
It may also be necessary to install email_validator if not included in your version of Flask-WTF.
```
pip install email_validator
```
##### Flask-Dropzone
For dragging and dropping of files onto the webpage for uploading.
```
pip install Flask-Dropzone
```
##### Flask-PyMongo
For connecting and interacting with a MongoDB database
```
pip install Flask-PyMongo
```
##### python-dotenv
For managing data within .env files
```
pip install python-dotenv
```
##### Flask-Bcrypt
For hashing passwords to store in a database.
```
pip install flask-bcrypt
```
##### Flask-Login
Handles user session for flask applications, including logging in, logging out and remember user sessions over time.
```
pip install flask-login
```
##### Flask-JSGlue
Allows for building flask-like URLs in javascript. Useful for Jquery POSTs (using flask synteax such as url_for).
```
pip install Flask-JSGlue
```
### Other
##### pytest
For carrying out unit testing of my code.
```
pip install pytest
```
##### pandas and xlrd
For easy installation of all packages (xlrd allows for parsing Excel files).
```
pip install pandas
pip install xlrd
```
##### SciPy and Pingouin
Used for carrying out the statistical tests on the data.
```
pip install scipy
pip install pingouin
```
##### XlsxWriter
For writing to excel files for users to export statistical tests
```
pip install XlsxWriter
```