2019-04-16 15:01:54 +01:00
|
|
|
|
from datetime import datetime
|
2017-05-22 17:02:03 +01:00
|
|
|
|
|
2021-06-23 15:56:05 +01:00
|
|
|
|
from notifications_utils.clients.redis import daily_limit_cache_key
|
|
|
|
|
|
|
2020-05-27 11:56:07 +01:00
|
|
|
|
from app.extensions import redis_client
|
2018-04-06 13:37:49 +01:00
|
|
|
|
from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache
|
2015-12-04 14:40:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-11-30 17:01:44 +00:00
|
|
|
|
class ServiceAPIClient(NotifyAdminAPIClient):
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('user-{user_id}')
|
2017-10-04 11:49:32 +01:00
|
|
|
|
def create_service(
|
|
|
|
|
|
self,
|
|
|
|
|
|
service_name,
|
|
|
|
|
|
organisation_type,
|
|
|
|
|
|
message_limit,
|
|
|
|
|
|
restricted,
|
|
|
|
|
|
user_id,
|
|
|
|
|
|
email_from,
|
|
|
|
|
|
):
|
2016-01-14 14:55:07 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Create a service and return the json.
|
|
|
|
|
|
"""
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"name": service_name,
|
2017-10-04 11:49:32 +01:00
|
|
|
|
"organisation_type": organisation_type,
|
2016-11-16 11:44:29 +00:00
|
|
|
|
"active": True,
|
2016-04-12 14:19:51 +01:00
|
|
|
|
"message_limit": message_limit,
|
2016-02-19 16:38:08 +00:00
|
|
|
|
"user_id": user_id,
|
2016-03-31 15:17:05 +01:00
|
|
|
|
"restricted": restricted,
|
2019-02-12 14:02:21 +00:00
|
|
|
|
"email_from": email_from,
|
2016-01-14 14:55:07 +00:00
|
|
|
|
}
|
2016-08-11 14:20:43 +01:00
|
|
|
|
data = _attach_current_user(data)
|
2016-03-13 09:37:17 +00:00
|
|
|
|
return self.post("/service", data)['data']['id']
|
2016-01-14 14:55:07 +00:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.set('service-{service_id}')
|
2016-07-20 11:46:29 +01:00
|
|
|
|
def get_service(self, service_id):
|
2016-01-19 10:23:08 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Retrieve a service.
|
|
|
|
|
|
"""
|
2018-05-09 13:53:02 +01:00
|
|
|
|
return self.get('/service/{0}'.format(service_id))
|
2016-07-25 15:26:43 +01:00
|
|
|
|
|
2021-06-28 10:11:22 +01:00
|
|
|
|
def get_service_statistics(self, service_id, limit_days=None):
|
|
|
|
|
|
return self.get('/service/{0}/statistics'.format(service_id), params={'limit_days': limit_days})['data']
|
2016-01-19 10:23:08 +00:00
|
|
|
|
|
2016-11-09 14:33:35 +00:00
|
|
|
|
def get_services(self, params_dict=None):
|
2016-01-19 10:23:08 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Retrieve a list of services.
|
|
|
|
|
|
"""
|
2016-11-09 14:33:35 +00:00
|
|
|
|
return self.get('/service', params=params_dict)
|
|
|
|
|
|
|
2019-08-13 16:25:26 +01:00
|
|
|
|
def find_services_by_name(self, service_name):
|
|
|
|
|
|
return self.get('/service/find-services-by-name', params={"service_name": service_name})
|
|
|
|
|
|
|
2019-04-25 18:07:40 +01:00
|
|
|
|
def get_live_services_data(self, params_dict=None):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Retrieve a list of live services data with contact names and notification counts.
|
|
|
|
|
|
"""
|
|
|
|
|
|
return self.get('/service/live-services-data', params=params_dict)
|
|
|
|
|
|
|
2016-11-09 14:33:35 +00:00
|
|
|
|
def get_active_services(self, params_dict=None):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Retrieve a list of active services.
|
|
|
|
|
|
"""
|
|
|
|
|
|
params_dict['only_active'] = True
|
|
|
|
|
|
return self.get_services(params_dict)
|
2016-01-19 10:23:08 +00:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2016-08-11 12:32:38 +01:00
|
|
|
|
def update_service(
|
|
|
|
|
|
self,
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
**kwargs
|
|
|
|
|
|
):
|
2016-01-14 14:55:07 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Update a service.
|
|
|
|
|
|
"""
|
2016-08-11 14:20:43 +01:00
|
|
|
|
data = _attach_current_user(kwargs)
|
|
|
|
|
|
disallowed_attributes = set(data.keys()) - {
|
2016-08-11 13:55:42 +01:00
|
|
|
|
'active',
|
2021-01-26 10:41:22 +00:00
|
|
|
|
'billing_contact_email_addresses',
|
|
|
|
|
|
'billing_contact_names',
|
2021-01-25 15:40:49 +00:00
|
|
|
|
'billing_reference',
|
2021-02-01 17:36:04 +00:00
|
|
|
|
'consent_to_research',
|
|
|
|
|
|
'contact_link',
|
|
|
|
|
|
'created_by',
|
2021-01-25 15:40:49 +00:00
|
|
|
|
'count_as_live',
|
2021-02-01 17:36:04 +00:00
|
|
|
|
'email_branding',
|
2016-08-11 13:55:42 +01:00
|
|
|
|
'email_from',
|
2021-02-01 17:36:04 +00:00
|
|
|
|
'free_sms_fragment_limit',
|
|
|
|
|
|
'go_live_at',
|
|
|
|
|
|
'go_live_user',
|
|
|
|
|
|
'letter_branding',
|
|
|
|
|
|
'letter_contact_block',
|
|
|
|
|
|
'message_limit',
|
|
|
|
|
|
'name',
|
|
|
|
|
|
'notes',
|
|
|
|
|
|
'organisation_type',
|
|
|
|
|
|
'permissions',
|
|
|
|
|
|
'prefix_sms',
|
2021-01-25 15:40:49 +00:00
|
|
|
|
'purchase_order_number',
|
2021-02-01 17:36:04 +00:00
|
|
|
|
'rate_limit',
|
2016-08-11 13:55:42 +01:00
|
|
|
|
'reply_to_email_address',
|
2016-08-23 10:15:22 +01:00
|
|
|
|
'research_mode',
|
2021-02-01 17:36:04 +00:00
|
|
|
|
'restricted',
|
2016-08-11 14:20:43 +01:00
|
|
|
|
'sms_sender',
|
2019-02-15 11:03:19 +00:00
|
|
|
|
'volume_email',
|
|
|
|
|
|
'volume_letter',
|
2021-02-01 17:36:04 +00:00
|
|
|
|
'volume_sms',
|
2016-08-11 13:55:42 +01:00
|
|
|
|
}
|
|
|
|
|
|
if disallowed_attributes:
|
|
|
|
|
|
raise TypeError('Not allowed to update service attributes: {}'.format(
|
|
|
|
|
|
", ".join(disallowed_attributes)
|
|
|
|
|
|
))
|
2021-01-25 14:03:16 +00:00
|
|
|
|
|
2016-01-14 14:55:07 +00:00
|
|
|
|
endpoint = "/service/{0}".format(service_id)
|
2016-03-08 10:40:07 +00:00
|
|
|
|
return self.post(endpoint, data)
|
2016-01-14 14:55:07 +00:00
|
|
|
|
|
2019-04-10 17:20:51 +01:00
|
|
|
|
@cache.delete('live-service-and-organisation-counts')
|
|
|
|
|
|
def update_status(self, service_id, live):
|
|
|
|
|
|
return self.update_service(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
message_limit=250000 if live else 50,
|
|
|
|
|
|
restricted=(not live),
|
2019-04-16 15:01:54 +01:00
|
|
|
|
go_live_at=str(datetime.utcnow()) if live else None
|
2019-04-10 17:20:51 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2019-07-08 14:32:18 +01:00
|
|
|
|
@cache.delete('live-service-and-organisation-counts')
|
|
|
|
|
|
def update_count_as_live(self, service_id, count_as_live):
|
|
|
|
|
|
return self.update_service(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
count_as_live=count_as_live,
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-06 13:37:49 +01:00
|
|
|
|
# This method is not cached because it calls through to one which is
|
2016-06-01 16:07:43 +01:00
|
|
|
|
def update_service_with_properties(self, service_id, properties):
|
2016-08-11 12:32:38 +01:00
|
|
|
|
return self.update_service(service_id, **properties)
|
2016-06-01 16:07:43 +01:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2020-05-22 11:19:49 +01:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2020-05-22 17:12:00 +01:00
|
|
|
|
def archive_service(self, service_id, cached_service_user_ids):
|
|
|
|
|
|
if cached_service_user_ids:
|
2020-05-27 11:56:07 +01:00
|
|
|
|
redis_client.delete(*map('user-{}'.format, cached_service_user_ids))
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post('/service/{}/archive'.format(service_id), data=None)
|
2016-11-02 16:53:40 +00:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2017-01-31 15:56:06 +00:00
|
|
|
|
def suspend_service(self, service_id):
|
|
|
|
|
|
return self.post('/service/{}/suspend'.format(service_id), data=None)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2017-01-31 15:56:06 +00:00
|
|
|
|
def resume_service(self, service_id):
|
|
|
|
|
|
return self.post('/service/{}/resume'.format(service_id), data=None)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
|
|
|
|
|
@cache.delete('user-{user_id}')
|
2016-03-23 10:46:31 +00:00
|
|
|
|
def remove_user_from_service(self, service_id, user_id):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Remove a user from a service
|
|
|
|
|
|
"""
|
|
|
|
|
|
endpoint = '/service/{service_id}/users/{user_id}'.format(
|
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
|
user_id=user_id)
|
2016-04-15 11:08:19 +01:00
|
|
|
|
data = _attach_current_user({})
|
|
|
|
|
|
return self.delete(endpoint, data)
|
2016-03-23 10:46:31 +00:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2018-11-08 15:53:33 +00:00
|
|
|
|
def create_service_template(self, name, type_, content, service_id, subject=None, process_type='normal',
|
|
|
|
|
|
parent_folder_id=None):
|
2016-01-14 14:55:07 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Create a service template.
|
|
|
|
|
|
"""
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"name": name,
|
|
|
|
|
|
"template_type": type_,
|
|
|
|
|
|
"content": content,
|
2017-01-18 15:11:34 +00:00
|
|
|
|
"service": service_id,
|
2018-11-08 15:53:33 +00:00
|
|
|
|
"process_type": process_type,
|
2016-01-14 14:55:07 +00:00
|
|
|
|
}
|
2016-02-22 14:14:03 +00:00
|
|
|
|
if subject:
|
|
|
|
|
|
data.update({
|
|
|
|
|
|
'subject': subject
|
|
|
|
|
|
})
|
2018-11-08 15:53:33 +00:00
|
|
|
|
if parent_folder_id:
|
|
|
|
|
|
data.update({
|
|
|
|
|
|
'parent_folder_id': parent_folder_id
|
|
|
|
|
|
})
|
2016-08-11 14:20:43 +01:00
|
|
|
|
data = _attach_current_user(data)
|
2016-01-14 14:55:07 +00:00
|
|
|
|
endpoint = "/service/{0}/template".format(service_id)
|
|
|
|
|
|
return self.post(endpoint, data)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2018-12-19 10:58:35 +00:00
|
|
|
|
def update_service_template(
|
2019-01-29 16:39:47 +00:00
|
|
|
|
self, id_, name, type_, content, service_id, subject=None, process_type=None
|
2018-12-19 10:58:35 +00:00
|
|
|
|
):
|
2016-01-20 09:46:48 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Update a service template.
|
|
|
|
|
|
"""
|
|
|
|
|
|
data = {
|
|
|
|
|
|
'id': id_,
|
|
|
|
|
|
'name': name,
|
|
|
|
|
|
'template_type': type_,
|
|
|
|
|
|
'content': content,
|
|
|
|
|
|
'service': service_id
|
|
|
|
|
|
}
|
2016-02-22 14:14:03 +00:00
|
|
|
|
if subject:
|
|
|
|
|
|
data.update({
|
|
|
|
|
|
'subject': subject
|
|
|
|
|
|
})
|
2017-01-18 15:11:34 +00:00
|
|
|
|
if process_type:
|
|
|
|
|
|
data.update({
|
|
|
|
|
|
'process_type': process_type
|
2018-12-18 18:22:03 +00:00
|
|
|
|
})
|
2016-08-11 14:20:43 +01:00
|
|
|
|
data = _attach_current_user(data)
|
2016-01-20 09:46:48 +00:00
|
|
|
|
endpoint = "/service/{0}/template/{1}".format(service_id, id_)
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(endpoint, data)
|
2016-01-20 09:46:48 +00:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2017-06-26 14:41:00 +01:00
|
|
|
|
def redact_service_template(self, service_id, id_):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2017-06-26 14:41:00 +01:00
|
|
|
|
"/service/{}/template/{}".format(service_id, id_),
|
2017-06-27 18:03:25 +01:00
|
|
|
|
_attach_current_user(
|
|
|
|
|
|
{'redact_personalisation': True}
|
|
|
|
|
|
),
|
2017-06-26 14:41:00 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2018-01-03 10:44:36 +00:00
|
|
|
|
def update_service_template_sender(self, service_id, template_id, reply_to):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
'reply_to': reply_to,
|
|
|
|
|
|
}
|
|
|
|
|
|
data = _attach_current_user(data)
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2018-01-03 10:44:36 +00:00
|
|
|
|
"/service/{0}/template/{1}".format(service_id, template_id),
|
|
|
|
|
|
data
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2019-01-29 15:43:59 +00:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2019-01-29 15:43:59 +00:00
|
|
|
|
def update_service_template_postage(self, service_id, template_id, postage):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2019-01-29 15:43:59 +00:00
|
|
|
|
"/service/{0}/template/{1}".format(service_id, template_id),
|
|
|
|
|
|
_attach_current_user({'postage': postage})
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2020-09-21 16:29:35 +01:00
|
|
|
|
@cache.set('service-{service_id}-template-{template_id}-version-{version}')
|
2018-04-19 10:26:17 +01:00
|
|
|
|
def get_service_template(self, service_id, template_id, version=None):
|
2016-01-19 10:23:08 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Retrieve a service template.
|
|
|
|
|
|
"""
|
|
|
|
|
|
endpoint = '/service/{service_id}/template/{template_id}'.format(
|
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
|
template_id=template_id)
|
2016-05-11 11:20:45 +01:00
|
|
|
|
if version:
|
|
|
|
|
|
endpoint = '{base}/version/{version}'.format(base=endpoint, version=version)
|
2018-04-19 10:26:17 +01:00
|
|
|
|
return self.get(endpoint)
|
2016-05-11 11:20:45 +01:00
|
|
|
|
|
2020-09-21 16:29:35 +01:00
|
|
|
|
@cache.set('service-{service_id}-template-{template_id}-versions')
|
2018-04-19 10:26:17 +01:00
|
|
|
|
def get_service_template_versions(self, service_id, template_id):
|
2016-05-11 11:20:45 +01:00
|
|
|
|
"""
|
|
|
|
|
|
Retrieve a list of versions for a template
|
|
|
|
|
|
"""
|
2016-05-13 17:30:33 +01:00
|
|
|
|
endpoint = '/service/{service_id}/template/{template_id}/versions'.format(
|
2016-05-11 11:20:45 +01:00
|
|
|
|
service_id=service_id,
|
|
|
|
|
|
template_id=template_id
|
|
|
|
|
|
)
|
2018-04-19 10:26:17 +01:00
|
|
|
|
return self.get(endpoint)
|
2016-01-19 10:23:08 +00:00
|
|
|
|
|
2019-09-09 10:59:32 +01:00
|
|
|
|
def get_precompiled_template(self, service_id):
|
|
|
|
|
|
"""
|
|
|
|
|
|
Returns the precompiled template for a service, creating it if it doesn't already exist
|
|
|
|
|
|
"""
|
|
|
|
|
|
return self.get('/service/{}/template/precompiled'.format(service_id))
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.set('service-{service_id}-templates')
|
2018-04-19 10:26:17 +01:00
|
|
|
|
def get_service_templates(self, service_id):
|
2016-01-19 10:23:08 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Retrieve all templates for service.
|
|
|
|
|
|
"""
|
2020-06-19 10:32:44 +01:00
|
|
|
|
endpoint = '/service/{service_id}/template?detailed=False'.format(
|
2016-01-19 10:23:08 +00:00
|
|
|
|
service_id=service_id)
|
2018-04-19 10:26:17 +01:00
|
|
|
|
return self.get(endpoint)
|
2016-01-19 10:23:08 +00:00
|
|
|
|
|
2018-04-19 10:24:35 +01:00
|
|
|
|
# This doesn’t need caching because it calls through to a method which is cached
|
2018-02-21 14:37:27 +00:00
|
|
|
|
def count_service_templates(self, service_id, template_type=None):
|
|
|
|
|
|
return len([
|
|
|
|
|
|
template for template in
|
|
|
|
|
|
self.get_service_templates(service_id)['data']
|
|
|
|
|
|
if (
|
|
|
|
|
|
not template_type
|
|
|
|
|
|
or template['template_type'] == template_type
|
|
|
|
|
|
)
|
|
|
|
|
|
])
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}-templates')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2016-01-14 14:55:07 +00:00
|
|
|
|
def delete_service_template(self, service_id, template_id):
|
|
|
|
|
|
"""
|
2016-05-23 13:59:33 +01:00
|
|
|
|
Set a service template's archived flag to True
|
2016-01-14 14:55:07 +00:00
|
|
|
|
"""
|
|
|
|
|
|
endpoint = "/service/{0}/template/{1}".format(service_id, template_id)
|
2016-05-23 13:59:33 +01:00
|
|
|
|
data = {
|
|
|
|
|
|
'archived': True
|
|
|
|
|
|
}
|
2016-08-11 14:20:43 +01:00
|
|
|
|
data = _attach_current_user(data)
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(endpoint, data=data)
|
2016-03-29 22:50:40 +01:00
|
|
|
|
|
2016-04-21 17:34:01 +01:00
|
|
|
|
# Temp access of service history data. Includes service and api key history
|
|
|
|
|
|
def get_service_history(self, service_id):
|
2019-10-18 16:09:39 +01:00
|
|
|
|
return self.get('/service/{0}/history'.format(service_id))['data']
|
|
|
|
|
|
|
|
|
|
|
|
def get_service_service_history(self, service_id):
|
|
|
|
|
|
return self.get_service_history(service_id)['service_history']
|
|
|
|
|
|
|
|
|
|
|
|
def get_service_api_key_history(self, service_id):
|
|
|
|
|
|
return self.get_service_history(service_id)['api_key_history']
|
2016-04-21 17:34:01 +01:00
|
|
|
|
|
2017-01-30 17:27:09 +00:00
|
|
|
|
def get_monthly_notification_stats(self, service_id, year):
|
|
|
|
|
|
return self.get(url='/service/{}/notifications/monthly?year={}'.format(service_id, year))
|
2016-07-29 10:28:18 +01:00
|
|
|
|
|
2020-06-12 09:05:26 +01:00
|
|
|
|
def get_guest_list(self, service_id):
|
2020-07-27 13:16:52 +01:00
|
|
|
|
return self.get(url='/service/{}/guest-list'.format(service_id))
|
2016-09-20 12:30:00 +01:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2020-06-12 09:05:26 +01:00
|
|
|
|
def update_guest_list(self, service_id, data):
|
2020-07-27 13:16:52 +01:00
|
|
|
|
return self.put(url='/service/{}/guest-list'.format(service_id), data=data)
|
2016-09-20 12:30:00 +01:00
|
|
|
|
|
2019-03-29 15:16:29 +00:00
|
|
|
|
def get_inbound_sms(self, service_id, user_number=''):
|
|
|
|
|
|
# POST prevents the user phone number leaking into our logs
|
|
|
|
|
|
return self.post(
|
2018-03-21 15:08:03 +00:00
|
|
|
|
'/service/{}/inbound-sms'.format(
|
2017-05-24 13:19:31 +01:00
|
|
|
|
service_id,
|
2018-03-21 15:08:03 +00:00
|
|
|
|
),
|
2019-04-02 09:17:13 +01:00
|
|
|
|
data={'phone_number': user_number}
|
2018-03-21 15:08:03 +00:00
|
|
|
|
)
|
2017-05-22 17:02:03 +01:00
|
|
|
|
|
2018-04-04 15:57:31 +01:00
|
|
|
|
def get_most_recent_inbound_sms(self, service_id, page=None):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
'/service/{}/inbound-sms/most-recent'.format(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
),
|
|
|
|
|
|
params={
|
|
|
|
|
|
'page': page
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2017-05-24 13:19:31 +01:00
|
|
|
|
def get_inbound_sms_by_id(self, service_id, notification_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
'/service/{}/inbound-sms/{}'.format(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
notification_id,
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2017-05-22 17:02:03 +01:00
|
|
|
|
def get_inbound_sms_summary(self, service_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
'/service/{}/inbound-sms/summary'.format(service_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2017-06-20 13:29:20 +01:00
|
|
|
|
def create_service_inbound_api(self, service_id, url, bearer_token, user_id):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"url": url,
|
|
|
|
|
|
"bearer_token": bearer_token,
|
|
|
|
|
|
"updated_by_id": user_id
|
|
|
|
|
|
}
|
|
|
|
|
|
return self.post("/service/{}/inbound-api".format(service_id), data)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2017-06-20 13:06:46 +01:00
|
|
|
|
def update_service_inbound_api(self, service_id, url, bearer_token, user_id, inbound_api_id):
|
2017-06-15 16:20:07 +01:00
|
|
|
|
data = {
|
2017-06-20 13:06:46 +01:00
|
|
|
|
"url": url,
|
2017-06-15 16:20:07 +01:00
|
|
|
|
"updated_by_id": user_id
|
|
|
|
|
|
}
|
2017-06-21 17:34:22 +01:00
|
|
|
|
if bearer_token:
|
|
|
|
|
|
data['bearer_token'] = bearer_token
|
2017-06-20 13:29:20 +01:00
|
|
|
|
return self.post("/service/{}/inbound-api/{}".format(service_id, inbound_api_id), data)
|
2017-06-20 13:06:46 +01:00
|
|
|
|
|
|
|
|
|
|
def get_service_inbound_api(self, service_id, inbound_sms_api_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
"/service/{}/inbound-api/{}".format(
|
|
|
|
|
|
service_id, inbound_sms_api_id
|
|
|
|
|
|
)
|
|
|
|
|
|
)['data']
|
2017-06-15 16:20:07 +01:00
|
|
|
|
|
2018-04-26 17:23:44 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
|
|
|
|
|
def delete_service_inbound_api(self, service_id, callback_api_id):
|
|
|
|
|
|
return self.delete("/service/{}/inbound-api/{}".format(
|
|
|
|
|
|
service_id, callback_api_id
|
|
|
|
|
|
))
|
|
|
|
|
|
|
2017-09-25 15:14:13 +01:00
|
|
|
|
def get_reply_to_email_addresses(self, service_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
"/service/{}/email-reply-to".format(
|
|
|
|
|
|
service_id
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def get_reply_to_email_address(self, service_id, reply_to_email_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
"/service/{}/email-reply-to/{}".format(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
reply_to_email_id
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2019-05-15 15:21:56 +01:00
|
|
|
|
def verify_reply_to_email_address(self, service_id, email_address):
|
2019-05-09 17:55:10 +01:00
|
|
|
|
return self.post(
|
2019-05-15 15:21:56 +01:00
|
|
|
|
"/service/{}/email-reply-to/verify".format(service_id),
|
2019-05-09 17:55:10 +01:00
|
|
|
|
data={"email": email_address}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2017-09-25 15:14:13 +01:00
|
|
|
|
def add_reply_to_email_address(self, service_id, email_address, is_default=False):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2017-09-25 15:14:13 +01:00
|
|
|
|
"/service/{}/email-reply-to".format(service_id),
|
|
|
|
|
|
data={
|
|
|
|
|
|
"email_address": email_address,
|
|
|
|
|
|
"is_default": is_default
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2018-04-26 15:09:37 +01:00
|
|
|
|
def update_reply_to_email_address(self, service_id, reply_to_email_id, email_address, is_default=False):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2017-09-25 15:14:13 +01:00
|
|
|
|
"/service/{}/email-reply-to/{}".format(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
reply_to_email_id,
|
|
|
|
|
|
),
|
|
|
|
|
|
data={
|
|
|
|
|
|
"email_address": email_address,
|
|
|
|
|
|
"is_default": is_default
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-26 15:09:37 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2018-04-26 15:09:37 +01:00
|
|
|
|
def delete_reply_to_email_address(self, service_id, reply_to_email_id):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2018-04-26 15:09:37 +01:00
|
|
|
|
"/service/{}/email-reply-to/{}/archive".format(service_id, reply_to_email_id),
|
|
|
|
|
|
data=None
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2017-10-05 15:47:12 +01:00
|
|
|
|
def get_letter_contacts(self, service_id):
|
2017-10-24 15:37:44 +01:00
|
|
|
|
return self.get("/service/{}/letter-contact".format(service_id))
|
2017-10-05 15:47:12 +01:00
|
|
|
|
|
|
|
|
|
|
def get_letter_contact(self, service_id, letter_contact_id):
|
2017-10-24 15:37:44 +01:00
|
|
|
|
return self.get("/service/{}/letter-contact/{}".format(service_id, letter_contact_id))
|
2017-10-05 15:47:12 +01:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2017-10-05 15:47:12 +01:00
|
|
|
|
def add_letter_contact(self, service_id, contact_block, is_default=False):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2017-10-05 15:47:12 +01:00
|
|
|
|
"/service/{}/letter-contact".format(service_id),
|
|
|
|
|
|
data={
|
|
|
|
|
|
"contact_block": contact_block,
|
|
|
|
|
|
"is_default": is_default
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2017-10-05 15:47:12 +01:00
|
|
|
|
def update_letter_contact(self, service_id, letter_contact_id, contact_block, is_default=False):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2017-10-05 15:47:12 +01:00
|
|
|
|
"/service/{}/letter-contact/{}".format(
|
|
|
|
|
|
service_id,
|
|
|
|
|
|
letter_contact_id,
|
|
|
|
|
|
),
|
|
|
|
|
|
data={
|
|
|
|
|
|
"contact_block": contact_block,
|
|
|
|
|
|
"is_default": is_default
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2019-07-04 16:11:19 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2019-07-04 16:11:19 +01:00
|
|
|
|
def delete_letter_contact(self, service_id, letter_contact_id):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2019-07-04 16:11:19 +01:00
|
|
|
|
"/service/{}/letter-contact/{}/archive".format(service_id, letter_contact_id),
|
|
|
|
|
|
data=None
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2017-10-24 15:37:44 +01:00
|
|
|
|
def get_sms_senders(self, service_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
"/service/{}/sms-sender".format(service_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def get_sms_sender(self, service_id, sms_sender_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
"/service/{}/sms-sender/{}".format(service_id, sms_sender_id)
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2017-10-24 15:37:44 +01:00
|
|
|
|
def add_sms_sender(self, service_id, sms_sender, is_default=False, inbound_number_id=None):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"sms_sender": sms_sender,
|
|
|
|
|
|
"is_default": is_default
|
|
|
|
|
|
}
|
|
|
|
|
|
if inbound_number_id:
|
|
|
|
|
|
data["inbound_number_id"] = inbound_number_id
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post("/service/{}/sms-sender".format(service_id), data=data)
|
2017-10-24 15:37:44 +01:00
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2018-04-26 15:09:37 +01:00
|
|
|
|
def update_sms_sender(self, service_id, sms_sender_id, sms_sender, is_default=False):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2017-10-24 15:37:44 +01:00
|
|
|
|
"/service/{}/sms-sender/{}".format(service_id, sms_sender_id),
|
2018-04-26 15:09:37 +01:00
|
|
|
|
data={
|
|
|
|
|
|
"sms_sender": sms_sender,
|
|
|
|
|
|
"is_default": is_default
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@cache.delete('service-{service_id}')
|
2022-02-22 12:28:23 +00:00
|
|
|
|
@cache.delete_by_pattern('service-{service_id}-template-*')
|
2018-04-26 15:09:37 +01:00
|
|
|
|
def delete_sms_sender(self, service_id, sms_sender_id):
|
2022-02-22 12:28:23 +00:00
|
|
|
|
return self.post(
|
2018-04-26 15:09:37 +01:00
|
|
|
|
"/service/{}/sms-sender/{}/archive".format(service_id, sms_sender_id),
|
|
|
|
|
|
data=None
|
2017-10-24 15:37:44 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2017-12-04 15:07:11 +00:00
|
|
|
|
def get_service_callback_api(self, service_id, callback_api_id):
|
|
|
|
|
|
return self.get(
|
|
|
|
|
|
"/service/{}/delivery-receipt-api/{}".format(
|
|
|
|
|
|
service_id, callback_api_id
|
|
|
|
|
|
)
|
|
|
|
|
|
)['data']
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2017-12-04 15:07:11 +00:00
|
|
|
|
def update_service_callback_api(self, service_id, url, bearer_token, user_id, callback_api_id):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"url": url,
|
|
|
|
|
|
"updated_by_id": user_id
|
|
|
|
|
|
}
|
|
|
|
|
|
if bearer_token:
|
|
|
|
|
|
data['bearer_token'] = bearer_token
|
|
|
|
|
|
return self.post("/service/{}/delivery-receipt-api/{}".format(service_id, callback_api_id), data)
|
|
|
|
|
|
|
2018-04-26 17:23:44 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
|
|
|
|
|
def delete_service_callback_api(self, service_id, callback_api_id):
|
|
|
|
|
|
return self.delete("/service/{}/delivery-receipt-api/{}".format(
|
|
|
|
|
|
service_id, callback_api_id
|
|
|
|
|
|
))
|
|
|
|
|
|
|
2018-04-20 16:32:02 +01:00
|
|
|
|
@cache.delete('service-{service_id}')
|
2017-12-04 15:07:11 +00:00
|
|
|
|
def create_service_callback_api(self, service_id, url, bearer_token, user_id):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"url": url,
|
|
|
|
|
|
"bearer_token": bearer_token,
|
|
|
|
|
|
"updated_by_id": user_id
|
|
|
|
|
|
}
|
|
|
|
|
|
return self.post("/service/{}/delivery-receipt-api".format(service_id), data)
|
2018-07-13 16:47:26 +01:00
|
|
|
|
|
2018-12-03 17:19:38 +00:00
|
|
|
|
@cache.delete('service-{service_id}-data-retention')
|
2018-07-13 16:47:26 +01:00
|
|
|
|
def create_service_data_retention(self, service_id, notification_type, days_of_retention):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"notification_type": notification_type,
|
|
|
|
|
|
"days_of_retention": days_of_retention
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return self.post("/service/{}/data-retention".format(service_id), data)
|
|
|
|
|
|
|
2018-12-03 17:19:38 +00:00
|
|
|
|
@cache.delete('service-{service_id}-data-retention')
|
2018-07-13 16:47:26 +01:00
|
|
|
|
def update_service_data_retention(self, service_id, data_retention_id, days_of_retention):
|
|
|
|
|
|
data = {
|
|
|
|
|
|
"days_of_retention": days_of_retention
|
|
|
|
|
|
}
|
|
|
|
|
|
return self.post("/service/{}/data-retention/{}".format(service_id, data_retention_id), data)
|
|
|
|
|
|
|
2018-12-03 17:19:38 +00:00
|
|
|
|
@cache.set('service-{service_id}-data-retention')
|
2018-07-13 16:47:26 +01:00
|
|
|
|
def get_service_data_retention(self, service_id):
|
|
|
|
|
|
return self.get("/service/{}/data-retention".format(service_id))
|
|
|
|
|
|
|
2020-03-03 17:40:50 +00:00
|
|
|
|
@cache.set('service-{service_id}-returned-letters-statistics')
|
|
|
|
|
|
def get_returned_letter_statistics(self, service_id):
|
|
|
|
|
|
return self.get("service/{}/returned-letter-statistics".format(service_id))
|
|
|
|
|
|
|
2020-02-12 11:42:06 +00:00
|
|
|
|
@cache.set('service-{service_id}-returned-letters-summary')
|
2019-12-17 17:23:00 +00:00
|
|
|
|
def get_returned_letter_summary(self, service_id):
|
|
|
|
|
|
return self.get("service/{}/returned-letter-summary".format(service_id))
|
|
|
|
|
|
|
|
|
|
|
|
def get_returned_letters(self, service_id, reported_at):
|
|
|
|
|
|
return self.get("service/{}/returned-letters?reported_at={}".format(service_id, reported_at))
|
2018-10-26 15:39:32 +01:00
|
|
|
|
|
2021-02-15 21:02:37 +00:00
|
|
|
|
@cache.delete('service-{service_id}')
|
|
|
|
|
|
def set_service_broadcast_settings(
|
2021-07-13 17:06:35 +01:00
|
|
|
|
self, service_id, service_mode, broadcast_channel, provider_restriction, cached_service_user_ids
|
2021-02-15 21:02:37 +00:00
|
|
|
|
):
|
|
|
|
|
|
"""
|
|
|
|
|
|
service_mode is one of "training" or "live"
|
2021-07-13 17:06:35 +01:00
|
|
|
|
broadcast channel is one of "operator", "test", "severe", "government"
|
2021-05-10 14:35:18 +01:00
|
|
|
|
provider_restriction is one of "all", "three", "o2", "vodafone", "ee"
|
2021-02-15 21:02:37 +00:00
|
|
|
|
"""
|
2021-07-13 17:06:35 +01:00
|
|
|
|
if cached_service_user_ids:
|
|
|
|
|
|
redis_client.delete(*map('user-{}'.format, cached_service_user_ids))
|
|
|
|
|
|
|
2021-02-15 21:02:37 +00:00
|
|
|
|
data = {
|
|
|
|
|
|
"service_mode": service_mode,
|
|
|
|
|
|
"broadcast_channel": broadcast_channel,
|
|
|
|
|
|
"provider_restriction": provider_restriction
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return self.post("/service/{}/set-as-broadcast-service".format(service_id), data)
|
|
|
|
|
|
|
2021-06-23 15:56:05 +01:00
|
|
|
|
def get_notification_count(self, service_id):
|
|
|
|
|
|
# if cache is not set return 0
|
|
|
|
|
|
count = redis_client.get(daily_limit_cache_key(service_id)) or 0
|
|
|
|
|
|
return int(count)
|
|
|
|
|
|
|
2019-12-18 11:53:46 +00:00
|
|
|
|
|
2018-10-26 15:39:32 +01:00
|
|
|
|
service_api_client = ServiceAPIClient()
|