diff --git a/app/main/dao/services_dao.py b/app/main/dao/services_dao.py deleted file mode 100644 index 69b8946b1..000000000 --- a/app/main/dao/services_dao.py +++ /dev/null @@ -1,91 +0,0 @@ -from flask import url_for, current_app -from app import service_api_client -from app.utils import BrowsableItem - - -def update_service(service): - return service_api_client.update_service( - service['id'], - service['name'], - service['active'], - service['limit'], - service['restricted'], - service['users']) - - -def get_service_by_id(id_): - return service_api_client.get_service(id_) - - -def get_service_by_id_or_404(id_): - return service_api_client.get_service(id_)['data'] - - -def get_services(user_id=None): - if user_id: - return service_api_client.get_services({'user_id': str(user_id)}) - else: - return service_api_client.get_services() - - -def unrestrict_service(service_id): - resp = service_api_client.get_service(service_id) - if resp['data']['restricted']: - resp = service_api_client.update_service( - service_id, - resp['data']['name'], - resp['data']['active'], - resp['data']['limit'], - False, - resp['data']['users']) - - -def activate_service(service_id): - resp = service_api_client.get_service(service_id) - if not resp['data']['active']: - resp = service_api_client.update_service( - service_id, - resp['data']['name'], - True, - resp['data']['limit'], - resp['data']['restricted'], - resp['data']['users']) - - -# TODO Fix when functionality is added to the api. -def find_service_by_service_name(service_name, user_id=None): - resp = service_api_client.get_services(user_id) - retval = None - for srv_json in resp['data']: - if srv_json['name'] == service_name: - retval = srv_json - break - return retval - - -def delete_service(id_): - return service_api_client.delete_service(id_) - - -def find_all_service_names(user_id=None): - resp = service_api_client.get_services(user_id) - return [x['name'] for x in resp['data']] - - -class ServicesBrowsableItem(BrowsableItem): - - @property - def title(self): - return self._item['name'] - - @property - def link(self): - return url_for('main.service_dashboard', service_id=self._item['id']) - - @property - def destructive(self): - return False - - @property - def hint(self): - return None diff --git a/app/main/views/add_service.py b/app/main/views/add_service.py index 9a30f7782..355c9bf09 100644 --- a/app/main/views/add_service.py +++ b/app/main/views/add_service.py @@ -8,7 +8,6 @@ from flask import ( from flask_login import login_required from app.main import main -from app.main.dao import services_dao from app.main.forms import AddServiceForm from app.notify_client.models import InvitedUser @@ -32,7 +31,7 @@ def add_service(): invite_api_client.accept_invite(service_id, invitation.id) return redirect(url_for('main.service_dashboard', service_id=service_id)) - form = AddServiceForm(services_dao.find_all_service_names) + form = AddServiceForm(service_api_client.find_all_service_names) heading = 'Which service do you want to set up notifications for?' if form.validate_on_submit(): session['service_name'] = form.name.data diff --git a/app/main/views/all_services.py b/app/main/views/all_services.py index 0efd1171d..0f913137d 100644 --- a/app/main/views/all_services.py +++ b/app/main/views/all_services.py @@ -3,13 +3,13 @@ from flask_login import login_required from app import service_api_client from app.main import main -from app.main.dao import services_dao from app.utils import user_has_permissions +from app.notify_client.api_client import ServicesBrowsableItem @main.route("/all-services") @login_required @user_has_permissions(None, admin_override=True) def show_all_services(): - services = [services_dao.ServicesBrowsableItem(x) for x in service_api_client.get_services()['data']] + services = [ServicesBrowsableItem(x) for x in service_api_client.get_services()['data']] return render_template('views/all-services.html', services=services) diff --git a/app/main/views/choose_service.py b/app/main/views/choose_service.py index 5ddaf61b0..4da0740e8 100644 --- a/app/main/views/choose_service.py +++ b/app/main/views/choose_service.py @@ -1,8 +1,8 @@ from flask import (render_template, redirect, url_for, session) from flask_login import login_required, current_user -from app.main.dao.services_dao import ServicesBrowsableItem -from app import service_api_client from app.main import main +from app import service_api_client +from app.notify_client.api_client import ServicesBrowsableItem @main.route("/services") @@ -15,15 +15,11 @@ def choose_service(): @main.route("/services-or-dashboard") +@login_required def show_all_services_or_dashboard(): + services = service_api_client.get_services()['data'] - if current_user.is_authenticated(): - - services = service_api_client.get_services()['data'] - - if 1 == len(services): - return redirect(url_for('.service_dashboard', service_id=services[0]['id'])) - else: - return redirect(url_for('.choose_service')) - - return redirect(url_for('main.index')) + if 1 == len(services): + return redirect(url_for('.service_dashboard', service_id=services[0]['id'])) + else: + return redirect(url_for('.choose_service')) diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 93b11cdc9..8194e80d3 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -7,9 +7,8 @@ from flask import ( from flask_login import login_required from app.main import main -from app.main.dao.services_dao import get_service_by_id from app.main.dao import templates_dao -from app import job_api_client, statistics_api_client +from app import (job_api_client, statistics_api_client, service_api_client) from app.utils import user_has_permissions @@ -20,7 +19,7 @@ def service_dashboard(service_id): templates = templates_dao.get_service_templates(service_id)['data'] jobs = job_api_client.get_job(service_id)['data'] - service = get_service_by_id(service_id) + service = service_api_client.get_service(service_id) session['service_name'] = service['data']['name'] session['service_id'] = service['data']['id'] diff --git a/app/main/views/invites.py b/app/main/views/invites.py index 7c48a3f44..5d9ac151b 100644 --- a/app/main/views/invites.py +++ b/app/main/views/invites.py @@ -10,11 +10,11 @@ from flask import ( from notifications_python_client.errors import HTTPError from app.main import main -from app.main.dao.services_dao import get_service_by_id_or_404 from app import ( invite_api_client, - user_api_client + user_api_client, + service_api_client ) @@ -24,7 +24,7 @@ def accept_invite(token): if invited_user.status == 'cancelled': from_user = user_api_client.get_user(invited_user.from_user) - service = get_service_by_id_or_404(invited_user.service) + service = service_api_client.get_service(invited_user.service)['data'] return render_template('views/cancelled-invitation.html', from_user=from_user.name, service_name=service['name']) diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 4e5082d31..13d9ea2ec 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -14,11 +14,13 @@ from flask import ( from flask_login import login_required from utils.template import Template -from app import job_api_client, notification_api_client +from app import (job_api_client, notification_api_client, service_api_client) from app.main import main from app.main.dao import templates_dao -from app.main.dao import services_dao -from app.utils import (get_page_from_request, generate_previous_next_dict, user_has_permissions) +from app.utils import ( + get_page_from_request, + generate_previous_next_dict, + user_has_permissions) @main.route("/services//jobs") @@ -37,7 +39,7 @@ def view_jobs(service_id): @login_required @user_has_permissions() def view_job(service_id, job_id): - service = services_dao.get_service_by_id_or_404(service_id) + service = service_api_client.get_service(service_id)['data'] job = job_api_client.get_job(service_id, job_id)['data'] template = templates_dao.get_service_template_or_404(service_id, job['template'])['data'] notifications = notification_api_client.get_notifications_for_service(service_id, job_id) @@ -66,7 +68,7 @@ def view_job(service_id, job_id): @login_required @user_has_permissions() def view_job_updates(service_id, job_id): - service = services_dao.get_service_by_id_or_404(service_id) + service = service_api_client.get_service(service_id)['data'] job = job_api_client.get_job(service_id, job_id)['data'] notifications = notification_api_client.get_notifications_for_service(service_id, job_id) finished = job['status'] == 'finished' diff --git a/app/main/views/manage_users.py b/app/main/views/manage_users.py index 6006f0553..0c9727301 100644 --- a/app/main/views/manage_users.py +++ b/app/main/views/manage_users.py @@ -20,10 +20,7 @@ from app.main.forms import ( InviteUserForm, PermissionsForm ) -from app.main.dao.services_dao import get_service_by_id -from app import user_api_client -from app import service_api_client -from app import invite_api_client +from app import (user_api_client, service_api_client, invite_api_client) from app.utils import user_has_permissions @@ -54,7 +51,7 @@ def manage_users(service_id): @login_required @user_has_permissions('manage_users', admin_override=True) def invite_user(service_id): - get_service_by_id(service_id) + service = service_api_client.get_service(service_id)['data'] form = InviteUserForm(invalid_email_address=current_user.email_address) @@ -84,9 +81,9 @@ def invite_user(service_id): @user_has_permissions('manage_users', admin_override=True) def edit_user_permissions(service_id, user_id): # TODO we should probably using the service id here in the get user - # call as well. eg. /user/?&service_id=service_id + # call as well. eg. /user/?&service=service_id user = user_api_client.get_user(user_id) - get_service_by_id(service_id) + service = service_api_client.get_service(service_id)['data'] # Need to make the email address read only, or a disabled field? # Do it through the template or the form class? form = PermissionsForm(**{ @@ -115,7 +112,7 @@ def edit_user_permissions(service_id, user_id): @user_has_permissions('manage_users', admin_override=True) def remove_user_from_service(service_id, user_id): user = user_api_client.get_user(user_id) - service = get_service_by_id(service_id) + service = service_api_client.get_service(service_id)['data'] # Need to make the email address read only, or a disabled field? # Do it through the template or the form class? form = PermissionsForm(**{ diff --git a/app/main/views/send.py b/app/main/views/send.py index f766f7394..37cc7a040 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -26,10 +26,7 @@ from app.main.uploader import ( s3download ) from app.main.dao import templates_dao -from app import ( - job_api_client, - service_api_client -) +from app import (job_api_client, service_api_client) from app.utils import user_has_permissions, get_errors_for_csv diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index f596ee1dd..8ce8daa3a 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -13,13 +13,7 @@ from flask_login import ( ) from notifications_python_client import HTTPError -from app.main.dao.services_dao import ( - get_service_by_id, - delete_service, - update_service, - find_all_service_names -) - +from app import service_api_client from app.main import main from app.utils import user_has_permissions from app.main.dao.users_dao import verify_password @@ -30,7 +24,7 @@ from app.main.forms import ConfirmPasswordForm, ServiceNameForm @login_required @user_has_permissions('manage_settings', admin_override=True) def service_settings(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] return render_template( 'views/service-settings.html', @@ -43,9 +37,9 @@ def service_settings(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_name_change(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] - form = ServiceNameForm(find_all_service_names) + form = ServiceNameForm(service_api_client.find_all_service_names) if form.validate_on_submit(): session['service_name_change'] = form.name.data @@ -62,7 +56,7 @@ def service_name_change(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_name_change_confirm(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] # Validate password for form def _check_password(pwd): @@ -72,7 +66,13 @@ def service_name_change_confirm(service_id): if form.validate_on_submit(): service['name'] = session['service_name_change'] try: - update_service(service) + service_api_client.update_service( + service['id'], + service['name'], + service['active'], + service['limit'], + service['restricted'], + service['users']) except HTTPError as e: error_msg = "Duplicate service name '{}'".format(session['service_name_change']) if e.status_code == 400 and error_msg in e.message['name']: @@ -96,7 +96,7 @@ def service_name_change_confirm(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_request_to_go_live(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] if request.method == 'GET': return render_template( 'views/service-settings/request-to-go-live.html', @@ -113,7 +113,7 @@ def service_request_to_go_live(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_status_change(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] if request.method == 'GET': return render_template( @@ -129,7 +129,7 @@ def service_status_change(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_status_change_confirm(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] # Validate password for form def _check_password(pwd): @@ -138,7 +138,13 @@ def service_status_change_confirm(service_id): if form.validate_on_submit(): service['active'] = True - update_service(service) + service_api_client.update_service( + service['id'], + service['name'], + service['active'], + service['limit'], + service['restricted'], + service['users']) return redirect(url_for('.service_settings', service_id=service_id)) return render_template( 'views/service-settings/confirm.html', @@ -152,7 +158,7 @@ def service_status_change_confirm(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_delete(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] if request.method == 'GET': return render_template( @@ -168,7 +174,7 @@ def service_delete(service_id): @login_required @user_has_permissions('manage_settings', admin_override=True) def service_delete_confirm(service_id): - service = get_service_by_id(service_id)['data'] + service = service_api_client.get_service(service_id)['data'] # Validate password for form def _check_password(pwd): @@ -176,7 +182,7 @@ def service_delete_confirm(service_id): form = ConfirmPasswordForm(_check_password) if form.validate_on_submit(): - service = delete_service(service_id) + service = service_api_client.delete_service(service_id) return redirect(url_for('.choose_service')) return render_template( diff --git a/app/main/views/sign_in.py b/app/main/views/sign_in.py index c9aa103a8..d800012c5 100644 --- a/app/main/views/sign_in.py +++ b/app/main/views/sign_in.py @@ -14,9 +14,8 @@ from flask.ext.login import ( ) from app.main import main -from app.main.dao import services_dao -from app import user_api_client +from app import (user_api_client, service_api_client) from app.main.forms import LoginForm @@ -41,7 +40,7 @@ def sign_in(): current_user.id == user.id and \ user.is_active(): confirm_login() - services = services_dao.get_services(user.id).get('data', []) + services = service_api_client.get_services({'user_id': str(user.id)}).get('data', []) if (len(services) == 1): return redirect(url_for('main.service_dashboard', service_id=services[0]['id'])) else: diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 7e34cc79f..9c27f6aeb 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -5,7 +5,7 @@ from app.main import main from app.utils import user_has_permissions from app.main.forms import SMSTemplateForm, EmailTemplateForm from app.main.dao import templates_dao as tdao -from app.main.dao import services_dao as sdao +from app import service_api_client form_objects = { @@ -24,7 +24,7 @@ page_headings = { @user_has_permissions('manage_templates', admin_override=True) def add_service_template(service_id, template_type): - service = sdao.get_service_by_id_or_404(service_id) + service = service_api_client.get_service(service_id) if template_type not in ['sms', 'email']: abort(404) diff --git a/app/main/views/two_factor.py b/app/main/views/two_factor.py index 063819b2d..fede5d9b2 100644 --- a/app/main/views/two_factor.py +++ b/app/main/views/two_factor.py @@ -9,8 +9,9 @@ from flask import ( from flask_login import login_user, current_user from app.main import main -from app.main.dao import users_dao, services_dao +from app.main.dao import users_dao from app.main.forms import TwoFactorForm +from app import service_api_client @main.route('/two-factor', methods=['GET', 'POST']) @@ -29,7 +30,7 @@ def two_factor(): if form.validate_on_submit(): try: user = users_dao.get_user_by_id(user_id) - services = services_dao.get_services(user_id).get('data', []) + services = service_api_client.get_services({'user_id': str(user_id)}).get('data', []) # Check if coming from new password page if 'password' in session['user_details']: user.set_password(session['user_details']['password']) diff --git a/app/notify_client/api_client.py b/app/notify_client/api_client.py index 76c62a796..2711254f6 100644 --- a/app/notify_client/api_client.py +++ b/app/notify_client/api_client.py @@ -1,5 +1,7 @@ from __future__ import unicode_literals +from flask import url_for from notifications_python_client.notifications import NotificationsAPIClient +from app.utils import BrowsableItem class ServiceAPIClient(NotificationsAPIClient): @@ -137,3 +139,26 @@ class ServiceAPIClient(NotificationsAPIClient): """ endpoint = "/service/{0}/template/{1}".format(service_id, template_id) return self.delete(endpoint) + + def find_all_service_names(self, user_id=None): + resp = self.get_services(user_id) + return [x['name'] for x in resp['data']] + + +class ServicesBrowsableItem(BrowsableItem): + + @property + def title(self): + return self._item['name'] + + @property + def link(self): + return url_for('main.service_dashboard', service_id=self._item['id']) + + @property + def destructive(self): + return False + + @property + def hint(self): + return None diff --git a/tests/app/main/views/test_add_service.py b/tests/app/main/views/test_add_service.py index 2b1e1c264..41c444ff4 100644 --- a/tests/app/main/views/test_add_service.py +++ b/tests/app/main/views/test_add_service.py @@ -1,5 +1,4 @@ from flask import url_for -from app.main.dao import services_dao def test_get_should_render_add_service_template(app_, diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index e51e7e602..9cbe24aa8 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -34,7 +34,7 @@ def test_should_show_page_for_one_user( with app_.test_request_context(): with app_.test_client() as client: mocker.patch('app.user_api_client.get_user', return_value=active_user_with_permissions) - mocker.patch('app.service_api_client.get_service', return_value=service) + mocker.patch('app.service_api_client.get_service', return_value={'data': service}) mocker.patch('app.service_api_client.get_services', return_value={'data': [service]}) client.login(active_user_with_permissions) response = client.get(url_for('main.edit_user_permissions', service_id=service['id'], user_id=0)) @@ -55,7 +55,7 @@ def test_edit_user_permissions( with app_.test_client() as client: mocker.patch('app.user_api_client.get_user', return_value=active_user_with_permissions) - mocker.patch('app.service_api_client.get_service', return_value=service) + mocker.patch('app.service_api_client.get_service', return_value={'data': service}) mocker.patch('app.service_api_client.get_services', return_value={'data': [service]}) client.login(active_user_with_permissions) response = client.post(url_for( @@ -126,7 +126,7 @@ def test_edit_some_user_permissions( def _mocks_for_test_manage_users(mocker, active_user_with_permissions, service): mocker.patch('app.user_api_client.get_user', return_value=active_user_with_permissions) - mocker.patch('app.service_api_client.get_service', return_value=service) + mocker.patch('app.service_api_client.get_service', return_value={'data': service}) mocker.patch('app.user_api_client.get_users_for_service', return_value=[active_user_with_permissions]) @@ -239,7 +239,7 @@ def test_manage_users_does_not_show_accepted_invite(app_, with app_.test_request_context(): with app_.test_client() as client: mocker.patch('app.user_api_client.get_user', return_value=active_user_with_permissions) - mocker.patch('app.service_api_client.get_service', return_value=service) + mocker.patch('app.service_api_client.get_service', return_value={'data': service}) mocker.patch('app.service_api_client.get_services', return_value={'data': [service]}) client.login(active_user_with_permissions) mocker.patch('app.user_api_client.get_users_for_service', return_value=[active_user_with_permissions]) @@ -267,7 +267,7 @@ def test_user_cant_invite_themselves( with app_.test_request_context(): with app_.test_client() as client: mocker.patch('app.user_api_client.get_user', return_value=active_user_with_permissions) - mocker.patch('app.service_api_client.get_service', return_value=service) + mocker.patch('app.service_api_client.get_service', return_value={'data': service}) mocker.patch('app.service_api_client.get_services', return_value={'data': [service]}) client.login(active_user_with_permissions) response = client.post(