mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-04-28 13:11:05 -04:00
We used to give users the right version of the agreement by guessing their organisation from their email address. Now we do it by looking at the organisation of the service they’re looking at. In other words, users should only be downloading the agreement as part of the go live journey, not outside it. This is because we think that users will get confused if they download the agreement and: - find there’s nowhere to physically sign it - think that accepting the agreement is all they need to do to go live Maintaining two paths to download the agreement also makes the code more complicated, and makes it harder to update the content on these pages.
144 lines
4.3 KiB
Python
144 lines
4.3 KiB
Python
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):
|
||
|
||
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: 'Can’t 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 = '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
|
||
|
||
def as_info_for_branding_request(self, fallback_domain):
|
||
return self.name or 'Can’t tell (domain is {})'.format(fallback_domain)
|
||
|
||
@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
|