Files
notifications-admin/app/models/organization.py
2025-10-20 12:11:01 -07:00

152 lines
4.2 KiB
Python

from collections import OrderedDict
from werkzeug.utils import cached_property
from app.enums import OrganizationType
from app.models import JSONModel, ModelList, SerialisedModelCollection, SortByNameMixin
from app.notify_client.organizations_api_client import organizations_client
class Organization(JSONModel, SortByNameMixin):
TYPE_FEDERAL = OrganizationType.FEDERAL
TYPE_STATE = OrganizationType.STATE
TYPE_OTHER = OrganizationType.OTHER
TYPE_LABELS = OrderedDict(
[
(TYPE_FEDERAL, "Federal government"),
(TYPE_STATE, "State government"),
(TYPE_OTHER, "Other"),
]
)
ALLOWED_PROPERTIES = {
"id",
"name",
"active",
"organization_type",
"domains",
"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(organizations_client.get_organization(org_id))
@classmethod
def from_domain(cls, domain):
return cls(organizations_client.get_organization_by_domain(domain))
@classmethod
def from_service(cls, service_id):
return cls(organizations_client.get_service_organization(service_id))
@classmethod
def create_from_form(cls, form):
return cls.create(
name=form.name.data,
organization_type=form.organization_type.data,
)
@classmethod
def create(cls, name, organization_type):
return cls(
organizations_client.create_organization(
name=name,
organization_type=organization_type,
)
)
def __init__(self, _dict):
super().__init__(_dict)
if self._dict == {}:
self.name = None
self.domains = []
self.organization_type = None
@property
def organization_type_label(self):
return self.TYPE_LABELS.get(self.organization_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 organizations_client.get_organization_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 s["active"] and s["restricted"]]
@property
def suspended_services(self):
return [s for s in self.services if not s["active"]]
@cached_property
def invited_users(self):
from app.models.user import OrganizationInvitedUsers
return OrganizationInvitedUsers(self.id)
@cached_property
def active_users(self):
from app.models.user import OrganizationUsers
return OrganizationUsers(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, delete_services_cache=False, **kwargs):
response = organizations_client.update_organization(
self.id,
cached_service_ids=self.service_ids if delete_services_cache else None,
**kwargs
)
self.__init__(response)
def associate_service(self, service_id):
organizations_client.update_service_organization(service_id, self.id)
def services_and_usage(self, financial_year):
return organizations_client.get_services_and_usage(self.id, financial_year)
class Organizations(SerialisedModelCollection):
model = Organization
class AllOrganizations(ModelList, Organizations):
client_method = organizations_client.get_organizations