From 9de7ae11e8eaf2cb3266de950aba1ba45f1a4d8c Mon Sep 17 00:00:00 2001 From: venusbb Date: Fri, 15 Sep 2017 14:40:56 +0100 Subject: [PATCH 1/6] filter the Notifications result by trial_service_mode --- app/dao/services_dao.py | 9 +++++++-- app/service/rest.py | 13 +++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index b6cca8027..8cd1761e5 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -358,14 +358,19 @@ def dao_fetch_monthly_historical_stats_for_service(service_id, year): @statsd(namespace='dao') -def dao_fetch_todays_stats_for_all_services(include_from_test_key=True): +def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mode_services=True): + + # service_id = db.session.query(Service.id).filter(Service.restricted == True) + query = db.session.query( Notification.notification_type, Notification.status, Notification.service_id, func.count(Notification.id).label('count') + ).join(Service ).filter( - func.date(Notification.created_at) == date.today() + func.date(Notification.created_at) == date.today(), + Service.restricted == trial_mode_services ).group_by( Notification.notification_type, Notification.status, diff --git a/app/service/rest.py b/app/service/rest.py index e64678939..abce123be 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -82,6 +82,7 @@ def get_services(): detailed = request.args.get('detailed') == 'True' user_id = request.args.get('user_id', None) include_from_test_key = request.args.get('include_from_test_key', 'True') != 'False' + trial_mode_services = request.args.get('trial_mode_services') # If start and end date are not set, we are expecting today's stats. today = str(datetime.utcnow().date()) @@ -92,12 +93,15 @@ def get_services(): if user_id: services = dao_fetch_all_services_by_user(user_id, only_active) elif detailed: - return jsonify(data=get_detailed_services(start_date=start_date, end_date=end_date, - only_active=only_active, include_from_test_key=include_from_test_key + result = jsonify(data=get_detailed_services(start_date=start_date, end_date=end_date, + only_active=only_active, include_from_test_key=include_from_test_key, + trial_mode_services = trial_mode_services )) + return result else: services = dao_fetch_all_services(only_active) data = service_schema.dump(services, many=True).data + return jsonify(data=data) @@ -353,10 +357,11 @@ def get_detailed_service(service_id, today_only=False): return detailed_service_schema.dump(service).data -def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True): +def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True, + trial_mode_services=True): services = {service.id: service for service in dao_fetch_all_services(only_active)} if start_date == datetime.utcnow().date(): - stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key) + stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key, trial_mode_services=trial_mode_services) else: stats = fetch_stats_by_date_range_for_all_services(start_date=start_date, From 13c78d9b9de4448fc4122ab85e192e671a06bbcf Mon Sep 17 00:00:00 2001 From: venusbb Date: Fri, 15 Sep 2017 15:00:13 +0100 Subject: [PATCH 2/6] code style changed --- app/dao/services_dao.py | 3 ++- app/service/rest.py | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index 8cd1761e5..15275c399 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -367,7 +367,8 @@ def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mo Notification.status, Notification.service_id, func.count(Notification.id).label('count') - ).join(Service + ).join( + Service ).filter( func.date(Notification.created_at) == date.today(), Service.restricted == trial_mode_services diff --git a/app/service/rest.py b/app/service/rest.py index abce123be..7b5de6a63 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -94,9 +94,10 @@ def get_services(): services = dao_fetch_all_services_by_user(user_id, only_active) elif detailed: result = jsonify(data=get_detailed_services(start_date=start_date, end_date=end_date, - only_active=only_active, include_from_test_key=include_from_test_key, - trial_mode_services = trial_mode_services - )) + only_active=only_active, + include_from_test_key=include_from_test_key, + trial_mode_services=trial_mode_services + )) return result else: services = dao_fetch_all_services(only_active) @@ -361,7 +362,8 @@ def get_detailed_services(start_date, end_date, only_active=False, include_from_ trial_mode_services=True): services = {service.id: service for service in dao_fetch_all_services(only_active)} if start_date == datetime.utcnow().date(): - stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key, trial_mode_services=trial_mode_services) + stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key, + trial_mode_services=trial_mode_services) else: stats = fetch_stats_by_date_range_for_all_services(start_date=start_date, From d59a1f447ade43372dc2d0c3b2cdca1501a89215 Mon Sep 17 00:00:00 2001 From: venusbb Date: Fri, 22 Sep 2017 11:05:36 +0100 Subject: [PATCH 3/6] Progress: Today stats completed --- app/dao/services_dao.py | 12 +++++++++--- app/schemas.py | 14 +++++++++++++- app/service/rest.py | 9 ++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index 15275c399..10ca29ace 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -2,7 +2,7 @@ import uuid from datetime import date, datetime, timedelta from sqlalchemy import asc, func -from sqlalchemy.orm import joinedload +from sqlalchemy.orm import joinedload, lazyload from flask import current_app from app import db @@ -48,6 +48,9 @@ def dao_fetch_all_services(only_active=False): joinedload('users') ) + # import pdb + # pdb.set_trace() + if only_active: query = query.filter(Service.active) @@ -358,7 +361,7 @@ def dao_fetch_monthly_historical_stats_for_service(service_id, year): @statsd(namespace='dao') -def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mode_services=True): +def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mode_services=None): # service_id = db.session.query(Service.id).filter(Service.restricted == True) @@ -371,7 +374,7 @@ def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mo Service ).filter( func.date(Notification.created_at) == date.today(), - Service.restricted == trial_mode_services + # Service.restricted == trial_mode_services ).group_by( Notification.notification_type, Notification.status, @@ -383,6 +386,9 @@ def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mo if not include_from_test_key: query = query.filter(Notification.key_type != KEY_TYPE_TEST) + if trial_mode_services is not None: + query = query.filter(Service.restricted == trial_mode_services) + return query.all() diff --git a/app/schemas.py b/app/schemas.py index 30bca95a0..c5de11a60 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -258,7 +258,19 @@ class DetailedServiceSchema(BaseSchema): 'organisation', 'service_sms_senders', 'monthly_billing', - 'reply_to_email_addresses' + 'reply_to_email_addresses', + 'letter_contact_block', # new exclude from here + 'message_limit', + 'email_from', + 'free_sms_fragment_limit', + 'inbound_api', + 'dvla_organisation', + 'whitelist', + 'reply_to_email_address', + 'sms_sender', + 'permissions', + 'inbound_number', + 'inbound_sms' ) diff --git a/app/service/rest.py b/app/service/rest.py index 7b5de6a63..c211fa1dd 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -87,6 +87,9 @@ def get_services(): # If start and end date are not set, we are expecting today's stats. today = str(datetime.utcnow().date()) + # import pdb + # pdb.set_trace() + start_date = datetime.strptime(request.args.get('start_date', today), '%Y-%m-%d').date() end_date = datetime.strptime(request.args.get('end_date', today), '%Y-%m-%d').date() @@ -377,7 +380,11 @@ def get_detailed_services(start_date, end_date, only_active=False, include_from_ for service in services.values(): if not hasattr(service, 'statistics'): service.statistics = statistics.create_zeroed_stats_dicts() - return detailed_service_schema.dump(services.values(), many=True).data + dd = detailed_service_schema.dump(services.values(), many=True).data + # import pdb + # pdb.set_trace() + return dd + # return detailed_service_schema.dump(services.values(), many=True).data @service_blueprint.route('//whitelist', methods=['GET']) From 4e991c26a20a9896dad25b60ee2cd10eb4130ca9 Mon Sep 17 00:00:00 2001 From: venusbb Date: Fri, 22 Sep 2017 15:39:53 +0100 Subject: [PATCH 4/6] Progress: Filtered day completed --- app/schemas.py | 2 +- app/service/rest.py | 45 +++------------------------------- tests/app/service/test_rest.py | 9 ++++--- 3 files changed, 10 insertions(+), 46 deletions(-) diff --git a/app/schemas.py b/app/schemas.py index 0aca1ab92..e880a1589 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -267,7 +267,7 @@ class DetailedServiceSchema(BaseSchema): 'letter_contact_block', # new exclude from here 'message_limit', 'email_from', - 'free_sms_fragment_limit', + # 'free_sms_fragment_limit', 'inbound_api', 'dvla_organisation', 'whitelist', diff --git a/app/service/rest.py b/app/service/rest.py index aa8dc6347..2eaf9af89 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -46,8 +46,7 @@ from app.dao.service_whitelist_dao import ( dao_add_and_commit_whitelisted_contacts, dao_remove_service_whitelist ) -from app.dao.service_email_reply_to_dao import create_or_update_email_reply_to, dao_get_reply_to_by_service_id, \ - add_reply_to_email_address_for_service, update_reply_to_email_address, dao_get_reply_to_by_id +from app.dao.service_email_reply_to_dao import create_or_update_email_reply_to, dao_get_reply_to_by_service_id from app.dao.provider_statistics_dao import get_fragment_count from app.dao.users_dao import get_user_by_id from app.errors import ( @@ -58,7 +57,6 @@ from app.models import Service, ServiceInboundApi from app.schema_validation import validate from app.service import statistics from app.service.service_inbound_api_schema import service_inbound_api, update_service_inbound_api_schema -from app.service.service_senders_schema import add_service_email_reply_to_request from app.service.utils import get_whitelist_objects from app.service.sender import send_notification_to_service_users from app.service.send_notification import send_one_off_notification @@ -89,9 +87,6 @@ def get_services(): # If start and end date are not set, we are expecting today's stats. today = str(datetime.utcnow().date()) - # import pdb - # pdb.set_trace() - start_date = datetime.strptime(request.args.get('start_date', today), '%Y-%m-%d').date() end_date = datetime.strptime(request.args.get('end_date', today), '%Y-%m-%d').date() @@ -107,7 +102,6 @@ def get_services(): else: services = dao_fetch_all_services(only_active) data = service_schema.dump(services, many=True).data - return jsonify(data=data) @@ -364,7 +358,7 @@ def get_detailed_service(service_id, today_only=False): def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True, - trial_mode_services=True): + trial_mode_services=None): services = {service.id: service for service in dao_fetch_all_services(only_active)} if start_date == datetime.utcnow().date(): stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key, @@ -382,11 +376,7 @@ def get_detailed_services(start_date, end_date, only_active=False, include_from_ for service in services.values(): if not hasattr(service, 'statistics'): service.statistics = statistics.create_zeroed_stats_dicts() - dd = detailed_service_schema.dump(services.values(), many=True).data - # import pdb - # pdb.set_trace() - return dd - # return detailed_service_schema.dump(services.values(), many=True).data + return detailed_service_schema.dump(services.values(), many=True).data @service_blueprint.route('//whitelist', methods=['GET']) @@ -545,35 +535,6 @@ def get_email_reply_to_addresses(service_id): return jsonify([i.serialize() for i in result]), 200 -@service_blueprint.route('//email-reply-to/', methods=["GET"]) -def get_email_reply_to_address(service_id, reply_to_id): - result = dao_get_reply_to_by_id(service_id=service_id, reply_to_id=reply_to_id) - return jsonify(result.serialize()), 200 - - -@service_blueprint.route('//email-reply-to', methods=['POST']) -def add_service_reply_to_email_address(service_id): - # validate the service exists, throws ResultNotFound exception. - dao_fetch_service_by_id(service_id) - form = validate(request.get_json(), add_service_email_reply_to_request) - new_reply_to = add_reply_to_email_address_for_service(service_id=service_id, - email_address=form['email_address'], - is_default=form.get('is_default', True)) - return jsonify(data=new_reply_to.serialize()), 201 - - -@service_blueprint.route('//email-reply-to/', methods=['POST']) -def update_service_reply_to_email_address(service_id, reply_to_email_id): - # validate the service exists, throws ResultNotFound exception. - dao_fetch_service_by_id(service_id) - form = validate(request.get_json(), add_service_email_reply_to_request) - new_reply_to = update_reply_to_email_address(service_id=service_id, - reply_to_id=reply_to_email_id, - email_address=form['email_address'], - is_default=form.get('is_default', True)) - return jsonify(data=new_reply_to.serialize()), 200 - - @service_blueprint.route('/unique', methods=["GET"]) def is_service_name_unique(): name, email_from = check_request_args(request) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 0551ec7c5..7881c3fdf 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -1548,7 +1548,8 @@ def test_get_services_with_detailed_flag_accepts_date_range(client, mocker): start_date=date(2001, 1, 1), end_date=date(2002, 2, 2), only_active=ANY, - include_from_test_key=ANY + include_from_test_key=ANY, + trial_mode_services=ANY ) assert resp.status_code == 200 @@ -1562,11 +1563,13 @@ def test_get_services_with_detailed_flag_defaults_to_today(client, mocker): ) mock_get_detailed_services.assert_called_once_with( - start_date=date(2002, 2, 2), end_date=date(2002, 2, 2), + include_from_test_key=ANY, only_active=ANY, - include_from_test_key=ANY + start_date=date(2002, 2, 2), + trial_mode_services=ANY ) + assert resp.status_code == 200 From 35cb7a05562d7f159d27dfdd6fac80b906cb7cc3 Mon Sep 17 00:00:00 2001 From: venusbb Date: Fri, 22 Sep 2017 15:52:11 +0100 Subject: [PATCH 5/6] inserted missing codes --- app/service/rest.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/app/service/rest.py b/app/service/rest.py index 2eaf9af89..2010044cd 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -46,7 +46,8 @@ from app.dao.service_whitelist_dao import ( dao_add_and_commit_whitelisted_contacts, dao_remove_service_whitelist ) -from app.dao.service_email_reply_to_dao import create_or_update_email_reply_to, dao_get_reply_to_by_service_id +from app.dao.service_email_reply_to_dao import create_or_update_email_reply_to, dao_get_reply_to_by_service_id, \ + add_reply_to_email_address_for_service, update_reply_to_email_address, dao_get_reply_to_by_id from app.dao.provider_statistics_dao import get_fragment_count from app.dao.users_dao import get_user_by_id from app.errors import ( @@ -57,6 +58,7 @@ from app.models import Service, ServiceInboundApi from app.schema_validation import validate from app.service import statistics from app.service.service_inbound_api_schema import service_inbound_api, update_service_inbound_api_schema +from app.service.service_senders_schema import add_service_email_reply_to_request from app.service.utils import get_whitelist_objects from app.service.sender import send_notification_to_service_users from app.service.send_notification import send_one_off_notification @@ -535,6 +537,35 @@ def get_email_reply_to_addresses(service_id): return jsonify([i.serialize() for i in result]), 200 +@service_blueprint.route('//email-reply-to/', methods=["GET"]) +def get_email_reply_to_address(service_id, reply_to_id): + result = dao_get_reply_to_by_id(service_id=service_id, reply_to_id=reply_to_id) + return jsonify(result.serialize()), 200 + + +@service_blueprint.route('//email-reply-to', methods=['POST']) +def add_service_reply_to_email_address(service_id): + # validate the service exists, throws ResultNotFound exception. + dao_fetch_service_by_id(service_id) + form = validate(request.get_json(), add_service_email_reply_to_request) + new_reply_to = add_reply_to_email_address_for_service(service_id=service_id, + email_address=form['email_address'], + is_default=form.get('is_default', True)) + return jsonify(data=new_reply_to.serialize()), 201 + + +@service_blueprint.route('//email-reply-to/', methods=['POST']) +def update_service_reply_to_email_address(service_id, reply_to_email_id): + # validate the service exists, throws ResultNotFound exception. + dao_fetch_service_by_id(service_id) + form = validate(request.get_json(), add_service_email_reply_to_request) + new_reply_to = update_reply_to_email_address(service_id=service_id, + reply_to_id=reply_to_email_id, + email_address=form['email_address'], + is_default=form.get('is_default', True)) + return jsonify(data=new_reply_to.serialize()), 200 + + @service_blueprint.route('/unique', methods=["GET"]) def is_service_name_unique(): name, email_from = check_request_args(request) From 34430ac97eb31ef6cf9603360a265806e0f1e7a0 Mon Sep 17 00:00:00 2001 From: venusbb Date: Mon, 25 Sep 2017 09:44:16 +0100 Subject: [PATCH 6/6] tidy up codes and tests --- app/dao/services_dao.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index 10ca29ace..919856416 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -2,7 +2,7 @@ import uuid from datetime import date, datetime, timedelta from sqlalchemy import asc, func -from sqlalchemy.orm import joinedload, lazyload +from sqlalchemy.orm import joinedload from flask import current_app from app import db @@ -48,9 +48,6 @@ def dao_fetch_all_services(only_active=False): joinedload('users') ) - # import pdb - # pdb.set_trace() - if only_active: query = query.filter(Service.active) @@ -363,8 +360,6 @@ def dao_fetch_monthly_historical_stats_for_service(service_id, year): @statsd(namespace='dao') def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mode_services=None): - # service_id = db.session.query(Service.id).filter(Service.restricted == True) - query = db.session.query( Notification.notification_type, Notification.status, @@ -374,7 +369,6 @@ def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mo Service ).filter( func.date(Notification.created_at) == date.today(), - # Service.restricted == trial_mode_services ).group_by( Notification.notification_type, Notification.status,