Skip to content

Commit

Permalink
Merge pull request #506 from UW-GAC/bugfix/managed-group-after-anvil-…
Browse files Browse the repository at this point in the history
…create-save-object-first

Save ManagedGroup before calling after_anvil_create
  • Loading branch information
amstilp committed Aug 7, 2024
2 parents 500d6d6 + 78daa73 commit 5d48e68
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 5 deletions.
2 changes: 1 addition & 1 deletion anvil_consortium_manager/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.25.0.dev2"
__version__ = "0.25.0.dev3"
13 changes: 13 additions & 0 deletions anvil_consortium_manager/tests/test_app/adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from anvil_consortium_manager.adapters.managed_group import BaseManagedGroupAdapter
from anvil_consortium_manager.adapters.workspace import BaseWorkspaceAdapter
from anvil_consortium_manager.forms import WorkspaceForm
from anvil_consortium_manager.models import GroupGroupMembership, ManagedGroup
from anvil_consortium_manager.tables import WorkspaceStaffTable, WorkspaceUserTable

from . import filters, forms, models, tables
Expand Down Expand Up @@ -118,3 +119,15 @@ def after_anvil_create(self, managed_group):
# Change the name of the group to something else.
managed_group.name = "changed-name"
managed_group.save()


class TestManagedGroupAfterAnVILCreateForeignKeyAdapter(TestManagedGroupAdapter):
"""Test adapter for workspaces with custom methods defined."""

def after_anvil_create(self, managed_group):
parent_group = ManagedGroup.objects.get(name="parent-group")
GroupGroupMembership.objects.create(
parent_group=parent_group,
child_group=managed_group,
role=GroupGroupMembership.MEMBER,
)
21 changes: 21 additions & 0 deletions anvil_consortium_manager/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5176,6 +5176,7 @@ def test_api_group_already_exists(self):
)
def test_post_custom_adapter_after_anvil_create(self):
"""The after_anvil_create method is run after a managed group is created."""
# Create a group to add this group to
api_url = self.get_api_url("test-group")
self.anvil_response_mock.add(responses.POST, api_url, status=self.api_success_code)
self.client.force_login(self.user)
Expand All @@ -5185,6 +5186,26 @@ def test_post_custom_adapter_after_anvil_create(self):
new_object = models.ManagedGroup.objects.latest("pk")
self.assertEqual(new_object.name, "changed-name")

@override_settings(
ANVIL_MANAGED_GROUP_ADAPTER="anvil_consortium_manager.tests.test_app.adapters.TestManagedGroupAfterAnVILCreateForeignKeyAdapter"
)
def test_post_custom_adapter_after_anvil_create_fk(self):
"""The view handles using the new group in a foreign key relationship correctly."""
# Create a group to add this group to.
parent_group = factories.ManagedGroupFactory.create(name="parent-group")
api_url = self.get_api_url("test-group")
self.anvil_response_mock.add(responses.POST, api_url, status=self.api_success_code)
self.client.force_login(self.user)
response = self.client.post(self.get_url(), {"name": "test-group"})
self.assertEqual(response.status_code, 302)
new_object = models.ManagedGroup.objects.latest("pk")
# Check that the membership was created.
self.assertEqual(models.GroupGroupMembership.objects.count(), 1)
membership = models.GroupGroupMembership.objects.latest("pk")
self.assertEqual(membership.parent_group, parent_group)
self.assertEqual(membership.child_group, new_object)
self.assertEqual(membership.role, models.GroupGroupMembership.MEMBER)


class ManagedGroupUpdateTest(TestCase):
def setUp(self):
Expand Down
12 changes: 8 additions & 4 deletions anvil_consortium_manager/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -697,23 +697,27 @@ class ManagedGroupCreate(
auth.AnVILConsortiumManagerStaffEditRequired,
viewmixins.ManagedGroupAdapterMixin,
SuccessMessageMixin,
CreateView,
FormView,
):
model = models.ManagedGroup
form_class = forms.ManagedGroupCreateForm
template_name = "anvil_consortium_manager/managedgroup_create.html"
success_message = "Successfully created Managed Group on AnVIL."

def get_success_url(self):
return self.object.get_absolute_url()

def form_valid(self, form):
"""If the form is valid, save the associated model and create it on AnVIL."""
# Set the email for the new group based on the default.
form.instance.email = form.instance.name.lower() + "@firecloud.org"
# Create but don't save the new group.
self.object = form.save(commit=False)
# Make an API call to AnVIL to create the group.
try:
self.object.anvil_create()
self.adapter.after_anvil_create(self.object)
with transaction.atomic():
self.object = form.save()
self.object.anvil_create()
self.adapter.after_anvil_create(self.object)
except AnVILAPIError as e:
# If the API call failed, rerender the page with the responses and show a message.
messages.add_message(self.request, messages.ERROR, "AnVIL API Error: " + str(e))
Expand Down

0 comments on commit 5d48e68

Please sign in to comment.