From a12eddc9591cc3a25b5034dab821551bbb80ed5a Mon Sep 17 00:00:00 2001 From: Patrick Smith Date: Mon, 1 Oct 2018 21:18:29 -0400 Subject: [PATCH 1/5] Add script to remove all data for test accounts --- script/remove_sample_data.py | 114 +++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 script/remove_sample_data.py diff --git a/script/remove_sample_data.py b/script/remove_sample_data.py new file mode 100644 index 00000000..28e0a3ad --- /dev/null +++ b/script/remove_sample_data.py @@ -0,0 +1,114 @@ +import ctypes +import sqlalchemy +from sqlalchemy import or_, event as sqlalchemy_event + +from atst.database import db +from atst.app import make_config, make_app + +from atst.models.audit_event import AuditEvent +from atst.models.environment import Environment +from atst.models.environment_role import EnvironmentRole +from atst.models.project import Project +from atst.models.request import Request +from atst.models.request_revision import RequestRevision +from atst.models.request_status_event import RequestStatusEvent +from atst.models.role import Role +from atst.models.user import User +from atst.models.workspace_role import WorkspaceRole +from atst.models.workspace import Workspace +from atst.models.mixins import AuditableMixin + + +dod_ids = [ + "1234567890", + "2345678901", + "3456789012", + "4567890123", + "5678901234", + "6789012345", + "2342342342", + "3453453453", + "4564564564", + "6786786786", +] + + +def remove_sample_data(): + users = db.session.query(User).filter(User.dod_id.in_(dod_ids)).all() + + delete_listeners = [ + k + for k in sqlalchemy_event.registry._key_to_collection + if k[1] == "after_delete" + ] + for listener in delete_listeners: + [class_id, identifier, _] = listener + model = ctypes.cast(class_id, ctypes.py_object).value + sqlalchemy_event.remove(model, identifier, AuditableMixin.audit_delete) + + for user in users: + requests = ( + db.session.query(Request) + .filter(Request.id.in_([r.id for r in user.owned_requests])) + .all() + ) + request_audit = ( + db.session.query(AuditEvent) + .filter(AuditEvent.request_id.in_([r.id for r in requests])) + .all() + ) + request_audit = ( + db.session.query(AuditEvent) + .filter(AuditEvent.request_id.in_([r.id for r in requests])) + .all() + ) + events = [ev for r in requests for ev in r.status_events] + revisions = [rev for r in requests for rev in r.revisions] + workspaces = [r.workspace for r in requests if r.workspace] + ws_audit = ( + db.session.query(AuditEvent) + .filter(AuditEvent.workspace_id.in_([w.id for w in workspaces])) + .all() + ) + workspace_roles = [role for workspace in workspaces for role in workspace.roles] + projects = [p for workspace in workspaces for p in workspace.projects] + environments = ( + db.session.query(Environment) + .filter(Environment.project_id.in_([p.id for p in projects])) + .all() + ) + roles = [role for env in environments for role in env.roles] + + for set_of_things in [ + roles, + environments, + projects, + workspace_roles, + ws_audit, + events, + revisions, + request_audit, + ]: + for thing in set_of_things: + db.session.delete(thing) + + db.session.commit() + + query = "DELETE FROM workspaces WHERE workspaces.id = ANY(:ids);" + db.session.connection().execute( + sqlalchemy.text(query), ids=[w.id for w in workspaces] + ) + + query = "DELETE FROM requests WHERE requests.id = ANY(:ids);" + db.session.connection().execute( + sqlalchemy.text(query), ids=[r.id for r in requests] + ) + + db.session.commit() + + +if __name__ == "__main__": + config = make_config() + app = make_app(config) + with app.app_context(): + remove_sample_data() From eeea08fe475b63f4a7c2088de7578b6b0e414183 Mon Sep 17 00:00:00 2001 From: Patrick Smith Date: Tue, 2 Oct 2018 16:00:52 -0400 Subject: [PATCH 2/5] re-create demo workspaces --- script/remove_sample_data.py | 50 +++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/script/remove_sample_data.py b/script/remove_sample_data.py index 28e0a3ad..8f1501c2 100644 --- a/script/remove_sample_data.py +++ b/script/remove_sample_data.py @@ -11,13 +11,20 @@ from atst.models.environment_role import EnvironmentRole from atst.models.project import Project from atst.models.request import Request from atst.models.request_revision import RequestRevision -from atst.models.request_status_event import RequestStatusEvent +from atst.models.request_status_event import RequestStatus, RequestStatusEvent from atst.models.role import Role from atst.models.user import User from atst.models.workspace_role import WorkspaceRole from atst.models.workspace import Workspace from atst.models.mixins import AuditableMixin +from atst.domain.environments import Environments +from atst.domain.reports import MONTHLY_SPEND_AARDVARK, MONTHLY_SPEND_BELUGA +from atst.domain.requests import Requests +from atst.domain.users import Users +from atst.domain.workspaces import Workspaces +from tests.factories import RequestFactory, TaskOrderFactory + dod_ids = [ "1234567890", @@ -26,15 +33,44 @@ dod_ids = [ "4567890123", "5678901234", "6789012345", - "2342342342", - "3453453453", - "4564564564", + "2342342342", # Andy + "3453453453", # Sally + "4564564564", # Betty "6786786786", ] -def remove_sample_data(): - users = db.session.query(User).filter(User.dod_id.in_(dod_ids)).all() +def create_demo_workspace(name, data): + workspace_owner = Users.get_by_dod_id("6786786786") # Other + auditor = Users.get_by_dod_id("3453453453") # Sally + + request = RequestFactory.build(creator=workspace_owner) + request.task_order = TaskOrderFactory.build() + request = Requests.update( + request.id, {"financial_verification": RequestFactory.mock_financial_data()} + ) + approved_request = Requests.set_status(request, RequestStatus.APPROVED) + + workspace = Requests.approve_and_create_workspace(request) + Workspaces.update(workspace, { "name": name }) + + for name in data: + project = Project(workspace=workspace, name=name, description='') + env_names = [env for env in data[name]] + envs = Environments.create_many(project, env_names) + db.session.add(project) + db.session.commit() + + + + + + +def remove_sample_data(all_users=False): + query = db.session.query(User) + if not all_users: + query = query.filter(User.dod_id.in_(dod_ids)) + users = query.all() delete_listeners = [ k @@ -112,3 +148,5 @@ if __name__ == "__main__": app = make_app(config) with app.app_context(): remove_sample_data() + create_demo_workspace('Aardvark', MONTHLY_SPEND_AARDVARK) + create_demo_workspace('Beluga', MONTHLY_SPEND_BELUGA) From f65474a1299e5cd47a201d5b17230553e109700e Mon Sep 17 00:00:00 2001 From: Patrick Smith Date: Wed, 10 Oct 2018 09:58:14 -0400 Subject: [PATCH 3/5] Remove extra whitespace --- script/remove_sample_data.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/script/remove_sample_data.py b/script/remove_sample_data.py index 8f1501c2..b77ae682 100644 --- a/script/remove_sample_data.py +++ b/script/remove_sample_data.py @@ -62,10 +62,6 @@ def create_demo_workspace(name, data): db.session.commit() - - - - def remove_sample_data(all_users=False): query = db.session.query(User) if not all_users: From 9d03c3e85676a2a40682fc659ea78e83cbc63d3b Mon Sep 17 00:00:00 2001 From: Patrick Smith Date: Fri, 12 Oct 2018 14:35:39 -0400 Subject: [PATCH 4/5] Catch error if demo user does not exist --- script/remove_sample_data.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/script/remove_sample_data.py b/script/remove_sample_data.py index b77ae682..16a3d3c7 100644 --- a/script/remove_sample_data.py +++ b/script/remove_sample_data.py @@ -19,6 +19,7 @@ from atst.models.workspace import Workspace from atst.models.mixins import AuditableMixin from atst.domain.environments import Environments +from atst.domain.exceptions import NotFoundError from atst.domain.reports import MONTHLY_SPEND_AARDVARK, MONTHLY_SPEND_BELUGA from atst.domain.requests import Requests from atst.domain.users import Users @@ -41,8 +42,12 @@ dod_ids = [ def create_demo_workspace(name, data): - workspace_owner = Users.get_by_dod_id("6786786786") # Other - auditor = Users.get_by_dod_id("3453453453") # Sally + try: + workspace_owner = Users.get_by_dod_id("678678678") # Other + auditor = Users.get_by_dod_id("3453453453") # Sally + except NotFoundError: + print("Could not find demo users; will not create demo workspace {}".format(name)) + return request = RequestFactory.build(creator=workspace_owner) request.task_order = TaskOrderFactory.build() From 8bf71f10c7e7e56856cadb929d5719b4c15994ba Mon Sep 17 00:00:00 2001 From: Patrick Smith Date: Tue, 16 Oct 2018 10:17:37 -0400 Subject: [PATCH 5/5] Update path so the script can be run and import atst --- script/remove_sample_data.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/script/remove_sample_data.py b/script/remove_sample_data.py index 16a3d3c7..e50b4870 100644 --- a/script/remove_sample_data.py +++ b/script/remove_sample_data.py @@ -1,3 +1,10 @@ +# Add root project dir to the python path +import os +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +sys.path.append(parent_dir) + import ctypes import sqlalchemy from sqlalchemy import or_, event as sqlalchemy_event