import logging
from service.tasks.data_model import list_caw_schemas
from service.tasks.management.cognito import delete_user
from service.tasks.precondition.checks.deletion import (
AllianceDeleteCheck,
WorkspaceDeleteCheck,
WorkspaceEmptyCheck,
)
from service.tasks.precondition.engine import Precondition
from service.utils.aws_connectors import run_query
from .utils import POOL_NAME, esc, make_date_in_future
logger = logging.getLogger(__name__)
def make_pretty_data(d, sub_data, **kv):
return (
"
{message}
"""
def ingest_manage_users_instructions(post_data, naughty_bits):
"""
Extract delete/create accounts info, send invite emails, etc.
:param post_data:
:param naughty_bits - xss token
:return:
"""
message = "Nice try, nothing happened."
if post_data.get("naughty-bits") == naughty_bits:
message = ""
try:
if "delete" in post_data:
if "delete-confirm" in post_data:
for pk, pd in post_data.items():
if pk.startswith("row-select-"):
for uc in run_query(
"SELECT default_schema, email FROM commons.user_company WHERE user_id = %(user_id)s",
{"user_id": pd},
):
user_id = pd
management_schema = uc[0]
# email = uc[1]
try:
# cognito delete
try:
delete_user(user_id, POOL_NAME)
except Exception as e:
message += f" Cognito Exception: {e} "
# alliance delete
for caw_schema, _ in list_caw_schemas(
management_schema,
with_caw_type=True,
workspaces=False,
):
for _ in run_query(
"SELECT management_company_id FROM commons.company_alliance "
"WHERE alliance_id = %(aid)s AND management_company_id = %(mid)s ",
{
"aid": caw_schema,
"mid": management_schema,
},
):
precondition = Precondition(
AllianceDeleteCheck(
caw_schema,
management_schema=management_schema,
user_id=user_id,
)
)
accepted = set()
for (
con
) in (
precondition.prepare_frontend_package()
):
accepted.update(con["items"])
precondition.accepted_consequences = (
accepted
)
if precondition.is_met:
precondition.execute()
# workspace delete
for caw_schema, _ in list_caw_schemas(
management_schema,
with_caw_type=True,
alliances=False,
):
if caw_schema[0] == "w":
precondition = Precondition(
WorkspaceDeleteCheck(
caw_schema,
management_schema=management_schema,
user_id=user_id,
)
)
else:
precondition = Precondition(
WorkspaceEmptyCheck(
caw_schema,
management_schema=management_schema,
user_id=user_id,
)
)
accepted = set()
for (
con
) in precondition.prepare_frontend_package():
accepted.update(con["items"])
precondition.accepted_consequences = accepted
if precondition.is_met:
precondition.execute()
# globals delete
run_query(
"DELETE FROM commons.company_alliance WHERE management_company_id = %(mid)s",
{"mid": management_schema},
fetch=False,
)
run_query(
"DELETE FROM commons.user_company WHERE user_id = %(uid)s",
{"uid": user_id},
fetch=False,
)
# company/user delete
run_query(
f"DROP SCHEMA {management_schema} CASCADE",
fetch=False,
)
message += f" Deleted user {uc[1]}"
except Exception as e:
logger.exception("deletion failed", exc_info=e)
if len(message) == 0:
message = "
did nothing"
else:
message = "Please also check the confirm delete checkbox"
if "extend" in post_data:
trial_end = post_data["trial-end"]
package_id = int(post_data["package-select"])
# ids = []
for pk, pd in post_data.items():
if pk.startswith("row-select-"):
for uc in run_query(
"SELECT default_schema, email FROM commons.user_company WHERE user_id = %(user_id)s",
{"user_id": pd},
):
management_schema = uc[0]
run_query(
f"UPDATE {management_schema}.company SET trial = true, "
f"current_package_id = %(package_id)s, subscription_valid_until_date = %(trial_end)s",
{"trial_end": trial_end, "package_id": package_id},
)
message += f" Extended trial to {trial_end} for {uc[1]} "
except Exception as e:
message += f" EXCEPTION: {e} "
return message