# notifications-admin

GOV.UK Notify admin application - https://www.notifications.service.gov.uk/

## Features of this application

 - Register and manage users
 - Create and manage services
 - Send batch emails and SMS by uploading a CSV
 - Show history of notifications

## First-time setup

### 1. Install Homebrew

Install [Homebrew](https://brew.sh), a package manager for OSX:

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

### 2. Make sure you're using correct language versions

Languages needed
- Python 3.6.x
- [Node](https://nodejs.org/) 10.15.3 or greater
- [npm](https://www.npmjs.com/) 6.4.1 or greater

Need to install node? Run:

```shell
brew install node
```

#### 2.1. `pyenv` For Python version management

[pyenv](https://github.com/pyenv/pyenv) is a program to manage and swap between different versions of Python. To install:

```shell
brew install pyenv
```

And then follow the further installation instructions in https://github.com/pyenv/pyenv#installation to configure it.

#### 2.2. `n` For Node version management

[NPM](npmjs.org) is Node's package management tool. `n` is a tool for managing
different versions of Node. The following installs `n` and uses the long term support (LTS)
version of Node.

```shell
npm install -g n
n lts
```

### 3. Install NPM dependencies

```shell
npm install
npm rebuild node-sass
```

### 4. Install and use `virtualenvwrapper` (optional)

We suggest using a virtualenv to separate the python dependencies for this project from python dependencies for other projects.

Install [virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/install.html):

```shell
pip install virtualenvwrapper
```

Then follow the [virtualenvwrapper installation instructions](https://virtualenvwrapper.readthedocs.io/en/latest/install.html) docs to configure virtualenvwrapper for your terminal.

Set up your virtualenv:

```shell
mkvirtualenv notifications-admin
```

If you need to specify a certain version of python you can do this using `-p`, for example:

```shell
mkvirtualenv -p ~/.pyenv/versions/3.6.3/bin/python notifications-admin
```

Activate your virtualenv:

```shell
workon notifications-admin
```

### 5. Install Python dependencies

Install dependencies and build the frontend assets:

```shell
./scripts/bootstrap.sh
```

**Note:** You may need versions of both Python 3 and Python 2 accessible to build the python dependencies. `pyenv` is great for that, and making both Python versions accessible can be done like so:

```shell
pyenv global 3.6.3 2.7.15
```

### 6. Create a local `environment.sh` file

In the root directory of the application, run:

```
echo "
export NOTIFY_ENVIRONMENT='development'
export FLASK_APP=application.py
export FLASK_DEBUG=1
export WERKZEUG_DEBUG_PIN=off
"> environment.sh
```

### 7. AWS credentials

Your aws credentials should be stored in a folder located at `~/.aws`. Follow [Amazon's instructions](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-config-files) for storing them correctly


### 8. Running the application

In the root directory of the application, run:

```shell
./scripts/run_app.sh
```

Then visit [localhost:6012](http://localhost:6012)

## Updating application dependencies

`requirements.txt` file is generated from the `requirements-app.txt` in order to pin
versions of all nested dependencies. If `requirements-app.txt` has been changed (or
we want to update the unpinned nested dependencies) `requirements.txt` should be
regenerated with

```
make freeze-requirements
```

`requirements.txt` should be committed alongside `requirements-app.txt` changes.


## Automatically rebuild the frontend assets

If you want the front end assets to re-compile on changes, leave this running
in a separate terminal from the app

```shell
    npm run watch
```

## Working with static assets

When running locally static assets are served by Flask at http://localhost:6012/static/…

When running on preview, staging and production there’s a bit more to it:

![notify-static-after](https://user-images.githubusercontent.com/355079/50343595-6ea5de80-051f-11e9-85cf-2c20eb3cdefa.png)
