diff --git a/app/__init__.py b/app/__init__.py
index 0d01c194e..75af97bd2 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -51,6 +51,7 @@ from app.notify_client.events_api_client import EventsApiClient
from app.notify_client.provider_client import ProviderClient
from app.notify_client.email_branding_client import EmailBrandingClient
from app.notify_client.models import AnonymousUser
+from app.notify_client.organisations_api_client import OrganisationsClient
from app.notify_client.letter_jobs_client import LetterJobsClient
from app.notify_client.inbound_number_client import InboundNumberClient
from app.notify_client.billing_api_client import BillingAPIClient
@@ -72,6 +73,7 @@ template_statistics_client = TemplateStatisticsApiClient()
events_api_client = EventsApiClient()
provider_client = ProviderClient()
email_branding_client = EmailBrandingClient()
+organisations_client = OrganisationsClient()
asset_fingerprinter = AssetFingerprinter()
statsd_client = StatsdClient()
deskpro_client = DeskproClient()
@@ -108,6 +110,7 @@ def create_app(application):
events_api_client.init_app(application)
provider_client.init_app(application)
email_branding_client.init_app(application)
+ organisations_client.init_app(application)
letter_jobs_client.init_app(application)
inbound_number_client.init_app(application)
billing_api_client.init_app(application)
diff --git a/app/main/__init__.py b/app/main/__init__.py
index ceea4e4b0..4ec54c1e2 100644
--- a/app/main/__init__.py
+++ b/app/main/__init__.py
@@ -30,6 +30,7 @@ from app.main.views import ( # noqa
letter_jobs,
email_branding,
conversation,
+ organisations,
notifications,
inbound_number
)
diff --git a/app/main/forms.py b/app/main/forms.py
index 2004d1661..537b11ba7 100644
--- a/app/main/forms.py
+++ b/app/main/forms.py
@@ -665,6 +665,11 @@ class ServiceCreateEmailBranding(StripWhitespaceForm):
file = FileField_wtf('Upload a PNG logo', validators=[FileAllowed(['png'], 'PNG Images only!')])
+class CreateOrUpdateOrganisation(StripWhitespaceForm):
+
+ name = StringField('Name', validators=[DataRequired()])
+
+
class LetterBranding(StripWhitespaceForm):
def __init__(self, choices=[], *args, **kwargs):
diff --git a/app/main/views/organisations.py b/app/main/views/organisations.py
new file mode 100644
index 000000000..80b16f8e4
--- /dev/null
+++ b/app/main/views/organisations.py
@@ -0,0 +1,75 @@
+from flask import redirect, render_template, url_for
+from flask_login import login_required
+
+from app import organisations_client
+from app.main import main
+from app.main.forms import CreateOrUpdateOrganisation
+from app.utils import user_has_permissions
+
+
+@main.route("/organisations", methods=['GET'])
+@login_required
+@user_has_permissions(admin_override=True)
+def organisations():
+ orgs = organisations_client.get_organisations()
+
+ return render_template(
+ 'views/organisations/organisations.html',
+ organisations=orgs
+ )
+
+
+@main.route("/organisation/", methods=['GET'])
+@login_required
+@user_has_permissions(admin_override=True)
+def view_organisation(org_id):
+ org = organisations_client.get_organisation(org_id)
+
+ return render_template(
+ 'views/organisations/view-organisation.html',
+ organisation=org
+ )
+
+
+@main.route("/organisation//edit", methods=['GET', 'POST'])
+@login_required
+@user_has_permissions(admin_override=True)
+def update_organisation(org_id):
+ org = organisations_client.get_organisation(org_id)
+
+ form = CreateOrUpdateOrganisation()
+
+ if form.validate_on_submit():
+ organisations_client.update_organisation(
+ org_id=org_id,
+ name=form.name.data
+ )
+
+ return redirect(url_for('.organisations'))
+
+ form.name.data = org['name']
+
+ return render_template(
+ 'views/organisations/manage-organisation.html',
+ form=form,
+ organisation=org
+ )
+
+
+@main.route("/organisations/add", methods=['GET', 'POST'])
+@login_required
+@user_has_permissions(admin_override=True)
+def add_organisation():
+ form = CreateOrUpdateOrganisation()
+
+ if form.validate_on_submit():
+ organisations_client.create_organisation(
+ name=form.name.data,
+ )
+
+ return redirect(url_for('.organisations'))
+
+ return render_template(
+ 'views/organisations/manage-organisation.html',
+ form=form
+ )
diff --git a/app/notify_client/organisations_api_client.py b/app/notify_client/organisations_api_client.py
new file mode 100644
index 000000000..ade5ad378
--- /dev/null
+++ b/app/notify_client/organisations_api_client.py
@@ -0,0 +1,30 @@
+from app.notify_client import NotifyAdminAPIClient
+
+
+class OrganisationsClient(NotifyAdminAPIClient):
+
+ def __init__(self):
+ super().__init__("a" * 73, "b")
+
+ def init_app(self, app):
+ self.base_url = app.config['API_HOST_NAME']
+ self.service_id = app.config['ADMIN_CLIENT_USER_NAME']
+ self.api_key = app.config['ADMIN_CLIENT_SECRET']
+
+ def get_organisations(self):
+ return self.get(url='/organisations')
+
+ def get_organisation(self, org_id):
+ return self.get(url='/organisations/{}'.format(org_id))
+
+ def create_organisation(self, name):
+ data = {
+ "name": name
+ }
+ return self.post(url="/organisations", data=data)
+
+ def update_organisation(self, org_id, name):
+ data = {
+ "name": name
+ }
+ return self.post(url="/organisations/{}".format(org_id), data=data)
diff --git a/app/templates/views/organisations/manage-organisation.html b/app/templates/views/organisations/manage-organisation.html
new file mode 100644
index 000000000..b9d18cea7
--- /dev/null
+++ b/app/templates/views/organisations/manage-organisation.html
@@ -0,0 +1,24 @@
+{% extends "views/platform-admin/_base_template.html" %}
+{% from "components/page-footer.html" import page_footer %}
+{% from "components/textbox.html" import textbox, colour_textbox %}
+
+{% block per_page_title %}
+ {{ '{} an organisation'.format('Update' if organisation else 'Create')}}
+{% endblock %}
+
+{% block service_page_title %}
+ {{ '{} an organisation'.format('Update' if organisation else 'Create')}}
+{% endblock %}
+
+{% block platform_admin_content %}
+
+ {{ '{} an organisation'.format('Update' if organisation else 'Create')}}
+
+{% endblock %}
diff --git a/app/templates/views/organisations/organisations.html b/app/templates/views/organisations/organisations.html
new file mode 100644
index 000000000..136e61d4a
--- /dev/null
+++ b/app/templates/views/organisations/organisations.html
@@ -0,0 +1,33 @@
+{% extends "views/platform-admin/_base_template.html" %}
+{% from "components/page-footer.html" import page_footer %}
+
+{% block per_page_title %}
+ Organisations
+{% endblock %}
+
+{% block service_page_title %}
+ Organisations
+{% endblock %}
+
+{% block platform_admin_content %}
+
+
+ Organisations
+
+
+
+
+{% endblock %}
diff --git a/app/templates/views/organisations/view-organisation.html b/app/templates/views/organisations/view-organisation.html
new file mode 100644
index 000000000..bcb7ce474
--- /dev/null
+++ b/app/templates/views/organisations/view-organisation.html
@@ -0,0 +1,23 @@
+{% extends "views/platform-admin/_base_template.html" %}
+{% from "components/page-footer.html" import page_footer %}
+
+{% block per_page_title %}
+ {{ organisation['name'] }}
+{% endblock %}
+
+{% block service_page_title %}
+ {{ organisation['name'] }}
+{% endblock %}
+
+{% block platform_admin_content %}
+
+
+
{{ organisation['name'] }}
+
+
+
+ [List of services]
+
+
+
+{% endblock %}
diff --git a/app/templates/views/platform-admin/_base_template.html b/app/templates/views/platform-admin/_base_template.html
index da8d6dd9f..786a79dfb 100644
--- a/app/templates/views/platform-admin/_base_template.html
+++ b/app/templates/views/platform-admin/_base_template.html
@@ -11,10 +11,11 @@
Platform admin