mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-11 17:38:50 -04:00
Allow lookup of org details
This commit: - makes the logic around looking up a domain a bit more sophisticated by matching on the longest domain name first - exposes the details about an organisation to consumers of the `GovernmentDomain` class
This commit is contained in:
162
app/utils.py
162
app/utils.py
@@ -439,131 +439,117 @@ class NotGovernmentDomain(Exception):
|
||||
class GovernmentDomain:
|
||||
|
||||
domains = {
|
||||
"gov.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"mod.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"mil.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"ddc-mod.org": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"gov.uk": None,
|
||||
"mod.uk": None,
|
||||
"mil.uk": None,
|
||||
"ddc-mod.org": None,
|
||||
"slc.co.uk": {
|
||||
"owner": "Student Loans Company",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"gov.scot": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"gov.scot": None,
|
||||
"parliament.uk": {
|
||||
"owner": "Parliament",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"nhs.uk": {
|
||||
"owner": "NHS",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"nhs.net": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"police.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"nhs.net": "nhs.uk",
|
||||
"police.uk": None,
|
||||
"dclgdatamart.co.uk": {
|
||||
"owner": None,
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"ucds.email": {
|
||||
"dwp.gov.uk": {
|
||||
"owner": "Deparment for Work and Pensions",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"dwp.gsi.gov.uk": "dwp.gov.uk",
|
||||
"ucds.email": "dwp.gov.uk",
|
||||
"naturalengland.org.uk": {
|
||||
"Owner": "Natural England",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"hmcts.net": {
|
||||
"owner": "Her Majesty’s Courts and Tribunals Service",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"scotent.co.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"assembly.wales": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"cjsm.net": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"cqc.org.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"scotent.co.uk": None,
|
||||
"assembly.wales": None,
|
||||
"cjsm.net": None,
|
||||
"cqc.org.uk": None,
|
||||
"bl.uk": {
|
||||
"owner": "British Library",
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"stfc.ac.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"wmfs.net": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"bbsrc.ac.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"acas.org.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"gov.wales": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"biglotteryfund.org.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"stfc.ac.uk": None,
|
||||
"wmfs.net": None,
|
||||
"bbsrc.ac.uk": None,
|
||||
"acas.org.uk": None,
|
||||
"gov.wales": None,
|
||||
"biglotteryfund.org.uk": None,
|
||||
"marinemanagement.org.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
"owner": "Marine Management Organisation",
|
||||
},
|
||||
"britishmuseum.org": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"derrystrabane.com": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
},
|
||||
"highwaysengland.co.uk": {
|
||||
"sector": None,
|
||||
"agreement_signed": False,
|
||||
"owner": "British Museum",
|
||||
},
|
||||
"derrystrabane.com": None,
|
||||
"highwaysengland.co.uk": None,
|
||||
}
|
||||
|
||||
def __init__(self, email_address_or_domain):
|
||||
|
||||
for domain, attributes in self.domains.items():
|
||||
if re.search(
|
||||
"[\.|@]({})$".format(domain.replace(".", "\.")),
|
||||
email_address_or_domain.lower()
|
||||
):
|
||||
return
|
||||
try:
|
||||
self._match = sorted(
|
||||
(
|
||||
domain for domain in self.domains.keys()
|
||||
if self._domain_matches(email_address_or_domain, domain)
|
||||
),
|
||||
key=len
|
||||
)[0]
|
||||
except IndexError:
|
||||
raise NotGovernmentDomain()
|
||||
|
||||
raise NotGovernmentDomain()
|
||||
self.owner, self.sector, self.agreement_signed = self._get_details_of_domain()
|
||||
|
||||
@staticmethod
|
||||
def _domain_matches(email_address_or_domain, domain):
|
||||
|
||||
email_address_or_domain = email_address_or_domain.lower()
|
||||
|
||||
return (email_address_or_domain == domain) or re.search(
|
||||
"[\.|@]({})$".format(domain.replace(".", "\.")),
|
||||
email_address_or_domain
|
||||
)
|
||||
|
||||
def _get_details_of_domain(self):
|
||||
|
||||
details = self.domains[self._match]
|
||||
|
||||
if isinstance(details, str):
|
||||
return GovernmentDomain(details)._get_details_of_domain()
|
||||
|
||||
elif isinstance(details, dict):
|
||||
return(
|
||||
details.get("owner"),
|
||||
details.get("sector"),
|
||||
bool(details.get("agreement_signed")),
|
||||
)
|
||||
|
||||
else:
|
||||
return(
|
||||
None,
|
||||
None,
|
||||
False,
|
||||
)
|
||||
|
||||
@@ -13,7 +13,8 @@ from app.utils import (
|
||||
generate_next_dict,
|
||||
Spreadsheet,
|
||||
get_letter_timings,
|
||||
get_cdn_domain
|
||||
get_cdn_domain,
|
||||
GovernmentDomain,
|
||||
)
|
||||
from tests.conftest import fake_uuid
|
||||
|
||||
@@ -307,3 +308,30 @@ def test_get_cdn_domain_on_non_localhost(client, mocker):
|
||||
mocker.patch.dict('app.current_app.config', values={'ADMIN_BASE_URL': 'https://some.admintest.com'})
|
||||
domain = get_cdn_domain()
|
||||
assert domain == 'static-logos.admintest.com'
|
||||
|
||||
|
||||
@pytest.mark.parametrize("domain_or_email_address", (
|
||||
"test@ucds.email", "test@dwp.gsi.gov.uk", "test@dwp.gov.uk", "dwp.gov.uk",
|
||||
))
|
||||
def test_get_valid_government_domain_known_details(domain_or_email_address):
|
||||
government_domain = GovernmentDomain(domain_or_email_address)
|
||||
assert government_domain.sector is None
|
||||
assert government_domain.owner is None
|
||||
assert government_domain.agreement_signed is False
|
||||
|
||||
|
||||
@pytest.mark.parametrize("domain_or_email_address", (
|
||||
"test@police.gov.uk", "police.gov.uk",
|
||||
))
|
||||
def test_get_valid_government_domain_unknown_details(domain_or_email_address):
|
||||
government_domain = GovernmentDomain(domain_or_email_address)
|
||||
assert government_domain.sector is None
|
||||
assert government_domain.owner is None
|
||||
assert government_domain.agreement_signed is False
|
||||
|
||||
|
||||
def test_get_valid_government_domain_some_known_details():
|
||||
government_domain = GovernmentDomain("marinemanagement.org.uk")
|
||||
assert government_domain.sector is None
|
||||
assert government_domain.owner == "Marine Management Organisation"
|
||||
assert government_domain.agreement_signed is False
|
||||
|
||||
Reference in New Issue
Block a user