Files
notifications-admin/app/models/contact_list.py

114 lines
3.2 KiB
Python
Raw Normal View History

from flask import abort, current_app
from notifications_utils.formatters import strip_whitespace
from notifications_utils.recipients import RecipientCSV
from werkzeug.utils import cached_property
from app.models import JSONModel
from app.notify_client.contact_list_api_client import contact_list_api_client
from app.s3_client.s3_csv_client import (
get_csv_metadata,
s3download,
s3upload,
set_metadata_on_csv_upload,
)
class ContactList(JSONModel):
ALLOWED_PROPERTIES = {
'id',
'created_at',
'created_by',
'service_id',
'original_file_name',
'row_count',
'template_type',
}
@classmethod
def from_id(cls, contact_list_id, *, service_id):
# This is temporary until we have a get single list endpoint
for contact_list in contact_list_api_client.get_contact_lists(service_id):
if contact_list['id'] == contact_list_id:
return cls(contact_list)
abort(404)
@staticmethod
def get_bucket_name():
return current_app.config['CONTACT_LIST_UPLOAD_BUCKET_NAME']
@staticmethod
def upload(service_id, file_dict):
return s3upload(
service_id,
file_dict,
current_app.config['AWS_REGION'],
bucket=ContactList.get_bucket_name(),
)
@staticmethod
def download(service_id, upload_id):
return strip_whitespace(s3download(
service_id,
upload_id,
bucket=ContactList.get_bucket_name(),
))
@staticmethod
def set_metadata(service_id, upload_id, **kwargs):
return set_metadata_on_csv_upload(
service_id,
upload_id,
bucket=ContactList.get_bucket_name(),
**kwargs,
)
@staticmethod
def get_metadata(service_id, upload_id):
return get_csv_metadata(
service_id,
upload_id,
bucket=ContactList.get_bucket_name(),
)
@staticmethod
def copy_to_uploads(service_id, upload_id):
contents = ContactList.download(service_id, upload_id)
metadata = ContactList.get_metadata(service_id, upload_id)
new_upload_id = s3upload(
service_id,
contents,
current_app.config['AWS_REGION'],
)
set_metadata_on_csv_upload(
service_id,
new_upload_id,
**metadata,
)
return new_upload_id
@classmethod
def create(cls, service_id, upload_id):
metadata = cls.get_metadata(service_id, upload_id)
if not metadata.get('valid'):
abort(403)
return cls(contact_list_api_client.create_contact_list(
service_id=service_id,
upload_id=upload_id,
original_file_name=metadata['original_file_name'],
row_count=int(metadata['row_count']),
template_type=metadata['template_type'],
))
@cached_property
def recipients(self):
return RecipientCSV(
self.download(self.service_id, self.id),
template_type=self.template_type,
international_sms=True,
max_initial_rows_shown=50,
)