Files
notifications-admin/app/models/organisation.py
Kenneth Kehl 54abfb3a4d remove components related to MOU and agreement (#476)
Co-authored-by: Kenneth Kehl <@kkehl@flexion.us>
2023-04-28 14:08:12 -04:00

169 lines
4.6 KiB
Python

from collections import OrderedDict
from werkzeug.utils import cached_property
from app.models import (
JSONModel,
ModelList,
SerialisedModelCollection,
SortByNameMixin,
)
from app.notify_client.email_branding_client import email_branding_client
from app.notify_client.organisations_api_client import organisations_client
class Organisation(JSONModel, SortByNameMixin):
TYPE_FEDERAL = 'federal'
TYPE_STATE = 'state'
TYPE_OTHER = 'other'
TYPE_LABELS = OrderedDict([
(TYPE_FEDERAL, 'Federal government'),
(TYPE_STATE, 'State government'),
(TYPE_OTHER, 'Other'),
])
ALLOWED_PROPERTIES = {
'id',
'name',
'active',
'organisation_type',
'email_branding_id',
'domains',
'request_to_go_live_notes',
'count_of_live_services',
'billing_contact_email_addresses',
'billing_contact_names',
'billing_reference',
'purchase_order_number',
'notes',
}
@classmethod
def from_id(cls, org_id):
if not org_id:
return cls({})
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,
organisation_type=form.organisation_type.data,
)
@classmethod
def create(cls, name, organisation_type):
return cls(organisations_client.create_organisation(
name=name,
organisation_type=organisation_type,
))
def __init__(self, _dict):
super().__init__(_dict)
if self._dict == {}:
self.name = None
self.domains = []
self.organisation_type = None
self.request_to_go_live_notes = None
self.email_branding_id = None
@property
def organisation_type_label(self):
return self.TYPE_LABELS.get(self.organisation_type)
@property
def billing_details(self):
billing_details = [
self.billing_contact_email_addresses,
self.billing_contact_names,
self.billing_reference,
self.purchase_order_number
]
if any(billing_details):
return billing_details
else:
return None
@cached_property
def services(self):
return organisations_client.get_organisation_services(self.id)
@cached_property
def service_ids(self):
return [s['id'] for s in self.services]
@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(),
)
@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'
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
)
self.__init__(response)
def associate_service(self, service_id):
organisations_client.update_service_organisation(
service_id,
self.id
)
def services_and_usage(self, financial_year):
return organisations_client.get_services_and_usage(self.id, financial_year)
class Organisations(SerialisedModelCollection):
model = Organisation
class AllOrganisations(ModelList, Organisations):
client_method = organisations_client.get_organisations