from flask import ( render_template, redirect, request, url_for, abort, session, flash ) from flask_login import ( login_required, current_user ) from notifications_python_client.errors import HTTPError from app.main.dao.services_dao import ( get_service_by_id, delete_service, update_service, find_all_service_names ) from app.main import main from app.utils import user_has_permissions from app.main.dao.users_dao import verify_password from app.main.forms import ConfirmPasswordForm, ServiceNameForm @main.route("/services//service-settings") @login_required @user_has_permissions('manage_settings') def service_settings(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e return render_template( 'views/service-settings.html', service=service, service_id=service_id ) @main.route("/services//service-settings/name", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_name_change(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e form = ServiceNameForm(find_all_service_names) if form.validate_on_submit(): session['service_name_change'] = form.name.data return redirect(url_for('.service_name_change_confirm', service_id=service_id)) return render_template( 'views/service-settings/name.html', service=service, form=form, service_id=service_id) @main.route("/services//service-settings/name/confirm", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_name_change_confirm(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e # Validate password for form def _check_password(pwd): return verify_password(current_user.id, pwd) form = ConfirmPasswordForm(_check_password) if form.validate_on_submit(): service['name'] = session['service_name_change'] try: update_service(service) 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']: # Redirect the user back to the change service name screen flash('This service name is already in use', 'error') return redirect(url_for('main.service_name_change', service_id=service_id)) else: raise e else: session['service_name'] = service['name'] session.pop('service_name_change') return redirect(url_for('.service_settings', service_id=service_id)) return render_template( 'views/service-settings/confirm.html', heading='Change your service name', form=form, service_id=service_id) @main.route("/services//service-settings/request-to-go-live", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_request_to_go_live(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e if request.method == 'GET': return render_template( 'views/service-settings/request-to-go-live.html', service=service, service_id=service_id ) elif request.method == 'POST': flash('Thanks your request to go live is being processed', 'default') # TODO implement whatever this action would do in the real world return redirect(url_for('.service_settings', service_id=service_id)) @main.route("/services//service-settings/status", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_status_change(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e if request.method == 'GET': return render_template( 'views/service-settings/status.html', service=service, service_id=service_id ) elif request.method == 'POST': return redirect(url_for('.service_status_change_confirm', service_id=service_id)) @main.route("/services//service-settings/status/confirm", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_status_change_confirm(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e # Validate password for form def _check_password(pwd): return verify_password(current_user.id, pwd) form = ConfirmPasswordForm(_check_password) if form.validate_on_submit(): service['active'] = True update_service(service) return redirect(url_for('.service_settings', service_id=service_id)) return render_template( 'views/service-settings/confirm.html', heading='Turn off all outgoing notifications', destructive=True, form=form, service_id=service_id) @main.route("/services//service-settings/delete", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_delete(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e if request.method == 'GET': return render_template( 'views/service-settings/delete.html', service=service, service_id=service_id ) elif request.method == 'POST': return redirect(url_for('.service_delete_confirm', service_id=service_id)) @main.route("/services//service-settings/delete/confirm", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings') def service_delete_confirm(service_id): try: service = get_service_by_id(service_id)['data'] except HTTPError as e: if e.status_code == 404: abort(404) else: raise e # Validate password for form def _check_password(pwd): return verify_password(current_user.id, pwd) form = ConfirmPasswordForm(_check_password) if form.validate_on_submit(): try: service = delete_service(service_id) except HTTPError as e: if e.status_code == 404: abort(404) else: raise e return redirect(url_for('.choose_service')) return render_template( 'views/service-settings/confirm.html', heading='Delete this service from Notify', destructive=True, form=form, service_id=service_id)