mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-02 17:48:36 -04:00
Getting permission types configured.
Signed-off-by: Cliff Hill <Clifford.hill@gsa.gov>
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from app import db
|
from app import db
|
||||||
from app.models import INVITE_EXPIRED, INVITE_PENDING, InvitedUser
|
from app.enums import InvitedUserStatusType
|
||||||
|
from app.models import InvitedUser
|
||||||
|
|
||||||
|
|
||||||
def save_invited_user(invited_user):
|
def save_invited_user(invited_user):
|
||||||
@@ -20,7 +21,7 @@ def get_expired_invite_by_service_and_id(service_id, invited_user_id):
|
|||||||
return InvitedUser.query.filter(
|
return InvitedUser.query.filter(
|
||||||
InvitedUser.service_id == service_id,
|
InvitedUser.service_id == service_id,
|
||||||
InvitedUser.id == invited_user_id,
|
InvitedUser.id == invited_user_id,
|
||||||
InvitedUser.status == INVITE_EXPIRED,
|
InvitedUser.status == InvitedUserStatusType.EXPIRED,
|
||||||
).one()
|
).one()
|
||||||
|
|
||||||
|
|
||||||
@@ -41,9 +42,9 @@ def expire_invitations_created_more_than_two_days_ago():
|
|||||||
db.session.query(InvitedUser)
|
db.session.query(InvitedUser)
|
||||||
.filter(
|
.filter(
|
||||||
InvitedUser.created_at <= datetime.utcnow() - timedelta(days=2),
|
InvitedUser.created_at <= datetime.utcnow() - timedelta(days=2),
|
||||||
InvitedUser.status.in_((INVITE_PENDING,)),
|
InvitedUser.status.in_((InvitedUserStatusType.PENDING,)),
|
||||||
)
|
)
|
||||||
.update({InvitedUser.status: INVITE_EXPIRED})
|
.update({InvitedUser.status: InvitedUserStatusType.EXPIRED})
|
||||||
)
|
)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return expired
|
return expired
|
||||||
|
|||||||
@@ -1,26 +1,7 @@
|
|||||||
from app import db
|
from app import db
|
||||||
from app.dao import DAOClass
|
from app.dao import DAOClass
|
||||||
from app.models import (
|
from app.enums import PermissionType
|
||||||
MANAGE_API_KEYS,
|
from app.models import Permission
|
||||||
MANAGE_SETTINGS,
|
|
||||||
MANAGE_TEMPLATES,
|
|
||||||
MANAGE_USERS,
|
|
||||||
SEND_EMAILS,
|
|
||||||
SEND_TEXTS,
|
|
||||||
VIEW_ACTIVITY,
|
|
||||||
Permission,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Default permissions for a service
|
|
||||||
default_service_permissions = [
|
|
||||||
MANAGE_USERS,
|
|
||||||
MANAGE_TEMPLATES,
|
|
||||||
MANAGE_SETTINGS,
|
|
||||||
SEND_TEXTS,
|
|
||||||
SEND_EMAILS,
|
|
||||||
MANAGE_API_KEYS,
|
|
||||||
VIEW_ACTIVITY,
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class PermissionDAO(DAOClass):
|
class PermissionDAO(DAOClass):
|
||||||
@@ -28,7 +9,7 @@ class PermissionDAO(DAOClass):
|
|||||||
model = Permission
|
model = Permission
|
||||||
|
|
||||||
def add_default_service_permissions_for_user(self, user, service):
|
def add_default_service_permissions_for_user(self, user, service):
|
||||||
for name in default_service_permissions:
|
for name in PermissionType.defaults:
|
||||||
permission = Permission(permission=name, user=user, service=service)
|
permission = Permission(permission=name, user=user, service=service)
|
||||||
self.create_instance(permission, _commit=False)
|
self.create_instance(permission, _commit=False)
|
||||||
|
|
||||||
|
|||||||
@@ -43,12 +43,6 @@ from app.utils import (
|
|||||||
get_midnight_in_utc,
|
get_midnight_in_utc,
|
||||||
)
|
)
|
||||||
|
|
||||||
DEFAULT_SERVICE_PERMISSIONS = [
|
|
||||||
ServicePermissionType.SMS,
|
|
||||||
ServicePermissionType.EMAIL,
|
|
||||||
ServicePermissionType.INTERNATIONAL_SMS,
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def dao_fetch_all_services(only_active=False):
|
def dao_fetch_all_services(only_active=False):
|
||||||
query = Service.query.order_by(asc(Service.created_at)).options(joinedload("users"))
|
query = Service.query.order_by(asc(Service.created_at)).options(joinedload("users"))
|
||||||
@@ -278,7 +272,7 @@ def dao_create_service(
|
|||||||
raise ValueError("Can't create a service without a user")
|
raise ValueError("Can't create a service without a user")
|
||||||
|
|
||||||
if service_permissions is None:
|
if service_permissions is None:
|
||||||
service_permissions = DEFAULT_SERVICE_PERMISSIONS
|
service_permissions = ServicePermissionType.defaults
|
||||||
|
|
||||||
organization = dao_get_organization_by_email_address(user.email_address)
|
organization = dao_get_organization_by_email_address(user.email_address)
|
||||||
|
|
||||||
|
|||||||
58
app/enums.py
58
app/enums.py
@@ -13,6 +13,12 @@ class NotificationType(Enum):
|
|||||||
LETTER = "letter"
|
LETTER = "letter"
|
||||||
|
|
||||||
|
|
||||||
|
class TemplateProcessType(Enum):
|
||||||
|
# TODO: Should Template.process_type be changed to use this?
|
||||||
|
NORMAL = "normal"
|
||||||
|
PRIORITY = "priority"
|
||||||
|
|
||||||
|
|
||||||
class UserAuthType(Enum):
|
class UserAuthType(Enum):
|
||||||
SMS = "sms_auth"
|
SMS = "sms_auth"
|
||||||
EMAIL = "email_auth"
|
EMAIL = "email_auth"
|
||||||
@@ -20,11 +26,33 @@ class UserAuthType(Enum):
|
|||||||
|
|
||||||
|
|
||||||
class ServiceCallbackType(Enum):
|
class ServiceCallbackType(Enum):
|
||||||
# TODO: Should ServiceCallbackApi.callback_type be changed to use this?
|
|
||||||
DELIVERY_STATUS = "delivery_status"
|
DELIVERY_STATUS = "delivery_status"
|
||||||
COMPLAINT = "complaint"
|
COMPLAINT = "complaint"
|
||||||
|
|
||||||
|
|
||||||
|
class PermissionType(Enum):
|
||||||
|
MANAGE_USERS = "manage_users"
|
||||||
|
MANAGE_TEMPLATES = "manage_templates"
|
||||||
|
MANAGE_SETTINGS = "manage_settings"
|
||||||
|
SEND_TEXTS = "send_texts"
|
||||||
|
SEND_EMAILS = "send_emails"
|
||||||
|
MANAGE_API_KEYS = "manage_api_keys"
|
||||||
|
PLATFORM_ADMIN = "platform_admin"
|
||||||
|
VIEW_ACTIVITY = "view_activity"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def defaults(self) -> tuple["PermissionType", ...]:
|
||||||
|
cls = type(self)
|
||||||
|
return (
|
||||||
|
cls.MANAGE_USERS,
|
||||||
|
cls.MANAGE_TEMPLATES,
|
||||||
|
cls.MANAGE_SETTINGS,
|
||||||
|
cls.SEND_TEXTS,
|
||||||
|
cls.SEND_EMAILS,
|
||||||
|
cls.MANAGE_API_KEYS,
|
||||||
|
cls.VIEW_ACTIVITY,
|
||||||
|
)
|
||||||
|
|
||||||
class ServicePermissionType(Enum):
|
class ServicePermissionType(Enum):
|
||||||
EMAIL = "email"
|
EMAIL = "email"
|
||||||
SMS = "sms"
|
SMS = "sms"
|
||||||
@@ -35,6 +63,14 @@ class ServicePermissionType(Enum):
|
|||||||
UPLOAD_DOCUMENT = "upload_document"
|
UPLOAD_DOCUMENT = "upload_document"
|
||||||
EDIT_FOLDER_PERMISSIONS = "edit_folder_permissions"
|
EDIT_FOLDER_PERMISSIONS = "edit_folder_permissions"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def defaults(self) -> tuple["ServicePermissionType", ...]:
|
||||||
|
cls = type(self)
|
||||||
|
return (
|
||||||
|
cls.SMS,
|
||||||
|
cls.EMAIL,
|
||||||
|
cls.INTERNATIONAL_SMS,
|
||||||
|
)
|
||||||
|
|
||||||
class GuestListRecipientType(Enum):
|
class GuestListRecipientType(Enum):
|
||||||
MOBILE = "mobile"
|
MOBILE = "mobile"
|
||||||
@@ -59,6 +95,26 @@ class JobStatusType(Enum):
|
|||||||
ERROR = "error"
|
ERROR = "error"
|
||||||
|
|
||||||
|
|
||||||
|
class InvitedUserStatusType(Enum):
|
||||||
|
PENDING = "pending"
|
||||||
|
ACCEPTED = "accepted"
|
||||||
|
CANCELLED = "cancelled"
|
||||||
|
EXPIRED = "expired"
|
||||||
|
|
||||||
|
|
||||||
|
class BrandingType(Enum):
|
||||||
|
# TODO: Should EmailBranding.branding_type be changed to use this?
|
||||||
|
GOVUK = "govuk" # Deprecated outside migrations
|
||||||
|
ORG = "org"
|
||||||
|
BOTH = "both"
|
||||||
|
ORG_BANNER = "org_banner"
|
||||||
|
|
||||||
|
|
||||||
|
class VerifyCodeType(Enum):
|
||||||
|
EMAIL = "email"
|
||||||
|
SMS = "sms"
|
||||||
|
|
||||||
|
|
||||||
class AgreementType(Enum):
|
class AgreementType(Enum):
|
||||||
MOU = "MOU"
|
MOU = "MOU"
|
||||||
IAA = "IAA"
|
IAA = "IAA"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import itertools
|
import itertools
|
||||||
import uuid
|
import uuid
|
||||||
from enum import Enum
|
|
||||||
|
|
||||||
from flask import current_app, url_for
|
from flask import current_app, url_for
|
||||||
from notifications_utils.clients.encryption.encryption_client import EncryptionError
|
from notifications_utils.clients.encryption.encryption_client import EncryptionError
|
||||||
@@ -21,12 +20,16 @@ from sqlalchemy.orm import validates
|
|||||||
from sqlalchemy.orm.collections import attribute_mapped_collection
|
from sqlalchemy.orm.collections import attribute_mapped_collection
|
||||||
|
|
||||||
from app import db, encryption
|
from app import db, encryption
|
||||||
from app.enums import ( # JobStatusType,; KeyType,; ServicePermissionType,; UserAuthType,
|
from app.enums import ( # JobStatusType,; KeyType,; UserAuthType,; TemplateProcessType,
|
||||||
AgreementStatus,
|
AgreementStatus,
|
||||||
AgreementType,
|
AgreementType,
|
||||||
GuestListRecipientType,
|
GuestListRecipientType,
|
||||||
|
InvitedUserStatusType,
|
||||||
NotificationType,
|
NotificationType,
|
||||||
|
PermissionType,
|
||||||
|
ServicePermissionType,
|
||||||
TemplateType,
|
TemplateType,
|
||||||
|
VerifyCodeType,
|
||||||
)
|
)
|
||||||
from app.hashing import check_hash, hashpw
|
from app.hashing import check_hash, hashpw
|
||||||
from app.history_meta import Versioned
|
from app.history_meta import Versioned
|
||||||
@@ -36,17 +39,12 @@ from app.utils import (
|
|||||||
get_dt_string_or_none,
|
get_dt_string_or_none,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# TODO: Change this
|
||||||
NORMAL = "normal"
|
NORMAL = "normal"
|
||||||
PRIORITY = "priority"
|
PRIORITY = "priority"
|
||||||
TEMPLATE_PROCESS_TYPE = [NORMAL, PRIORITY]
|
TEMPLATE_PROCESS_TYPE = [NORMAL, PRIORITY]
|
||||||
|
|
||||||
|
|
||||||
class TemplateProcessType(Enum):
|
|
||||||
# TODO: Should Template.process_type be changed to use this?
|
|
||||||
NORMAL = "normal"
|
|
||||||
PRIORITY = "priority"
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Change this
|
# TODO: Change this
|
||||||
SMS_AUTH_TYPE = "sms_auth"
|
SMS_AUTH_TYPE = "sms_auth"
|
||||||
EMAIL_AUTH_TYPE = "email_auth"
|
EMAIL_AUTH_TYPE = "email_auth"
|
||||||
@@ -282,14 +280,6 @@ BRANDING_ORG_BANNER = "org_banner"
|
|||||||
BRANDING_TYPES = [BRANDING_ORG, BRANDING_BOTH, BRANDING_ORG_BANNER]
|
BRANDING_TYPES = [BRANDING_ORG, BRANDING_BOTH, BRANDING_ORG_BANNER]
|
||||||
|
|
||||||
|
|
||||||
class BrandingType(Enum):
|
|
||||||
# TODO: Should EmailBranding.branding_type be changed to use this?
|
|
||||||
GOVUK = "govuk" # Deprecated outside migrations
|
|
||||||
ORG = "org"
|
|
||||||
BOTH = "both"
|
|
||||||
ORG_BANNER = "org_banner"
|
|
||||||
|
|
||||||
|
|
||||||
class BrandingTypes(db.Model):
|
class BrandingTypes(db.Model):
|
||||||
__tablename__ = "branding_type"
|
__tablename__ = "branding_type"
|
||||||
name = db.Column(db.String(255), primary_key=True)
|
name = db.Column(db.String(255), primary_key=True)
|
||||||
@@ -343,13 +333,6 @@ service_email_branding = db.Table(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# TODO: This need to be changed
|
|
||||||
class ServicePermissionTypes(db.Model):
|
|
||||||
__tablename__ = "service_permission_types"
|
|
||||||
|
|
||||||
name = db.Column(db.String(255), primary_key=True)
|
|
||||||
|
|
||||||
|
|
||||||
class Domain(db.Model):
|
class Domain(db.Model):
|
||||||
__tablename__ = "domain"
|
__tablename__ = "domain"
|
||||||
domain = db.Column(db.String(255), primary_key=True)
|
domain = db.Column(db.String(255), primary_key=True)
|
||||||
@@ -766,12 +749,12 @@ class ServicePermission(db.Model):
|
|||||||
index=True,
|
index=True,
|
||||||
nullable=False,
|
nullable=False,
|
||||||
)
|
)
|
||||||
permission = db.Column(
|
permission = db.Enum(
|
||||||
db.String(255),
|
PermissionType,
|
||||||
db.ForeignKey("service_permission_types.name"),
|
name="permission_type",
|
||||||
index=True,
|
index=True,
|
||||||
primary_key=True,
|
primary_key=True,
|
||||||
nullable=False,
|
nullable=False
|
||||||
)
|
)
|
||||||
created_at = db.Column(
|
created_at = db.Column(
|
||||||
db.DateTime, default=datetime.datetime.utcnow, nullable=False
|
db.DateTime, default=datetime.datetime.utcnow, nullable=False
|
||||||
@@ -1398,11 +1381,6 @@ class Job(db.Model):
|
|||||||
archived = db.Column(db.Boolean, nullable=False, default=False)
|
archived = db.Column(db.Boolean, nullable=False, default=False)
|
||||||
|
|
||||||
|
|
||||||
class VerifyCodeType(Enum):
|
|
||||||
EMAIL = "email"
|
|
||||||
SMS = "sms"
|
|
||||||
|
|
||||||
|
|
||||||
class VerifyCode(db.Model):
|
class VerifyCode(db.Model):
|
||||||
__tablename__ = "verify_codes"
|
__tablename__ = "verify_codes"
|
||||||
|
|
||||||
@@ -1924,25 +1902,6 @@ class NotificationHistory(db.Model, HistoryModel):
|
|||||||
self.status = original.status
|
self.status = original.status
|
||||||
|
|
||||||
|
|
||||||
INVITE_PENDING = "pending"
|
|
||||||
INVITE_ACCEPTED = "accepted"
|
|
||||||
INVITE_CANCELLED = "cancelled"
|
|
||||||
INVITE_EXPIRED = "expired"
|
|
||||||
INVITED_USER_STATUS_TYPES = [
|
|
||||||
INVITE_PENDING,
|
|
||||||
INVITE_ACCEPTED,
|
|
||||||
INVITE_CANCELLED,
|
|
||||||
INVITE_EXPIRED,
|
|
||||||
]
|
|
||||||
# TODO: Change these
|
|
||||||
|
|
||||||
|
|
||||||
class InviteStatusType(db.Model):
|
|
||||||
__tablename__ = "invite_status_type"
|
|
||||||
|
|
||||||
name = db.Column(db.String, primary_key=True)
|
|
||||||
|
|
||||||
|
|
||||||
class InvitedUser(db.Model):
|
class InvitedUser(db.Model):
|
||||||
__tablename__ = "invited_users"
|
__tablename__ = "invited_users"
|
||||||
|
|
||||||
@@ -1964,9 +1923,9 @@ class InvitedUser(db.Model):
|
|||||||
default=datetime.datetime.utcnow,
|
default=datetime.datetime.utcnow,
|
||||||
)
|
)
|
||||||
status = db.Column(
|
status = db.Column(
|
||||||
db.Enum(*INVITED_USER_STATUS_TYPES, name="invited_users_status_types"),
|
db.Enum(InvitedUserStatusType, name="invited_users_status_types"),
|
||||||
nullable=False,
|
nullable=False,
|
||||||
default=INVITE_PENDING,
|
default=InvitedUserStatusType.PENDING,
|
||||||
)
|
)
|
||||||
permissions = db.Column(db.String, nullable=False)
|
permissions = db.Column(db.String, nullable=False)
|
||||||
auth_type = db.Column(
|
auth_type = db.Column(
|
||||||
@@ -2002,10 +1961,9 @@ class InvitedOrganizationUser(db.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
status = db.Column(
|
status = db.Column(
|
||||||
db.String,
|
db.Enum(InvitedUserStatusType, name="invited_users_status_types"),
|
||||||
db.ForeignKey("invite_status_type.name"),
|
|
||||||
nullable=False,
|
nullable=False,
|
||||||
default=INVITE_PENDING,
|
default=InvitedUserStatusType.PENDING,
|
||||||
)
|
)
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
@@ -2019,30 +1977,6 @@ class InvitedOrganizationUser(db.Model):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Service Permissions
|
|
||||||
MANAGE_USERS = "manage_users"
|
|
||||||
MANAGE_TEMPLATES = "manage_templates"
|
|
||||||
MANAGE_SETTINGS = "manage_settings"
|
|
||||||
SEND_TEXTS = "send_texts"
|
|
||||||
SEND_EMAILS = "send_emails"
|
|
||||||
MANAGE_API_KEYS = "manage_api_keys"
|
|
||||||
PLATFORM_ADMIN = "platform_admin"
|
|
||||||
VIEW_ACTIVITY = "view_activity"
|
|
||||||
|
|
||||||
# List of permissions
|
|
||||||
PERMISSION_LIST = [
|
|
||||||
MANAGE_USERS,
|
|
||||||
MANAGE_TEMPLATES,
|
|
||||||
MANAGE_SETTINGS,
|
|
||||||
SEND_TEXTS,
|
|
||||||
SEND_EMAILS,
|
|
||||||
MANAGE_API_KEYS,
|
|
||||||
PLATFORM_ADMIN,
|
|
||||||
VIEW_ACTIVITY,
|
|
||||||
]
|
|
||||||
# TODO: Change These
|
|
||||||
|
|
||||||
|
|
||||||
class Permission(db.Model):
|
class Permission(db.Model):
|
||||||
__tablename__ = "permissions"
|
__tablename__ = "permissions"
|
||||||
|
|
||||||
@@ -2061,7 +1995,7 @@ class Permission(db.Model):
|
|||||||
)
|
)
|
||||||
user = db.relationship("User")
|
user = db.relationship("User")
|
||||||
permission = db.Column(
|
permission = db.Column(
|
||||||
db.Enum(*PERMISSION_LIST, name="permission_types"),
|
db.Enum(ServicePermissionType, name="permission_types"),
|
||||||
index=False,
|
index=False,
|
||||||
unique=False,
|
unique=False,
|
||||||
nullable=False,
|
nullable=False,
|
||||||
|
|||||||
Reference in New Issue
Block a user