Files
notifications-admin/app/models/organisation.py
Chris Hill-Scott c9a32c7327 Remove duplication of org type lookup
There’s a couple of places where we’re looking up the label for the type
of organisation.

Having this repeated in multiple places means it’s more likely we forget
to update one of these places when making a change.

This commit looks up from the tuple in the organisation model, which is
where other code references this stuff from. This is only possible now
that we don’t have duplicate keys (ie GP practice doesn’t share a key
any more).
2019-08-28 15:36:09 +01:00

159 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from flask import abort
from werkzeug.utils import cached_property
from app.models import JSONModel, ModelList
from app.notify_client.organisations_api_client import organisations_client
class Organisation(JSONModel):
TYPES = (
('central', 'Central government'),
('local', 'Local government'),
('nhs_central', 'NHS central government agency or public body'),
('nhs_local', 'NHS Trust or Clinical Commissioning Group'),
('nhs_gp', 'GP practice'),
('emergency_service', 'Emergency service'),
('school_or_college', 'School or college'),
('other', 'Other'),
)
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',
'agreement_signed_on_behalf_of_name',
'agreement_signed_on_behalf_of_email_address',
'domains',
'request_to_go_live_notes',
'count_of_live_services',
}
@classmethod
def from_id(cls, org_id):
return cls(organisations_client.get_organisation(org_id))
@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))
@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,
))
def __init__(self, _dict):
super().__init__(_dict)
if self._dict == {}:
self.name = None
self.crown = None
self.agreement_signed = None
self.domains = []
self.organisation_type = None
self.request_to_go_live_notes = None
def as_agreement_statement_for_go_live_request(self, fallback_domain):
if self.agreement_signed:
agreement_statement = 'Yes, on behalf of {}.'.format(self.name)
elif self.name:
agreement_statement = '{} (organisation is {}, {}).'.format(
{
False: 'No',
None: 'Cant tell',
}.get(self.agreement_signed),
self.name,
{
True: 'a crown body',
False: 'a non-crown body',
None: 'crown status unknown',
}.get(self.crown),
)
else:
agreement_statement = 'Cant 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
def as_info_for_branding_request(self, fallback_domain):
return self.name or 'Cant tell (domain is {})'.format(fallback_domain)
@property
def organisation_type_label(self):
return dict(self.TYPES).get(self.organisation_type)
@property
def crown_status_or_404(self):
if self.crown is None:
abort(404)
return self.crown
@cached_property
def services(self):
return organisations_client.get_organisation_services(self.id)
@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
def invited_users(self):
from app.models.user import OrganisationInvitedUsers
return OrganisationInvitedUsers(self.id)
@cached_property
def active_users(self):
from app.models.user import OrganisationUsers
return OrganisationUsers(self.id)
@cached_property
def team_members(self):
return sorted(
self.invited_users + self.active_users,
key=lambda user: user.email_address.lower(),
)
def update(self, **kwargs):
response = organisations_client.update_organisation(self.id, **kwargs)
self.__init__(response)
class Organisations(ModelList):
client = organisations_client.get_organisations
model = Organisation