Merge pull request #2368 from alphagov/richer-orgs

Use ‘organisations‘ table to store info about organisations (not YAML)
This commit is contained in:
Chris Hill-Scott
2019-03-08 14:57:21 +00:00
committed by GitHub
9 changed files with 390 additions and 21 deletions

View File

@@ -1,7 +1,10 @@
from sqlalchemy.sql.expression import func
from app import db
from app.dao.dao_utils import transactional
from app.models import (
Organisation,
Domain,
InvitedOrganisationUser,
User
)
@@ -23,6 +26,21 @@ def dao_get_organisation_by_id(organisation_id):
return Organisation.query.filter_by(id=organisation_id).one()
def dao_get_organisation_by_email_address(email_address):
email_address = email_address.lower()
for domain in Domain.query.order_by(func.char_length(Domain.domain).desc()).all():
if (
email_address.endswith("@{}".format(domain.domain)) or
email_address.endswith(".{}".format(domain.domain))
):
return Organisation.query.filter_by(id=domain.organisation_id).one()
return None
def dao_get_organisation_by_service_id(service_id):
return Organisation.query.join(Organisation.services).filter_by(id=service_id).first()
@@ -34,10 +52,26 @@ def dao_create_organisation(organisation):
@transactional
def dao_update_organisation(organisation_id, **kwargs):
return Organisation.query.filter_by(id=organisation_id).update(
domains = kwargs.pop('domains', [])
organisation = Organisation.query.filter_by(id=organisation_id).update(
kwargs
)
if isinstance(domains, list):
Domain.query.filter_by(organisation_id=organisation_id).delete()
db.session.bulk_save_objects([
Domain(domain=domain.lower(), organisation_id=organisation_id)
for domain in domains
])
db.session.commit()
return organisation
@transactional
def dao_add_service_to_organisation(service, organisation_id):

View File

@@ -11,6 +11,7 @@ from app.dao.dao_utils import (
transactional,
version_class
)
from app.dao.organisation_dao import dao_get_organisation_by_email_address
from app.dao.service_sms_sender_dao import insert_service_sms_sender
from app.dao.service_user_dao import dao_get_service_user
from app.models import (
@@ -151,14 +152,25 @@ def dao_fetch_service_by_id_and_user(service_id, user_id):
@transactional
@version_class(Service)
def dao_create_service(service, user, service_id=None, service_permissions=None, letter_branding=None):
def dao_create_service(
service,
user,
service_id=None,
service_permissions=None,
letter_branding=None,
):
# the default property does not appear to work when there is a difference between the sqlalchemy schema and the
# db schema (ie: during a migration), so we have to set sms_sender manually here. After the GOVUK sms_sender
# migration is completed, this code should be able to be removed.
if not user:
raise ValueError("Can't create a service without a user")
if service_permissions is None:
service_permissions = DEFAULT_SERVICE_PERMISSIONS
organisation = dao_get_organisation_by_email_address(user.email_address)
from app.dao.permissions_dao import permission_dao
service.users.append(user)
permission_dao.add_default_service_permissions_for_user(user, service)
@@ -173,8 +185,20 @@ def dao_create_service(service, user, service_id=None, service_permissions=None,
# do we just add the default - or will we get a value from FE?
insert_service_sms_sender(service, current_app.config['FROM_NUMBER'])
if letter_branding:
service.letter_branding = letter_branding
if organisation:
service.organisation = organisation
if organisation.email_branding_id:
service.email_branding = organisation.email_branding_id
if organisation.letter_branding_id and not service.letter_branding:
service.letter_branding = organisation.letter_branding_id
db.session.add(service)

View File

@@ -316,6 +316,12 @@ organisation_to_service = db.Table(
)
class Domain(db.Model):
__tablename__ = "domain"
domain = db.Column(db.String(255), primary_key=True)
organisation_id = db.Column('organisation_id', UUID(as_uuid=True), db.ForeignKey('organisation.id'), nullable=False)
class Organisation(db.Model):
__tablename__ = "organisation"
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=False)
@@ -329,15 +335,50 @@ class Organisation(db.Model):
secondary='organisation_to_service',
uselist=True)
agreement_signed = db.Column(db.Boolean, nullable=True)
agreement_signed_at = db.Column(db.DateTime, nullable=True)
agreement_signed_by_id = db.Column(
UUID(as_uuid=True),
db.ForeignKey('users.id'),
nullable=True,
)
agreement_signed_version = db.Column(db.Float, nullable=True)
crown = db.Column(db.Boolean, nullable=True)
organisation_type = db.Column(db.String(255), nullable=True)
domains = db.relationship(
'Domain',
)
email_branding = db.relationship('EmailBranding')
email_branding_id = db.Column(
UUID(as_uuid=True),
db.ForeignKey('email_branding.id'),
nullable=True,
)
letter_branding = db.relationship('LetterBranding')
letter_branding_id = db.Column(
UUID(as_uuid=True),
db.ForeignKey('letter_branding.id'),
nullable=True,
)
def serialize(self):
serialized = {
return {
"id": str(self.id),
"name": self.name,
"active": self.active,
"crown": self.crown,
"organisation_type": self.organisation_type,
"letter_branding_id": self.letter_branding_id,
"email_branding_id": self.email_branding_id,
"agreement_signed": self.agreement_signed,
"agreement_signed_at": self.agreement_signed_at,
"agreement_signed_by_id": self.agreement_signed_by_id,
"agreement_signed_version": self.agreement_signed_version,
}
return serialized
class Service(db.Model, Versioned):
__tablename__ = 'services'