def upload_contact_list(service_id): form = CsvUploadForm() if form.validate_on_submit(): try: upload_id = ContactList.upload( current_service.id, Spreadsheet.from_file_form(form).as_dict, ) file_name_metadata = unicode_truncate( SanitiseASCII.encode(form.file.data.filename), 1600) ContactList.set_metadata(current_service.id, upload_id, original_file_name=file_name_metadata) return redirect( url_for( '.check_contact_list', service_id=service_id, upload_id=upload_id, )) except (UnicodeDecodeError, BadZipFile, XLRDError): flash( 'Could not read {}. Try using a different file format.'.format( form.file.data.filename)) except (XLDateError): flash(( '{} contains numbers or dates that Notify cannot understand. ' 'Try formatting all columns as ‘text’ or export your file as CSV.' ).format(form.file.data.filename)) return render_template( 'views/uploads/contact-list/upload.html', form=form, allowed_file_extensions=Spreadsheet.ALLOWED_FILE_EXTENSIONS, )
def download_contact_list(service_id, contact_list_id): contact_list = ContactList.from_id(contact_list_id, service_id=service_id) return send_file( filename_or_fp=BytesIO(contact_list.contents.encode('utf-8')), attachment_filename=contact_list.saved_file_name, as_attachment=True, )
def test_get_jobs(mock_get_jobs): contact_list = ContactList({'id': 'a', 'service_id': 'b'}) assert isinstance(contact_list.get_jobs(page=123), PaginatedJobs) # mock_get_jobs mocks the underlying API client method, not # contact_list.get_jobs mock_get_jobs.assert_called_once_with( 'b', contact_list_id='a', statuses={ 'finished', 'sending limits exceeded', 'ready to send', 'scheduled', 'sent to dvla', 'pending', 'in progress', }, page=123, limit_days=None, )
def contact_list(service_id, contact_list_id): contact_list = ContactList.from_id(contact_list_id, service_id=service_id) return render_template( 'views/uploads/contact-list/contact-list.html', contact_list=contact_list, jobs=contact_list.get_jobs( page=1, limit_days=current_service.get_days_of_retention( contact_list.template_type), ), )
def send_from_contact_list(service_id, template_id, contact_list_id): contact_list = ContactList.from_id( contact_list_id, service_id=current_service.id, ) return redirect(url_for( 'main.check_messages', service_id=current_service.id, template_id=template_id, upload_id=contact_list.copy_to_uploads(), contact_list_id=contact_list.id, ))
def delete_contact_list(service_id, contact_list_id): contact_list = ContactList.from_id(contact_list_id, service_id=service_id) if request.method == 'POST': contact_list.delete() return redirect(url_for( '.uploads', service_id=service_id, )) flash([ f"Are you sure you want to delete ‘{contact_list.original_file_name}’?", ], 'delete') return render_template( 'views/uploads/contact-list/contact-list.html', contact_list=contact_list, confirm_delete_banner=True, )
def test_created_at(): created_at = ContactList({ 'created_at': '2016-05-06T07:08:09.061258' }).created_at assert isinstance(created_at, datetime) assert created_at.isoformat() == '2016-05-06T08:08:09.061258+01:00'
def save_contact_list(service_id, upload_id): ContactList.create(current_service.id, upload_id) return redirect(url_for( '.uploads', service_id=current_service.id, ))
def check_contact_list(service_id, upload_id): form = CsvUploadForm() contents = ContactList.download(service_id, upload_id) first_row = contents.splitlines()[0].strip().rstrip( ',') if contents else '' original_file_name = ContactList.get_metadata(service_id, upload_id).get( 'original_file_name', '') template_type = { 'emailaddress': 'email', 'phonenumber': 'sms', }.get(Columns.make_key(first_row)) recipients = RecipientCSV( contents, template=get_sample_template(template_type or 'sms'), whitelist=itertools.chain.from_iterable( [user.name, user.mobile_number, user.email_address] for user in current_service.active_users) if current_service.trial_mode else None, allow_international_sms=current_service.has_permission( 'international_sms'), max_initial_rows_shown=50, max_errors_shown=50, ) non_empty_column_headers = list(filter(None, recipients.column_headers)) if len(non_empty_column_headers ) > 1 or not template_type or not recipients: return render_template( 'views/uploads/contact-list/too-many-columns.html', recipients=recipients, original_file_name=original_file_name, template_type=template_type, form=form, allowed_file_extensions=Spreadsheet.ALLOWED_FILE_EXTENSIONS) if recipients.too_many_rows or not len(recipients): return render_template( 'views/uploads/contact-list/column-errors.html', recipients=recipients, original_file_name=original_file_name, form=form, allowed_file_extensions=Spreadsheet.ALLOWED_FILE_EXTENSIONS) row_errors = get_errors_for_csv(recipients, template_type) if row_errors: return render_template( 'views/uploads/contact-list/row-errors.html', recipients=recipients, original_file_name=original_file_name, row_errors=row_errors, form=form, allowed_file_extensions=Spreadsheet.ALLOWED_FILE_EXTENSIONS) if recipients.has_errors: return render_template( 'views/uploads/contact-list/column-errors.html', recipients=recipients, original_file_name=original_file_name, form=form, allowed_file_extensions=Spreadsheet.ALLOWED_FILE_EXTENSIONS) metadata_kwargs = { 'row_count': len(recipients), 'valid': True, 'original_file_name': original_file_name, 'template_type': template_type } ContactList.set_metadata(service_id, upload_id, **metadata_kwargs) return render_template( 'views/uploads/contact-list/ok.html', recipients=recipients, original_file_name=original_file_name, upload_id=upload_id, )
def contact_list(service_id, contact_list_id): return render_template( 'views/uploads/contact-list/contact-list.html', contact_list=ContactList.from_id(contact_list_id, service_id=service_id), )