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 ( "" + "".format( **kv ) + "".join( f"{esc(v)}" if k == "website" else f"{esc(v)}" for k, v in d.items() ) + "".join(f"{esc(v)}" for k, v in sub_data.items()) + "" ) def page_manage_users(message="", post_data=None, naughty_bits=None): """ Generate pre-signup list and allow operations delete/create accounts/ set trial period :return: """ post_data = post_data or {} package_select = "".join( f"" for p in run_query( "SELECT id, package_name FROM commons.packages ORDER BY id", return_type="dict", ) ) # TO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS"') users = run_query( """SELECT user_id, email, user_name, company_name, default_schema "company_schema" FROM commons.user_company""", return_type="dict", ) sign_frag = "{pretty_data}" header = "" for user in users: header = ( "" + "".join(f"{k}" for k in user.keys()) + "trialsubscribed_untilpackage" + "" ) break lines = "".join( sign_frag.format( pretty_data=make_pretty_data( user, run_query( f"""SELECT trial, TO_CHAR(subscription_valid_until_date, 'YYYY-MM-DD') as "subscribed_until", (SELECT package_name FROM commons.packages WHERE id = current_package_id) as "package" FROM {user['company_schema']}.company WHERE company_id = '{user['company_schema']}' """, return_type="dict", )[0], checked="checked" if f"row-select-{user['user_id']}" in post_data else "", **user, ) ) for user in users ) trial_end = ( post_data["trial-end"] if "trial-end" in post_data else make_date_in_future(weeks=2) ) return f""" Fansifter Admin: Pre-Signup
{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