mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-10 10:03:38 -04:00
Working on getting tests working.
Signed-off-by: Cliff Hill <Clifford.hill@gsa.gov>
This commit is contained in:
@@ -73,7 +73,9 @@ def expire_or_delete_invitations():
|
|||||||
try:
|
try:
|
||||||
start = datetime.utcnow()
|
start = datetime.utcnow()
|
||||||
expired_invites = expire_invitations_created_more_than_two_days_ago()
|
expired_invites = expire_invitations_created_more_than_two_days_ago()
|
||||||
current_app.logger.info(f"Expire job started {start} finished {datetime.utcnow()} expired {len(expired_invites)} invitations")
|
current_app.logger.info(
|
||||||
|
f"Expire job started {start} finished {datetime.utcnow()} expired {expired_invites} invitations"
|
||||||
|
)
|
||||||
except SQLAlchemyError:
|
except SQLAlchemyError:
|
||||||
current_app.logger.exception("Failed to expire invitations")
|
current_app.logger.exception("Failed to expire invitations")
|
||||||
raise
|
raise
|
||||||
@@ -81,7 +83,9 @@ def expire_or_delete_invitations():
|
|||||||
try:
|
try:
|
||||||
start = datetime.utcnow()
|
start = datetime.utcnow()
|
||||||
deleted_invites = delete_org_invitations_created_more_than_two_days_ago()
|
deleted_invites = delete_org_invitations_created_more_than_two_days_ago()
|
||||||
current_app.logger.info(f"Delete job started {start} finished {datetime.utcnow()} deleted {len(deleted_invites)} invitations")
|
current_app.logger.info(
|
||||||
|
f"Delete job started {start} finished {datetime.utcnow()} deleted {deleted_invites} invitations"
|
||||||
|
)
|
||||||
except SQLAlchemyError:
|
except SQLAlchemyError:
|
||||||
current_app.logger.exception("Failed to delete invitations")
|
current_app.logger.exception("Failed to delete invitations")
|
||||||
raise
|
raise
|
||||||
|
|||||||
@@ -10,15 +10,29 @@ def save_invited_user(invited_user):
|
|||||||
|
|
||||||
|
|
||||||
def get_invited_user_by_service_and_id(service_id, invited_user_id):
|
def get_invited_user_by_service_and_id(service_id, invited_user_id):
|
||||||
return InvitedUser.query.filter_by(service_id=service_id, id=invited_user_id).one()
|
return InvitedUser.query.filter(
|
||||||
|
InvitedUser.service_id == service_id,
|
||||||
|
InvitedUser.id == invited_user_id,
|
||||||
|
InvitedUser.status != INVITE_EXPIRED,
|
||||||
|
).one()
|
||||||
|
|
||||||
|
|
||||||
def get_invited_user_by_id(invited_user_id):
|
def get_invited_user_by_id(invited_user_id):
|
||||||
return InvitedUser.query.filter_by(id=invited_user_id).one()
|
return InvitedUser.query.filter(
|
||||||
|
InvitedUser.id == invited_user_id, InvitedUser.status != INVITE_EXPIRED
|
||||||
|
).one()
|
||||||
|
|
||||||
|
|
||||||
|
def get_expired_invited_users_for_service(service_id):
|
||||||
|
return InvitedUser.query.filter(
|
||||||
|
InvitedUser.service_id == service_id, InvitedUser.status == INVITE_EXPIRED
|
||||||
|
).all()
|
||||||
|
|
||||||
|
|
||||||
def get_invited_users_for_service(service_id):
|
def get_invited_users_for_service(service_id):
|
||||||
return InvitedUser.query.filter_by(service_id=service_id).all()
|
return InvitedUser.query.filter(
|
||||||
|
InvitedUser.service_id == service_id, InvitedUser.status != INVITE_EXPIRED
|
||||||
|
).all()
|
||||||
|
|
||||||
|
|
||||||
def expire_invitations_created_more_than_two_days_ago():
|
def expire_invitations_created_more_than_two_days_ago():
|
||||||
|
|||||||
@@ -1888,7 +1888,12 @@ INVITE_PENDING = "pending"
|
|||||||
INVITE_ACCEPTED = "accepted"
|
INVITE_ACCEPTED = "accepted"
|
||||||
INVITE_CANCELLED = "cancelled"
|
INVITE_CANCELLED = "cancelled"
|
||||||
INVITE_EXPIRED = "expired"
|
INVITE_EXPIRED = "expired"
|
||||||
INVITED_USER_STATUS_TYPES = [INVITE_PENDING, INVITE_ACCEPTED, INVITE_CANCELLED, INVITE_EXPIRED]
|
INVITED_USER_STATUS_TYPES = [
|
||||||
|
INVITE_PENDING,
|
||||||
|
INVITE_ACCEPTED,
|
||||||
|
INVITE_CANCELLED,
|
||||||
|
INVITE_EXPIRED,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class InviteStatusType(db.Model):
|
class InviteStatusType(db.Model):
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from notifications_utils.url_safe_token import check_token, generate_token
|
|||||||
|
|
||||||
from app.config import QueueNames
|
from app.config import QueueNames
|
||||||
from app.dao.invited_user_dao import (
|
from app.dao.invited_user_dao import (
|
||||||
|
get_expired_invited_users_for_service,
|
||||||
get_invited_user_by_id,
|
get_invited_user_by_id,
|
||||||
get_invited_user_by_service_and_id,
|
get_invited_user_by_service_and_id,
|
||||||
get_invited_users_for_service,
|
get_invited_users_for_service,
|
||||||
@@ -58,6 +59,12 @@ def create_invited_user(service_id):
|
|||||||
return jsonify(data=invited_user_schema.dump(invited_user)), 201
|
return jsonify(data=invited_user_schema.dump(invited_user)), 201
|
||||||
|
|
||||||
|
|
||||||
|
@service_invite.route("/service/<service_id>/invite/expired", methods=["GET"])
|
||||||
|
def get_expired_invited_users_by_service(service_id):
|
||||||
|
expired_invited_users = get_expired_invited_users_for_service(service_id)
|
||||||
|
return jsonify(data=invited_user_schema.dump(expired_invited_users, many=True)), 200
|
||||||
|
|
||||||
|
|
||||||
@service_invite.route("/service/<service_id>/invite", methods=["GET"])
|
@service_invite.route("/service/<service_id>/invite", methods=["GET"])
|
||||||
def get_invited_users_by_service(service_id):
|
def get_invited_users_by_service(service_id):
|
||||||
invited_users = get_invited_users_for_service(service_id)
|
invited_users = get_invited_users_for_service(service_id)
|
||||||
|
|||||||
22
migrations/versions/0404_expire_invites.py
Normal file
22
migrations/versions/0404_expire_invites.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
"""
|
||||||
|
|
||||||
|
Revision ID: 0404_expire_invites
|
||||||
|
Revises: 0403_add_carrier
|
||||||
|
Create Date: 2023-11-10 15:52:07.348485
|
||||||
|
|
||||||
|
"""
|
||||||
|
from re import I
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
revision = "0404_expire_invites"
|
||||||
|
down_revision = "0403_add_carrier"
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.execute("insert into invite_status_type values ('expired')")
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.execute("delete from invite_status_type where name = 'expired'")
|
||||||
@@ -11,8 +11,8 @@ from app.celery.scheduled_tasks import (
|
|||||||
check_for_missing_rows_in_completed_jobs,
|
check_for_missing_rows_in_completed_jobs,
|
||||||
check_for_services_with_high_failure_rates_or_sending_to_tv_numbers,
|
check_for_services_with_high_failure_rates_or_sending_to_tv_numbers,
|
||||||
check_job_status,
|
check_job_status,
|
||||||
expire_or_delete_invitations,
|
|
||||||
delete_verify_codes,
|
delete_verify_codes,
|
||||||
|
expire_or_delete_invitations,
|
||||||
replay_created_notifications,
|
replay_created_notifications,
|
||||||
run_scheduled_jobs,
|
run_scheduled_jobs,
|
||||||
)
|
)
|
||||||
@@ -40,7 +40,7 @@ def test_should_call_delete_codes_on_delete_verify_codes_task(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_should_call_delete_invotations_on_delete_invitations_task(
|
def test_should_call_expire_or_delete_invotations_on_expire_or_delete_invitations_task(
|
||||||
notify_db_session, mocker
|
notify_db_session, mocker
|
||||||
):
|
):
|
||||||
mocker.patch(
|
mocker.patch(
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ def test_update_org_invited_user_for_invalid_data_returns_400(
|
|||||||
assert len(json_resp["errors"]) == 1
|
assert len(json_resp["errors"]) == 1
|
||||||
assert (
|
assert (
|
||||||
json_resp["errors"][0]["message"]
|
json_resp["errors"][0]["message"]
|
||||||
== "status garbage is not one of [pending, accepted, cancelled]"
|
== "status garbage is not one of [pending, accepted, cancelled, expired]"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ def test_create_invited_user(
|
|||||||
permissions="send_messages,manage_service,manage_api_keys",
|
permissions="send_messages,manage_service,manage_api_keys",
|
||||||
auth_type=EMAIL_AUTH_TYPE,
|
auth_type=EMAIL_AUTH_TYPE,
|
||||||
folder_permissions=["folder_1", "folder_2", "folder_3"],
|
folder_permissions=["folder_1", "folder_2", "folder_3"],
|
||||||
**extra_args
|
**extra_args,
|
||||||
)
|
)
|
||||||
|
|
||||||
json_resp = admin_request.post(
|
json_resp = admin_request.post(
|
||||||
@@ -127,7 +127,7 @@ def test_create_invited_user_invalid_email(client, sample_service, mocker, fake_
|
|||||||
auth_header = create_admin_authorization_header()
|
auth_header = create_admin_authorization_header()
|
||||||
|
|
||||||
response = client.post(
|
response = client.post(
|
||||||
"/service/{}/invite".format(sample_service.id),
|
f"/service/{sample_service.id}/invite",
|
||||||
headers=[("Content-Type", "application/json"), auth_header],
|
headers=[("Content-Type", "application/json"), auth_header],
|
||||||
data=data,
|
data=data,
|
||||||
)
|
)
|
||||||
@@ -145,7 +145,7 @@ def test_get_all_invited_users_by_service(client, notify_db_session, sample_serv
|
|||||||
invited_user = create_invited_user(sample_service, to_email_address=email)
|
invited_user = create_invited_user(sample_service, to_email_address=email)
|
||||||
invites.append(invited_user)
|
invites.append(invited_user)
|
||||||
|
|
||||||
url = "/service/{}/invite".format(sample_service.id)
|
url = f"/service/{sample_service.id}/invite"
|
||||||
|
|
||||||
auth_header = create_admin_authorization_header()
|
auth_header = create_admin_authorization_header()
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ def test_get_all_invited_users_by_service(client, notify_db_session, sample_serv
|
|||||||
def test_get_invited_users_by_service_with_no_invites(
|
def test_get_invited_users_by_service_with_no_invites(
|
||||||
client, notify_db_session, sample_service
|
client, notify_db_session, sample_service
|
||||||
):
|
):
|
||||||
url = "/service/{}/invite".format(sample_service.id)
|
url = f"/service/{sample_service.id}/invite"
|
||||||
|
|
||||||
auth_header = create_admin_authorization_header()
|
auth_header = create_admin_authorization_header()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user