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')}}

+
+ {{textbox(form.name)}} + {{ page_footer( + 'Save', + back_link=url_for('.organisations'), + back_link_text='Back to organisations', + ) }} +
+{% 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 +

+ +
+ Create an organisation +
+ +{% 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