Files
notifications-api/app/dao/organization_dao.py

147 lines
4.6 KiB
Python
Raw Permalink Normal View History

2024-10-14 08:34:29 -07:00
from sqlalchemy import delete, select, update
2023-07-10 11:06:29 -07:00
from sqlalchemy.sql.expression import func
from app import db
from app.dao.dao_utils import VersionOptions, autocommit, version_class
from app.models import Domain, Organization, Service, User
def dao_get_organizations():
stmt = select(Organization).order_by(
2023-07-10 11:06:29 -07:00
Organization.active.desc(), Organization.name.asc()
)
return db.session.execute(stmt).scalars().all()
2023-07-10 11:06:29 -07:00
def dao_count_organizations_with_live_services():
stmt = (
select(func.count(func.distinct(Organization.id)))
2023-08-29 14:54:30 -07:00
.join(Organization.services)
2024-12-20 08:09:19 -08:00
.where(
2023-08-29 14:54:30 -07:00
Service.active.is_(True),
Service.restricted.is_(False),
Service.count_as_live.is_(True),
)
)
return db.session.execute(stmt).scalar() or 0
2023-07-10 11:06:29 -07:00
def dao_get_organization_services(organization_id):
2024-12-19 11:10:03 -08:00
stmt = select(Organization).where(Organization.id == organization_id)
return db.session.execute(stmt).scalars().one().services
2023-07-10 11:06:29 -07:00
def dao_get_organization_live_services(organization_id):
2024-12-19 11:10:03 -08:00
stmt = select(Service).where(
Service.organization_id == organization_id, Service.restricted == False # noqa
)
return db.session.execute(stmt).scalars().all()
2023-07-10 11:06:29 -07:00
def dao_get_organization_by_id(organization_id):
2024-12-19 11:10:03 -08:00
stmt = select(Organization).where(Organization.id == organization_id)
return db.session.execute(stmt).scalars().one()
2023-07-10 11:06:29 -07:00
def dao_get_organization_by_email_address(email_address):
2023-08-29 14:54:30 -07:00
email_address = email_address.lower().replace(".gsi.gov.uk", ".gov.uk")
stmt = select(Domain).order_by(func.char_length(Domain.domain).desc())
domains = db.session.execute(stmt).scalars().all()
for domain in domains:
2023-08-29 14:54:30 -07:00
if email_address.endswith(
"@{}".format(domain.domain)
) or email_address.endswith(".{}".format(domain.domain)):
2024-12-19 11:10:03 -08:00
stmt = select(Organization).where(Organization.id == domain.organization_id)
return db.session.execute(stmt).scalars().one()
2023-07-10 11:06:29 -07:00
return None
def dao_get_organization_by_service_id(service_id):
2024-12-19 11:10:03 -08:00
stmt = (
2024-12-20 08:09:19 -08:00
select(Organization).join(Organization.services).where(Service.id == service_id)
2024-12-19 11:10:03 -08:00
)
return db.session.execute(stmt).scalars().first()
2023-07-10 11:06:29 -07:00
@autocommit
def dao_create_organization(organization):
db.session.add(organization)
@autocommit
def dao_update_organization(organization_id, **kwargs):
2023-08-29 14:54:30 -07:00
domains = kwargs.pop("domains", None)
2024-10-14 08:52:50 -07:00
stmt = (
update(Organization).where(Organization.id == organization_id).values(**kwargs)
)
2024-10-14 08:34:29 -07:00
num_updated = db.session.execute(stmt).rowcount
2023-07-10 11:06:29 -07:00
if isinstance(domains, list):
2024-12-19 11:10:03 -08:00
stmt = delete(Domain).where(Domain.organization_id == organization_id)
db.session.execute(stmt)
2023-08-29 14:54:30 -07:00
db.session.bulk_save_objects(
[
Domain(domain=domain.lower(), organization_id=organization_id)
for domain in domains
]
)
2023-07-10 11:06:29 -07:00
organization = db.session.get(Organization, organization_id)
2023-08-29 14:54:30 -07:00
if "organization_type" in kwargs:
_update_organization_services(
organization, "organization_type", only_where_none=False
)
2023-07-10 11:06:29 -07:00
2023-08-29 14:54:30 -07:00
if "email_branding_id" in kwargs:
_update_organization_services(organization, "email_branding")
2023-07-10 11:06:29 -07:00
return num_updated
@version_class(
VersionOptions(Service, must_write_history=False),
)
def _update_organization_services(organization, attribute, only_where_none=True):
for service in organization.services:
if getattr(service, attribute) is None or not only_where_none:
setattr(service, attribute, getattr(organization, attribute))
db.session.add(service)
@autocommit
@version_class(Service)
def dao_add_service_to_organization(service, organization_id):
2024-12-19 11:10:03 -08:00
stmt = select(Organization).where(Organization.id == organization_id)
organization = db.session.execute(stmt).scalars().one()
2023-07-10 11:06:29 -07:00
service.organization_id = organization_id
service.organization_type = organization.organization_type
db.session.add(service)
def dao_get_users_for_organization(organization_id):
2023-08-29 14:54:30 -07:00
return (
db.session.query(User)
.join(User.organizations)
2024-12-20 08:09:19 -08:00
.where(Organization.id == organization_id, User.state == "active")
2023-08-29 14:54:30 -07:00
.order_by(User.created_at)
.all()
)
2023-07-10 11:06:29 -07:00
@autocommit
def dao_add_user_to_organization(organization_id, user_id):
organization = dao_get_organization_by_id(organization_id)
2024-12-19 11:10:03 -08:00
stmt = select(User).where(User.id == user_id)
user = db.session.execute(stmt).scalars().one()
2023-07-10 11:06:29 -07:00
user.organizations.append(organization)
db.session.add(organization)
return user
@autocommit
def dao_remove_user_from_organization(organization, user):
organization.users.remove(user)