mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-07 17:28:24 -04:00
Merge pull request #235 from alphagov/fix-bad-first-column
Validate column heading.
This commit is contained in:
@@ -27,7 +27,8 @@ from app.main.dao import templates_dao
|
|||||||
from app.main.dao import services_dao
|
from app.main.dao import services_dao
|
||||||
from app import job_api_client
|
from app import job_api_client
|
||||||
from app.utils import (
|
from app.utils import (
|
||||||
validate_recipient, InvalidPhoneError, InvalidEmailError, user_has_permissions)
|
validate_recipient, validate_header_row, InvalidPhoneError, InvalidEmailError, user_has_permissions,
|
||||||
|
InvalidHeaderError)
|
||||||
from utils.process_csv import first_column_heading
|
from utils.process_csv import first_column_heading
|
||||||
|
|
||||||
|
|
||||||
@@ -284,6 +285,7 @@ def _get_rows(contents, raw_template):
|
|||||||
values=row,
|
values=row,
|
||||||
drop_values={first_column_heading[raw_template['template_type']]}
|
drop_values={first_column_heading[raw_template['template_type']]}
|
||||||
).replaced
|
).replaced
|
||||||
except (InvalidEmailError, InvalidPhoneError, NeededByTemplateError, NoPlaceholderForDataError):
|
except (InvalidEmailError, InvalidPhoneError, NeededByTemplateError,
|
||||||
|
NoPlaceholderForDataError, InvalidHeaderError):
|
||||||
valid = False
|
valid = False
|
||||||
return {"valid": valid, "rows": rows}
|
return {"valid": valid, "rows": rows}
|
||||||
|
|||||||
16
app/utils.py
16
app/utils.py
@@ -3,7 +3,7 @@ import re
|
|||||||
from functools import wraps
|
from functools import wraps
|
||||||
from flask import (abort, session)
|
from flask import (abort, session)
|
||||||
|
|
||||||
from utils.process_csv import get_recipient_from_row
|
from utils.process_csv import get_recipient_from_row, first_column_heading
|
||||||
|
|
||||||
|
|
||||||
class BrowsableItem(object):
|
class BrowsableItem(object):
|
||||||
@@ -42,6 +42,11 @@ class InvalidPhoneError(Exception):
|
|||||||
self.message = message
|
self.message = message
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidHeaderError(Exception):
|
||||||
|
def __init__(self, message):
|
||||||
|
self.message = message
|
||||||
|
|
||||||
|
|
||||||
def validate_phone_number(number):
|
def validate_phone_number(number):
|
||||||
sanitised_number = number.replace('(', '')
|
sanitised_number = number.replace('(', '')
|
||||||
sanitised_number = sanitised_number.replace(')', '')
|
sanitised_number = sanitised_number.replace(')', '')
|
||||||
@@ -90,12 +95,21 @@ def validate_email_address(email_address):
|
|||||||
|
|
||||||
|
|
||||||
def validate_recipient(row, template_type):
|
def validate_recipient(row, template_type):
|
||||||
|
validate_header_row(row, template_type)
|
||||||
return {
|
return {
|
||||||
'email': validate_email_address,
|
'email': validate_email_address,
|
||||||
'sms': validate_phone_number
|
'sms': validate_phone_number
|
||||||
}[template_type](get_recipient_from_row(row, template_type))
|
}[template_type](get_recipient_from_row(row, template_type))
|
||||||
|
|
||||||
|
|
||||||
|
def validate_header_row(row, template_type):
|
||||||
|
try:
|
||||||
|
column_heading = first_column_heading[template_type]
|
||||||
|
row[column_heading]
|
||||||
|
except KeyError as e:
|
||||||
|
raise InvalidHeaderError('Invalid header name, should be {}'.format(column_heading))
|
||||||
|
|
||||||
|
|
||||||
def user_has_permissions(*permissions, or_=False):
|
def user_has_permissions(*permissions, or_=False):
|
||||||
def wrap(func):
|
def wrap(func):
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
|
|
||||||
from app.utils import user_has_permissions
|
from app.utils import user_has_permissions, validate_header_row, validate_recipient, InvalidHeaderError
|
||||||
from app.main.views.index import index
|
from app.main.views.index import index
|
||||||
from werkzeug.exceptions import Forbidden
|
from werkzeug.exceptions import Forbidden
|
||||||
|
|
||||||
@@ -56,3 +56,11 @@ def test_user_has_permissions_multiple(app_,
|
|||||||
decorator = user_has_permissions('manage_templates', 'manage_users')
|
decorator = user_has_permissions('manage_templates', 'manage_users')
|
||||||
decorated_index = decorator(index)
|
decorated_index = decorator(index)
|
||||||
response = decorated_index()
|
response = decorated_index()
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_header_row():
|
||||||
|
row = {'bad': '+44 7700 900981'}
|
||||||
|
try:
|
||||||
|
validate_header_row(row, 'sms')
|
||||||
|
except InvalidHeaderError as e:
|
||||||
|
assert e.message == 'Invalid header name, should be phone number'
|
||||||
|
|||||||
Reference in New Issue
Block a user