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:
Chris Hill-Scott
2018-02-06 10:55:29 +00:00
parent 911fc3ff4c
commit 91ab54e9c1
2 changed files with 103 additions and 89 deletions

View File

@@ -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 Majestys 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,
)