2019-07-12 09:03:35 +01:00
|
|
|
|
from flask import abort
|
2019-05-23 17:17:26 +01:00
|
|
|
|
from werkzeug.utils import cached_property
|
2019-04-04 11:18:22 +01:00
|
|
|
|
|
2019-06-12 13:40:57 +01:00
|
|
|
|
from app.models import JSONModel, ModelList
|
2019-09-12 11:49:31 +01:00
|
|
|
|
from app.notify_client.email_branding_client import email_branding_client
|
|
|
|
|
|
from app.notify_client.letter_branding_client import letter_branding_client
|
2019-05-23 17:17:26 +01:00
|
|
|
|
from app.notify_client.organisations_api_client import organisations_client
|
2019-04-04 11:18:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Organisation(JSONModel):
|
|
|
|
|
|
|
2019-09-12 15:03:32 +01:00
|
|
|
|
TYPE_CENTRAL = 'central'
|
|
|
|
|
|
TYPE_LOCAL = 'local'
|
|
|
|
|
|
TYPE_NHS_CENTRAL = 'nhs_central'
|
|
|
|
|
|
TYPE_NHS_LOCAL = 'nhs_local'
|
|
|
|
|
|
TYPE_NHS_GP = 'nhs_gp'
|
|
|
|
|
|
TYPE_EMERGENCY_SERVICE = 'emergency_service'
|
|
|
|
|
|
TYPE_SCHOOL_OR_COLLEGE = 'school_or_college'
|
|
|
|
|
|
TYPE_OTHER = 'other'
|
|
|
|
|
|
|
2019-08-27 15:52:42 +01:00
|
|
|
|
TYPES = (
|
2019-09-12 15:03:32 +01:00
|
|
|
|
(TYPE_CENTRAL, 'Central government'),
|
|
|
|
|
|
(TYPE_LOCAL, 'Local government'),
|
|
|
|
|
|
(TYPE_NHS_CENTRAL, 'NHS – central government agency or public body'),
|
|
|
|
|
|
(TYPE_NHS_LOCAL, 'NHS Trust or Clinical Commissioning Group'),
|
|
|
|
|
|
(TYPE_NHS_GP, 'GP practice'),
|
|
|
|
|
|
(TYPE_EMERGENCY_SERVICE, 'Emergency service'),
|
|
|
|
|
|
(TYPE_SCHOOL_OR_COLLEGE, 'School or college'),
|
|
|
|
|
|
(TYPE_OTHER, 'Other'),
|
2019-08-27 15:52:42 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
2019-04-04 11:18:22 +01:00
|
|
|
|
ALLOWED_PROPERTIES = {
|
|
|
|
|
|
'id',
|
|
|
|
|
|
'name',
|
|
|
|
|
|
'active',
|
|
|
|
|
|
'crown',
|
|
|
|
|
|
'organisation_type',
|
|
|
|
|
|
'letter_branding_id',
|
|
|
|
|
|
'email_branding_id',
|
|
|
|
|
|
'agreement_signed',
|
|
|
|
|
|
'agreement_signed_at',
|
|
|
|
|
|
'agreement_signed_by_id',
|
|
|
|
|
|
'agreement_signed_version',
|
2019-06-18 14:24:29 +01:00
|
|
|
|
'agreement_signed_on_behalf_of_name',
|
|
|
|
|
|
'agreement_signed_on_behalf_of_email_address',
|
2019-04-04 11:18:22 +01:00
|
|
|
|
'domains',
|
2019-05-13 14:50:40 +01:00
|
|
|
|
'request_to_go_live_notes',
|
2019-06-12 12:09:26 +01:00
|
|
|
|
'count_of_live_services',
|
2019-04-04 11:18:22 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-23 17:17:26 +01:00
|
|
|
|
@classmethod
|
|
|
|
|
|
def from_id(cls, org_id):
|
|
|
|
|
|
return cls(organisations_client.get_organisation(org_id))
|
|
|
|
|
|
|
2019-06-13 14:23:02 +01:00
|
|
|
|
@classmethod
|
|
|
|
|
|
def from_domain(cls, domain):
|
|
|
|
|
|
return cls(organisations_client.get_organisation_by_domain(domain))
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def from_service(cls, service_id):
|
|
|
|
|
|
return cls(organisations_client.get_service_organisation(service_id))
|
|
|
|
|
|
|
2019-07-02 10:01:29 +01:00
|
|
|
|
@classmethod
|
|
|
|
|
|
def create_from_form(cls, form):
|
|
|
|
|
|
return cls.create(
|
|
|
|
|
|
name=form.name.data,
|
|
|
|
|
|
crown={
|
|
|
|
|
|
'crown': True,
|
|
|
|
|
|
'non-crown': False,
|
|
|
|
|
|
'unknown': None,
|
|
|
|
|
|
}.get(form.crown_status.data),
|
|
|
|
|
|
organisation_type=form.organisation_type.data,
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
|
def create(cls, name, crown, organisation_type, agreement_signed=False):
|
|
|
|
|
|
return cls(organisations_client.create_organisation(
|
|
|
|
|
|
name=name,
|
|
|
|
|
|
crown=crown,
|
|
|
|
|
|
organisation_type=organisation_type,
|
|
|
|
|
|
agreement_signed=agreement_signed,
|
|
|
|
|
|
))
|
|
|
|
|
|
|
2019-04-04 11:18:22 +01:00
|
|
|
|
def __init__(self, _dict):
|
|
|
|
|
|
|
|
|
|
|
|
super().__init__(_dict)
|
|
|
|
|
|
|
|
|
|
|
|
if self._dict == {}:
|
2019-05-03 13:35:52 +01:00
|
|
|
|
self.name = None
|
|
|
|
|
|
self.crown = None
|
|
|
|
|
|
self.agreement_signed = None
|
|
|
|
|
|
self.domains = []
|
|
|
|
|
|
self.organisation_type = None
|
2019-05-13 14:50:40 +01:00
|
|
|
|
self.request_to_go_live_notes = None
|
2019-09-12 13:45:35 +01:00
|
|
|
|
self.email_branding_id = None
|
2019-04-04 11:18:22 +01:00
|
|
|
|
|
2019-07-12 09:03:35 +01:00
|
|
|
|
def as_agreement_statement_for_go_live_request(self, fallback_domain):
|
2019-04-04 11:18:22 +01:00
|
|
|
|
if self.agreement_signed:
|
2019-05-13 14:50:40 +01:00
|
|
|
|
agreement_statement = 'Yes, on behalf of {}.'.format(self.name)
|
2019-04-04 11:23:40 +01:00
|
|
|
|
elif self.name:
|
2019-05-13 14:50:40 +01:00
|
|
|
|
agreement_statement = '{} (organisation is {}, {}).'.format(
|
2019-04-04 11:18:22 +01:00
|
|
|
|
{
|
|
|
|
|
|
False: 'No',
|
|
|
|
|
|
None: 'Can’t tell',
|
|
|
|
|
|
}.get(self.agreement_signed),
|
|
|
|
|
|
self.name,
|
|
|
|
|
|
{
|
|
|
|
|
|
True: 'a crown body',
|
|
|
|
|
|
False: 'a non-crown body',
|
|
|
|
|
|
None: 'crown status unknown',
|
2019-04-04 15:02:30 +01:00
|
|
|
|
}.get(self.crown),
|
2019-04-04 11:18:22 +01:00
|
|
|
|
)
|
|
|
|
|
|
else:
|
2019-05-13 14:50:40 +01:00
|
|
|
|
agreement_statement = 'Can’t tell (domain is {}).'.format(fallback_domain)
|
|
|
|
|
|
|
|
|
|
|
|
if self.request_to_go_live_notes:
|
|
|
|
|
|
agreement_statement = agreement_statement + ' ' + self.request_to_go_live_notes
|
|
|
|
|
|
|
|
|
|
|
|
return agreement_statement
|
2019-04-04 11:18:22 +01:00
|
|
|
|
|
2019-04-04 11:23:40 +01:00
|
|
|
|
def as_info_for_branding_request(self, fallback_domain):
|
|
|
|
|
|
return self.name or 'Can’t tell (domain is {})'.format(fallback_domain)
|
2019-04-04 11:18:22 +01:00
|
|
|
|
|
2019-08-27 16:32:30 +01:00
|
|
|
|
@property
|
|
|
|
|
|
def organisation_type_label(self):
|
|
|
|
|
|
return dict(self.TYPES).get(self.organisation_type)
|
|
|
|
|
|
|
2019-04-04 11:18:22 +01:00
|
|
|
|
@property
|
|
|
|
|
|
def crown_status_or_404(self):
|
2019-04-04 15:02:30 +01:00
|
|
|
|
if self.crown is None:
|
2019-04-04 11:18:22 +01:00
|
|
|
|
abort(404)
|
2019-04-04 15:02:30 +01:00
|
|
|
|
return self.crown
|
2019-05-23 17:17:26 +01:00
|
|
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
|
|
def services(self):
|
|
|
|
|
|
return organisations_client.get_organisation_services(self.id)
|
|
|
|
|
|
|
2019-10-03 11:57:24 +01:00
|
|
|
|
@cached_property
|
|
|
|
|
|
def service_ids(self):
|
|
|
|
|
|
return [s['id'] for s in self.services]
|
|
|
|
|
|
|
2019-05-23 17:17:26 +01:00
|
|
|
|
@property
|
|
|
|
|
|
def live_services(self):
|
|
|
|
|
|
return [s for s in self.services if s['active'] and not s['restricted']]
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
def trial_services(self):
|
|
|
|
|
|
return [s for s in self.services if not s['active'] or s['restricted']]
|
|
|
|
|
|
|
|
|
|
|
|
@cached_property
|
2019-05-23 15:27:35 +01:00
|
|
|
|
def invited_users(self):
|
|
|
|
|
|
from app.models.user import OrganisationInvitedUsers
|
|
|
|
|
|
return OrganisationInvitedUsers(self.id)
|
2019-05-23 17:17:26 +01:00
|
|
|
|
|
|
|
|
|
|
@cached_property
|
2019-05-23 15:27:35 +01:00
|
|
|
|
def active_users(self):
|
|
|
|
|
|
from app.models.user import OrganisationUsers
|
|
|
|
|
|
return OrganisationUsers(self.id)
|
2019-05-23 17:17:26 +01:00
|
|
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
|
|
def team_members(self):
|
|
|
|
|
|
return sorted(
|
2019-05-23 15:27:35 +01:00
|
|
|
|
self.invited_users + self.active_users,
|
|
|
|
|
|
key=lambda user: user.email_address.lower(),
|
2019-05-23 17:17:26 +01:00
|
|
|
|
)
|
2019-06-12 13:40:57 +01:00
|
|
|
|
|
2019-09-12 11:49:31 +01:00
|
|
|
|
@cached_property
|
|
|
|
|
|
def email_branding(self):
|
|
|
|
|
|
if self.email_branding_id:
|
|
|
|
|
|
return email_branding_client.get_email_branding(
|
|
|
|
|
|
self.email_branding_id
|
|
|
|
|
|
)['email_branding']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
def email_branding_name(self):
|
|
|
|
|
|
if self.email_branding_id:
|
|
|
|
|
|
return self.email_branding['name']
|
|
|
|
|
|
return 'GOV.UK'
|
|
|
|
|
|
|
|
|
|
|
|
@cached_property
|
|
|
|
|
|
def letter_branding(self):
|
|
|
|
|
|
if self.letter_branding_id:
|
|
|
|
|
|
return letter_branding_client.get_letter_branding(
|
|
|
|
|
|
self.letter_branding_id
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2019-10-03 11:57:24 +01:00
|
|
|
|
def update(self, delete_services_cache=False, **kwargs):
|
|
|
|
|
|
response = organisations_client.update_organisation(
|
|
|
|
|
|
self.id,
|
|
|
|
|
|
cached_service_ids=self.service_ids if delete_services_cache else None,
|
|
|
|
|
|
**kwargs
|
|
|
|
|
|
)
|
2019-06-18 14:24:29 +01:00
|
|
|
|
self.__init__(response)
|
|
|
|
|
|
|
2019-09-04 16:27:25 +01:00
|
|
|
|
def associate_service(self, service_id):
|
|
|
|
|
|
organisations_client.update_service_organisation(
|
2019-11-04 12:20:09 +00:00
|
|
|
|
service_id,
|
2019-09-04 16:27:25 +01:00
|
|
|
|
self.id
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2019-06-12 13:40:57 +01:00
|
|
|
|
|
|
|
|
|
|
class Organisations(ModelList):
|
|
|
|
|
|
client = organisations_client.get_organisations
|
|
|
|
|
|
model = Organisation
|