mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-20 15:31:15 -05:00
134 lines
3.9 KiB
Python
134 lines
3.9 KiB
Python
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():
|
|
return Organization.query.order_by(
|
|
Organization.active.desc(), Organization.name.asc()
|
|
).all()
|
|
|
|
|
|
def dao_count_organizations_with_live_services():
|
|
return (
|
|
db.session.query(Organization.id)
|
|
.join(Organization.services)
|
|
.filter(
|
|
Service.active.is_(True),
|
|
Service.restricted.is_(False),
|
|
Service.count_as_live.is_(True),
|
|
)
|
|
.distinct()
|
|
.count()
|
|
)
|
|
|
|
|
|
def dao_get_organization_services(organization_id):
|
|
return Organization.query.filter_by(id=organization_id).one().services
|
|
|
|
|
|
def dao_get_organization_live_services(organization_id):
|
|
return Service.query.filter_by(
|
|
organization_id=organization_id, restricted=False
|
|
).all()
|
|
|
|
|
|
def dao_get_organization_by_id(organization_id):
|
|
return Organization.query.filter_by(id=organization_id).one()
|
|
|
|
|
|
def dao_get_organization_by_email_address(email_address):
|
|
email_address = email_address.lower().replace(".gsi.gov.uk", ".gov.uk")
|
|
|
|
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 Organization.query.filter_by(id=domain.organization_id).one()
|
|
|
|
return None
|
|
|
|
|
|
def dao_get_organization_by_service_id(service_id):
|
|
return (
|
|
Organization.query.join(Organization.services).filter_by(id=service_id).first()
|
|
)
|
|
|
|
|
|
@autocommit
|
|
def dao_create_organization(organization):
|
|
db.session.add(organization)
|
|
|
|
|
|
@autocommit
|
|
def dao_update_organization(organization_id, **kwargs):
|
|
domains = kwargs.pop("domains", None)
|
|
num_updated = Organization.query.filter_by(id=organization_id).update(kwargs)
|
|
|
|
if isinstance(domains, list):
|
|
Domain.query.filter_by(organization_id=organization_id).delete()
|
|
db.session.bulk_save_objects(
|
|
[
|
|
Domain(domain=domain.lower(), organization_id=organization_id)
|
|
for domain in domains
|
|
]
|
|
)
|
|
|
|
organization = Organization.query.get(organization_id)
|
|
if "organization_type" in kwargs:
|
|
_update_organization_services(
|
|
organization, "organization_type", only_where_none=False
|
|
)
|
|
|
|
if "email_branding_id" in kwargs:
|
|
_update_organization_services(organization, "email_branding")
|
|
|
|
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):
|
|
organization = Organization.query.filter_by(id=organization_id).one()
|
|
|
|
service.organization_id = organization_id
|
|
service.organization_type = organization.organization_type
|
|
|
|
db.session.add(service)
|
|
|
|
|
|
def dao_get_users_for_organization(organization_id):
|
|
return (
|
|
db.session.query(User)
|
|
.join(User.organizations)
|
|
.filter(Organization.id == organization_id, User.state == "active")
|
|
.order_by(User.created_at)
|
|
.all()
|
|
)
|
|
|
|
|
|
@autocommit
|
|
def dao_add_user_to_organization(organization_id, user_id):
|
|
organization = dao_get_organization_by_id(organization_id)
|
|
user = User.query.filter_by(id=user_id).one()
|
|
user.organizations.append(organization)
|
|
db.session.add(organization)
|
|
return user
|
|
|
|
|
|
@autocommit
|
|
def dao_remove_user_from_organization(organization, user):
|
|
organization.users.remove(user)
|